--- /dev/null
+/*=========================================================================
+
+ Program: bbtk
+ Module: $RCSfile: bbtkObject.h,v $
+ Language: C++
+ Date: $Date: 2008/04/18 12:59:15 $
+ Version: $Revision: 1.1 $
+
+ 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 <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <set>
+
+namespace bbtk
+{
+
+ // The top class of bbtk class hierarchy
+ class Object
+ {
+ public:
+ typedef boost::shared_ptr<Object> Pointer;
+ typedef boost::weak_ptr<Object> 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();
+ static void PrintObjectInfo(const std::string& name);
+ static void PrintObjectInfo(const Pointer& o);
+ /// Default objects deleter : removes object from list on deletion
+ struct 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 <class U>
+ boost::shared_ptr<U> GetThisPointer() const
+ {
+ return boost::dynamic_pointer_cast<U>(mThisPointer.lock());
+ }
+ template <class U>
+ static boost::shared_ptr<U> MakePointer(U* s, bool lock = false)
+ {
+ if (s->mThisPointer.lock())
+ {
+ boost::shared_ptr<U> p = s->GetThisPointer<U>();
+ if (!lock) s->mThisPointerLocked.reset();
+ return p;
+ }
+ boost::shared_ptr<U> p = boost::shared_ptr<U>(s,Object::Deleter());
+ static_cast<Object::Deleter*>
+ (p._internal_get_deleter(typeid(Object::Deleter)))
+ ->mPointer = p;
+ s->mThisPointer = p;
+ Object::InsertInObjectList(p);
+ if (lock) s->LockThis();
+ return p;
+ }
+ template <class U, class D>
+ static boost::shared_ptr<U> MakePointer(U* s,
+ const D& del,
+ bool lock = false)
+ {
+ if (s->mThisPointer.lock())
+ {
+ boost::shared_ptr<U> p = s->GetThisPointer<U>();
+ if (!lock) s->mThisPointerLocked.reset();
+ return p;
+ }
+ boost::shared_ptr<U> p = boost::shared_ptr<U>(s,del);
+ static_cast<D*>
+ (p._internal_get_deleter(typeid(D)))
+ ->mPointer = p;
+ s->mThisPointer = p;
+ Object::InsertInObjectList(p);
+ if (lock) s->LockThis();
+ return p;
+ }
+
+
+ private:
+ typedef std::set<boost::weak_ptr<Object> > 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> CLASS ## Pointer; \
+ typedef boost::weak_ptr<CLASS> CLASS ## WeakPointer;
+
+
+#define BBTK_OBJECT_MINIMAL_INTERFACE \
+ public: \
+ typedef boost::shared_ptr<Self> Pointer; \
+ typedef boost::weak_ptr<Self> WeakPointer; \
+ friend struct Object::Deleter;
+ //private:
+
+ // does not work : why ?
+ // boost::get_deleter<Deleter,Pointer>(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_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
+ struct StaticInitTime
+ {
+ StaticInitTime();
+ ~StaticInitTime();
+
+
+ static bool PrintObjectListInfo;
+ private:
+ static Object mObject;
+ };
+
+
+ /*
+ template <class T, class U>
+ inline T BruteForceDownCastPointer(class U p)
+ {
+
+ }
+ */
+
+}// namespace bbtk
+
+#endif
+