1 // Copyright (C) 2001-2005 Open Source Telecom Corporation. 2 // Copyright (C) 2006-2014 David Sugar, Tycho Softworks. 3 // Copyright (C) 2015 Cherokees of Idaho. 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; either version 2 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU Lesser General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 // 18 // As a special exception to the GNU General Public License, permission is 19 // granted for additional uses of the text contained in its release 20 // of Common C++. 21 // 22 // The exception is that, if you link the Common C++ library with other 23 // files to produce an executable, this does not by itself cause the 24 // resulting executable to be covered by the GNU General Public License. 25 // Your use of that executable is in no way restricted on account of 26 // linking the Common C++ library code into it. 27 // 28 // This exception does not however invalidate any other reasons why 29 // the executable file might be covered by the GNU General Public License. 30 // 31 // This exception applies only to the code released under the 32 // name Common C++. If you copy code from other releases into a copy of 33 // Common C++, as the General Public License permits, the exception does 34 // not apply to the code that you add in this way. To avoid misleading 35 // anyone as to the status of such modified files, you must delete 36 // this exception notice from them. 37 // 38 // If you write modifications of your own for Common C++, it is your choice 39 // whether to permit this exception to apply to your modifications. 40 // If you do not wish that, delete this exception notice. 41 42 /** 43 * @file commoncpp/pointer.h 44 * @short Template for creating reference count managed smart pointers. 45 **/ 46 47 #ifndef COMMONCPP_POINTER_H_ 48 #define COMMONCPP_POINTER_H_ 49 50 #ifndef COMMONCPP_CONFIG_H_ 51 #include <commoncpp/config.h> 52 #endif 53 54 namespace ost { 55 56 /** 57 * Used to create and manage referece counted pointers. 58 * 59 * @author David Sugar <dyfet@gnutelephony.org> 60 * @short reference counted pointer template. 61 */ 62 template <class T> 63 class Pointer 64 { 65 protected: 66 unsigned *ptrCount; 67 T *ptrObject; 68 ptrDetach(void)69 inline void ptrDetach(void) { 70 if(ptrCount && --(*ptrCount)==0) { 71 delete ptrObject; 72 delete ptrCount; 73 } 74 ptrObject = NULL; 75 ptrCount = NULL; 76 } 77 78 public: ptrObject(ptr)79 inline explicit Pointer(T* ptr = NULL) : ptrObject(ptr) { 80 ptrCount = new unsigned; 81 *ptrCount = 1; 82 } 83 Pointer(const Pointer<T> & ref)84 inline Pointer(const Pointer<T> &ref) { 85 ptrObject = ref.ptrObject; 86 ptrCount = ref.ptrCount; 87 ++(*ptrCount); 88 } 89 ~Pointer()90 inline virtual ~Pointer() { 91 ptrDetach(); 92 } 93 94 inline Pointer& operator=(const Pointer<T> &ref) { 95 if(this != &ref) { 96 ptrDetach(); 97 ptrObject = ref.ptrObject; 98 ptrCount = ref.ptrCount; 99 ++(*ptrCount); 100 } 101 return *this; 102 } 103 104 inline T& operator*() const { 105 return *ptrObject; 106 } 107 getObject()108 inline T* getObject() const { 109 return ptrObject; 110 } 111 112 inline T* operator->() const { 113 return ptrObject; 114 } 115 116 inline operator bool() const { 117 return (*ptrCount != 1); 118 } 119 120 inline bool operator!() const { 121 return (*ptrCount == 1); 122 } 123 124 inline int operator++() const { 125 return ++(*ptrCount); 126 } 127 128 inline int operator--() const { 129 if(*ptrCount == 1) { 130 delete this; 131 return 0; 132 } 133 return --(*ptrCount); 134 } 135 }; 136 137 } // namespace ost 138 139 #endif 140