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_REGISTERABLE
00024 #define H_SPK_REGISTERABLE
00025
00026 #include "Core/SPK_DEF.h"
00027 #include "Core/SPK_Vector3D.h"
00028
00029
00030
00031
00032 #define SPK_IMPLEMENT_REGISTERABLE(ClassName) \
00033 \
00034 virtual ClassName* clone(bool createBase) const \
00035 { \
00036 ClassName* cloneObject = new ClassName(*this); \
00037 cloneObject->copyChildren(*this,createBase); \
00038 return cloneObject; \
00039 } \
00040 \
00041 public : \
00042 virtual std::string getClassName() const {return #ClassName;}
00043
00044
00045 namespace SPK
00046 {
00048 typedef unsigned long SPK_ID;
00049
00051 extern SPK_PREFIX const SPK_ID NO_ID;
00052
00054 extern SPK_PREFIX const std::string NO_NAME;
00055
00086 class SPK_PREFIX Registerable
00087 {
00088 friend class SPKFactory;
00089
00090 public :
00091
00093
00095
00097 Registerable();
00098
00103 Registerable(const Registerable& registerable);
00104
00106
00108
00110 virtual ~Registerable();
00111
00113
00115
00123 void setShared(bool shared);
00124
00132 void setDestroyable(bool destroyable);
00133
00145 void setName(const std::string& name);
00146
00148
00150
00160 SPK_ID getSPKID() const;
00161
00167 SPK_ID getID() const;
00168
00179 unsigned int getNbReferences() const;
00180
00185 bool isRegistered() const;
00186
00191 bool isShared() const;
00192
00197 bool isDestroyable() const;
00198
00208 const std::string& getName() const;
00209
00217 virtual std::string getClassName() const = 0;
00218
00220
00222
00235 virtual Registerable* findByName(const std::string& name);
00236
00237 protected :
00238
00249 void registerChild(Registerable* child,bool registerAll);
00250
00261 Registerable* copyChild(Registerable* child,bool createBase);
00262
00273 bool destroyChild(Registerable* child,bool keepChildren);
00274
00283 void incrementChildReference(Registerable* child);
00284
00293 void decrementChildReference(Registerable* child);
00294
00311 static void registerObject(Registerable* obj,bool registerAll = false);
00312
00314
00316
00327 virtual void registerChildren(bool registerAll){};
00328
00339 virtual void copyChildren(const Registerable& object,bool createBase){};
00340
00350 virtual void destroyChildren(bool keepChildren){};
00351
00352 private :
00353
00354 SPK_ID ID;
00355 unsigned int nbReferences;
00356
00357 std::string name;
00358
00359 bool shared;
00360 bool destroyable;
00361
00362
00363 virtual void onRegister() {}
00364 virtual void onUnregister() {}
00365
00366 void incrementReference();
00367 void decrementReference();
00368
00369
00370 Registerable& operator=(const Registerable& registerable);
00371
00373
00375
00384 virtual Registerable* clone(bool createBase) const = 0;
00385 };
00386
00387
00388 inline void Registerable::setShared(bool shared)
00389 {
00390 this->shared = shared;
00391 }
00392
00393 inline void Registerable::setDestroyable(bool destroyable)
00394 {
00395 this->destroyable = destroyable;
00396 }
00397
00398 inline void Registerable::setName(const std::string& name)
00399 {
00400 this->name = name;
00401 }
00402
00403 inline SPK_ID Registerable::getSPKID() const
00404 {
00405 return ID;
00406 }
00407
00408 inline SPK_ID Registerable::getID() const
00409 {
00410 return getSPKID();
00411 }
00412
00413 inline unsigned int Registerable::getNbReferences() const
00414 {
00415 return nbReferences;
00416 }
00417
00418 inline bool Registerable::isRegistered() const
00419 {
00420 return ID != NO_ID;
00421 }
00422
00423 inline bool Registerable::isShared() const
00424 {
00425 return shared;
00426 }
00427
00428 inline bool Registerable::isDestroyable() const
00429 {
00430 return destroyable;
00431 }
00432
00433 inline const std::string& Registerable::getName() const
00434 {
00435 return name;
00436 }
00437
00438 inline Registerable* Registerable::findByName(const std::string& name)
00439 {
00440 return getName().compare(name) == 0 ? this : NULL;
00441 }
00442
00443 inline void Registerable::incrementReference()
00444 {
00445 if (isRegistered())
00446 ++nbReferences;
00447 }
00448
00449 inline void Registerable::decrementReference()
00450 {
00451 if ((isRegistered())&&(nbReferences > 0))
00452 --nbReferences;
00453 }
00454
00455 inline void Registerable::incrementChildReference(Registerable* child)
00456 {
00457 if ((isRegistered())&&(child != NULL))
00458 child->incrementReference();
00459 }
00460
00461 inline void Registerable::decrementChildReference(Registerable* child)
00462 {
00463 if ((isRegistered())&&(child != NULL))
00464 child->decrementReference();
00465 }
00466 }
00467
00468 #endif