DGtal
2.2.0
Toggle main menu visibility
Loading...
Searching...
No Matches
testCountedPtr.cpp
Go to the documentation of this file.
1
16
31
33
#include <iostream>
34
#include "DGtal/base/Common.h"
35
#include "DGtal/base/CountedPtr.h"
37
38
using namespace
std
;
39
using namespace
DGtal
;
40
42
// Functions for testing class CountedPtr.
44
48
bool
testCountedPtr
()
49
{
50
unsigned
int
nbok = 0;
51
unsigned
int
nb = 0;
52
53
trace
.
beginBlock
(
"Testing CountedPtr ..."
);
54
55
int
*value=
new
int(5);
56
CountedPtr<int>
p( value );
57
nbok += p.
unique
() ? 1 : 0;
58
nb++;
59
trace
.
info
() << p <<
" value="
<< *p<< std::endl;
60
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
61
<<
"unique"
<< std::endl;
62
63
*p = 6;
64
trace
.
info
() << p <<
" value="
<< *p<< std::endl;
65
nbok += p.
unique
() ? 1 : 0;
66
nb++;
67
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
68
<<
"unique"
<< std::endl;
69
70
trace
.
endBlock
();
71
72
return
nbok == nb;
73
}
74
75
76
bool
testCountedPtrCopy
()
77
{
78
unsigned
int
nbok = 0;
79
unsigned
int
nb = 0;
80
81
trace
.
beginBlock
(
"Testing CountedPtr copy..."
);
82
83
int
*value=
new
int(5);
84
CountedPtr<int>
p( value );
85
nbok += p.
unique
() ? 1 : 0;
86
nb++;
87
trace
.
info
() << p <<std::endl;
88
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
89
<<
"unique"
<< std::endl;
90
91
CountedPtr<int>
q ( p );
92
93
nbok += p.
unique
() ? 0: 1;
94
nb++;
95
trace
.
info
() << p <<std::endl;
96
trace
.
info
() << q<<std::endl;
97
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
98
<<
"not unique anymore"
<< std::endl;
99
100
101
trace
.
endBlock
();
102
103
return
nbok == nb;
104
}
105
106
struct
A
{
107
A
(
int
_a ) :
a
( _a )
108
{
109
++
nb
;
110
trace
.
info
() <<
"#"
<<
nb
<<
" A::A( int ), a is "
<<
a
<< std::endl;
111
}
112
A
(
const
A
& other ) :
a
( other.
a
)
113
{
114
++
nb
;
115
trace
.
info
() <<
"#"
<<
nb
<<
" A::A( const A& ), a is "
<<
a
<< std::endl;
116
}
117
A
&
operator=
(
const
A
& other )
118
{
119
if
(
this
!= &other )
120
a
= other.
a
;
121
trace
.
info
() <<
"#"
<<
nb
<<
" A::op=( const A& ), a is "
<<
a
<< std::endl;
122
return
*
this
;
123
}
124
~A
()
125
{
126
--
nb
;
127
trace
.
info
() <<
"#"
<<
nb
<<
" A::~A(), a was "
<<
a
<< std::endl;
128
}
129
static
int
nb
;
130
int
a
;
131
};
132
133
int
A::nb
= 0;
134
135
bool
testCountedPtrMemory
()
136
{
137
unsigned
int
nbok = 0;
138
unsigned
int
nb = 0;
139
trace
.
beginBlock
(
"Testing CountedPtr memory management..."
);
140
141
trace
.
beginBlock
(
"An invalid CountedPtr does not create any instance."
);
142
{
143
CountedPtr<A>
cptr;
144
}
145
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
146
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
147
trace
.
endBlock
();
148
149
trace
.
beginBlock
(
"CountedPtr can be used as a simple pointer with automatic deallocation."
);
150
{
151
CountedPtr<A>
cptr(
new
A
( 10 ) );
152
++nb; nbok +=
A::nb
== 1 ? 1 : 0;
153
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 1"
<< std::endl;
154
}
155
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
156
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
157
trace
.
endBlock
();
158
159
trace
.
beginBlock
(
"CountedPtr can be initialized with = CountedPtr<A>( pointer )."
);
160
{
161
CountedPtr<A>
cptr =
CountedPtr<A>
(
new
A
( 5 ) );
162
++nb; nbok +=
A::nb
== 1 ? 1 : 0;
163
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 1"
<< std::endl;
164
}
165
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
166
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
167
trace
.
endBlock
();
168
169
trace
.
beginBlock
(
"CountedPtr allows to share objects."
);
170
{
171
CountedPtr<A>
cptr(
new
A
( 7 ) );
172
CountedPtr<A>
cptr2 = cptr;
173
++nb; nbok +=
A::nb
== 1 ? 1 : 0;
174
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 1"
<< std::endl;
175
++nb; nbok += cptr.
get
() == cptr2.
get
() ? 1 : 0;
176
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get() == cptr2.get()"
<< std::endl;
177
++nb; nbok += cptr.
count
() == 2 ? 1 : 0;
178
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.count() == 2"
<< std::endl;
179
++nb; nbok += cptr2.
count
() == 2 ? 1 : 0;
180
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr2.count() == 2"
<< std::endl;
181
}
182
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
183
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
184
trace
.
endBlock
();
185
186
trace
.
beginBlock
(
"CountedPtr are smart wrt assignment."
);
187
{
188
CountedPtr<A>
cptr(
new
A
( 3 ) );
189
CountedPtr<A>
cptr2(
new
A
( 12 ) );
190
++nb; nbok +=
A::nb
== 2 ? 1 : 0;
191
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 2"
<< std::endl;
192
++nb; nbok += cptr.
get
() != cptr2.
get
() ? 1 : 0;
193
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get() != cptr2.get()"
<< std::endl;
194
cptr = cptr2;
195
++nb; nbok +=
A::nb
== 1 ? 1 : 0;
196
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 1"
<< std::endl;
197
++nb; nbok += cptr.
get
()->a == 12 ? 1 : 0;
198
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get()->a == 12"
<< std::endl;
199
++nb; nbok += cptr.
get
() == cptr2.
get
() ? 1 : 0;
200
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.get() == cptr2.get()"
<< std::endl;
201
++nb; nbok += cptr.
count
() == 2 ? 1 : 0;
202
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr.count() == 2"
<< std::endl;
203
++nb; nbok += cptr2.
count
() == 2 ? 1 : 0;
204
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"cptr2.count() == 2"
<< std::endl;
205
}
206
++nb; nbok +=
A::nb
== 0 ? 1 : 0;
207
trace
.
info
() <<
"("
<< nbok <<
"/"
<< nb <<
") "
<<
"A::nb == 0"
<< std::endl;
208
trace
.
endBlock
();
209
210
trace
.
endBlock
();
211
return
nb == nbok;
212
}
213
214
216
// Standard services - public :
217
218
int
main
(
int
argc,
char
** argv )
219
{
220
trace
.
beginBlock
(
"Testing class CountedPtr"
);
221
trace
.
info
() <<
"Args:"
;
222
for
(
int
i = 0; i < argc; ++i )
223
trace
.
info
() <<
" "
<< argv[ i ];
224
trace
.
info
() << endl;
225
226
bool
res =
testCountedPtr
()
227
&&
testCountedPtrCopy
()
228
&&
testCountedPtrMemory
();
229
trace
.
emphase
() << ( res ?
"Passed."
:
"Error."
) << endl;
230
trace
.
endBlock
();
231
return
res ? 0 : 1;
232
}
233
// //
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::unique
bool unique() const noexcept
Definition
CountedPtr.h:204
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
testCountedPtr.cpp:117
A< TC, int >::nb
static int nb
Definition
testCountedConstPtrOrConstPtr.cpp:66
A::A
A(int _a)
Definition
testCountedPtr.cpp:107
A::~A
~A()
Definition
testCountedPtr.cpp:124
A::A
A(const A &other)
Definition
testCountedPtr.cpp:112
testCountedPtr
bool testCountedPtr()
Definition
testCountedPtr.cpp:48
testCountedPtrMemory
bool testCountedPtrMemory()
Definition
testCountedPtr.cpp:135
testCountedPtrCopy
bool testCountedPtrCopy()
Definition
testCountedPtr.cpp:76
main
int main(int, char **)
Definition
testIntegerComputer.cpp:331
tests
base
testCountedPtr.cpp
Generated on
for DGtal by
1.18.0