• Main Page
  • Classes
  • Files
  • File List

EvSimObjectPool.h

00001 #ifndef EVSIMOBJECTPOOL_H_
00002 #define EVSIMOBJECTPOOL_H_
00003 
00004 #include "EvSimObject.h"
00005 #include "SimContext.h"
00006 
00007 #include <vector>
00008 using std::vector;
00009 
00011 class EvSimObjectPool
00012 {
00013 public:
00014 
00015     EvSimObjectPool();
00016 
00017     virtual ~EvSimObjectPool();
00018 
00020     EvSimObject::ID createObject( EvSimObjectFactory const& objFactory  );
00021 
00023     EvSimObject::ID addObject(EvSimObject *o);
00024 
00025 
00027     EvSimObject *getObject(EvSimObject::ID oid) const;
00028 
00030     void initObjects(EvSimNetwork & net);
00031 
00032     void resetObjects(InitializeContext &sim_ctxt);
00033 
00035     int numOfObjects();
00036 
00038     inline EvSimObject::ID getLastId();
00039 
00040 
00041 //***************************
00042     class Iterator
00043     {
00044     public:
00045         Iterator( vector<EvSimObject*> *vec_=NULL, size_t idx_=0):
00046                 vec(vec_), idx(idx_)
00047         { /*NOOP*/ };
00048 
00049         EvSimObject** operator->()
00050         {
00051             return &((*vec)[idx]);
00052         }
00053 
00054         EvSimObject* operator*()
00055         {
00056             return ((*vec)[idx]);
00057         }
00058 
00059         Iterator & operator=(const Iterator & other) {
00060                 vec = other.vec;
00061                 idx = other.idx;
00062                 return *this;
00063         }
00064 
00065         bool operator!=(const Iterator& other)
00066         {
00067             return ( idx != other.idx || vec!=other.vec );
00068         }
00069 
00070         Iterator& operator++()
00071         {
00072             idx++;
00073             return *this;
00074         }
00075 
00076         inline EvSimObject::ID getID(void)
00077         {
00078             return idx;
00079         };
00080 
00081     private:
00082         vector<EvSimObject*> *vec;
00083         size_t idx;
00084     };
00085 
00086 
00088 
00090     inline Iterator begin()
00091     {
00092         return Iterator( &pool, 0 );
00093     }
00094 
00096     /* \param type Integer ID specifying the type of objects
00097      */
00098     inline Iterator end()
00099     {
00100         return Iterator( &(pool), pool.size() );
00101     }
00102 
00103 protected:
00104 
00105     EvSimObject::ID addObject( EvSimObjectFactory const& objFactory, RandomEngine *rng );
00106 
00107 
00108     vector< EvSimObject*> pool;
00109 
00110 private:
00111 
00112     EvSimObject::BlockAllocator _blockAllocator;
00113 
00114 };
00115 
00116 inline EvSimObject::ID EvSimObjectPool::addObject( EvSimObjectFactory const& objFactory, RandomEngine *rng )
00117 {
00118     EvSimObject::setAllocator( _blockAllocator );
00119     return  addObject( objFactory.create( rng ) );
00120 }
00121 
00122 inline EvSimObject::ID EvSimObjectPool::createObject( EvSimObjectFactory const& objFactory  )
00123 {
00124     EvSimObject::setAllocator( _blockAllocator );
00125     return addObject( objFactory.create() );
00126 }
00127 
00128 inline int EvSimObjectPool::numOfObjects()
00129 {
00130         return pool.size();
00131 }
00132 
00133 inline EvSimObject::ID EvSimObjectPool::getLastId()
00134 {
00135     return pool.size()-1;
00136 }
00137 
00138 #endif /* EVSIMOBJECTPOOL_H_ */

Generated on Wed Sep 18 2013 11:25:40 for NEVESIM by  doxygen 1.7.1