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_ */