| [5d1611] | 1 | /*
 | 
|---|
 | 2 |  * World.cpp
 | 
|---|
 | 3 |  *
 | 
|---|
 | 4 |  *  Created on: Feb 3, 2010
 | 
|---|
 | 5 |  *      Author: crueger
 | 
|---|
 | 6 |  */
 | 
|---|
 | 7 | 
 | 
|---|
 | 8 | #include "World.hpp"
 | 
|---|
 | 9 | 
 | 
|---|
| [d346b6] | 10 | #include "atom.hpp"
 | 
|---|
| [354859] | 11 | #include "molecule.hpp"
 | 
|---|
 | 12 | #include "periodentafel.hpp"
 | 
|---|
| [fc1b24] | 13 | #include "Descriptors/AtomDescriptor.hpp"
 | 
|---|
| [d346b6] | 14 | 
 | 
|---|
 | 15 | using namespace std;
 | 
|---|
| [4d9c01] | 16 | 
 | 
|---|
| [5d1611] | 17 | /******************************* getter and setter ************************/
 | 
|---|
| [354859] | 18 | periodentafel *&World::getPeriode(){
 | 
|---|
| [5d1611] | 19 |   return periode;
 | 
|---|
 | 20 | }
 | 
|---|
 | 21 | 
 | 
|---|
| [7a1ce5] | 22 | atom* World::getAtom(AtomDescriptor descriptor){
 | 
|---|
| [fc1b24] | 23 |   return descriptor.find();
 | 
|---|
 | 24 | }
 | 
|---|
 | 25 | 
 | 
|---|
| [7a1ce5] | 26 | vector<atom*> World::getAllAtoms(AtomDescriptor descriptor){
 | 
|---|
| [fc1b24] | 27 |   return descriptor.findAll();
 | 
|---|
 | 28 | }
 | 
|---|
 | 29 | 
 | 
|---|
| [354859] | 30 | int World::numAtoms(){
 | 
|---|
 | 31 |   return atoms.size();
 | 
|---|
 | 32 | }
 | 
|---|
 | 33 | 
 | 
|---|
 | 34 | int World::numMolecules(){
 | 
|---|
 | 35 |   return molecules_deprecated->ListOfMolecules.size();
 | 
|---|
 | 36 | }
 | 
|---|
 | 37 | 
 | 
|---|
 | 38 | molecule* World::createMolecule(){
 | 
|---|
 | 39 |   OBSERVE;
 | 
|---|
 | 40 |   molecule *mol = NULL;
 | 
|---|
 | 41 |   mol = new molecule(periode);
 | 
|---|
 | 42 |   molecules_deprecated->insert(mol);
 | 
|---|
 | 43 |   molecules.insert(mol);
 | 
|---|
 | 44 |   mol->signOn(this);
 | 
|---|
 | 45 |   return mol;
 | 
|---|
 | 46 | }
 | 
|---|
 | 47 | 
 | 
|---|
 | 48 | 
 | 
|---|
| [5d1611] | 49 | /******************************* Singleton Stuff **************************/
 | 
|---|
 | 50 | 
 | 
|---|
| [4d9c01] | 51 | // TODO: Hide boost-thread using Autotools stuff when no threads are used
 | 
|---|
| [5d1611] | 52 | World* World::theWorld = 0;
 | 
|---|
| [4d9c01] | 53 | boost::mutex World::worldLock;
 | 
|---|
 | 54 | 
 | 
|---|
| [5d1611] | 55 | 
 | 
|---|
 | 56 | 
 | 
|---|
| [7a1ce5] | 57 | World::World() :
 | 
|---|
| [354859] | 58 |     periode(new periodentafel),
 | 
|---|
| [028c2e] | 59 |     molecules_deprecated(new MoleculeListClass),
 | 
|---|
 | 60 |     dummyId(0)
 | 
|---|
| [7dad10] | 61 | {
 | 
|---|
 | 62 |   molecules_deprecated->signOn(this);
 | 
|---|
 | 63 | }
 | 
|---|
| [5d1611] | 64 | 
 | 
|---|
 | 65 | World::~World()
 | 
|---|
| [354859] | 66 | {
 | 
|---|
| [028c2e] | 67 |   molecules_deprecated->signOff(this);
 | 
|---|
 | 68 |   delete molecules_deprecated;
 | 
|---|
| [354859] | 69 |   delete periode;
 | 
|---|
 | 70 | }
 | 
|---|
| [5d1611] | 71 | 
 | 
