00001
00002
00003
00004
00005
00006
00007
00008
00010
00011
00012 #ifndef __LIDAR_OBJECT_H__
00013 #define __LIDAR_OBJECT_H__
00014
00015 #include "lidar/Atomic.h"
00016
00017 LT_BEGIN_LIDAR_NAMESPACE
00018
00034 class Object
00035 {
00045 #define ABSTRACT_OBJECT(classname) \
00046 DISABLE_COPY(classname); \
00047 protected: \
00048 classname(void); \
00049 virtual ~classname(void)
00050
00055 #define CONCRETE_OBJECT(classname) \
00056 ABSTRACT_OBJECT(classname); \
00057 public: \
00058 static classname *create(void)
00059
00060 #define IMPLEMENT_OBJECT_CREATE(classname) \
00061 classname * classname::create(void) { return new classname; }
00062
00063 ABSTRACT_OBJECT(Object);
00064 public:
00068 void retain(void) const;
00069
00074 void release(void) const;
00075
00076 protected:
00078 static void *operator new(size_t size);
00080 static void operator delete(void *ptr);
00081
00082 private:
00083 mutable AtomicInt m_refCount;
00084 };
00085
00090 template<typename OBJECT> static inline OBJECT *RETAIN(OBJECT *obj)
00091 {
00092 if(obj != NULL)
00093 obj->retain();
00094 return obj;
00095 }
00096
00101 template<typename OBJECT> static inline void RELEASE(OBJECT *&obj)
00102 {
00103 if(obj != NULL)
00104 {
00105 obj->release();
00106 obj = NULL;
00107 }
00108 }
00109
00157 template<typename TYPE>
00158 class Scoped
00159 {
00160 public:
00162 ~Scoped(void) { RELEASE(m_object); }
00163
00165 Scoped(void) : m_object(TYPE::create()) {}
00166
00175 Scoped(TYPE *object) : m_object(object) {}
00176
00182 Scoped &operator=(TYPE *object)
00183 {
00184 if(object != m_object)
00185 {
00186 RELEASE(m_object);
00187 m_object = RETAIN(object);
00188 }
00189 return *this;
00190 }
00191
00197 Scoped(const Scoped &object) : m_object(RETAIN(object.m_object)) {}
00198
00204 Scoped &operator=(const Scoped &object)
00205 {
00206 if(m_object != object.m_object)
00207 {
00208 RELEASE(m_object);
00209 m_object = RETAIN(object.m_object);
00210 }
00211 return *this;
00212 }
00213
00215 TYPE *operator->(void) { return m_object; }
00217 TYPE &operator*(void) { return *m_object; }
00218 #ifndef SWIG
00219
00220 operator TYPE *&(void) { return m_object; }
00221 #endif
00222
00223 private:
00224 TYPE *m_object;
00225 };
00226
00227 LT_END_LIDAR_NAMESPACE
00228 #endif // __LIDAR_OBJECT_H__