1 | #include "mindb.h"
|
---|
2 |
|
---|
3 | #include <mars_util.h>
|
---|
4 |
|
---|
5 | namespace geoworld
|
---|
6 | {
|
---|
7 | void MineralsDB::resolveReferences()
|
---|
8 | {
|
---|
9 | // Resolving all mineral references to classes
|
---|
10 | for (MineralMap::iterator iMin = _minerals.begin(); iMin != _minerals.end(); ++iMin)
|
---|
11 | {
|
---|
12 | resolve(iMin->second->clazz);
|
---|
13 | }
|
---|
14 |
|
---|
15 | // Determining all class groupings of minerals
|
---|
16 | for (ClassesMap::const_iterator iClass = _classes.all.begin(); iClass != _classes.all.end(); ++iClass)
|
---|
17 | {
|
---|
18 | DirectMineralList & grouping = _groups.classes[iClass->first] = DirectMineralList();
|
---|
19 |
|
---|
20 | for (MineralMap::iterator iMin = _minerals.begin(); iMin != _minerals.end(); ++iMin)
|
---|
21 | {
|
---|
22 | if (!iMin->second->clazz.isNull())
|
---|
23 | {
|
---|
24 | const std::string & name = iMin->second->clazz->name;
|
---|
25 |
|
---|
26 | if (name == iClass->first)
|
---|
27 | grouping.push_back(iMin->second);
|
---|
28 | }
|
---|
29 | }
|
---|
30 |
|
---|
31 | if (grouping.empty())
|
---|
32 | _groups.classes.erase(iClass->first);
|
---|
33 | }
|
---|
34 |
|
---|
35 | // Resolving all group definition minerals
|
---|
36 | for (MineralGroups::iterator iGrp = _groups.all.begin(); iGrp != _groups.all.end(); ++iGrp)
|
---|
37 | {
|
---|
38 | for (MineralGroupDef::MineralList::iterator iGrpMin = iGrp->second->members.begin(); iGrpMin != iGrp->second->members.end(); ++iGrpMin)
|
---|
39 | resolve(*iGrpMin);
|
---|
40 | }
|
---|
41 |
|
---|
42 | for (MineralMap::iterator i = _minerals.begin(); i != _minerals.end(); ++i)
|
---|
43 | {
|
---|
44 | for (MineralDef::GenesisList::iterator ig = i->second->genesis.begin();
|
---|
45 | ig != i->second->genesis.end();
|
---|
46 | ++ig)
|
---|
47 | {
|
---|
48 | resolve(ig->associations);
|
---|
49 | resolve(ig->protolith);
|
---|
50 | resolve(ig->host.mineral);
|
---|
51 | resolve(ig->environments);
|
---|
52 | }
|
---|
53 | }
|
---|
54 | }
|
---|
55 |
|
---|
56 | void MineralsDB::createIndexes()
|
---|
57 | {
|
---|
58 | // Create class-by-silica index
|
---|
59 | for (ClassesMap::const_iterator j = _classes.all.begin(); j != _classes.all.end(); ++j)
|
---|
60 | for (MineralClass::DispositionList::const_iterator i = j->second->dispositions.begin(); i != j->second->dispositions.end(); ++i)
|
---|
61 | _classes.silica[i->silica.base].insert(j->second);
|
---|
62 |
|
---|
63 | // Create mineral-by-associated index
|
---|
64 | for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
|
---|
65 | {
|
---|
66 | for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
|
---|
67 | {
|
---|
68 | for (MineralReferenceList::const_iterator k = j->associations.begin(); k != j->associations.end(); ++k)
|
---|
69 | {
|
---|
70 | if (!k->mineral.isNull())
|
---|
71 | {
|
---|
72 | PetrogenyMineralMultiMap::iterator u = _associations.find(k->mineral);
|
---|
73 |
|
---|
74 | if (u == _associations.end())
|
---|
75 | u = _associations.insert(_associations.begin(), std::pair< MineralPtr, PetrogenyMineralSet > (k->mineral, PetrogenyMineralSet()));
|
---|
76 |
|
---|
77 | u->second.insert(GenesisMineralMapping(*k, i->second, j));
|
---|
78 | }
|
---|
79 | }
|
---|
80 | }
|
---|
81 | }
|
---|
82 |
|
---|
83 | // Create mineral-by-protolith index
|
---|
84 | for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
|
---|
85 | {
|
---|
86 | for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
|
---|
87 | {
|
---|
88 | for (MineralReferenceList::const_iterator k = j->protolith.begin(); k != j->protolith.end(); ++k)
|
---|
89 | {
|
---|
90 | if (!k->mineral.isNull())
|
---|
91 | {
|
---|
92 | PetrogenyMineralMultiMap::iterator u = _protoliths.find(k->mineral);
|
---|
93 |
|
---|
94 | if (u == _protoliths.end())
|
---|
95 | u = _protoliths.insert(_protoliths.begin(), std::pair< MineralPtr, PetrogenyMineralSet > (k->mineral, PetrogenyMineralSet()));
|
---|
96 |
|
---|
97 | u->second.insert(GenesisMineralMapping(*k, i->second, j));
|
---|
98 | }
|
---|
99 | }
|
---|
100 | }
|
---|
101 | }
|
---|
102 |
|
---|
103 | // Create mineral-by-host index
|
---|
104 | for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
|
---|
105 | {
|
---|
106 | for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
|
---|
107 | {
|
---|
108 | if (j->host)
|
---|
109 | {
|
---|
110 | PetrogenyMineralMultiMap::iterator u = _hosts.find(j->host.mineral);
|
---|
111 |
|
---|
112 | if (u == _hosts.end())
|
---|
113 | u = _hosts.insert(_hosts.begin(), std::pair< MineralPtr, PetrogenyMineralSet > (j->host.mineral, PetrogenyMineralSet()));
|
---|
114 |
|
---|
115 | u->second.insert(GenesisMineralMapping(j->host, i->second, j));
|
---|
116 | }
|
---|
117 | }
|
---|
118 | }
|
---|
119 |
|
---|
120 | // Create mineral-by-environment index
|
---|
121 | for (MineralMap::const_iterator i = _minerals.begin(); i != _minerals.end(); ++i)
|
---|
122 | {
|
---|
123 | for (MineralDef::GenesisList::const_iterator j = i->second->genesis.begin(); j != i->second->genesis.end(); ++j)
|
---|
124 | {
|
---|
125 | for (MinClassReferenceList::const_iterator k = j->environments.begin(); k != j->environments.end(); ++k)
|
---|
126 | {
|
---|
127 | if (!k->isNull())
|
---|
128 | {
|
---|
129 | PetrogenyClassMultiMap::iterator u = _environments.find(*k);
|
---|
130 |
|
---|
131 | if (u == _environments.end())
|
---|
132 | u = _environments.insert(_environments.begin(), std::pair< MinClassPtr, PetrogenyClassSet > (*k, PetrogenyClassSet()));
|
---|
133 |
|
---|
134 | u->second.insert(GenesisClassMapping(i->second, j));
|
---|
135 | }
|
---|
136 | }
|
---|
137 | }
|
---|
138 | }
|
---|
139 | }
|
---|
140 |
|
---|
141 | void MineralsDB::resolve( MineralPtr & rWRef )
|
---|
142 | {
|
---|
143 | if (!rWRef.isNull() && rWRef.getState() == MineralPtr::Weak)
|
---|
144 | {
|
---|
145 | MineralMap::const_iterator iMineral = _minerals.find(rWRef.getName());
|
---|
146 |
|
---|
147 | if (iMineral != _minerals.end())
|
---|
148 | rWRef.resolve(iMineral->second);
|
---|
149 | else
|
---|
150 | rWRef.makeNull();
|
---|
151 | }
|
---|
152 | }
|
---|
153 | void MineralsDB::resolve( mars::WeakReference< MineralClass > & rWRef )
|
---|
154 | {
|
---|
155 | if (!rWRef.isNull() && rWRef.getState() == mars::WeakReference< MineralClass >::Weak)
|
---|
156 | {
|
---|
157 | ClassesMap::const_iterator iClass = _classes.all.find(rWRef.getName());
|
---|
158 |
|
---|
159 | if (iClass != _classes.all.end())
|
---|
160 | rWRef.resolve(iClass->second);
|
---|
161 | else
|
---|
162 | rWRef.makeNull();
|
---|
163 | }
|
---|
164 | }
|
---|
165 | void MineralsDB::resolve( MinClassReferenceList & list )
|
---|
166 | {
|
---|
167 | for (MinClassReferenceList::iterator i = list.begin(); i != list.end(); ++i)
|
---|
168 | {
|
---|
169 | resolve (*i);
|
---|
170 | }
|
---|
171 | }
|
---|
172 | void MineralsDB::resolve( MineralReferenceList & list )
|
---|
173 | {
|
---|
174 | class MineralReferenceCompare
|
---|
175 | {
|
---|
176 | public:
|
---|
177 | inline bool operator() (const MineralReference & a, const MineralReference & b) const
|
---|
178 | {
|
---|
179 | if (a.mineral.isNull())
|
---|
180 | return !b.mineral.isNull();
|
---|
181 | else if (b.mineral.isNull())
|
---|
182 | return false;
|
---|
183 | else
|
---|
184 | {
|
---|
185 | const std::string &
|
---|
186 | aName = getName(a.mineral),
|
---|
187 | bName = getName(b.mineral);
|
---|
188 |
|
---|
189 | if (aName == bName)
|
---|
190 | return a.distributions.to_ulong() < b.distributions.to_ulong();
|
---|
191 | else
|
---|
192 | return aName < bName;
|
---|
193 | }
|
---|
194 | }
|
---|
195 | };
|
---|
196 | std::set <MineralReference, MineralReferenceCompare> tracker;
|
---|
197 |
|
---|
198 | for (MineralReferenceList::iterator i = list.begin();
|
---|
199 | i != list.end();
|
---|
200 | ++i)
|
---|
201 | {
|
---|
202 | MineralMap::const_iterator iMin = _minerals.find(getName(i->mineral));
|
---|
203 |
|
---|
204 | if (iMin != _minerals.end())
|
---|
205 | {
|
---|
206 | tracker.insert(*i);
|
---|
207 | i->mineral.resolve(iMin->second);
|
---|
208 | }
|
---|
209 | }
|
---|
210 |
|
---|
211 | MineralReferenceList::iterator i = list.begin();
|
---|
212 | if (i != list.end()) do
|
---|
213 | {
|
---|
214 | MineralGroupMap::const_iterator iClass = _groups.classes.find(getName(i->mineral));
|
---|
215 |
|
---|
216 | if (iClass != _groups.classes.end())
|
---|
217 | {
|
---|
218 | MineralReference oMineralDefault = *i;
|
---|
219 |
|
---|
220 | i = list.erase(i);
|
---|
221 | for (DirectMineralList::const_iterator iClassMin = iClass->second.begin(); iClassMin != iClass->second.end(); ++iClassMin)
|
---|
222 | {
|
---|
223 | oMineralDefault.mineral = MineralPtr (*iClassMin);
|
---|
224 | if (tracker.end() == tracker.find(oMineralDefault))
|
---|
225 | {
|
---|
226 | list.insert(i, oMineralDefault);
|
---|
227 | tracker.insert(oMineralDefault);
|
---|
228 | }
|
---|
229 | }
|
---|
230 | } else {
|
---|
231 | MineralGroups::const_iterator iGrp = _groups.all.find(getName(i->mineral));
|
---|
232 |
|
---|
233 | if (iGrp != _groups.all.end())
|
---|
234 | {
|
---|
235 | MineralReference oMineralDefault = *i;
|
---|
236 |
|
---|
237 | i = list.erase(i);
|
---|
238 | for (MineralGroupDef::MineralList::const_iterator iGrpMin = iGrp->second->members.begin(); iGrpMin != iGrp->second->members.end(); ++iGrpMin)
|
---|
239 | {
|
---|
240 | oMineralDefault.mineral = *iGrpMin;
|
---|
241 | if (tracker.end() == tracker.find(oMineralDefault))
|
---|
242 | {
|
---|
243 | list.insert(i, oMineralDefault);
|
---|
244 | tracker.insert(oMineralDefault);
|
---|
245 | }
|
---|
246 | }
|
---|
247 | } else
|
---|
248 | i++;
|
---|
249 | }
|
---|
250 | } while (i != list.end());
|
---|
251 | }
|
---|
252 |
|
---|
253 | const mars::ptr< MineralDef > MineralsDB::getMinByName( const std::string & sName ) const
|
---|
254 | {
|
---|
255 | MineralMap::const_iterator i = _minerals.find(sName);
|
---|
256 |
|
---|
257 | if (i == _minerals.end())
|
---|
258 | throw Ex("No such mineral");
|
---|
259 | else
|
---|
260 | return i->second;
|
---|
261 | }
|
---|
262 |
|
---|
263 | const mars::ptr< MineralClass > MineralsDB::getClassByName( const std::string & sName ) const
|
---|
264 | {
|
---|
265 | ClassesMap::const_iterator i = _classes.all.find(sName);
|
---|
266 |
|
---|
267 | if (i == _classes.all.end())
|
---|
268 | throw Ex("No such mineral class");
|
---|
269 | else
|
---|
270 | return i->second;
|
---|
271 | }
|
---|
272 |
|
---|
273 | mars::ptr< MineralClass > MineralsDB::addClass( const mars::ptr< MineralClass > & ptr )
|
---|
274 | {
|
---|
275 | switch (ptr->type)
|
---|
276 | {
|
---|
277 | case MineralClass::Type_Igneous: _classes.igneous[ptr->name] = ptr; break;
|
---|
278 | case MineralClass::Type_Sedimentary: _classes.sedimentary[ptr->name] = ptr; break;
|
---|
279 | }
|
---|
280 | _classes.all[ptr->name] = ptr;
|
---|
281 |
|
---|
282 | return ptr;
|
---|
283 | }
|
---|
284 |
|
---|
285 | mars::ptr< MineralGroupDef > MineralsDB::addGroup( const mars::ptr< MineralGroupDef > & ptr )
|
---|
286 | {
|
---|
287 | return _groups.all[ptr->name] = ptr;
|
---|
288 | }
|
---|
289 |
|
---|
290 | mars::ptr< MineralDef > MineralsDB::addMineral( const mars::ptr< MineralDef > & ptr )
|
---|
291 | {
|
---|
292 | return _minerals[ptr->name] = ptr;
|
---|
293 | }
|
---|
294 |
|
---|
295 | geoworld::MineralsDB::classes_const_iterator MineralsDB::beginClasses( const MineralClass::Type enmcType ) const
|
---|
296 | {
|
---|
297 | const ClassesMap * pMap = NULL;
|
---|
298 |
|
---|
299 | switch (enmcType)
|
---|
300 | {
|
---|
301 | case MineralClass::Type_Igneous: pMap = &_classes.igneous; break;
|
---|
302 | case MineralClass::Type_Sedimentary: pMap = &_classes.sedimentary; break;
|
---|
303 | default: pMap = &_classes.all; break;
|
---|
304 | }
|
---|
305 |
|
---|
306 | return classes_const_iterator(pMap->begin());
|
---|
307 | }
|
---|
308 |
|
---|
309 | geoworld::MineralsDB::classes_const_iterator MineralsDB::endClasses( const MineralClass::Type enmcType ) const
|
---|
310 | {
|
---|
311 | const ClassesMap * pMap = NULL;
|
---|
312 |
|
---|
313 | switch (enmcType)
|
---|
314 | {
|
---|
315 | case MineralClass::Type_Igneous: pMap = &_classes.igneous; break;
|
---|
316 | case MineralClass::Type_Sedimentary: pMap = &_classes.sedimentary; break;
|
---|
317 | default: pMap = &_classes.all; break;
|
---|
318 | }
|
---|
319 |
|
---|
320 | return classes_const_iterator(pMap->end());
|
---|
321 | }
|
---|
322 |
|
---|
323 | MineralsDB::PetrogenyMineralSetFacade MineralsDB::getAssociatedMinerals( const std::string & sName ) const
|
---|
324 | {
|
---|
325 | MineralMap::const_iterator i = _minerals.find(sName);
|
---|
326 |
|
---|
327 | if (i != _minerals.end())
|
---|
328 | return getAssociatedMinerals(MineralPtr(i->second));
|
---|
329 | else
|
---|
330 | return PetrogenyMineralSetFacade(_endMineralPetrogeny);
|
---|
331 | }
|
---|
332 |
|
---|
333 | MineralsDB::PetrogenyMineralSetFacade MineralsDB::getAssociatedMinerals( const MineralPtr & pMin ) const
|
---|
334 | {
|
---|
335 | PetrogenyMineralMultiMap::const_iterator i = _associations.find(pMin);
|
---|
336 |
|
---|
337 | if (i != _associations.end())
|
---|
338 | return PetrogenyMineralSetFacade(i->second);
|
---|
339 | else
|
---|
340 | return PetrogenyMineralSetFacade(_endMineralPetrogeny);
|
---|
341 | }
|
---|
342 |
|
---|
343 | MineralsDB::PetrogenyMineralSetFacade MineralsDB::getIncubatedMinerals( const std::string & sName ) const
|
---|
344 | {
|
---|
345 | MineralMap::const_iterator i = _minerals.find(sName);
|
---|
346 |
|
---|
347 | if (i != _minerals.end())
|
---|
348 | return getIncubatedMinerals(MineralPtr(i->second));
|
---|
349 | else
|
---|
350 | return PetrogenyMineralSetFacade(_endMineralPetrogeny);
|
---|
351 | }
|
---|
352 |
|
---|
353 | MineralsDB::PetrogenyMineralSetFacade MineralsDB::getIncubatedMinerals( const MineralPtr & pMin ) const
|
---|
354 | {
|
---|
355 | PetrogenyMineralMultiMap::const_iterator i = _protoliths.find(pMin);
|
---|
356 |
|
---|
357 | if (i != _protoliths.end())
|
---|
358 | return PetrogenyMineralSetFacade(i->second);
|
---|
359 | else
|
---|
360 | return PetrogenyMineralSetFacade(_endMineralPetrogeny);
|
---|
361 | }
|
---|
362 |
|
---|
363 | MineralsDB::PetrogenyMineralSetFacade MineralsDB::getHostedMinerals( const std::string & sName ) const
|
---|
364 | {
|
---|
365 | MineralMap::const_iterator i = _minerals.find(sName);
|
---|
366 |
|
---|
367 | if (i != _minerals.end())
|
---|
368 | return getHostedMinerals(MineralPtr(i->second));
|
---|
369 | else
|
---|
370 | return PetrogenyMineralSetFacade(_endMineralPetrogeny);
|
---|
371 | }
|
---|
372 |
|
---|
373 | MineralsDB::PetrogenyMineralSetFacade MineralsDB::getHostedMinerals( const MineralPtr & pMin ) const
|
---|
374 | {
|
---|
375 | PetrogenyMineralMultiMap::const_iterator i = _hosts.find(pMin);
|
---|
376 |
|
---|
377 | if (i != _hosts.end())
|
---|
378 | return PetrogenyMineralSetFacade(i->second);
|
---|
379 | else
|
---|
380 | return PetrogenyMineralSetFacade(_endMineralPetrogeny);
|
---|
381 | }
|
---|
382 |
|
---|
383 | MineralsDB::PetrogenyClassSetFacade MineralsDB::getMineralsByEnvironment( const std::string & sName ) const
|
---|
384 | {
|
---|
385 | ClassesMap::const_iterator i = _classes.all.find(sName);
|
---|
386 |
|
---|
387 | if (i != _classes.all.end())
|
---|
388 | return getMineralsByEnvironment(MinClassPtr(i->second));
|
---|
389 | else
|
---|
390 | return PetrogenyClassSetFacade(_endClassPetrogeny);
|
---|
391 | }
|
---|
392 |
|
---|
393 | MineralsDB::PetrogenyClassSetFacade MineralsDB::getMineralsByEnvironment( const MinClassPtr & pClass ) const
|
---|
394 | {
|
---|
395 | PetrogenyClassMultiMap::const_iterator i = _environments.find(pClass);
|
---|
396 |
|
---|
397 | if (i != _environments.end())
|
---|
398 | return PetrogenyClassSetFacade(i->second);
|
---|
399 | else
|
---|
400 | return PetrogenyClassSetFacade(_endClassPetrogeny);
|
---|
401 | }
|
---|
402 |
|
---|
403 | // TODO: Move?
|
---|
404 | bool PetrogenyDef::intersection( const MineralReferenceList & lstSubject, const MineralDepositList & lstObject )
|
---|
405 | {
|
---|
406 | for (MineralReferenceList::const_iterator i = lstSubject.begin(); i != lstSubject.end(); ++i)
|
---|
407 | for (MineralDepositList::const_iterator j = lstObject.begin(); j != lstObject.end(); ++j)
|
---|
408 | if (*i & *j)
|
---|
409 | return true;
|
---|
410 |
|
---|
411 | return false;
|
---|
412 | }
|
---|
413 |
|
---|
414 | // TODO: Move?
|
---|
415 | bool PetrogenyDef::intersection( const MinClassReferenceList & lstSubject, const MinClassPtr & pMinClassObject )
|
---|
416 | {
|
---|
417 | for (MinClassReferenceList::const_iterator i = lstSubject.begin(); i != lstSubject.end(); ++i)
|
---|
418 | if (*i == pMinClassObject)
|
---|
419 | return true;
|
---|
420 |
|
---|
421 | return false;
|
---|
422 | }
|
---|
423 | } |
---|