DGtal  0.9.3
testCountedPtrOrPtr.cpp
Go to the documentation of this file.
1 
30 #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 
73 {
74  unsigned int nbok = 0;
75  unsigned int nb = 0;
76  trace.beginBlock ( "Testing CountedPtrOrPtr memory managment..." );
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 // //
void beginBlock(const std::string &keyword="")
Aim: Smart pointer based on reference counts.
Definition: CountedPtr.h:79
Trace trace
Definition: Common.h:137
int main(int argc, char **argv)
unsigned int count() const
STL namespace.
double endBlock()
Aim: Smart or simple pointer on T. It can be a smart pointer based on reference counts or a simple po...
Definition: CountedPtr.h:51
unsigned int count() const
Definition: CountedPtr.h:236
bool testCountedPtrOrPtrMemory()
std::ostream & emphase()
DGtal is the top-level namespace which contains all DGtal functions and types.
T * get() const
Definition: CountedPtr.h:195
std::ostream & info()