Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/World.hpp

    r6e97e5 r31af19  
    1616#include <boost/shared_ptr.hpp>
    1717
    18 #include "types.hpp"
    19 #include "Descriptors/SelectiveIterator.hpp"
     18#include "defs.hpp"
    2019#include "Patterns/Observer.hpp"
    2120#include "Patterns/Cacheable.hpp"
    22 #include "Patterns/Singleton.hpp"
    23 
    2421
    2522// forward declarations
     
    3633class AtomsCalculation;
    3734
    38 
    39 
    40 class World : public Singleton<World>, public Observable
     35class World : public Observable
    4136{
    42 
    43 // Make access to constructor and destructor possible from inside the singleton
    44 friend class Singleton<World>;
    45 
    4637// necessary for coupling with descriptors
    4738friend class AtomDescriptor_impl;
     
    5445template<typename> friend class AtomsCalculation;
    5546public:
    56 
    57   // Types for Atom and Molecule structures
    5847  typedef std::map<atomId_t,atom*> AtomSet;
    5948  typedef std::map<moleculeId_t,molecule*> MoleculeSet;
     
    161150
    162151  // Atoms
    163   typedef SelectiveIterator<atom*,AtomSet,AtomDescriptor> AtomIterator;
     152
     153  class AtomIterator :
     154    public std::iterator<std::iterator_traits<AtomSet::iterator>::difference_type,
     155                         std::iterator_traits<AtomSet::iterator>::value_type,
     156                         std::iterator_traits<AtomSet::iterator>::pointer,
     157                         std::iterator_traits<AtomSet::iterator>::reference>
     158  {
     159  public:
     160
     161    typedef AtomSet::iterator _Iter;
     162    typedef _Iter::value_type value_type;
     163    typedef _Iter::difference_type difference_type;
     164    typedef _Iter::pointer pointer;
     165    typedef _Iter::reference reference;
     166    typedef _Iter::iterator_category iterator_category;
     167
     168
     169    AtomIterator();
     170    AtomIterator(AtomDescriptor, World*);
     171    AtomIterator(const AtomIterator&);
     172    AtomIterator& operator=(const AtomIterator&);
     173    AtomIterator& operator++();     // prefix
     174    AtomIterator  operator++(int);  // postfix with dummy parameter
     175    bool operator==(const AtomIterator&);
     176    bool operator==(const AtomSet::iterator&);
     177    bool operator!=(const AtomIterator&);
     178    bool operator!=(const AtomSet::iterator&);
     179    atom* operator*();
     180
     181    int getCount();
     182  protected:
     183    void advanceState();
     184    AtomSet::iterator state;
     185    boost::shared_ptr<AtomDescriptor_impl>  descr;
     186    int index;
     187
     188    World* world;
     189  };
    164190
    165191  /**
     
    175201   * used for internal purposes, like AtomProcesses and AtomCalculations.
    176202   */
    177   AtomIterator atomEnd();
     203  AtomSet::iterator atomEnd();
    178204
    179205  // Molecules
    180206
    181   typedef SelectiveIterator<molecule*,MoleculeSet,MoleculeDescriptor> MoleculeIterator;
     207  class MoleculeIterator :
     208    public std::iterator<std::iterator_traits<MoleculeSet::iterator>::difference_type,
     209                         std::iterator_traits<MoleculeSet::iterator>::value_type,
     210                         std::iterator_traits<MoleculeSet::iterator>::pointer,
     211                         std::iterator_traits<MoleculeSet::iterator>::reference>
     212  {
     213  public:
     214
     215    typedef MoleculeSet::iterator _Iter;
     216    typedef _Iter::value_type value_type;
     217    typedef _Iter::difference_type difference_type;
     218    typedef _Iter::pointer pointer;
     219    typedef _Iter::reference reference;
     220    typedef _Iter::iterator_category iterator_category;
     221
     222    MoleculeIterator();
     223    MoleculeIterator(MoleculeDescriptor, World*);
     224    MoleculeIterator(const MoleculeIterator&);
     225    MoleculeIterator& operator=(const MoleculeIterator&);
     226    MoleculeIterator& operator++();     // prefix
     227    MoleculeIterator  operator++(int);  // postfix with dummy parameter
     228    bool operator==(const MoleculeIterator&);
     229    bool operator==(const MoleculeSet::iterator&);
     230    bool operator!=(const MoleculeIterator&);
     231    bool operator!=(const MoleculeSet::iterator&);
     232    molecule* operator*();
     233
     234    int getCount();
     235  protected:
     236    void advanceState();
     237    MoleculeSet::iterator state;
     238    boost::shared_ptr<MoleculeDescriptor_impl>  descr;
     239    int index;
     240
     241    World* world;
     242  };
    182243
    183244  /**
     
    193254   * used for internal purposes, like MoleculeProcesses and MoleculeCalculations.
    194255   */
    195   MoleculeIterator moleculeEnd();
     256  MoleculeSet::iterator moleculeEnd();
    196257
    197258
     
    206267
    207268  periodentafel *periode;
    208 public:
    209269  AtomSet atoms;
    210 private:
    211270  std::set<atomId_t> atomIdPool; //<!stores the pool for all available AtomIds below currAtomId
    212271  atomId_t currAtomId; //!< stores the next available Id for atoms
    213272  MoleculeSet molecules;
    214273  moleculeId_t currMoleculeId;
     274
     275
     276  /***** singleton Stuff *****/
     277public:
     278
     279  /**
     280   * get the currently active instance of the World.
     281   */
     282  static World* get();
     283
     284  /**
     285   * destroy the currently active instance of the World.
     286   */
     287  static void destroy();
     288
     289  /**
     290   * destroy the currently active instance of the World and immidiately
     291   * create a new one. Use this to reset while somebody is still Observing
     292   * the world and should reset the observed instance. All observers will be
     293   * sent the subjectKille() message from the old world.
     294   */
     295  static World* reset();
     296
    215297private:
    216298  /**
     
    225307   */
    226308  virtual ~World();
     309
     310  static World *theWorld;
     311  // this mutex only saves the singleton pattern...
     312  // use other mutexes to protect internal data as well
     313  // this mutex handles access to the pointer, not to the object!!!
     314  static boost::mutex worldLock;
    227315
    228316  /*****
Note: See TracChangeset for help on using the changeset viewer.