00001 /***************************************************************************** 00002 * Copyright (C) 2011 by Benjamin Hadorn (b_hadorn@bluewin.ch) 00003 ***************************************************************************** 00004 * Project : Zeus Base Library 00005 * Module : ArrayPtr 00006 * Package : Zeus.ZeusBase.System 00007 * Author : Benjamin Hadorn 00008 * Date : 27.12.2011 00009 * System : Zeus-Framework 00010 ***************************************************************************** 00011 * Licence: * 00012 * This library is free software; you can redistribute it and/or modify * 00013 * it under the terms of the GNU Lesser General Public License as * 00014 * published by the Free Software Foundation; either version * 00015 * 2.1 of the License, or (at your option) any later version. * 00016 * * 00017 * This library is distributed in the hope that it will be useful, * 00018 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00019 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00020 * GNU Lesser General Public License for more details. * 00021 * * 00022 * You should have received a copy of the GNU Lesser General Public * 00023 * License along with this library; if not, write to the Free Software * 00024 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA * 00025 *****************************************************************************/ 00026 00027 /***************************************************************************** 00028 * Changes: 00029 * 27.12.2011 bha: created zeus 2.0 00030 *****************************************************************************/ 00031 00032 #ifndef ArrayPtrHPP 00033 #define ArrayPtrHPP 00034 00035 #include <zeusbase/System/Interfaces/IZUnknown.hpp> 00036 #include <string.h> 00037 00038 00039 BEGIN_NAMESPACE_Zeus 00040 00041 00042 /**************************************************************************/ 00046 /**************************************************************************/ 00047 template <class T> class TArrayPtr 00048 { 00049 public: 00050 00051 /***********************************************************************/ 00054 /***********************************************************************/ 00055 inline TArrayPtr() 00056 { 00057 m_paPtr = NULL; 00058 m_pReferenceCounter = NULL; 00059 m_iSize = 0; 00060 } 00061 00062 /***********************************************************************/ 00067 /***********************************************************************/ 00068 inline TArrayPtr(Int iSize) 00069 { 00070 m_paPtr = NULL; 00071 m_pReferenceCounter = NULL; 00072 m_iSize = 0; 00073 if (iSize > 0) 00074 { 00075 this->assign(new T[iSize], iSize); 00076 } 00077 } 00078 00079 /***********************************************************************/ 00084 /***********************************************************************/ 00085 TArrayPtr(const T* pPtr, Int iSize = -1) 00086 { 00087 m_pReferenceCounter = NULL; 00088 m_paPtr = NULL; 00089 m_iSize = 0; 00090 00091 this->assign(pPtr, iSize); 00092 } 00093 00094 /***********************************************************************/ 00099 /***********************************************************************/ 00100 inline TArrayPtr(const TArrayPtr<T>& rWrapper) 00101 { 00102 m_iSize = 0; 00103 m_paPtr = NULL; 00104 m_pReferenceCounter = NULL; 00105 assignWrapper(rWrapper); 00106 } 00107 00108 /***********************************************************************/ 00111 /***********************************************************************/ 00112 inline virtual ~TArrayPtr() 00113 { 00114 release(); 00115 } 00116 00117 /***********************************************************************/ 00120 /***********************************************************************/ 00121 void assignWrapper(const TArrayPtr& rWrapper) 00122 { 00123 release(); 00124 m_iSize = rWrapper.m_iSize; 00125 m_paPtr = rWrapper.m_paPtr; 00126 m_pReferenceCounter = rWrapper.m_pReferenceCounter; 00127 if (m_paPtr != NULL && m_pReferenceCounter != NULL && *m_pReferenceCounter > 0) 00128 { 00129 (*m_pReferenceCounter)++; 00130 } 00131 else 00132 { 00133 m_paPtr = NULL; 00134 m_pReferenceCounter = NULL; 00135 } 00136 } 00137 00138 /***********************************************************************/ 00141 /***********************************************************************/ 00142 void assign(const T* pInterface, Int iSize = -1) 00143 { 00144 release(); 00145 m_iSize = iSize; 00146 m_paPtr = (T*)pInterface; 00147 if (m_paPtr != NULL) 00148 { 00149 m_pReferenceCounter = new Int(); 00150 *m_pReferenceCounter = 1; 00151 } 00152 } 00153 00154 /***********************************************************************/ 00157 /***********************************************************************/ 00158 inline void clean() 00159 { 00160 if (m_iSize > 0 && m_paPtr != NULL) 00161 { 00162 ::memset(m_paPtr, 0x00, sizeof(T)*m_iSize); 00163 } 00164 } 00165 00166 /***********************************************************************/ 00169 /***********************************************************************/ 00170 inline void memset(Int iValue) 00171 { 00172 if (m_iSize > 0 && m_paPtr != NULL) 00173 { 00174 ::memset(m_paPtr, iValue, sizeof(T)*m_iSize); 00175 } 00176 } 00177 00178 /***********************************************************************/ 00181 /***********************************************************************/ 00182 inline bool equals(const T* pPtr) const 00183 { 00184 return (m_paPtr == pPtr); 00185 } 00186 00187 /***********************************************************************/ 00190 /***********************************************************************/ 00191 inline T* getPointer() 00192 { 00193 return m_paPtr; 00194 } 00195 00196 /***********************************************************************/ 00199 /***********************************************************************/ 00200 inline const T* getConstPointer() const 00201 { 00202 return m_paPtr; 00203 } 00204 00205 /***********************************************************************/ 00208 /***********************************************************************/ 00209 inline Int getSize() const 00210 { 00211 return m_iSize; 00212 } 00213 00214 00215 /***********************************************************************/ 00218 /***********************************************************************/ 00219 inline void release() 00220 { 00221 release_internal(true); 00222 } 00223 00224 /***********************************************************************/ 00228 /***********************************************************************/ 00229 inline T* detach() 00230 { 00231 T* paPtr = this->m_paPtr; 00232 release_internal(false); 00233 return paPtr; 00234 } 00235 00236 /***********************************************************************/ 00240 /***********************************************************************/ 00241 inline TArrayPtr<T>& operator=(const TArrayPtr<T>& rWrapper) 00242 { 00243 assignWrapper(rWrapper); 00244 return *this; 00245 } 00246 00247 /***********************************************************************/ 00251 /***********************************************************************/ 00252 inline TArrayPtr<T>& operator=(const T* pPtr) 00253 { 00254 assign(pPtr); 00255 return *this; 00256 } 00257 00258 /***********************************************************************/ 00262 /***********************************************************************/ 00263 inline bool operator==(const TArrayPtr<T>& rWrapper) const 00264 { 00265 return equals(rWrapper.m_paPtr); 00266 } 00267 00268 /***********************************************************************/ 00272 /***********************************************************************/ 00273 inline bool operator!=(const TArrayPtr<T>& rWrapper) const 00274 { 00275 return !equals(rWrapper.m_paPtr); 00276 } 00277 00278 /***********************************************************************/ 00282 /***********************************************************************/ 00283 inline bool operator==(const T* pPtr) const 00284 { 00285 return equals(pPtr); 00286 } 00287 00288 /***********************************************************************/ 00292 /***********************************************************************/ 00293 inline bool operator!=(const T* pPtr) const 00294 { 00295 return !equals(pPtr); 00296 } 00297 00298 /***********************************************************************/ 00301 /***********************************************************************/ 00302 inline operator T*() const {return m_paPtr; } 00303 00304 #if !defined(_MSC_VER) || _MSC_VER > 1200 00305 /***********************************************************************/ 00308 /***********************************************************************/ 00309 inline T& operator[](Int iIndex) { return m_paPtr[iIndex]; } 00310 00311 /***********************************************************************/ 00314 /***********************************************************************/ 00315 inline const T& operator[](Int iIndex) const { return m_paPtr[iIndex]; } 00316 #endif 00317 00318 /***********************************************************************/ 00321 /***********************************************************************/ 00322 inline T& getItem(Int iIndex) { return m_paPtr[iIndex]; } 00323 00324 /***********************************************************************/ 00327 /***********************************************************************/ 00328 inline const T& getItemConst(Int iIndex) const { return m_paPtr[iIndex]; } 00329 00330 protected: 00332 T* m_paPtr; 00334 Int* m_pReferenceCounter; 00336 Int m_iSize; 00337 00338 /***********************************************************************/ 00341 /***********************************************************************/ 00342 void release_internal(bool bDeletePointer) 00343 { 00344 if (this->m_paPtr != NULL) 00345 { 00346 (*m_pReferenceCounter)--; 00347 if (*m_pReferenceCounter <= 0) 00348 { 00349 delete this->m_pReferenceCounter; 00350 if (bDeletePointer) 00351 { 00352 delete [] this->m_paPtr; 00353 } 00354 } //(*m_pReferenceCounter <= 0) 00355 this->m_paPtr = NULL; 00356 this->m_pReferenceCounter = NULL; 00357 this->m_iSize = 0; 00358 } //(this->m_paPtr != NULL) 00359 } 00360 }; 00361 00362 END_NAMESPACE_Zeus 00363 00364 #endif