summaryrefslogtreecommitdiff
authoralwin <alwin>2004-03-11 22:52:07 (UTC)
committer alwin <alwin>2004-03-11 22:52:07 (UTC)
commit83b7f42d5f93e1657705584d3d626b8d8fde28ac (patch) (unidiff)
tree6510078c79ae4b5f1fb2fdcfb71ad5a1247c8ad0
parent31fe5681a49cbcf291abf755ee5f2f2fb1e4a582 (diff)
downloadopie-83b7f42d5f93e1657705584d3d626b8d8fde28ac.zip
opie-83b7f42d5f93e1657705584d3d626b8d8fde28ac.tar.gz
opie-83b7f42d5f93e1657705584d3d626b8d8fde28ac.tar.bz2
*sigh* forgot to test before first checkin. sorry.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/osmart_pointer.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/libopie2/opiecore/osmart_pointer.h b/libopie2/opiecore/osmart_pointer.h
index a362a60..2a2518f 100644
--- a/libopie2/opiecore/osmart_pointer.h
+++ b/libopie2/opiecore/osmart_pointer.h
@@ -30,115 +30,115 @@ _;:, .> :=|. This program is free software; you can
30*/ 30*/
31 31
32#ifndef _osmart_pointer_h 32#ifndef _osmart_pointer_h
33#define _osmart_pointer_h 33#define _osmart_pointer_h
34 34
35/*! 35/*!
36 * \file osmart_pointer.h 36 * \file osmart_pointer.h
37 * \brief smart pointer and reference counter 37 * \brief smart pointer and reference counter
38 * \author Rajko Albrecht 38 * \author Rajko Albrecht
39 * 39 *
40 */ 40 */
41 41
42namespace Opie { 42namespace Opie {
43 43
44//! simple reference counter class 44//! simple reference counter class
45class oref_count { 45class oref_count {
46protected: 46protected:
47 //! reference count member 47 //! reference count member
48 long m_RefCount; 48 long m_RefCount;
49public: 49public:
50 //! first reference must be added after "new" via Pointer() 50 //! first reference must be added after "new" via Pointer()
51 oref_count() : m_RefCount(0) 51 oref_count() : m_RefCount(0)
52 {} 52 {}
53 virtual ~oref_count() {} 53 virtual ~oref_count() {}
54 //! add a reference 54 //! add a reference
55 void Incr() { 55 void Incr() {
56 ++m_RefCount; 56 ++m_RefCount;
57 } 57 }
58 //! delete a reference 58 //! delete a reference
59 void Decr() { 59 void Decr() {
60 --m_RefCount; 60 --m_RefCount;
61 } 61 }
62 //! is it referenced 62 //! is it referenced
63 bool Shared() { return (m_RefCount > 0); } 63 bool Shared() { return (m_RefCount > 0); }
64}; 64};
65 65
66//! reference counting wrapper class 66//! reference counting wrapper class
67template<class T> class osmart_pointer { 67template<class T> class osmart_pointer {
68 //! pointer to object 68 //! pointer to object
69 /*! 69 /*!
70 * this object must contain Incr(), Decr() and Shared() 70 * this object must contain Incr(), Decr() and Shared()
71 * methode as public members. The best way is, that it will be a child 71 * methode as public members. The best way is, that it will be a child
72 * class of RefCount 72 * class of RefCount
73 */ 73 */
74 T *ptr; 74 T *ptr;
75public: 75public:
76 //! standart constructor 76 //! standart constructor
77 osmart_pointer() { ptr = NULL; } 77 osmart_pointer() { ptr = NULL; }
78 //! standart destructor 78 //! standart destructor
79 /*! 79 /*!
80 * release the reference, if it were the last reference, destroys 80 * release the reference, if it were the last reference, destroys
81 * ptr 81 * ptr
82 */ 82 */
83 ~osmart_pointer() 83 ~osmart_pointer()
84 { 84 {
85 if (ptr){ 85 if (ptr){
86 ptr->Decr(); 86 ptr->Decr();
87 if (!ptr->Shared()) 87 if (!ptr->Shared())
88 delete ptr; 88 delete ptr;
89 } 89 }
90 } 90 }
91 //! construction 91 //! construction
92 osmart_pointer(T* t) { if (ptr = t) ptr->Incr(); } 92 osmart_pointer(T* t) { if (ptr = t) ptr->Incr(); }
93 //! Pointer copy 93 //! Pointer copy
94 osmart_pointer(const smart_pointer<T>& p) 94 osmart_pointer(const osmart_pointer<T>& p)
95 { if (ptr = p.ptr) ptr->Incr(); } 95 { if (ptr = p.ptr) ptr->Incr(); }
96 //! pointer copy by assignment 96 //! pointer copy by assignment
97 osmart_pointer<T>& operator= (const smart_pointer<T>& p) 97 osmart_pointer<T>& operator= (const osmart_pointer<T>& p)
98 { 98 {
99 // already same: nothing to do 99 // already same: nothing to do
100 if (ptr == p.ptr) return *this; 100 if (ptr == p.ptr) return *this;
101 // decouple reference 101 // decouple reference
102 if (ptr) { ptr->Decr(); if (!ptr->Shared()) delete ptr; } 102 if (ptr) { ptr->Decr(); if (!ptr->Shared()) delete ptr; }
103 // establish new reference 103 // establish new reference
104 if (ptr = p.ptr) ptr->Incr(); 104 if (ptr = p.ptr) ptr->Incr();
105 return *this; 105 return *this;
106 } 106 }
107 osmart_pointer<T>& operator= (T*p) 107 osmart_pointer<T>& operator= (T*p)
108 { 108 {
109 if (ptr==p)return *this; 109 if (ptr==p)return *this;
110 if (ptr) { 110 if (ptr) {
111 ptr->Decr(); 111 ptr->Decr();
112 if (!ptr->Shared()) delete ptr; 112 if (!ptr->Shared()) delete ptr;
113 } 113 }
114 if (ptr=p) ptr->Incr(); 114 if (ptr=p) ptr->Incr();
115 return *this; 115 return *this;
116 } 116 }
117 117
118 //! cast to conventional pointer 118 //! cast to conventional pointer
119 operator T* () const { return ptr; } 119 operator T* () const { return ptr; }
120 120
121 //! deref: fails for NULL pointer 121 //! deref: fails for NULL pointer
122 T& operator* () {return *ptr; } 122 T& operator* () {return *ptr; }
123 //! deref: fails for NULL pointer 123 //! deref: fails for NULL pointer
124 const T& operator* ()const {return *ptr; } 124 const T& operator* ()const {return *ptr; }
125 125
126 //! deref with method call 126 //! deref with method call
127 T* operator-> () {return ptr; } 127 T* operator-> () {return ptr; }
128 //! deref with const method call 128 //! deref with const method call
129 const T* operator-> ()const {return ptr; } 129 const T* operator-> ()const {return ptr; }
130 130
131 //! supports "if (pointer)" 131 //! supports "if (pointer)"
132 operator bool () const { return (ptr != NULL); } 132 operator bool () const { return (ptr != NULL); }
133 //! "if (pointer)" as non const 133 //! "if (pointer)" as non const
134 operator bool () { return ptr != NULL;} 134 operator bool () { return ptr != NULL;}
135 135
136 //! support if (!pointer)" 136 //! support if (!pointer)"
137 bool operator! () const { return (ptr == NULL); } 137 bool operator! () const { return (ptr == NULL); }
138 //! support if (!pointer)" as non const 138 //! support if (!pointer)" as non const
139 bool operator! () { return (ptr == NULL); } 139 bool operator! () { return (ptr == NULL); }
140}; 140};
141 141
142} 142}
143 143
144#endif 144#endif