MrSID Decode SDK for LiDAR Reference Manual
1.1.4.4709
|
00001 /* ////////////////////////////////////////////////////////////////////////// 00002 // // 00003 // This code is Copyright (c) 2008-2010 LizardTech, Inc, 1008 Western // 00004 // Avenue, Suite 200, Seattle, WA 98104. Unauthorized use or distribution // 00005 // prohibited. Access to and use of this code is permitted only under // 00006 // license from LizardTech, Inc. Portions of the code are protected by // 00007 // US and foreign patents and other filings. All Rights Reserved. // 00008 // // 00010 /* PUBLIC */ 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__