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 CountedPtrOrPtr.
This file is part of the DGtal library. 
Definition in file testCountedPtrOrPtr.cpp.
      
        
          | bool testCountedPtrOrPtrMemory | ( |  | ) |  | 
      
 
Definition at line 72 of file testCountedPtrOrPtr.cpp.
   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  {
   81  }
   82  ++nb; nbok += 
A::nb == 0 ? 1 : 0;
 
   83  trace.info() << 
"(" << nbok << 
"/" << nb << 
") " << 
"A::nb == 0" << std::endl;
 
   85 
   86  trace.beginBlock ( 
"A CountedPtrOrPtr can be used as a simple pointer on an object without acquiring it." );
 
   87  {
   89    ++nb; nbok += 
A::nb == 1 ? 1 : 0;
 
   90    trace.info() << 
"(" << nbok << 
"/" << nb << 
") " << 
"A::nb == 1" << std::endl;
 
   91    {
   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;
 
  104 
  105  trace.beginBlock ( 
"CountedPtrOrPtr can be used as a smart pointer with acquisition and automatic deallocation." );
 
  106  {
  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;
 
  116 
  117  trace.beginBlock ( 
"CountedPtrOrPtr can be initialized with = CountedPtrOrPtr<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;
 
  128 
  129  trace.beginBlock ( 
"CountedPtrOrPtr can be initialized with = CountedPtr<A>( pointer )." );
 
  130  {
  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;
 
  140 
  141  trace.beginBlock ( 
"CountedPtrOrPtr allows to share objects." );
 
  142  {
  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;
 
  157 
  158  trace.beginBlock ( 
"CountedPtrOrPtr allows to share objects with CountedPtr." );
 
  159  {
  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;
 
  174 
  175  trace.beginBlock ( 
"CountedPtrOrPtr are smart wrt assignment." );
 
  176  {
  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;
 
  198 
  199  trace.beginBlock ( 
"CountedPtrOrPtr and CountedPtr are smart wrt assignment." );
 
  200  {
  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;
 
  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;
 
  225 
  227  return nb == nbok;
  228}
Aim: Smart or simple pointer on T. It can be a smart pointer based on reference counts or a simple po...
unsigned int count() const
Aim: Smart pointer based on reference counts.
References DGtal::CountedPtr< T >::count(), DGtal::CountedPtrOrPtr< T >::count(), DGtal::CountedPtr< T >::get(), DGtal::CountedPtrOrPtr< T >::get(), DGtal::CountedPtrOrPtr< T >::isSimple(), DGtal::CountedPtrOrPtr< T >::isSmart(), A< TC, TD >::nb, and DGtal::trace.
Referenced by main().