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 int retain(void) const;
00069
00074 int release(void) const;
00075
00076 private:
00077 mutable AtomicInt m_refCount;
00078 };
00079
00084 template<typename OBJECT> static inline OBJECT *RETAIN(OBJECT *obj)
00085 {
00086 if(obj != NULL)
00087 obj->retain();
00088 return obj;
00089 }
00090
00095 template<typename OBJECT> static inline void RELEASE(OBJECT *&obj)
00096 {
00097 if(obj != NULL)
00098 {
00099 obj->release();
00100 obj = NULL;
00101 }
00102 }
00103
00151 template<typename TYPE>
00152 class Scoped
00153 {
00154 public:
00156 ~Scoped(void) { RELEASE(m_object); }
00157
00159 Scoped(void) : m_object(TYPE::create()) {}
00160
00169 Scoped(TYPE *object) : m_object(object) {}
00170
00176 Scoped &operator=(TYPE *object)
00177 {
00178 if(object != m_object)
00179 {
00180 RELEASE(m_object);
00181 m_object = RETAIN(object);
00182 }
00183 return *this;
00184 }
00185 Scoped &operator=(const TYPE *object)
00186 {
00187 if(object != m_object)
00188 {
00189 RELEASE(m_object);
00190 m_object = RETAIN(const_cast<TYPE *>(object));
00191 }
00192 return *this;
00193 }
00194
00200 Scoped(const Scoped &object) : m_object(RETAIN(object.m_object)) {}
00201
00207 Scoped &operator=(const Scoped &object)
00208 {
00209 if(m_object != object.m_object)
00210 {
00211 RELEASE(m_object);
00212 m_object = RETAIN(object.m_object);
00213 }
00214 return *this;
00215 }
00216
00218 TYPE *operator->(void) { return m_object; }
00219 const TYPE *operator->(void) const { return m_object; }
00221 TYPE &operator*(void) { return *m_object; }
00222 const TYPE &operator*(void) const { return *m_object; }
00223 #ifndef SWIG
00224
00225 operator TYPE *&(void) { return m_object; }
00226 operator const TYPE *&(void) const { return const_cast<const TYPE *&>(m_object); }
00227 #endif
00228
00229 private:
00230 TYPE *m_object;
00231 };
00232
00233 template<typename OBJECT> static inline OBJECT *RETAIN(Scoped<OBJECT> &obj)
00234 {
00235 if(obj != NULL)
00236 obj->retain();
00237 return obj;
00238 }
00239
00240 LT_END_LIDAR_NAMESPACE
00241 #endif // __LIDAR_OBJECT_H__