]> Creatis software - bbtk.git/blobdiff - kernel/src/bbtkObject.h
=== MAJOR RELEASE ====
[bbtk.git] / kernel / src / bbtkObject.h
diff --git a/kernel/src/bbtkObject.h b/kernel/src/bbtkObject.h
new file mode 100644 (file)
index 0000000..21109d3
--- /dev/null
@@ -0,0 +1,193 @@
+/*=========================================================================
+                                                                                
+  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
+