DGtal 1.3.0
Loading...
Searching...
No Matches
testCountedConstPtrOrConstPtr.cpp
Go to the documentation of this file.
1
31#include <iostream>
32#include "DGtal/base/Common.h"
33#include "DGtal/base/CountedConstPtrOrConstPtr.h"
35
36using namespace std;
37using namespace DGtal;
38
40// Functions for testing class CountedConstPtrOrConstPtr.
42
43struct A {
44 A( int _a ) : a( _a )
45 {
46 ++nb;
47 trace.info() << "#" << nb << " A::A( int ), a is " << a << std::endl;
48 }
49 A( const A& other ) : a( other.a )
50 {
51 ++nb;
52 trace.info() << "#" << nb << " A::A( const A& ), a is " << a << std::endl;
53 }
54 A& operator=( const A& other )
55 {
56 if ( this != &other )
57 a = other.a;
58 trace.info() << "#" << nb << " A::op=( const A& ), a is " << a << std::endl;
59 return *this;
60 }
61 ~A()
62 {
63 --nb;
64 trace.info() << "#" << nb << " A::~A(), a was " << a << std::endl;
65 }
66 static int nb;
67 int a;
68};
69
70int A::nb = 0;
71
73{
74 unsigned int nbok = 0;
75 unsigned int nb = 0;
76 trace.beginBlock ( "Testing CountedConstPtrOrConstPtr memory managment..." );
77
78 trace.beginBlock ( "An invalid CountedConstPtrOrConstPtr does not create any instance." );
79 {
81 }
82 ++nb; nbok += A::nb == 0 ? 1 : 0;
83 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
85
86 trace.beginBlock ( "A CountedConstPtrOrConstPtr can be used as a simple pointer on an object without acquiring it." );
87 {
88 A a( 17 );
89 ++nb; nbok += A::nb == 1 ? 1 : 0;
90 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
91 {
92 CountedConstPtrOrConstPtr<A> cptr( &a, false );
93 ++nb; nbok += A::nb == 1 ? 1 : 0;
94 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
95 ++nb; nbok += cptr.isSimple() ? 1 : 0;
96 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.isSimple()" << std::endl;
97 }
98 ++nb; nbok += A::nb == 1 ? 1 : 0;
99 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
100 }
101 ++nb; nbok += A::nb == 0 ? 1 : 0;
102 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
103 trace.endBlock();
104
105 trace.beginBlock ( "CountedConstPtrOrConstPtr can be used as a smart pointer with acquisition and automatic deallocation." );
106 {
107 CountedConstPtrOrConstPtr<A> cptr( new A( 10 ) );
108 ++nb; nbok += A::nb == 1 ? 1 : 0;
109 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
110 ++nb; nbok += cptr.isSmart() ? 1 : 0;
111 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.isSmart()" << std::endl;
112 }
113 ++nb; nbok += A::nb == 0 ? 1 : 0;
114 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
115 trace.endBlock();
116
117 trace.beginBlock ( "CountedConstPtrOrConstPtr can be initialized with = CountedConstPtrOrConstPtr<A>( pointer )." );
118 {
120 ++nb; nbok += A::nb == 1 ? 1 : 0;
121 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
122 ++nb; nbok += cptr.isSmart() ? 1 : 0;
123 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.isSmart()" << std::endl;
124 }
125 ++nb; nbok += A::nb == 0 ? 1 : 0;
126 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
127 trace.endBlock();
128
129 trace.beginBlock ( "CountedConstPtrOrConstPtr can be initialized with = CountedPtr<A>( pointer )." );
130 {
131 CountedConstPtrOrConstPtr<A> cptr = CountedPtr<A>( new A( 5 ) );
132 ++nb; nbok += A::nb == 1 ? 1 : 0;
133 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
134 ++nb; nbok += cptr.isSmart() ? 1 : 0;
135 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.isSmart()" << std::endl;
136 }
137 ++nb; nbok += A::nb == 0 ? 1 : 0;
138 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
139 trace.endBlock();
140
141 trace.beginBlock ( "CountedConstPtrOrConstPtr allows to share objects." );
142 {
143 CountedConstPtrOrConstPtr<A> cptr( new A( 7 ) );
144 CountedConstPtrOrConstPtr<A> cptr2 = cptr;
145 ++nb; nbok += A::nb == 1 ? 1 : 0;
146 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
147 ++nb; nbok += cptr.get() == cptr2.get() ? 1 : 0;
148 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() == cptr2.get()" << std::endl;
149 ++nb; nbok += cptr.count() == 2 ? 1 : 0;
150 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.count() == 2" << std::endl;
151 ++nb; nbok += cptr2.count() == 2 ? 1 : 0;
152 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr2.count() == 2" << std::endl;
153 }
154 ++nb; nbok += A::nb == 0 ? 1 : 0;
155 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
156 trace.endBlock();
157
158 trace.beginBlock ( "CountedConstPtrOrConstPtr allows to share objects with CountedPtr." );
159 {
160 CountedPtr<A> cptr( new A( 7 ) );
161 CountedConstPtrOrConstPtr<A> cptr2 = cptr;
162 ++nb; nbok += A::nb == 1 ? 1 : 0;
163 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
164 ++nb; nbok += cptr.get() == cptr2.get() ? 1 : 0;
165 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() == cptr2.get()" << std::endl;
166 ++nb; nbok += cptr.count() == 2 ? 1 : 0;
167 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.count() == 2" << std::endl;
168 ++nb; nbok += cptr2.count() == 2 ? 1 : 0;
169 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr2.count() == 2" << std::endl;
170 }
171 ++nb; nbok += A::nb == 0 ? 1 : 0;
172 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
173 trace.endBlock();
174
175 trace.beginBlock ( "CountedConstPtrOrConstPtr allows to share objects with CountedPtrOrPtr." );
176 {
177 CountedPtrOrPtr<A> cptr( new A( 7 ) );
178 CountedConstPtrOrConstPtr<A> cptr2 = cptr;
179 ++nb; nbok += A::nb == 1 ? 1 : 0;
180 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
181 ++nb; nbok += cptr.get() == cptr2.get() ? 1 : 0;
182 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() == cptr2.get()" << std::endl;
183 ++nb; nbok += cptr.count() == 2 ? 1 : 0;
184 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.count() == 2" << std::endl;
185 ++nb; nbok += cptr2.count() == 2 ? 1 : 0;
186 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr2.count() == 2" << std::endl;
187 }
188 ++nb; nbok += A::nb == 0 ? 1 : 0;
189 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
190 trace.endBlock();
191
192 trace.beginBlock ( "CountedConstPtrOrConstPtr are smart wrt assignment." );
193 {
194 CountedConstPtrOrConstPtr<A> cptr( new A( 3 ) );
195 CountedConstPtrOrConstPtr<A> cptr2( new A( 12 ) );
196 ++nb; nbok += A::nb == 2 ? 1 : 0;
197 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 2" << std::endl;
198 ++nb; nbok += cptr.get() != cptr2.get() ? 1 : 0;
199 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() != cptr2.get()" << std::endl;
200 cptr = cptr2;
201 ++nb; nbok += A::nb == 1 ? 1 : 0;
202 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
203 ++nb; nbok += cptr.get()->a == 12 ? 1 : 0;
204 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get()->a == 12" << std::endl;
205 // cptr.get()->a = 5; // does not compile.
206 ++nb; nbok += cptr.get() == cptr2.get() ? 1 : 0;
207 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() == cptr2.get()" << std::endl;
208 ++nb; nbok += cptr.count() == 2 ? 1 : 0;
209 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.count() == 2" << std::endl;
210 ++nb; nbok += cptr2.count() == 2 ? 1 : 0;
211 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr2.count() == 2" << std::endl;
212 }
213 ++nb; nbok += A::nb == 0 ? 1 : 0;
214 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
215 trace.endBlock();
216
217 trace.beginBlock ( "CountedConstPtrOrConstPtr and CountedPtr are smart wrt assignment." );
218 {
219 CountedConstPtrOrConstPtr<A> cptr( new A( 3 ) );
220 CountedPtr<A> cptr2( new A( 12 ) );
221 ++nb; nbok += A::nb == 2 ? 1 : 0;
222 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 2" << std::endl;
223 ++nb; nbok += cptr.get() != cptr2.get() ? 1 : 0;
224 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() != cptr2.get()" << std::endl;
225 cptr = cptr2;
226 ++nb; nbok += A::nb == 1 ? 1 : 0;
227 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
228 ++nb; nbok += cptr.get()->a == 12 ? 1 : 0;
229 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get()->a == 12" << std::endl;
230 ++nb; nbok += cptr.get() == cptr2.get() ? 1 : 0;
231 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() == cptr2.get()" << std::endl;
232 ++nb; nbok += cptr.count() == 2 ? 1 : 0;
233 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.count() == 2" << std::endl;
234 ++nb; nbok += cptr2.count() == 2 ? 1 : 0;
235 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr2.count() == 2" << std::endl;
236 }
237 ++nb; nbok += A::nb == 0 ? 1 : 0;
238 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
239 trace.endBlock();
240
241 trace.beginBlock ( "CountedConstPtrOrConstPtr and CountedPtrOrPtr are smart wrt assignment." );
242 {
243 CountedConstPtrOrConstPtr<A> cptr( new A( 3 ) );
244 CountedPtrOrPtr<A> cptr2( new A( 12 ) );
245 ++nb; nbok += A::nb == 2 ? 1 : 0;
246 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 2" << std::endl;
247 ++nb; nbok += cptr.get() != cptr2.get() ? 1 : 0;
248 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() != cptr2.get()" << std::endl;
249 cptr = cptr2;
250 ++nb; nbok += A::nb == 1 ? 1 : 0;
251 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 1" << std::endl;
252 ++nb; nbok += cptr.get()->a == 12 ? 1 : 0;
253 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get()->a == 12" << std::endl;
254 ++nb; nbok += cptr.get() == cptr2.get() ? 1 : 0;
255 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.get() == cptr2.get()" << std::endl;
256 ++nb; nbok += cptr.count() == 2 ? 1 : 0;
257 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr.count() == 2" << std::endl;
258 ++nb; nbok += cptr2.count() == 2 ? 1 : 0;
259 trace.info() << "(" << nbok << "/" << nb << ") " << "cptr2.count() == 2" << std::endl;
260 }
261 ++nb; nbok += A::nb == 0 ? 1 : 0;
262 trace.info() << "(" << nbok << "/" << nb << ") " << "A::nb == 0" << std::endl;
263 trace.endBlock();
264
265 trace.endBlock();
266 return nb == nbok;
267}
268
269
271// Standard services - public :
272
273int main( int argc, char** argv )
274{
275 trace.beginBlock ( "Testing class CountedConstPtrOrConstPtr" );
276 trace.info() << "Args:";
277 for ( int i = 0; i < argc; ++i )
278 trace.info() << " " << argv[ i ];
279 trace.info() << endl;
280
282 trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
283 trace.endBlock();
284 return res ? 0 : 1;
285}
286// //
Aim: Smart or simple const pointer on T. It can be a smart pointer based on reference counts or a sim...
Aim: Smart or simple pointer on T. It can be a smart pointer based on reference counts or a simple po...
T * get() const noexcept
unsigned int count() const
Aim: Smart pointer based on reference counts.
Definition: CountedPtr.h:80
T * get() const noexcept
Definition: CountedPtr.h:195
unsigned int count() const
Definition: CountedPtr.h:236
void beginBlock(const std::string &keyword="")
std::ostream & emphase()
std::ostream & info()
double endBlock()
DGtal is the top-level namespace which contains all DGtal functions and types.
Trace trace
Definition: Common.h:154
STL namespace.
int main()
Definition: testBits.cpp:56
bool testCountedConstPtrOrConstPtrMemory()