summaryrefslogtreecommitdiff
authorzecke <zecke>2004-11-18 21:36:33 (UTC)
committer zecke <zecke>2004-11-18 21:36:33 (UTC)
commit3302eb30390e6053637929316670da3e8fbe279e (patch) (unidiff)
tree5d8eb530e081a95b2ee5152ef63575b6c966154c
parent7ac32658ba09d8456cc75e5cf80707caa616848b (diff)
downloadopie-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 (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/opiecore.pro2
-rw-r--r--libopie2/opiecore/osharedpointer.h136
-rw-r--r--libopie2/opiecore/osmartpointer.cpp57
-rw-r--r--libopie2/opiecore/osmartpointer.h33
4 files changed, 209 insertions, 19 deletions
diff --git a/libopie2/opiecore/opiecore.pro b/libopie2/opiecore/opiecore.pro
index 8189a7c..e72576c 100644
--- a/libopie2/opiecore/opiecore.pro
+++ b/libopie2/opiecore/opiecore.pro
@@ -11,6 +11,7 @@ HEADERS = oapplication.h \
11 opluginloader.h \ 11 opluginloader.h \
12 oprocess.h \ 12 oprocess.h \
13 oprocctrl.h \ 13 oprocctrl.h \
14 osharedpointer.h \
14 osmartpointer.h \ 15 osmartpointer.h \
15 ostorageinfo.h \ 16 ostorageinfo.h \
16 xmltree.h 17 xmltree.h
@@ -25,6 +26,7 @@ SOURCES = oapplication.cpp \
25 opluginloader.cpp \ 26 opluginloader.cpp \
26 oprocess.cpp \ 27 oprocess.cpp \
27 oprocctrl.cpp \ 28 oprocctrl.cpp \
29 osmartpointer.cpp \
28 ostorageinfo.cpp \ 30 ostorageinfo.cpp \
29 xmltree.cpp 31 xmltree.cpp
30 32
diff --git a/libopie2/opiecore/osharedpointer.h b/libopie2/opiecore/osharedpointer.h
new file mode 100644
index 0000000..f19d836
--- a/dev/null
+++ b/libopie2/opiecore/osharedpointer.h
@@ -0,0 +1,136 @@
1// -*- Mode: C++; -*-
2/*
3 This file is part of the Opie Project
4 Copyright (C) 2004 Rajko Albrecht <alwin@handhelds.org>
5 Copyright (C) 2004 Holger Hans Peter Freyther <freyther@handhelds.org>
6 Copyright (C) The Opie Team <opie-devel@handhelds.org>
7 =.
8 .=l.
9 .>+-=
10_;:, .> :=|. This program is free software; you can
11.> <`_, > . <= redistribute it and/or modify it under
12:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
13.="- .-=="i, .._ License as published by the Free Software
14- . .-<_> .<> Foundation; either version 2 of the License,
15 ._= =} : or (at your option) any later version.
16 .%`+i> _;_.
17 .i_,=:_. -<s. This program is distributed in the hope that
18 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
19 : .. .:, . . . without even the implied warranty of
20 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
21 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
22..}^=.= = ; Library General Public License for more
23++= -. .` .: details.
24: = ...= . :.=-
25-. .:....=;==+<; You should have received a copy of the GNU
26 -_. . . )=. = Library General Public License along with
27 -- :-=` this library; see the file COPYING.LIB.
28 If not, write to the Free Software Foundation,
29 Inc., 59 Temple Place - Suite 330,
30 Boston, MA 02111-1307, USA.
31*/
32
33
34#ifndef O_SHARED_POINTER_H
35#define O_SHARED_POINTER_H
36
37#include <opie2/osmartpointer.h>
38
39/*!
40 * \file osharedpointer.h
41 * \brief Adapter with Refcounting around any data type
42 * \author Rajko Albrecht and Holger Hans Peter Freyther
43 */
44
45namespace Opie {
46namespace Core {
47template<class T>
48class OSharedPointerData : public ORefCount {
49public:
50 OSharedPointerData( T* dt ) {
51 data = dt;
52 }
53
54 ~OSharedPointerData() {
55 delete data;
56 }
57
58 T *data;
59};
60
61
62/**
63 * \brief A small Adapter around any Pointer
64 *
65 *
66 *
67 */
68template<class T>
69class OSharedPointer {
70 typedef OSharedPointerData<T> Data;
71 Data* data;
72
73 void unref() {
74 if (data) { data->Decr(); if (!data->Shared()) delete data; }
75 data = 0;
76 }
77
78public:
79 OSharedPointer () { data = 0;}
80
81 OSharedPointer( T* t ) {
82 data = new Data( t );
83 data->Incr();
84 }
85
86 OSharedPointer( const OSharedPointer<T>& p ) {
87 if ( data = p.data ) data->Incr();
88 }
89
90 ~OSharedPointer() {
91 unref();
92 }
93
94 OSharedPointer<T> &operator=( const OSharedPointer<T>& p ) {
95 // already same: nothing to do
96 if (data == p.data) return *this;
97 // decouple reference
98 unref();
99 // establish new reference
100 if (data = p.data) data->Incr();
101 return *this;
102 }
103
104 OSharedPointer<T> &operator=( T *p ) {
105 unref();
106 data = new Data( p );
107 data->Incr();
108
109 return *this;
110 }
111
112 operator T* () const { return data->data; }
113 T& operator*() { return *data->data; }
114 const T& operator*()const { return data->data; }
115
116 //! deref with method call
117 T* operator-> () {return data->data; }
118 //! deref with const method call
119 const T* operator-> ()const {return data->data; }
120
121
122 //! supports "if (pointer)"
123 operator bool () const { return (data != 0 && data->data != 0); }
124 //! "if (pointer)" as non const
125 operator bool () { return ( data != 0 && data->data != NULL );}
126
127 //! support if (!pointer)"
128 bool operator! () const { return (data == 0 || data->data == 0); }
129 //! support if (!pointer)" as non const
130 bool operator! () { return (data == 0 || data->data == 0); }
131};
132
133}
134}
135
136#endif
diff --git a/libopie2/opiecore/osmartpointer.cpp b/libopie2/opiecore/osmartpointer.cpp
new file mode 100644
index 0000000..480e03a
--- a/dev/null
+++ b/libopie2/opiecore/osmartpointer.cpp
@@ -0,0 +1,57 @@
1// -*- Mode: C++; -*-
2/*
3 This file is part of the Opie Project
4 Copyright (C) 2004 Rajko Albrecht <alwin@handhelds.org>
5 Copyright (C) The Opie Team <opie-devel@handhelds.org>
6 =.
7 .=l.
8 .>+-=
9_;:, .> :=|. This program is free software; you can
10.> <`_, > . <= redistribute it and/or modify it under
11:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
12.="- .-=="i, .._ License as published by the Free Software
13- . .-<_> .<> Foundation; either version 2 of the License,
14 ._= =} : or (at your option) any later version.
15 .%`+i> _;_.
16 .i_,=:_. -<s. This program is distributed in the hope that
17 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
18 : .. .:, . . . without even the implied warranty of
19 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
20 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
21..}^=.= = ; Library General Public License for more
22++= -. .` .: details.
23: = ...= . :.=-
24-. .:....=;==+<; You should have received a copy of the GNU
25 -_. . . )=. = Library General Public License along with
26 -- :-=` this library; see the file COPYING.LIB.
27 If not, write to the Free Software Foundation,
28 Inc., 59 Temple Place - Suite 330,
29 Boston, MA 02111-1307, USA.
30*/
31
32#include "osmartpointer.h"
33
34namespace Opie {
35namespace Core {
36
37ORefCount::ORefCount()
38 : m_RefCount(0)
39{}
40
41ORefCount::~ORefCount()
42{}
43
44void ORefCount::Incr() {
45 ++m_RefCount;
46}
47
48void ORefCount::Decr() {
49 --m_RefCount;
50}
51
52bool ORefCount::Shared() {
53 return (m_RefCount > 0);
54}
55
56}
57}
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 {
48class ORefCount { 48class ORefCount {
49protected: 49protected:
50 //! reference count member 50 //! reference count member
51 long m_RefCount; 51 unsigned long m_RefCount;
52public: 52public:
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
70template<class T> class OSmartPointer { 65template<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