DGtal  0.9.3
Functions
testCountedConstPtrOrConstPtr.cpp File Reference
#include <iostream>
#include "DGtal/base/Common.h"
#include "DGtal/base/CountedConstPtrOrConstPtr.h"
Include dependency graph for testCountedConstPtrOrConstPtr.cpp:

Go to the source code of this file.

Functions

bool testCountedConstPtrOrConstPtrMemory ()
 
int main (int argc, char **argv)
 

Detailed Description

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Author
Jacques-Olivier Lachaud (jacqu.nosp@m.es-o.nosp@m.livie.nosp@m.r.la.nosp@m.chaud.nosp@m.@uni.nosp@m.v-sav.nosp@m.oie..nosp@m.fr ) Laboratory of Mathematics (CNRS, UMR 5807), University of Savoie, France
Date
2014/07/22

Functions for testing class CountedConstPtrOrConstPtr.

This file is part of the DGtal library.

Definition in file testCountedConstPtrOrConstPtr.cpp.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 273 of file testCountedConstPtrOrConstPtr.cpp.

References DGtal::Trace::beginBlock(), DGtal::Trace::emphase(), DGtal::Trace::endBlock(), DGtal::Trace::info(), testCountedConstPtrOrConstPtrMemory(), and DGtal::trace.

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 }
void beginBlock(const std::string &keyword="")
Trace trace
Definition: Common.h:137
double endBlock()
std::ostream & emphase()
bool testCountedConstPtrOrConstPtrMemory()
std::ostream & info()

◆ testCountedConstPtrOrConstPtrMemory()

bool testCountedConstPtrOrConstPtrMemory ( )

Definition at line 72 of file testCountedConstPtrOrConstPtr.cpp.

References DGtal::Trace::beginBlock(), DGtal::CountedPtr< T >::count(), DGtal::CountedPtrOrPtr< T >::count(), DGtal::CountedConstPtrOrConstPtr< T >::count(), DGtal::Trace::endBlock(), DGtal::CountedPtr< T >::get(), DGtal::CountedPtrOrPtr< T >::get(), DGtal::CountedConstPtrOrConstPtr< T >::get(), DGtal::Trace::info(), DGtal::CountedConstPtrOrConstPtr< T >::isSimple(), DGtal::CountedConstPtrOrConstPtr< T >::isSmart(), and DGtal::trace.

Referenced by main().

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;
84  trace.endBlock();
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 }
void beginBlock(const std::string &keyword="")
Aim: Smart pointer based on reference counts.
Definition: CountedPtr.h:79
Trace trace
Definition: Common.h:137
Aim: Smart or simple const pointer on T. It can be a smart pointer based on reference counts or a sim...
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
std::ostream & info()