Changes in src/World.hpp [354859:24a5e0]
- File:
-
- 1 edited
-
src/World.hpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/World.hpp
r354859 r24a5e0 9 9 #define WORLD_HPP_ 10 10 11 #include < boost/thread.hpp>11 #include <string> 12 12 #include <map> 13 13 #include <vector> 14 14 #include <set> 15 15 #include <boost/thread.hpp> 16 #include <boost/shared_ptr.hpp> 17 18 #include "defs.hpp" 16 19 #include "Patterns/Observer.hpp" 17 20 #include "Patterns/Cacheable.hpp" … … 24 27 class AtomDescriptor; 25 28 class AtomDescriptor_impl; 29 class ManipulateAtomsProcess; 30 template<typename T> 31 class AtomsCalculation; 26 32 27 33 class World : public Observable 28 34 { 35 // necessary for coupling with descriptors 29 36 friend class AtomDescriptor_impl; 37 friend class AtomDescriptor; 38 39 // Actions, calculations etc associated with the World 40 friend class ManipulateAtomsProcess; 41 template<typename> friend class AtomsCalculation; 30 42 public: 43 typedef std::map<atomId_t,atom*> AtomSet; 44 typedef std::map<moleculeId_t,molecule*> MoleculeSet; 31 45 32 46 /***** getter and setter *****/ 33 47 // reference to pointer is used for legacy reason... reference will be removed latter to keep encapsulation of World object 48 /** 49 * returns the periodentafel for the world. 50 */ 34 51 periodentafel *&getPeriode(); 52 53 /** 54 * returns the first atom that matches a given descriptor. 55 * Do not rely on ordering for descriptors that match more than one atom. 56 */ 35 57 atom* getAtom(AtomDescriptor descriptor); 58 59 /** 60 * returns a vector containing all atoms that match a given descriptor 61 */ 36 62 std::vector<atom*> getAllAtoms(AtomDescriptor descriptor); 63 std::vector<atom*> getAllAtoms(); 64 65 /** 66 * returns a calculation that calls a given function on all atoms matching a descriptor. 67 * the calculation is not called at this point and can be used as an action, i.e. be stored in 68 * menus, be kept around for later use etc. 69 */ 70 template<typename T> AtomsCalculation<T>* calcOnAtoms(boost::function<T(atom*)>,std::string,AtomDescriptor); 71 template<typename T> AtomsCalculation<T>* calcOnAtoms(boost::function<T(atom*)>,std::string); 72 73 /** 74 * get the number of atoms in the World 75 */ 37 76 int numAtoms(); 77 78 /** 79 * get the number of molecules in the World 80 */ 38 81 int numMolecules(); 39 82 40 83 /***** Methods to work with the World *****/ 84 85 /** 86 * create a new molecule. This method should be used whenever any kind of molecule is needed. Assigns a unique 87 * ID to the molecule and stores it in the World for later retrieval. Do not create molecules directly. 88 */ 41 89 molecule *createMolecule(); 90 91 void destroyMolecule(molecule*); 92 void destroyMolecule(moleculeId_t); 93 94 /** 95 * Create a new atom. This method should be used whenever any atom is needed. Assigns a unique ID and stores 96 * the atom in the World. If the atom is not destroyed it will automatically be destroyed when the world ends. 97 */ 98 atom *createAtom(); 99 100 /** 101 * Registers a Atom unknown to world. Needed in some rare cases, e.g. when cloning atoms, or in some unittests. 102 * Do not re-register Atoms already known to the world since this will cause double-frees. 103 */ 104 int registerAtom(atom*); 105 106 /** 107 * Delete some atom and erase it from the world. Use this whenever you need to destroy any atom. Do not call delete on 108 * atom directly since this will leave the pointer inside the world. 109 */ 110 void destroyAtom(atom*); 111 112 /** 113 * Delete some atom and erase it from the world. Use this whenever you need to destroy any atom. Do not call delete on 114 * atom directly since this will leave the pointer inside the world. 115 */ 116 void destroyAtom(atomId_t); 117 118 /** 119 * Produces a process that calls a function on all Atoms matching a given descriptor. The process is not 120 * called at this time, so it can be passed around, stored inside menuItems etc. 121 */ 122 ManipulateAtomsProcess* manipulateAtoms(boost::function<void(atom*)>,std::string,AtomDescriptor); 123 ManipulateAtomsProcess* manipulateAtoms(boost::function<void(atom*)>,std::string); 124 125 protected: 126 /**** Iterators to use internal data structures */ 127 class AtomIterator { 128 public: 129 AtomIterator(); 130 AtomIterator(AtomDescriptor, World*); 131 AtomIterator(const AtomIterator&); 132 AtomIterator& operator=(const AtomIterator&); 133 AtomIterator& operator++(); // prefix 134 AtomIterator operator++(int); // postfix with dummy parameter 135 bool operator==(const AtomIterator&); 136 bool operator==(const AtomSet::iterator&); 137 bool operator!=(const AtomIterator&); 138 bool operator!=(const AtomSet::iterator&); 139 atom* operator*(); 140 141 int getCount(); 142 protected: 143 void advanceState(); 144 AtomSet::iterator state; 145 boost::shared_ptr<AtomDescriptor_impl> descr; 146 int index; 147 148 World* world; 149 }; 150 151 /** 152 * returns an iterator over all Atoms matching a given descriptor. 153 * used for internal purposes, like AtomProcesses and AtomCalculations. 154 */ 155 AtomIterator getAtomIter(AtomDescriptor descr); 156 157 /** 158 * returns an iterator to the end of the AtomSet. Due to overloading this iterator 159 * can be compared to iterators produced by getAtomIter (see the mis-matching types). 160 * Thus it can be used to detect when such an iterator is at the end of the list. 161 * used for internal purposes, like AtomProcesses and AtomCalculations. 162 */ 163 AtomSet::iterator atomEnd(); 164 165 /******* Internal manipulation routines for double callback and Observer mechanism ******/ 166 void doManipulate(ManipulateAtomsProcess *); 167 42 168 private: 43 169 periodentafel *periode; 44 std::map<int,atom*> atoms; 45 std::set<molecule*> molecules; 170 AtomSet atoms; 171 atomId_t currAtomId; //!< stores the next available Id for atoms 172 MoleculeSet molecules; 173 moleculeId_t currMoleculeId; 46 174 47 175 48 176 /***** singleton Stuff *****/ 49 177 public: 178 179 /** 180 * get the currently active instance of the World. 181 */ 50 182 static World* get(); 183 184 /** 185 * destroy the currently active instance of the World. 186 */ 51 187 static void destroy(); 188 189 /** 190 * destroy the currently active instance of the World and immidiately 191 * create a new one. Use this to reset while somebody is still Observing 192 * the world and should reset the observed instance. All observers will be 193 * sent the subjectKille() message from the old world. 194 */ 52 195 static World* reset(); 53 196 54 197 private: 198 /** 199 * private constructor to ensure creation of the world using 200 * the singleton pattern. 201 */ 55 202 World(); 203 204 /** 205 * private destructor to ensure destruction of the world using the 206 * singleton pattern. 207 */ 56 208 virtual ~World(); 57 209 … … 68 220 MoleculeListClass *&getMolecules(); 69 221 70 // functions used for the WorldContent template mechanism71 void registerAtom(atom *theAtom);72 void unregisterAtom(atom *theAtom);73 222 private: 74 // this function cleans up anything that cannot be cleaned while the lock is active75 // at a later point all these cleanups have to be moved to the World Class so the deadlock and76 // race condition can both be avoided.77 void destroyLegacy();78 79 223 MoleculeListClass *molecules_deprecated; 80 81 // this is needed to assign unique IDs to atoms... so far82 // IDs are not assigned upon Atom creation, so we cannot query the ID83 // during construction. By using the dummy ID we can make sure all atoms84 // are actually stored in the map and don't overwrite each other.85 int dummyId;86 224 }; 87 225
Note:
See TracChangeset
for help on using the changeset viewer.
