ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/IPHCalignment2/TrackingTools/TrajectoryState/interface/ProxyBase.h
Revision: 1.1
Committed: Fri Nov 25 16:38:26 2011 UTC (13 years, 5 months ago) by econte
Content type: text/plain
Branch: MAIN
CVS Tags: TBD2011, TBD_2011, HEAD
Log Message:
new IPHC alignment

File Contents

# User Rev Content
1 econte 1.1 #ifndef Tracker_ProxyBase_H
2     #define Tracker_ProxyBase_H
3    
4     #include "TrackingTools/TrajectoryParametrization/interface/TrajectoryStateExceptions.h"
5     #include "TrackingTools/TrajectoryState/interface/CopyUsingNew.h"
6    
7     /** A base class for reference counting proxies.
8     * The class to which this one is proxy must inherit from
9     * ReferenceCounted.
10     * A ProxyBase has value semantics, in contrast to ReferenceCountingPointer,
11     * which has pointer semantics.
12     * The Proxy class inheriting from ProxyBase must duplicate the
13     * part of the interface of the reference counted class that it whiches to expose.
14     */
15    
16     template <class T, class Cloner >
17     class ProxyBase {
18     protected:
19    
20     ProxyBase() : theData(0) {}
21    
22     explicit ProxyBase( T* p) : theData(p) {if (theData) theData->addReference();}
23    
24     ProxyBase( const ProxyBase& other) {
25     theData = other.theData;
26     if (theData) theData->addReference();
27     }
28    
29     ~ProxyBase() {
30     destroy();
31     }
32    
33     ProxyBase& operator=( const ProxyBase& other) {
34     if ( theData != other.theData) {
35     destroy();
36     theData = other.theData;
37     if (theData) theData->addReference();
38     }
39     return *this;
40     }
41    
42    
43     void swap(ProxyBase& other) {
44     std::swap(theData,other.theData);
45     }
46    
47    
48     #if defined( __GXX_EXPERIMENTAL_CXX0X__)
49     ProxyBase(ProxyBase&& other) {
50     theData = other.theData;
51     other.theData=0;
52     }
53    
54     ProxyBase& operator=(ProxyBase&& other) {
55     if ( theData != other.theData) {
56     destroy();
57     theData = other.theData;
58     other.theData=0;
59     }
60     return *this;
61     }
62     #endif
63    
64     const T& data() const { check(); return *theData;}
65    
66     T& unsharedData() {
67     check();
68     if ( references() > 1) {
69     theData->removeReference();
70     theData = Cloner().clone( *theData);
71     if (theData) theData->addReference();
72     }
73     return *theData;
74     }
75    
76     T& sharedData() { check(); return *theData;}
77    
78     bool isValid() const { return theData != 0;}
79    
80     void check() const {
81     if (theData == 0)
82     throw TrajectoryStateException("Error: uninitialized ProxyBase used");
83     }
84    
85     void destroy() { if (isValid()) theData->removeReference();}
86    
87     int references() const {return theData->references();}
88    
89     private:
90     T* theData;
91     };
92    
93     template <class T, class Cloner >
94     inline
95     void swap(ProxyBase<T,Cloner>& lh, ProxyBase<T,Cloner>& rh) {
96     lh.swap(rh);
97     }
98    
99     #endif // Tracker_ProxyBase_H