ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/DataCont/interface/Ref.h
Revision: 1.8
Committed: Wed Jul 25 03:08:40 2012 UTC (12 years, 9 months ago) by paus
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_032, Mit_031, Mit_030, Mit_029c, Mit_029b, Mit_030_pre1, Mit_029a, Mit_029, Mit_029_pre1, HEAD
Changes since 1.7: +16 -11 lines
Error occurred while calculating annotation data.
Log Message:
Preparing for version 029.

File Contents

# Content
1 //--------------------------------------------------------------------------------------------------
2 // $Id: Ref.h,v 1.7 2010/09/19 23:46:08 bendavid Exp $
3 //
4 // Ref
5 //
6 // Templated implementation of our own TRef.
7 //
8 // Authors: J.Bendavid
9 //--------------------------------------------------------------------------------------------------
10
11 #ifndef MITANA_DATACONT_REF_H
12 #define MITANA_DATACONT_REF_H
13
14 #include <TObject.h>
15 #include <TRefTable.h>
16 #include <TProcessID.h>
17 #include <TError.h>
18 #include "MitAna/DataCont/interface/RefResolver.h"
19 #include "MitAna/DataCont/interface/ProcIDRef.h"
20
21 namespace mithep
22 {
23 template<class ArrayElement>
24 class Ref
25 {
26 public:
27 Ref() : fPID(0), fUID(0) {}
28 Ref(const ArrayElement *ae) { SetObject(ae); }
29 virtual ~Ref() {}
30
31 Bool_t IsNull() const { return fUID==0 ? kTRUE : kFALSE; }
32 Bool_t IsValid() const { return !IsNull(); }
33 const ArrayElement *Obj() const;
34 ArrayElement *Obj();
35 Bool_t RefsObject(const ArrayElement *ae) const;
36 void SetObject(const ArrayElement *ae);
37
38 void operator= (const ArrayElement *ae) { SetObject(ae); }
39 Bool_t operator==(const ArrayElement *ae) { return RefsObject(ae); }
40
41 protected:
42 TObject *GetObject() const;
43
44 ProcIDRef fPID; //||process id corresponding to referenced object
45 UInt_t fUID; //unique id of the referenced object
46
47 ClassDef(Ref, 1) // Templated implementation of our own TRef
48 };
49 }
50
51 //--------------------------------------------------------------------------------------------------
52 template<class ArrayElement>
53 TObject *mithep::Ref<ArrayElement>::GetObject() const
54 {
55 // Return pointer to object. Code adapted from TRef::GetObject().
56
57 if (IsNull())
58 return 0;
59
60 TProcessID *pid = fPID.Pid();
61 if (!pid) {
62 Fatal("GetObject","Process id pointer is null!");
63 return 0;
64 }
65
66 if (!TProcessID::IsValid(pid)) {
67 Fatal("GetObject","Process id is invalid!");
68 return 0;
69 }
70
71 TObject *obj = RefResolver::GetObjectWithID(fUID,pid);
72 if (!obj) {
73 Fatal("Ref::GetObject","Null pointer for valid ref!");
74 }
75
76 return obj;
77 }
78
79 //--------------------------------------------------------------------------------------------------
80 template<class ArrayElement>
81 const ArrayElement *mithep::Ref<ArrayElement>::Obj() const
82 {
83 // Return entry at given index. Code adapted from TRef::GetObject().
84
85 return reinterpret_cast<const ArrayElement*>(GetObject());
86 }
87
88 //--------------------------------------------------------------------------------------------------
89 template<class ArrayElement>
90 ArrayElement *mithep::Ref<ArrayElement>::Obj()
91 {
92 // Return entry at given index. Code adapted from TRef::GetObject().
93
94 return reinterpret_cast<ArrayElement*>(GetObject());
95 }
96
97 //--------------------------------------------------------------------------------------------------
98 template<class ArrayElement>
99 Bool_t mithep::Ref<ArrayElement>::RefsObject(const ArrayElement *ae) const
100 {
101 // Check whether Ref points to given object.
102
103 if (IsNull())
104 return kFALSE;
105
106 const TObject *oe = reinterpret_cast<const TObject*>(ae);
107
108 if (!oe->TestBit(kIsReferenced))
109 return kFALSE;
110
111 UInt_t oUid = oe->GetUniqueID();
112 TProcessID *oPid = TProcessID::GetProcessWithUID(oUid, const_cast<TObject*>(oe));
113 if (!oPid)
114 return kFALSE;
115
116 if ( (fUID&0xffffff)!=(oUid&0xffffff) || fPID.Pid()->GetUniqueID()!=oPid->GetUniqueID())
117 return kFALSE;
118 return kTRUE;
119 }
120
121 //--------------------------------------------------------------------------------------------------
122 template<class ArrayElement>
123 void mithep::Ref<ArrayElement>::SetObject(const ArrayElement *ae)
124 {
125 // Set reference to object.
126
127 if (!ae)
128 return;
129
130 const TObject *oe = reinterpret_cast<const TObject*>(ae);
131
132
133 // check if the object can belong here and assign or get its uid
134 if (oe->TestBit(kHasUUID)) {
135 Fatal("Add", "Object cannot be added as it has not UUID!");
136 return;
137 }
138
139 if (oe->TestBit(kIsReferenced)) {
140 fUID = oe->GetUniqueID();
141 fPID.SetPid(TProcessID::GetProcessWithUID(fUID, const_cast<TObject*>(oe)));
142 } else {
143 fPID.SetPid(TProcessID::GetSessionProcessID());
144 fUID = TProcessID::AssignID(const_cast<TObject*>(oe));
145 }
146 }
147 #endif