Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CandRefer.cxx

Go to the documentation of this file.
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 }

Generated on Mon Feb 15 11:06:28 2010 for loon by  doxygen 1.3.9.1