source: trunk/source/global/management/test/testReferenceCountedHandle.cc @ 1358

Last change on this file since 1358 was 1199, checked in by garnier, 15 years ago

nvx fichiers dans CVS

File size: 9.8 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: testReferenceCountedHandle.cc,v 1.10 2006/06/29 19:05:08 gunter Exp $
28//
29//
30// The program testing features and behaviour of the
31// reference counted handle, smart-pointer, class.
32// ----------------------------------------------------------------------
33
34#define sDefault  "Default"
35#define csDefault "cDefault"
36
37#include "G4ios.hh"
38#include "G4ReferenceCountedHandle.hh"
39
40#include <assert.h>
41
42#include <iostream>
43#include <string>
44#include <vector>
45
46class TesterBase
47{
48public: 
49  TesterBase() {
50  }
51 
52  virtual ~TesterBase() {
53    G4cout << "TesterBase being destroyed..." << G4endl;
54  }
55 
56  inline bool Ok() const {
57    return true;
58  }
59 
60  virtual void Report() = 0;
61};
62
63class TesterString : public TesterBase
64{
65public:
66 
67  TesterString( const char* str = csDefault ) {
68    fData = str;
69  }
70 
71  TesterString( std::string& str ) : fData(str) {}
72 
73  ~TesterString(){
74    G4cout << "Tester " << fData << " being destroyed..." << G4endl;   
75  }
76 
77  inline const std::string& Data() const {
78    return fData;
79  }
80 
81  inline void  SetData( const std::string& data ) {
82    fData = data;
83  }
84 
85  inline void  SetData( const char*        data ) {
86    fData = data;
87  }
88 
89  virtual void Report() {
90    G4cout << " >>" << Data() << "<< ";
91  }
92 
93private:
94  std::string fData;
95};
96
97
98class TesterInt : public TesterBase
99{
100public:
101  TesterInt( int i = 0 ) : fData( i ) {}
102 
103  ~TesterInt(){
104    G4cout << "Tester " << fData << " being destroyed..." << G4endl;   
105  }
106 
107  inline const int& Data() const {
108    return fData;
109  }
110 
111  inline void SetData( const int data ) {
112    fData = data;
113  }
114 
115  virtual void Report() {
116    G4cout << " >>" << Data() << "<< ";
117  }
118 
119private:
120  int fData;
121};
122
123typedef G4ReferenceCountedHandle<TesterBase>   Counted;
124typedef G4ReferenceCountedHandle<TesterString> CountedString;
125typedef G4ReferenceCountedHandle<TesterInt>    CountedInt;
126
127/*
128// Beta prototype of the class monitoring run-time activity of the RC handles
129class HandleWatcher {
130public:
131  typedef std::vector<G4ReferenceCountedHandle<TesterBase> >       Handles;
132  typedef Handles::iterator          HandlesIt;
133  typedef Handles::const_iterator    HandlesCIt;
134 
135public:
136  HandleWatcher() {}
137 
138  ~HandleWatcher() {
139    fHandles.clear();
140  }
141 
142  inline void AddHandle( const Counted& handle ) {
143    SetCurrent( handle );
144    fHandles.push_back( handle );
145  }
146 
147  inline const Counted& operator[]( unsigned int index ) {
148    return fHandles[index];
149  }
150 
151  inline void SetCurrent( const Counted& handle ) {
152    fCurrent = handle;
153  }
154 
155  void Report() {
156    G4cout << "HandleWatcher Report:" << G4endl;
157    G4cout << "---------------------" << G4endl;
158    HandlesCIt it;
159    for( it = fHandles.begin(); it != fHandles.end(); it++ ) {
160      G4cout << "Handle "; (*it)->Report(); G4cout << " count " << (*it).Count() << G4endl;
161    }
162    G4cout << "\nCurrent handle "; fCurrent->Report();
163    G4cout << " count " << fCurrent.Count() << G4endl;
164  }
165 
166private:
167  Handles fHandles;
168  Counted fCurrent;
169};
170*/
171
172inline void SimulateNavigator( Counted& rcObj ) {
173  rcObj = new TesterString( "Simulated" );
174}
175
176int main( int argc, char* argv[] )
177{
178  Counted t0;
179  G4cout << "Testing reference counting..." << G4endl;
180  //HandleWatcher watcher;
181 
182  Counted t1 = new TesterString();
183  t0 = t1;
184  {
185                  assert( t1 );
186      assert( 2 == t1.Count() );
187     
188      G4cout << G4endl << "Initial tester 1 count:................... " << t1.Count() << G4endl;
189     
190      //watcher.AddHandle( t1 );
191     
192      Counted t2;
193      assert( !t2 );
194     
195      G4cout << "Initial tester 2 count:................... " << t2.Count() << G4endl;
196     
197      t2 = t1;
198     
199      assert( t1 );
200      assert( t2 );
201      assert( 3 == t1.Count() );
202      assert( 3 == t2.Count() );
203     
204      G4cout << "After assignment tester 1 count:.......... " << t1.Count() << G4endl;
205      G4cout << "After assignment tester 2 count:.......... " << t2.Count() << G4endl;
206     
207      //memory_watcher.AllocInfo();
208      //watcher.AddHandle( t2 );
209     
210      {
211        Counted t3 = t2;
212       
213        assert( t3 );
214       
215        assert( 4 == t1.Count() );
216        assert( 4 == t2.Count() );
217        assert( 4 == t3.Count() );
218       
219        G4cout << "After copy tester 1 count:................ " << t1.Count() << G4endl;
220        G4cout << "After copy tester 2 count:................ " << t2.Count() << G4endl;
221        G4cout << "Initial tester 3 count:................... " << t3.Count() << G4endl;
222       
223        //watcher.AddHandle( t3 );
224      } // t3 Done
225     
226      //memory_watcher.AllocInfo();
227     
228      assert( t1 );
229      assert( t2 );
230      assert( 3 == t1.Count() );
231      assert( 3 == t2.Count() );
232     
233      G4cout << "After destruction of t3 tester 1 count:... " << t1.Count() << G4endl;
234      G4cout << "                        tester 2 count:... " << t2.Count() << G4endl;
235  } // t2 Done   
236 
237  assert( t1 );
238  assert( 2 == t1.Count() );
239 
240  G4cout << "After destruction of t2 tester 1 count:... " << t1.Count() << G4endl;
241 
242  //--------------------------------------------------------------------------------
243  G4cout << "\nTesting dereferencing..." << G4endl;
244  assert( t1->Ok() );
245  G4cout << "Dereferencing of t1 method Ok() is:....... " << (int)t1->Ok() << G4endl;
246 
247  const TesterBase* nativeObj = t1();
248  assert( nativeObj != 0);
249  G4cout << "Dereferenced object's method Ok() is:..... " << (int)nativeObj->Ok() << G4endl;
250 
251  //--------------------------------------------------------------------------------
252  G4cout << "\nTesting copy and assignment\nby a pointer to counted object...\n" << G4endl;
253  G4cout << "Tester 1 is counting:....................."; t1->Report();
254  G4cout << "with count: " << t1.Count() << G4endl;
255  Counted t4 = t1;
256  G4cout << "\nTester 1 being copied to the new tester 4 ...\n" << G4endl;
257  G4cout << "Tester 1 is counting:....................."; t1->Report();
258  G4cout << "with count: " << t1.Count() << G4endl;
259  G4cout << "Tester 4 is counting:....................."; t4->Report();
260  G4cout << "with count: " << t4.Count() << G4endl;
261 
262  //watcher.AddHandle( t4 );
263 
264  std::string str = "New";
265  t1 = new TesterString( str );
266  assert( 1 == t1.Count() );   
267  G4cout << "\nAfter assignment of a counted object pointer to t1:\n" << G4endl;
268  G4cout << "Tester 0 is counting:....................."; t0->Report();
269  G4cout << "with count: " << t0.Count() << G4endl;
270  G4cout << "Tester 1 is counting:....................."; t1->Report();
271  G4cout << "with count: " << t1.Count() << G4endl;
272  G4cout << "Tester 4 is counting:....................."; t4->Report();
273  G4cout << "with count: " << t4.Count() << G4endl;
274 
275  TesterString* dumbPtr = dynamic_cast<TesterString*>( t4() );
276  dumbPtr->SetData( "Updated" );
277  G4cout << "\nAfter the counted object's data update in t4:\n" << G4endl;
278  G4cout << "Tester 0 is counting:....................."; t0->Report();
279  G4cout << "with count: " << t0.Count() << G4endl;
280  G4cout << "Tester 1 is counting:....................."; t1->Report();
281  G4cout << "with count: " << t1.Count() << G4endl;
282  G4cout << "Tester 4 is counting:....................."; t4->Report();
283  G4cout << "with count: " << t4.Count() << G4endl;
284 
285  t4 = new TesterInt( 100 );
286  G4cout << "\nAfter assignment of an int tester object to t1:\n" << G4endl;
287  G4cout << "Tester 0 is counting:....................."; t0->Report();
288  G4cout << "with count: " << t0.Count() << G4endl;
289  G4cout << "Tester 1 is counting:....................."; t1->Report();
290  G4cout << "with count: " << t1.Count() << G4endl;
291  G4cout << "Tester 4 is counting:....................."; t4->Report();
292  G4cout << "with count: " << t4.Count() << G4endl;
293 
294  G4cout << "\nCalling SimulateNavigator( t0 )...\n" << G4endl;
295  SimulateNavigator( t0 );
296 
297  G4cout << "\nAfter SimulateNavigator( t0 ) call...\n" << G4endl;
298  G4cout << "Tester 0 is counting:....................."; t0->Report();
299  G4cout << "with count: " << t0.Count() << G4endl;
300  G4cout << "Tester 1 is counting:....................."; t1->Report();
301  G4cout << "with count: " << t1.Count() << G4endl;
302  G4cout << "Tester 4 is counting:....................."; t4->Report();
303  G4cout << "with count: " << t4.Count() << G4endl;
304 
305  //watcher.Report();
306 
307  G4cout << "\nEnd of program, expecting the automatic heap memory cleanup...\n" << G4endl;
308 
309  return 0;
310}
Note: See TracBrowser for help on using the repository browser.