author | zecke <zecke> | 2004-11-18 21:36:33 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-11-18 21:36:33 (UTC) |
commit | 3302eb30390e6053637929316670da3e8fbe279e (patch) (unidiff) | |
tree | 5d8eb530e081a95b2ee5152ef63575b6c966154c /libopie2/opiecore/osmartpointer.h | |
parent | 7ac32658ba09d8456cc75e5cf80707caa616848b (diff) | |
download | opie-3302eb30390e6053637929316670da3e8fbe279e.zip opie-3302eb30390e6053637929316670da3e8fbe279e.tar.gz opie-3302eb30390e6053637929316670da3e8fbe279e.tar.bz2 |
-Move ORefCount to a non inline implementation in osmartpointer.cpp
-Add OSharedPointer as a smart pointer adapter to adapt any pointer
This is used by Opie PIM
Change pro file
Diffstat (limited to 'libopie2/opiecore/osmartpointer.h') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libopie2/opiecore/osmartpointer.h | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/libopie2/opiecore/osmartpointer.h b/libopie2/opiecore/osmartpointer.h index e9cee0c..f2f6464 100644 --- a/libopie2/opiecore/osmartpointer.h +++ b/libopie2/opiecore/osmartpointer.h | |||
@@ -3,7 +3,7 @@ | |||
3 | This file is part of the Opie Project | 3 | This file is part of the Opie Project |
4 | Copyright (C) 2004 Rajko Albrecht <alwin@handhelds.org> | 4 | Copyright (C) 2004 Rajko Albrecht <alwin@handhelds.org> |
5 | Copyright (C) The Opie Team <opie-devel@handhelds.org> | 5 | Copyright (C) The Opie Team <opie-devel@handhelds.org> |
6 | =. | 6 | =. |
7 | .=l. | 7 | .=l. |
8 | .>+-= | 8 | .>+-= |
9 | _;:, .> :=|. This program is free software; you can | 9 | _;:, .> :=|. This program is free software; you can |
@@ -48,29 +48,24 @@ namespace Core { | |||
48 | class ORefCount { | 48 | class ORefCount { |
49 | protected: | 49 | protected: |
50 | //! reference count member | 50 | //! reference count member |
51 | long m_RefCount; | 51 | unsigned long m_RefCount; |
52 | public: | 52 | public: |
53 | //! first reference must be added after "new" via Pointer() | 53 | //! first reference must be added after "new" via Pointer() |
54 | ORefCount() : m_RefCount(0) | 54 | ORefCount(); |
55 | {} | 55 | virtual ~ORefCount(); |
56 | virtual ~ORefCount() {} | ||
57 | //! add a reference | 56 | //! add a reference |
58 | void Incr() { | 57 | void Incr(); |
59 | ++m_RefCount; | ||
60 | } | ||
61 | //! delete a reference | 58 | //! delete a reference |
62 | void Decr() { | 59 | void Decr(); |
63 | --m_RefCount; | ||
64 | } | ||
65 | //! is it referenced | 60 | //! is it referenced |
66 | bool Shared() { return (m_RefCount > 0); } | 61 | bool Shared(); |
67 | }; | 62 | }; |
68 | 63 | ||
69 | //! reference counting wrapper class | 64 | //! reference counting wrapper class |
70 | template<class T> class OSmartPointer { | 65 | template<class T> class OSmartPointer { |
71 | //! pointer to object | 66 | //! pointer to object |
72 | /*! | 67 | /*! |
73 | * this object must contain Incr(), Decr() and Shared() | 68 | * this object must contain Incr(), Decr() and Shared() |
74 | * methode as public members. The best way is, that it will be a child | 69 | * methode as public members. The best way is, that it will be a child |
75 | * class of RefCount | 70 | * class of RefCount |
76 | */ | 71 | */ |
@@ -94,15 +89,15 @@ public: | |||
94 | //! construction | 89 | //! construction |
95 | OSmartPointer(T* t) { if (ptr = t) ptr->Incr(); } | 90 | OSmartPointer(T* t) { if (ptr = t) ptr->Incr(); } |
96 | //! Pointer copy | 91 | //! Pointer copy |
97 | OSmartPointer(const OSmartPointer<T>& p) | 92 | OSmartPointer(const OSmartPointer<T>& p) |
98 | { if (ptr = p.ptr) ptr->Incr(); } | 93 | { if (ptr = p.ptr) ptr->Incr(); } |
99 | //! pointer copy by assignment | 94 | //! pointer copy by assignment |
100 | OSmartPointer<T>& operator= (const OSmartPointer<T>& p) | 95 | OSmartPointer<T>& operator= (const OSmartPointer<T>& p) |
101 | { | 96 | { |
102 | // already same: nothing to do | 97 | // already same: nothing to do |
103 | if (ptr == p.ptr) return *this; | 98 | if (ptr == p.ptr) return *this; |
104 | // decouple reference | 99 | // decouple reference |
105 | if (ptr) { ptr->Decr(); if (!ptr->Shared()) delete ptr; } | 100 | if (ptr) { ptr->Decr(); if (!ptr->Shared()) delete ptr; } |
106 | // establish new reference | 101 | // establish new reference |
107 | if (ptr = p.ptr) ptr->Incr(); | 102 | if (ptr = p.ptr) ptr->Incr(); |
108 | return *this; | 103 | return *this; |
@@ -120,7 +115,7 @@ public: | |||
120 | 115 | ||
121 | //! cast to conventional pointer | 116 | //! cast to conventional pointer |
122 | operator T* () const { return ptr; } | 117 | operator T* () const { return ptr; } |
123 | 118 | ||
124 | //! deref: fails for NULL pointer | 119 | //! deref: fails for NULL pointer |
125 | T& operator* () {return *ptr; } | 120 | T& operator* () {return *ptr; } |
126 | //! deref: fails for NULL pointer | 121 | //! deref: fails for NULL pointer |
@@ -130,12 +125,12 @@ public: | |||
130 | T* operator-> () {return ptr; } | 125 | T* operator-> () {return ptr; } |
131 | //! deref with const method call | 126 | //! deref with const method call |
132 | const T* operator-> ()const {return ptr; } | 127 | const T* operator-> ()const {return ptr; } |
133 | 128 | ||
134 | //! supports "if (pointer)" | 129 | //! supports "if (pointer)" |
135 | operator bool () const { return (ptr != NULL); } | 130 | operator bool () const { return (ptr != NULL); } |
136 | //! "if (pointer)" as non const | 131 | //! "if (pointer)" as non const |
137 | operator bool () { return ptr != NULL;} | 132 | operator bool () { return ptr != NULL;} |
138 | 133 | ||
139 | //! support if (!pointer)" | 134 | //! support if (!pointer)" |
140 | bool operator! () const { return (ptr == NULL); } | 135 | bool operator! () const { return (ptr == NULL); } |
141 | //! support if (!pointer)" as non const | 136 | //! support if (!pointer)" as non const |