DGtal
2.2.0
Toggle main menu visibility
Loading...
Searching...
No Matches
testCountedPtrOrPtr.cpp
Go to the documentation of this file.
1
16
29
31
#include <iostream>
32
#include "DGtal/base/Common.h"
33
#include "DGtal/base/CountedPtrOrPtr.h"
35
36
using namespace
std
;
37
using namespace
DGtal
;
38
40
// Functions for testing class CountedPtrOrPtr.
42
43
struct
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
70
int
A::nb
= 0;
71
72
bool
testCountedPtrOrPtrMemory
()
73
{
74
unsigned
int
nbok = 0;
75
unsigned
int
nb = 0;
76
trace
.
beginBlock
(
"Testing CountedPtrOrPtr memory management..."
);
77
78
trace
.
beginBlock
(
"An invalid CountedPtrOrPtr does not create any instance."
);
79
{
80
CountedPtrOrPtr<A>
cptr;
81
}
82
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
83
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
84
trace
.
endBlock
();
85
86
trace
.
beginBlock
(
"A CountedPtrOrPtr 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
CountedPtrOrPtr<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
(
"CountedPtrOrPtr can be used as a smart pointer with acquisition and automatic deallocation."
);
106
{
107
CountedPtrOrPtr<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
(
"CountedPtrOrPtr can be initialized with = CountedPtrOrPtr<A>( pointer )."
);
118
{
119
CountedPtrOrPtr<A>
cptr =
CountedPtrOrPtr<A>
(
new
A
( 5 ) );
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
(
"CountedPtrOrPtr can be initialized with = CountedPtr<A>( pointer )."
);
130
{
131
CountedPtrOrPtr<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
(
"CountedPtrOrPtr allows to share objects."
);
142
{
143
CountedPtrOrPtr<A>
cptr(
new
A
( 7 ) );
144
CountedPtrOrPtr<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
(
"CountedPtrOrPtr allows to share objects with CountedPtr."
);
159
{
160
CountedPtr<A>
cptr(
new
A
( 7 ) );
161
CountedPtrOrPtr<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
(
"CountedPtrOrPtr are smart wrt assignment."
);
176
{
177
CountedPtrOrPtr<A>
cptr(
new
A
( 3 ) );
178
CountedPtrOrPtr<A>
cptr2(
new
A
( 12 ) );
179
++nb; nbok +=
A::nb
== 2 ? 1 : 0;
180
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 2"
<< std::endl;
181
++nb; nbok += cptr.
get
() != cptr2.
get
() ? 1 : 0;
182
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get() != cptr2.get()"
<< std::endl;
183
cptr = cptr2;
184
++nb; nbok +=
A::nb
== 1 ? 1 : 0;
185
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 1"
<< std::endl;
186
++nb; nbok += cptr.
get
()->a == 12 ? 1 : 0;
187
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get()->a == 12"
<< std::endl;
188
++nb; nbok += cptr.
get
() == cptr2.
get
() ? 1 : 0;
189
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get() == cptr2.get()"
<< std::endl;
190
++nb; nbok += cptr.
count
() == 2 ? 1 : 0;
191
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.count() == 2"
<< std::endl;
192
++nb; nbok += cptr2.
count
() == 2 ? 1 : 0;
193
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr2.count() == 2"
<< std::endl;
194
}
195
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
196
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
197
trace
.
endBlock
();
198
199
trace
.
beginBlock
(
"CountedPtrOrPtr and CountedPtr are smart wrt assignment."
);
200
{
201
CountedPtrOrPtr<A>
cptr(
new
A
( 3 ) );
202
CountedPtr<A>
cptr2(
new
A
( 12 ) );
203
++nb; nbok +=
A::nb
== 2 ? 1 : 0;
204
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 2"
<< std::endl;
205
++nb; nbok += cptr.
get
() != cptr2.
get
() ? 1 : 0;
206
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get() != cptr2.get()"
<< std::endl;
207
cptr = cptr2;
208
++nb; nbok +=
A::nb
== 1 ? 1 : 0;
209
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 1"
<< std::endl;
210
++nb; nbok += cptr.
get
()->a == 12 ? 1 : 0;
211
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get()->a == 12"
<< std::endl;
212
++nb; nbok += cptr.
get
() == cptr2.
get
() ? 1 : 0;
213
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get() == cptr2.get()"
<< std::endl;
214
cptr.
get
()->a = 5;
// does compile.
215
++nb; nbok += cptr.
get
()->a == 5 ? 1 : 0;
216
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get()->a == 5"
<< std::endl;
217
++nb; nbok += cptr.
count
() == 2 ? 1 : 0;
218
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.count() == 2"
<< std::endl;
219
++nb; nbok += cptr2.
count
() == 2 ? 1 : 0;
220
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr2.count() == 2"
<< std::endl;
221
}
222
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
223
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
224
trace
.
endBlock
();
225
226
trace
.
endBlock
();
227
return
nb == nbok;
228
}
229
230
232
// Standard services - public :
233
234
int
main
(
int
argc,
char
** argv )
235
{
236
trace
.
beginBlock
(
"Testing class CountedPtrOrPtr"
);
237
trace
.
info
() <<
"Args:"
;
238
for
(
int
i = 0; i < argc; ++i )
239
trace
.
info
() <<
" "
<< argv[ i ];
240
trace
.
info
() << endl;
241
242
bool
res =
testCountedPtrOrPtrMemory
();
243
trace
.
emphase
() << ( res ?
"Passed."
:
"Error."
) << endl;
244
trace
.
endBlock
();
245
return
res ? 0 : 1;
246
}
247
// //
DGtal::CountedPtrOrPtr
Aim: Smart or simple pointer on T. It can be a smart pointer based on reference counts or a simple po...
Definition
CountedPtrOrPtr.h:96
DGtal::CountedPtrOrPtr::get
T * get() const noexcept
Definition
CountedPtrOrPtr.h:290
DGtal::CountedPtrOrPtr::isSmart
bool isSmart() const
Definition
CountedPtrOrPtr.h:217
DGtal::CountedPtrOrPtr::count
unsigned int count() const
Definition
CountedPtrOrPtr.h:314
DGtal::CountedPtrOrPtr::CountedPtrOrPtr
CountedPtrOrPtr(T *p=0, bool isCountedPtr=true)
Definition
CountedPtrOrPtr.h:121
DGtal::CountedPtrOrPtr::isSimple
bool isSimple() const
Definition
CountedPtrOrPtr.h:225
DGtal::CountedPtr
Aim: Smart pointer based on reference counts.
Definition
CountedPtr.h:80
DGtal::CountedPtr::get
T * get() const noexcept
Definition
CountedPtr.h:195
DGtal::CountedPtr::count
unsigned int count() const
Definition
CountedPtr.h:236
DGtal::CountedPtr::CountedPtr
CountedPtr(T *p=0)
Definition
CountedPtr.h:119
DGtal::Trace::beginBlock
void beginBlock(const std::string &keyword="")
DGtal::Trace::emphase
std::ostream & emphase()
DGtal::Trace::info
std::ostream & info()
DGtal::Trace::endBlock
double endBlock()
DGtal
DGtal is the top-level namespace which contains all DGtal functions and types.
Definition
ClosedIntegerHalfPlane.h:49
DGtal::trace
Trace trace
std
STL namespace.
A
Definition
testCountedConstPtrOrConstPtr.cpp:43
A< TC, int >::a
int a
Definition
testCountedConstPtrOrConstPtr.cpp:67
A::operator=
A & operator=(const A &other)
Definition
testCountedPtrOrPtr.cpp:54
A< TC, int >::nb
static int nb
Definition
testCountedConstPtrOrConstPtr.cpp:66
A::A
A(int _a)
Definition
testCountedPtrOrPtr.cpp:44
A::~A
~A()
Definition
testCountedPtrOrPtr.cpp:61
A::A
A(const A &other)
Definition
testCountedPtrOrPtr.cpp:49
testCountedPtrOrPtrMemory
bool testCountedPtrOrPtrMemory()
Definition
testCountedPtrOrPtr.cpp:72
main
int main(int, char **)
Definition
testIntegerComputer.cpp:331
tests
base
testCountedPtrOrPtr.cpp
Generated on
for DGtal by
1.18.0