00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022
00023 #ifndef H_SPK_FACTORY
00024 #define H_SPK_FACTORY
00025
00026 #include "Core/SPK_DEF.h"
00027 #include "Core/SPK_Registerable.h"
00028
00029
00044 #define SPK_Copy(ClassName,arg) \
00045 dynamic_cast<ClassName*>(SPK::SPKFactory::getInstance().copy(arg))
00046
00060 #define SPK_Get(ClassName,ID) \
00061 dynamic_cast<ClassName*>(SPK::SPKFactory::getInstance().get(ID))
00062
00068 #define SPK_Destroy(arg) \
00069 SPK::SPKFactory::getInstance().destroy(arg)
00070
00076 #define SPK_Create(object) \
00077 SPK::SPKFactory::getInstance().create(object)
00078
00079 namespace SPK
00080 {
00117 class SPK_PREFIX SPKFactory
00118 {
00119 friend class Registerable;
00120
00121 public :
00122
00127 static SPKFactory& getInstance();
00128
00129 static void destroyInstance();
00130
00135 size_t getNbObjects() const;
00136
00142 SPK_ID create(const Registerable& base);
00143
00152 Registerable* copy(SPK_ID ID);
00153
00163 Registerable* copy(const Registerable* registerable);
00164
00173 Registerable* get(SPK_ID ID);
00174
00191 bool destroy(SPK_ID ID,bool checkNbReferences = true);
00192
00205 bool destroy(Registerable* registerable,bool checkNbReferences = true);
00206
00208 void destroyAll();
00209
00214 void trace(SPK_ID ID);
00215
00223 void trace(const Registerable* registerable);
00224
00226 void traceAll();
00227
00238 Registerable* findByName(const std::string& name);
00239
00240 private :
00241
00242 static SPKFactory* instance;
00243 static SPK_ID currentID;
00244
00245 std::map<SPK_ID,Registerable*> SPKRegister;
00246 std::map<const Registerable*,Registerable*> SPKAdresses;
00247
00248 void traceObject(const std::map<SPK_ID,Registerable*>::iterator& it,bool nextLine);
00249
00250 bool isAlreadyProcessed(const Registerable* source);
00251 Registerable* getProcessedObject(const Registerable* source);
00252 void markAsProcessed(const Registerable* source,Registerable* object);
00253
00254 Registerable* registerObject(Registerable* object);
00255 void unregisterObject(std::map<SPK_ID,Registerable*>::iterator& it,bool keepChildren = false);
00256 bool unregisterObject(SPK_ID ID,bool keepChildren = false);
00257
00258
00259 SPKFactory(){};
00260 SPKFactory(const SPKFactory&){};
00261 ~SPKFactory(){this->destroyAll();}
00262
00263 #ifdef SPK_DEBUG
00264 size_t nbAlloc;
00265 size_t nbDesalloc;
00266 #endif
00267 };
00268
00269
00270 inline size_t SPKFactory::getNbObjects() const
00271 {
00272 return SPKRegister.size();
00273 }
00274
00275 inline bool SPKFactory::isAlreadyProcessed(const Registerable* source)
00276 {
00277 return SPKAdresses.find(source) != SPKAdresses.end();
00278 }
00279
00280 inline Registerable* SPKFactory::getProcessedObject(const Registerable* source)
00281 {
00282 return SPKAdresses.find(source)->second;
00283 }
00284
00285 inline void SPKFactory::markAsProcessed(const Registerable* source,Registerable* object)
00286 {
00287 SPKAdresses.insert(std::pair<const Registerable*,Registerable*>(source,object));
00288 }
00289 }
00290
00291 #endif