00001 00002 // $Id: CandRefer.cxx,v 1.4 2003/12/07 06:09:49 gmieg Exp $ 00003 // 00004 // CandRefer.cxx 00005 // 00006 // Class for controlling access to the CandBase class. 00007 // 00008 // The CandBase class inherits from CandRefCounted for ref-counting. 00009 // 00010 // Each concrete CandBase must define a Dup function. 00011 // Each concrete CandBase must grant friendship to class CandRefer. 00012 // 00013 // Adapted from Babar's BbrReferencer (written by Gautier Hamel de 00014 // Monchenault and Bob Jacobsen). 00015 // 00016 // Author: G. Irwin 1/2000 00018 00019 #include <cassert> 00020 00021 #include "TBuffer.h" 00022 #include "TClass.h" 00023 00024 #include "Candidate/CandBase.h" 00025 #include "Candidate/CandRefer.h" 00026 #include "MessageService/MsgService.h" 00027 00028 ClassImp(CandRefer) 00029 00030 //______________________________________________________________________ 00031 CVSID("$Id: CandRefer.cxx,v 1.4 2003/12/07 06:09:49 gmieg Exp $"); 00032 00033 //______________________________________________________________________ 00034 CandRefer::CandRefer() : 00035 fRef(0) 00036 { 00037 } 00038 00039 //______________________________________________________________________ 00040 CandRefer::CandRefer(CandBase *ref) : 00041 fRef(ref) 00042 { 00043 IncNRefer(); 00044 } 00045 00046 //______________________________________________________________________ 00047 CandRefer::CandRefer(const CandRefer &cr) 00048 { 00049 fRef = cr.fRef; 00050 IncNRefer(); 00051 } 00052 00053 //______________________________________________________________________ 00054 CandRefer::~CandRefer() 00055 { 00056 DropRefer(); 00057 } 00058 00059 //______________________________________________________________________ 00060 Bool_t CandRefer::operator==(const CandRefer &cr) const 00061 { 00062 return (fRef == cr.fRef); 00063 } 00064 00065 //______________________________________________________________________ 00066 Bool_t CandRefer::operator!=(const CandRefer &cr) const 00067 { 00068 return (fRef != cr.fRef); 00069 } 00070 00071 //______________________________________________________________________ 00072 CandRefer &CandRefer::operator=(const CandRefer &cr) 00073 { 00074 if ((this != &cr) && (fRef != cr.fRef)) { 00075 DropRefer(); 00076 fRef = cr.fRef; 00077 IncNRefer(); 00078 } 00079 return *this; 00080 } 00081 00082 //______________________________________________________________________ 00083 Int_t CandRefer::DecNRefer() 00084 { 00085 if (fRef) return fRef->DropLink() - 1; // Subtract LocalHandle link 00086 return 0; 00087 } 00088 00089 //______________________________________________________________________ 00090 void CandRefer::DropRefer() 00091 { 00092 if (fRef && DecNRefer()==0) delete fRef; 00093 fRef = (CandBase *) 0; 00094 } 00095 00096 //______________________________________________________________________ 00097 Int_t CandRefer::IncNRefer() 00098 { 00099 if (fRef) return fRef->AddLink() - 1; // Subtract LocalHandle link 00100 return 0; 00101 } 00102 00103 //______________________________________________________________________ 00104 Int_t CandRefer::GetNRefers() const 00105 { 00106 if (fRef) return fRef->GetNLinks() - 1; // Subtract LocalHandle link 00107 return 0; 00108 } 00109 00110 //______________________________________________________________________ 00111 CandBase *CandRefer::OwnRef() 00112 { 00113 00114 // Make sure the reference exists 00115 assert(fRef!=0); 00116 00117 // Make sure the referenced object has links (at least this one) 00118 assert(GetNRefers() > 0); 00119 00120 if (GetNRefers() != 1) { // No exclusive access to referenced object 00121 00122 MSG("Cand", Msg::kSynopsis) << "Candidate object of class " 00123 << fRef->ClassName() << " cloned before modification." << endl; 00124 00125 // Decrement the referenced object counter 00126 DecNRefer(); 00127 assert(GetNRefers() > 0); 00128 00129 // Clone the referenced object 00130 fRef = fRef->Dup(); 00131 00132 // Increment the new referenced object counter 00133 IncNRefer(); 00134 assert(GetNRefers()==1); 00135 } 00136 00137 // Return the reference 00138 return fRef; 00139 } 00140 00141 //______________________________________________________________________ 00142 void CandRefer::SetRef(CandBase *ref) 00143 { 00144 if (ref != fRef) { 00145 DropRefer(); 00146 fRef = ref; 00147 IncNRefer(); 00148 } 00149 } 00150 00151 //______________________________________________________________________ 00152 void CandRefer::Streamer(TBuffer &R__b) 00153 { 00154 00155 // Stream an object of class CandRefer. 00156 if (R__b.IsReading()) { 00157 CandRefer::Class()->ReadBuffer(R__b, this); 00158 IncNRefer(); // Ref count incremented from CandRefer Streamer:2/03 00159 } else { 00160 CandRefer::Class()->WriteBuffer(R__b, this); 00161 } 00162 }
1.3.9.1