Changes in src/World.cpp [387b36:70378e]
- File:
-
- 1 edited
-
src/World.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/World.cpp
r387b36 r70378e 1 1 /* 2 * World.cpp2 * world.cpp 3 3 * 4 * Created on: Feb3, 20104 * Created on: Mar 3, 2010 5 5 * Author: crueger 6 6 */ … … 8 8 #include "World.hpp" 9 9 10 #include "atom.hpp" 11 #include "config.hpp" 12 #include "molecule.hpp" 13 #include "periodentafel.hpp" 14 #include "Descriptors/AtomDescriptor.hpp" 15 #include "Descriptors/AtomDescriptor_impl.hpp" 16 #include "Descriptors/MoleculeDescriptor.hpp" 17 #include "Descriptors/MoleculeDescriptor_impl.hpp" 18 #include "Descriptors/SelectiveIterator_impl.hpp" 19 #include "Actions/ManipulateAtomsProcess.hpp" 10 double *World::cell_size = 0; 20 11 21 #include "Patterns/Singleton_impl.hpp" 12 /** Constructor of World. 13 * 14 */ 15 World::World() 16 { 17 cell_size = new double[6]; 18 }; 22 19 23 using namespace std; 20 /** Destructor of World. 21 * 22 */ 23 World::~World() 24 { 25 delete[](cell_size); 26 }; 24 27 25 /******************************* getter and setter ************************/ 26 periodentafel *&World::getPeriode(){ 27 return periode; 28 29 // TODO: Hide boost-thread using Autotools stuff when no threads are used 30 World* World::theWorld = 0; 31 32 33 World* World::get(){ 34 // boost supports RAII-Style locking, so we don't need to unlock 35 if(!theWorld) { 36 theWorld = new World(); 37 } 38 return theWorld; 28 39 } 29 40 30 config *&World::getConfig(){ 31 return configuration; 41 void World::destroy(){ 42 delete theWorld; 43 theWorld = 0; 32 44 } 33 45 34 // Atoms 46 World* World::reset(){ 47 World* oldWorld = 0; 48 { 49 oldWorld = theWorld; 50 theWorld = new World(); 51 // oldworld does not need protection any more, 52 // since we should have the only reference 35 53 36 atom* World::getAtom(AtomDescriptor descriptor){ 37 return descriptor.find(); 54 // worldLock handles access to the pointer, 55 // not to the object 56 } // scope-end releases the lock 57 58 // we have to let all the observers know that the 59 // oldWorld was destroyed. oldWorld calls subjectKilled 60 // upon destruction. Every Observer getting that signal 61 // should see that it gets the updated new world 62 delete oldWorld; 38 63 } 39 40 vector<atom*> World::getAllAtoms(AtomDescriptor descriptor){41 return descriptor.findAll();42 }43 44 vector<atom*> World::getAllAtoms(){45 return getAllAtoms(AllAtoms());46 }47 48 int World::numAtoms(){49 return atoms.size();50 }51 52 // Molecules53 54 molecule *World::getMolecule(MoleculeDescriptor descriptor){55 return descriptor.find();56 }57 58 std::vector<molecule*> World::getAllMolecules(MoleculeDescriptor descriptor){59 return descriptor.findAll();60 }61 62 std::vector<molecule*> World::getAllMolecules(){63 return getAllMolecules(AllMolecules());64 }65 66 int World::numMolecules(){67 return molecules_deprecated->ListOfMolecules.size();68 }69 70 // system71 72 double * World::getDomain() {73 return cell_size;74 }75 76 void World::setDomain(double * matrix)77 {78 79 }80 81 std::string World::getDefaultName() {82 return defaultName;83 }84 85 void World::setDefaultName(std::string name)86 {87 defaultName = name;88 };89 90 int World::getExitFlag() {91 return ExitFlag;92 }93 94 void World::setExitFlag(int flag) {95 if (ExitFlag < flag)96 ExitFlag = flag;97 }98 99 /******************** Methods to change World state *********************/100 101 molecule* World::createMolecule(){102 OBSERVE;103 molecule *mol = NULL;104 mol = NewMolecule();105 assert(!molecules.count(currMoleculeId));106 mol->setId(currMoleculeId++);107 // store the molecule by ID108 molecules[mol->getId()] = mol;109 mol->signOn(this);110 return mol;111 }112 113 void World::destroyMolecule(molecule* mol){114 OBSERVE;115 destroyMolecule(mol->getId());116 }117 118 void World::destroyMolecule(moleculeId_t id){119 OBSERVE;120 molecule *mol = molecules[id];121 assert(mol);122 DeleteMolecule(mol);123 molecules.erase(id);124 }125 126 double *World::cell_size = NULL;127 128 atom *World::createAtom(){129 OBSERVE;130 atomId_t id = getNextAtomId();131 atom *res = NewAtom(id);132 res->setWorld(this);133 // store the atom by ID134 atoms[res->getId()] = res;135 return res;136 }137 138 139 int World::registerAtom(atom *atom){140 OBSERVE;141 atomId_t id = getNextAtomId();142 atom->setId(id);143 atom->setWorld(this);144 atoms[atom->getId()] = atom;145 return atom->getId();146 }147 148 void World::destroyAtom(atom* atom){149 OBSERVE;150 int id = atom->getId();151 destroyAtom(id);152 }153 154 void World::destroyAtom(atomId_t id) {155 OBSERVE;156 atom *atom = atoms[id];157 assert(atom);158 DeleteAtom(atom);159 atoms.erase(id);160 releaseAtomId(id);161 }162 163 bool World::changeAtomId(atomId_t oldId, atomId_t newId, atom* target){164 OBSERVE;165 // in case this call did not originate from inside the atom, we redirect it,166 // to also let it know that it has changed167 if(!target){168 target = atoms[oldId];169 assert(target && "Atom with that ID not found");170 return target->changeId(newId);171 }172 else{173 if(reserveAtomId(newId)){174 atoms.erase(oldId);175 atoms.insert(pair<atomId_t,atom*>(newId,target));176 return true;177 }178 else{179 return false;180 }181 }182 }183 184 ManipulateAtomsProcess* World::manipulateAtoms(boost::function<void(atom*)> op,std::string name,AtomDescriptor descr){185 return new ManipulateAtomsProcess(op, descr,name,true);186 }187 188 ManipulateAtomsProcess* World::manipulateAtoms(boost::function<void(atom*)> op,std::string name){189 return manipulateAtoms(op,name,AllAtoms());190 }191 192 /********************* Internal Change methods for double Callback and Observer mechanism ********/193 194 void World::doManipulate(ManipulateAtomsProcess *proc){195 proc->signOn(this);196 {197 OBSERVE;198 proc->doManipulate(this);199 }200 proc->signOff(this);201 }202 /******************************* IDManagement *****************************/203 204 // Atoms205 206 atomId_t World::getNextAtomId(){207 // see if we can reuse some Id208 if(atomIdPool.empty()){209 return currAtomId++;210 }211 else{212 // we give out the first ID from the pool213 atomId_t id = *(atomIdPool.begin());214 atomIdPool.erase(id);215 return id;216 }217 }218 219 void World::releaseAtomId(atomId_t id){220 atomIdPool.insert(id);221 // defragmentation of the pool222 set<atomId_t>::reverse_iterator iter;223 // go through all Ids in the pool that lie immediately below the border224 while(!atomIdPool.empty() && *(atomIdPool.rbegin())==(currAtomId-1)){225 atomIdPool.erase(--currAtomId);226 }227 }228 229 bool World::reserveAtomId(atomId_t id){230 if(id>=currAtomId ){231 // add all ids between the new one and current border as available232 for(atomId_t pos=currAtomId; pos<id; ++pos){233 atomIdPool.insert(pos);234 }235 currAtomId=id+1;236 return true;237 }238 else if(atomIdPool.count(id)){239 atomIdPool.erase(id);240 return true;241 }242 else{243 // this ID could not be reserved244 return false;245 }246 }247 248 // Molecules249 250 /******************************* Iterators ********************************/251 252 // Build the AtomIterator from template253 CONSTRUCT_SELECTIVE_ITERATOR(atom*,World::AtomSet,AtomDescriptor);254 255 256 World::AtomIterator World::getAtomIter(AtomDescriptor descr){257 return AtomIterator(descr,atoms);258 }259 260 World::AtomIterator World::atomEnd(){261 return AtomIterator(AllAtoms(),atoms,atoms.end());262 }263 264 // build the MoleculeIterator from template265 CONSTRUCT_SELECTIVE_ITERATOR(molecule*,World::MoleculeSet,MoleculeDescriptor);266 267 World::MoleculeIterator World::getMoleculeIter(MoleculeDescriptor descr){268 return MoleculeIterator(descr,molecules);269 }270 271 World::MoleculeIterator World::moleculeEnd(){272 return MoleculeIterator(AllMolecules(),molecules,molecules.end());273 }274 275 /******************************* Singleton Stuff **************************/276 277 World::World() :278 periode(new periodentafel),279 configuration(new config),280 ExitFlag(0),281 atoms(),282 currAtomId(0),283 molecules(),284 currMoleculeId(0),285 molecules_deprecated(new MoleculeListClass(this))286 {287 cell_size = new double[6];288 cell_size[0] = 20.;289 cell_size[1] = 0.;290 cell_size[2] = 20.;291 cell_size[3] = 0.;292 cell_size[4] = 0.;293 cell_size[5] = 20.;294 defaultName = "none";295 molecules_deprecated->signOn(this);296 }297 298 World::~World()299 {300 molecules_deprecated->signOff(this);301 delete[] cell_size;302 delete molecules_deprecated;303 delete periode;304 delete configuration;305 MoleculeSet::iterator molIter;306 for(molIter=molecules.begin();molIter!=molecules.end();++molIter){307 DeleteMolecule((*molIter).second);308 }309 molecules.clear();310 AtomSet::iterator atIter;311 for(atIter=atoms.begin();atIter!=atoms.end();++atIter){312 DeleteAtom((*atIter).second);313 }314 atoms.clear();315 }316 317 // Explicit instantiation of the singleton mechanism at this point318 319 CONSTRUCT_SINGLETON(World)320 321 /******************************* deprecated Legacy Stuff ***********************/322 323 MoleculeListClass *&World::getMolecules() {324 return molecules_deprecated;325 }
Note:
See TracChangeset
for help on using the changeset viewer.
