MrSID Decode SDK for LiDAR Reference Manual  1.1.4.4709
Object.h
Go to the documentation of this file.
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__