|---|
 | 72 | World* World::get(){
 | 
|---|
 | 73 |   // boost supports RAII-Style locking, so we don't need to unlock
 | 
|---|
 | 74 |   boost::mutex::scoped_lock guard(worldLock);
 | 
|---|
 | 75 |   if(!theWorld) {
 | 
|---|
 | 76 |     theWorld = new World();
 | 
|---|
 | 77 |   }
 | 
|---|
 | 78 |   return theWorld;
 | 
|---|
 | 79 | }
 | 
|---|
 | 80 | 
 | 
|---|
 | 81 | void World::destroy(){
 | 
|---|
| [354859] | 82 |   // For legacy reasons all atoms have to be destroyed first, since unregistering would cause deadlocks otherwise
 | 
|---|
 | 83 |   theWorld->destroyLegacy();
 | 
|---|
 | 84 |   //WARNING: at this point we have a small race condition, when sombody now tries to access the world.
 | 
|---|
 | 85 | 
 | 
|---|
| [5d1611] | 86 |   // boost supports RAII-Style locking, so we don't need to unlock
 | 
|---|
 | 87 |   boost::mutex::scoped_lock guard(worldLock);
 | 
|---|
 | 88 |   delete theWorld;
 | 
|---|
 | 89 |   theWorld = 0;
 | 
|---|
 | 90 | }
 | 
|---|
 | 91 | 
 | 
|---|
 | 92 | World* World::reset(){
 | 
|---|
| [354859] | 93 |   // For legacy reasons all atoms have to be destroyed first, since unregistering would cause deadlocks otherwise
 | 
|---|
 | 94 |   theWorld->destroyLegacy();
 | 
|---|
 | 95 |   //WARNING: at this point we have a small race condition, when sombody now tries to access the world.
 | 
|---|
 | 96 | 
 | 
|---|
| [5d1611] | 97 |   World* oldWorld = 0;
 | 
|---|
 | 98 |   {
 | 
|---|
 | 99 |     // boost supports RAII-Style locking, so we don't need to unlock
 | 
|---|
 | 100 |     boost::mutex::scoped_lock guard(worldLock);
 | 
|---|
 | 101 | 
 | 
|---|
 | 102 |     oldWorld = theWorld;
 | 
|---|
 | 103 |     theWorld = new World();
 | 
|---|
 | 104 |     // oldworld does not need protection any more,
 | 
|---|
 | 105 |     // since we should have the only reference
 | 
|---|
 | 106 | 
 | 
|---|
 | 107 |     // worldLock handles access to the pointer,
 | 
|---|
 | 108 |     // not to the object
 | 
|---|
 | 109 |   } // scope-end releases the lock
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 |   // we have to let all the observers know that the
 | 
|---|
 | 112 |   // oldWorld was destroyed. oldWorld calls subjectKilled
 | 
|---|
 | 113 |   // upon destruction. Every Observer getting that signal
 | 
|---|
 | 114 |   // should see that it gets the updated new world
 | 
|---|
 | 115 |   delete oldWorld;
 | 
|---|
 | 116 | }
 | 
|---|
 | 117 | 
 | 
|---|
 | 118 | /******************************* deprecated Legacy Stuff ***********************/
 | 
|---|
 | 119 | 
 | 
|---|
| [354859] | 120 | MoleculeListClass *&World::getMolecules() {
 | 
|---|
 | 121 |   return molecules_deprecated;
 | 
|---|
| [5d1611] | 122 | }
 | 
|---|
| [4d9c01] | 123 | 
 | 
|---|
| [d346b6] | 124 | // some legacy stuff to let the World know about items created outside
 | 
|---|
 | 125 | void World::registerAtom(atom *theAtom){
 | 
|---|
 | 126 |   OBSERVE;
 | 
|---|
| [7a1ce5] | 127 |   atoms[dummyId++] = theAtom;
 | 
|---|
| [d346b6] | 128 | }
 | 
|---|
| [4d9c01] | 129 | 
 | 
|---|
| [354859] | 130 | void World::destroyLegacy(){
 | 
|---|
 | 131 |   //delete molecules_deprecated;
 | 
|---|
 | 132 | }
 | 
|---|
 | 133 | 
 | 
|---|
| [d346b6] | 134 | void World::unregisterAtom(atom *theAtom){
 | 
|---|
 | 135 |   OBSERVE;
 | 
|---|
 | 136 |   atoms.erase(theAtom->getId());
 | 
|---|
| [4d9c01] | 137 | }
 | 
|---|