/*========================================================================= Program: bbtk Module: $RCSfile: bbtkObject.h,v $ Language: C++ Date: $Date: 2008/05/06 13:45:12 $ Version: $Revision: 1.4 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See doc/license.txt or http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ /** *\file *\brief Object : the top class of bbtk class hierarchy * */ #ifndef __bbtkObject_h__ #define __bbtkObject_h__ #include #include #include #include namespace bbtk { // The top class of bbtk class hierarchy class BBTK_EXPORT Object { public: typedef boost::shared_ptr Pointer; typedef boost::weak_ptr WeakPointer; Object(); virtual ~Object(); virtual std::string GetObjectName() const; virtual std::string GetObjectInfo() const; virtual size_t GetObjectSize() const { return sizeof(Object); } virtual size_t GetObjectInternalSize() const { return sizeof(Object); } virtual size_t GetObjectRecursiveSize() const { return sizeof(Object); } long GetUseCount() { return mThisPointer.use_count(); } static void InsertInObjectList(Pointer); static void RemoveFromObjectList(WeakPointer); static void PrintObjectListInfo(const std::string& name); // static void PrintObjectInfo(const std::string& name); static void PrintObjectInfo(const Pointer& o); static long GetObjectsCount() { return mgObjectList.size(); } /// Default objects deleter : removes object from list on deletion struct BBTK_EXPORT Deleter { Deleter() : mPointer() {} virtual void operator() (Object* p); virtual void Delete(Object* p) { delete p; } WeakPointer mPointer; }; protected: void LockThis() { mThisPointerLocked = mThisPointer.lock(); } void UnLockThis() { mThisPointerLocked = Pointer(); } // Object::Pointer GetThis() const { return mThisPointer.lock(); } template boost::shared_ptr GetThisPointer() const { return boost::dynamic_pointer_cast(mThisPointer.lock()); } template static boost::shared_ptr MakePointer(U* s, bool lock = false) { if (s->mThisPointer.lock()) { boost::shared_ptr p = s->GetThisPointer(); if (!lock) s->mThisPointerLocked.reset(); return p; } boost::shared_ptr p = boost::shared_ptr(s,Object::Deleter()); static_cast (p._internal_get_deleter(typeid(Object::Deleter))) ->mPointer = p; s->mThisPointer = p; Object::InsertInObjectList(p); if (lock) s->LockThis(); return p; } template static boost::shared_ptr MakePointer(U* s, const D& del, bool lock = false) { if (s->mThisPointer.lock()) { boost::shared_ptr p = s->GetThisPointer(); if (!lock) s->mThisPointerLocked.reset(); return p; } boost::shared_ptr p = boost::shared_ptr(s,del); static_cast (p._internal_get_deleter(typeid(D))) ->mPointer = p; s->mThisPointer = p; Object::InsertInObjectList(p); if (lock) s->LockThis(); return p; } private: typedef std::set > ObjectListType; static ObjectListType mgObjectList; WeakPointer mThisPointer; Pointer mThisPointerLocked; }; #define BBTK_OBJECT_DEFINE_SELF(CLASS) public : typedef CLASS Self; #define BBTK_FORWARD_DECLARE_POINTER(CLASS) \ typedef boost::shared_ptr CLASS ## Pointer; \ typedef boost::weak_ptr CLASS ## WeakPointer; #define BBTK_OBJECT_MINIMAL_INTERFACE \ public: \ typedef boost::shared_ptr Pointer; \ typedef boost::weak_ptr WeakPointer; \ friend struct Object::Deleter; //private: // does not work : why ? // boost::get_deleter(pt)->mPointer = pt; // #define BBTK_OBJECT_MINIMAL_INTERFACE_WITH_SELF(CLASS) \ public : typedef CLASS Self; \ BBTK_OBJECT_MINIMAL_INTERFACE; #define BBTK_OBJECT_INTERFACE(CLASS) \ BBTK_OBJECT_MINIMAL_INTERFACE_WITH_SELF(CLASS); \ public: \ std::string GetObjectName() const; \ std::string GetObjectInfo() const ; \ size_t GetObjectSize() const ; \ size_t GetObjectInternalSize() const ; \ size_t GetObjectRecursiveSize() const ; \ protected: \ CLASS(); \ CLASS(const CLASS&); \ ~CLASS(); #define BBTK_OBJECT_INTERFACE_NO_CONDES(CLASS) \ BBTK_OBJECT_MINIMAL_INTERFACE_WITH_SELF(CLASS); \ public: \ std::string GetObjectName() const; \ std::string GetObjectInfo() const ; \ size_t GetObjectSize() const ; \ size_t GetObjectInternalSize() const ; \ size_t GetObjectRecursiveSize() const ; #define BBTK_ABSTRACT_OBJECT_INTERFACE(CLASS) \ public : typedef CLASS Self; \ BBTK_OBJECT_MINIMAL_INTERFACE; \ protected: \ CLASS(); \ CLASS(const CLASS&); \ virtual ~CLASS(); //======================================================================= // A struct with one static instance // just to print object list info after main class BBTK_EXPORT StaticInitTime { public: StaticInitTime(); ~StaticInitTime(); static bool PrintObjectListInfo; private: static bbtk::Object mObject; }; /* template inline T BruteForceDownCastPointer(class U p) { } */ }// namespace bbtk #endif