Main Page   Modules   Class Hierarchy   Data Structures   File List   Data Fields   Globals   Related Pages  

oscl_shared_ptr.h

Go to the documentation of this file.
00001 // -*- c++ -*-
00002 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
00003 
00004 //         O S C L _ S H A R E D _ P T R
00005 
00006 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
00007 
00019 #ifndef OSCL_SHARED_PTR_H_INCLUDED
00020 #define OSCL_SHARED_PTR_H_INCLUDED
00021 
00022 #ifndef OSCL_BASE_H_INCLUDED
00023 #include "oscl_base.h"
00024 #endif
00025 
00026 #ifndef OSCL_REFCOUNTER_H_INCLUDED
00027 #include "oscl_refcounter.h"
00028 #endif
00029 
00030 #define OSCL_DISABLE_WARNING_RETURN_TYPE_NOT_UDT
00031 #include "osclconfig_compiler_warnings.h"
00032 
00034 template <class TheClass>
00035 class OsclSharedPtr
00036 {
00037     public:
00039         OsclSharedPtr() :
00040                 mpRep(NULL), refcnt(NULL) {}
00041 
00043 
00046         OsclSharedPtr(TheClass* inClassPtr, OsclRefCounter* in_refcnt) :
00047                 mpRep(inClassPtr), refcnt(in_refcnt) {};
00048 
00049 
00051         OsclSharedPtr(const OsclSharedPtr& inSharedPtr) :
00052                 mpRep(inSharedPtr.mpRep), refcnt(inSharedPtr.refcnt)
00053         {
00054             if (refcnt)
00055             {
00056                 refcnt->addRef();
00057             }
00058         }
00059 
00060 
00062         virtual ~OsclSharedPtr()
00063         {
00064             if (refcnt != NULL)
00065             {
00066                 refcnt->removeRef();
00067             }
00068         } // end destructor
00069 
00070 
00073         TheClass* operator->()
00074         {
00075             return mpRep;
00076         }
00077 
00079         TheClass& operator*()
00080         {
00081             return *mpRep;
00082         }
00083 
00085         operator TheClass*()
00086         {
00087             return mpRep;
00088         }
00089 
00091         TheClass* GetRep()
00092         {
00093             return mpRep;
00094         }
00095 
00097         OsclRefCounter* GetRefCounter()
00098         {
00099             return refcnt;
00100         }
00101 
00103         int get_count()
00104         {
00105             return (refcnt == NULL) ? 0 : refcnt->getCount();
00106         }
00107 
00109         void Bind(const OsclSharedPtr& inHandle);
00110 
00112         void Bind(TheClass* ptr, OsclRefCounter* in_refcnt);
00113 
00115         void Unbind()
00116         {
00117             Bind(NULL, NULL);
00118         };
00119 
00121         OsclSharedPtr& operator=(const OsclSharedPtr& inSharedPtr)
00122         {
00123             Bind(inSharedPtr);
00124             return *this;
00125         }
00126 
00128         bool operator==(const OsclSharedPtr& b) const;
00129 
00130     private:
00131 
00132         TheClass* mpRep;
00133         OsclRefCounter* refcnt;
00134 
00135 };
00136 
00137 
00138 template <class TheClass> inline bool OsclSharedPtr<TheClass>::operator==(const OsclSharedPtr<TheClass>& b) const
00139 {
00140     if ((this->mpRep == b.mpRep) &&
00141             (this->refcnt == b.refcnt))
00142     {
00143         return true;
00144     }
00145     return false;
00146 }
00147 
00148 
00149 template <class TheClass> inline void OsclSharedPtr<TheClass>::Bind(const OsclSharedPtr& inSharedPtr)
00150 {
00151     if (mpRep == inSharedPtr.mpRep) return;
00152 
00153     if (refcnt != NULL)
00154     {
00155         refcnt->removeRef();
00156     }
00157 
00158     refcnt = inSharedPtr.refcnt;
00159     mpRep = inSharedPtr.mpRep;
00160 
00161     if (refcnt != NULL)
00162     {
00163         refcnt->addRef();
00164     }
00165 
00166 }
00167 
00168 template <class TheClass> inline void OsclSharedPtr<TheClass>::Bind(TheClass* ptr,
00169         OsclRefCounter* in_refcnt)
00170 {
00171     if (refcnt != NULL)
00172     {
00173         refcnt->removeRef();
00174     }
00175 
00176     mpRep = ptr;
00177     refcnt = in_refcnt;
00178 
00179 }
00180 
00181 #endif  // OSCL_SHARED_PTR_H_INCLUDED

OSCL API
Posting Version: CORE_8.000.1.1_RC4