ReferenceCounting.hGo to the documentation of this file.00001 /* 00002 * Copyright (c) 2000-2003 Barak Weichselbaum <barak@komodia.com> 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 00014 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 00015 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00016 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00017 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 00018 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00019 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00020 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00021 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00022 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00023 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00024 * SUCH DAMAGE. 00025 * 00026 * Contact info: 00027 * ------------- 00028 * 00029 * Site: http://www.komodia.com 00030 * Main contact: barak@komodia.com 00031 * For custom projects, 00032 * consulting, or other 00033 * paid services: sales@komodia.com 00034 */ 00035 00036 #if !defined(AFX_REFERENCECOUNTING_H__6B9BA7CA_EBA0_41AC_9BA6_793FBDB710C7__INCLUDED_) 00037 #define AFX_REFERENCECOUNTING_H__6B9BA7CA_EBA0_41AC_9BA6_793FBDB710C7__INCLUDED_ 00038 00039 #if _MSC_VER > 1000 00040 #pragma once 00041 #endif // _MSC_VER > 1000 00042 00043 #include "KomodiaSettings.h" 00044 00045 KOMODIA_NAMESPACE_START 00046 00047 class CReferenceCounting; 00048 00049 template<class T> 00050 class CReferenceSPT 00051 { 00052 public: 00053 //Our operator overload 00054 virtual T* operator->() 00055 { 00056 return m_pCounter; 00057 } 00058 00059 //Detach the counter from this smart ptr 00060 T* Detach() 00061 { 00062 //Save to tmp 00063 T* pTmp; 00064 pTmp=m_pCounter; 00065 00066 //Clear out var 00067 m_pCounter=NULL; 00068 00069 //Done 00070 return pTmp; 00071 } 00072 00073 //Add a ref 00074 long AddRef() 00075 { 00076 if (m_pCounter) 00077 return m_pCounter->AddRef(); 00078 else 00079 return 0; 00080 } 00081 00082 //Release a ref 00083 long ReleaseRef() 00084 { 00085 if (m_pCounter) 00086 return m_pCounter->ReleaseRef(); 00087 else 00088 return 0; 00089 } 00090 00091 //Ctor and Dtor 00092 //Ctor will do an addref automatically 00093 CReferenceSPT(T* pCounter, 00094 bool bAutoAdd=true) : m_pCounter(pCounter) 00095 { 00096 //Do we need to add 00097 if (bAutoAdd) 00098 //Add the ref 00099 AddRef(); 00100 } 00101 virtual ~CReferenceSPT() 00102 { 00103 //Release the ref 00104 ReleaseRef(); 00105 } 00106 private: 00107 //No copy ctor 00108 CReferenceSPT(const CReferenceSPT& rPtr); 00109 00110 //No assigment operator 00111 CReferenceSPT& operator=(const CReferenceSPT& rPtr); 00112 00113 //Our counter 00114 T* m_pCounter; 00115 }; 00116 00117 class CReferenceSmartPtr 00118 { 00119 public: 00120 //Detach the counter from this smart ptr 00121 const CReferenceCounting* Detach(); 00122 00123 //Add a ref 00124 long AddRef(); 00125 00126 //Release a ref 00127 long ReleaseRef(); 00128 00129 //Ctor and Dtor 00130 //Ctor will do an addref automatically 00131 CReferenceSmartPtr(const CReferenceCounting* pCounter, 00132 bool bAutoAdd=true); 00133 virtual ~CReferenceSmartPtr(); 00134 private: 00135 //No copy ctor 00136 CReferenceSmartPtr(const CReferenceSmartPtr& rPtr); 00137 00138 //No assigment operator 00139 CReferenceSmartPtr& operator=(const CReferenceSmartPtr& rPtr); 00140 00141 //Our counter 00142 const CReferenceCounting* m_pCounter; 00143 }; 00144 00145 class CReferenceCounting 00146 { 00147 public: 00148 //Actual reference counting methods 00149 //Add a reference 00150 virtual long AddRef()const; 00151 00152 //Remove a reference 00153 virtual long ReleaseRef()const; 00154 00155 //Actual destruct function, this will call delete 00156 virtual void Destruct()const; 00157 00158 //Assigment operator 00159 CReferenceCounting& operator=(const CReferenceCounting& rReference); 00160 00161 //Ctor and Dtor 00162 CReferenceCounting(); 00163 CReferenceCounting(const CReferenceCounting& rReference); 00164 virtual ~CReferenceCounting(); 00165 private: 00166 //Our reference count 00167 mutable long m_lCount; 00168 }; 00169 00170 KOMODIA_NAMESPACE_END 00171 00172 #endif // !defined(AFX_REFERENCECOUNTING_H__6B9BA7CA_EBA0_41AC_9BA6_793FBDB710C7__INCLUDED_) |