1 #ifndef _StRegistry_ 2 #define _StRegistry_ 3 4 5 ////////////////////////////////////////////////////////////////////////// 6 // // 7 // // 8 // // 9 ////////////////////////////////////////////////////////////////////////// 10 11 #include <assert.h> 12 #include "TString.h" 13 #include "TObject.h" 14 #include "StObject.h" 15 //#ifndef __CINT__ 16 class TObject; 17 #include <vector> 18 #include <algorithm> 19 using std::vector; 20 using std::random_shuffle; 21 typedef vector<TObject*> VecTObj; 22 #ifndef __CINT__ 23 typedef vector<TObject*>::iterator VecTObjIter; 24 typedef vector<TObject*>::const_iterator const_VecTObjIter; 25 typedef VecTObjIter StObjArrayIter; 26 typedef VecTObjIter StStrArrayIter; 27 typedef VecTObjIter StRefArrayIter; 28 typedef const_VecTObjIter const_StObjArrayIter; 29 typedef const_VecTObjIter const_StStrArrayIter; 30 typedef const_VecTObjIter const_StRefArrayIter; 31 #endif /*!__CINT__*/ 32 33 #ifdef __CINT__NEVER 34 class VecTObj; 35 class VecTObjIter; 36 class const_VecTObjIter; 37 class StObjArrayIter; 38 class StStrArrayIter; 39 class StRefArrayIter; 40 class const_StObjArrayIter; 41 class const_StStrArrayIter; 42 class const_StRefArrayIter; 43 #endif /*__CINT__*/ 44 45 class StObjLink : public TObject 46 { 47 public: 48 StObjLink(const StObject *p=0) {fLink=(StObject*)p;} 49 StObjLink(const StObjLink &from):TObject() {fLink=(StObject*)from.fLink;} 50 ~StObjLink() {fLink=0;} 51 52 StObjLink &operator=(StObjLink &from){fLink=from.fLink;return *this;} 53 StObjLink &operator=(StObject *obj) {fLink=obj; return *this;} 54 StObject &operator*() {return *fLink;} 55 StObject *operator->() {return fLink;} 56 // operator StObject *&() {return fLink;} 57 // operator const StObject *() const {return fLink;} 58 StObject* get() {return fLink;} 59 virtual Bool_t IsFolder() const {return 1;} 60 virtual void Browse(TBrowser* b); 61 // void Streamer(TBuffer &buf); 62 63 StObject *fLink; 64 ClassDef(StObjLink,1) 65 }; 66 67 template<class T> 68 class StLink : public StObjLink { 69 public: 70 typedef T element_type; 71 StLink(T *p = 0):StObjLink(p){}; 72 StLink<T> &operator=(T *obj) {fLink=obj; return *this;} 73 StLink<T> &operator=(const StLink<T> &fr) {fLink=(StObject*)fr.fLink; return *this;} 74 T &operator*() {return *((T*)fLink);} 75 T *operator->() {return (T*)fLink; } 76 const T *operator->() const {return (const T*)fLink; } 77 operator const T *() const{return (const T*)fLink; } 78 operator T *&() {return ( T*&)fLink; } 79 }; 80 81 82 class StObjArray; 83 class StStrArray; 84 class StRefArray; 85 86 87 class StObjArray : public StObject { 88 public: 89 StObjArray(Int_t sz=0){if(sz) resize(sz);} 90 virtual ~StObjArray(){} 91 virtual void Browse(TBrowser *b); 92 void random_shuffle(int start=0,int end=0x7fffffff); 93 size_t capacity() const {return fV.capacity();} 94 size_t max_size() const {return fV.max_size();} 95 void clear() {fV.clear() ;} 96 void pop_back() {fV.pop_back() ;} 97 int empty() const {return fV.empty() ;} 98 size_t size () const {return fV.size() ;} 99 void reserve(size_t sz) {fV.reserve(sz) ;} 100 void resize(size_t sz,TObject *v=0) {fV.resize(sz,v);} 101 virtual Bool_t IsFolder() const; 102 TObject * &at(int i) {return fV[i];} 103 void put_at(TObject *obj,int i){fV[i]=obj;} 104 105 TObject * const &front() const { return fV.front();} 106 TObject * &front() { return fV.front();} 107 108 TObject * const &back() const { return fV.back();} 109 TObject * &back() { return fV.back();} 110 TObject * find(const char *name) const; 111 112 #ifndef __CINT__ 113 const_VecTObjIter begin() const {return fV.begin();} 114 VecTObjIter begin() {return fV.begin();} 115 const_VecTObjIter end() const {return fV.end();} 116 VecTObjIter end() {return fV.end();} 117 TObject** Erase(TObject** it ,int del); 118 TObject** Erase(TObject** fst,TObject** lst,int del); 119 #endif /*!__CINT__*/ 120 121 TObject *& operator[](Int_t i) {return fV[i];} 122 TObject * const &operator[](Int_t i) const {return fV[i];} 123 void push_back(const TObject * const to){fV.push_back((TObject*)to);} 124 Int_t getEntries() const; 125 void ls(const char *tit="") const; 126 void Print(const char *tit="") const { ls(tit); } 127 protected: 128 //#ifndef __CINT__ 129 VecTObj fV; 130 //#endif //_CINT__ 131 ClassDef(StObjArray,4) 132 }; 133 134 135 class StStrArray : public StObjArray { 136 protected: 137 138 //NONMONO void Book(TObject* obj,int idx); 139 140 public: 141 StStrArray(Int_t sz=0); 142 StStrArray(const StStrArray &from); 143 virtual ~StStrArray(); 144 void operator=(const StStrArray &a); 145 146 void push_back(const TObject *to); 147 void put_at(TObject *obj,int i); 148 void clear(); 149 virtual void makeZombie(int flg); 150 private: 151 ClassDef(StStrArray,3) 152 }; 153 154 155 class StRefArray : public StObjArray 156 { 157 public: 158 StRefArray(Int_t sz=0); 159 StRefArray(const StRefArray &from); 160 ~StRefArray(){}; 161 ClassDef(StRefArray,3) 162 }; 163 164 // Utilities 165 166 // Macros 167 168 #ifndef __CINT__ 169 #define StCollectionDef(QWERTY) \ 170 class St ## QWERTY;\ 171 typedef St ## QWERTY** St ## QWERTY ## Iterator;\ 172 typedef St ## QWERTY * const * const_St ## QWERTY ## Iterator;\ 173 \ 174 class StPtrVec ## QWERTY : public StRefArray \ 175 { \ 176 public: \ 177 StPtrVec ## QWERTY(Int_t sz=0):StRefArray(sz){};\ 178 StPtrVec ## QWERTY(const StPtrVec ## QWERTY &from):StRefArray(from){};\ 179 virtual ~StPtrVec ## QWERTY(){};\ 180 \ 181 St ## QWERTY * const &at(Int_t idx) const {return (St ## QWERTY * const &)fV[idx];}\ 182 St ## QWERTY * &at(Int_t idx) {return (St ## QWERTY * &)fV[idx];}\ 183 \ 184 St ## QWERTY * const &front() const {return (St ## QWERTY * const &)fV.front();}\ 185 St ## QWERTY * &front() {return (St ## QWERTY * &)fV.front();}\ 186 \ 187 St ## QWERTY * const &back() const {return (St ## QWERTY * const &)fV.back();}\ 188 St ## QWERTY * &back() {return (St ## QWERTY * &)fV.back();}\ 189 \ 190 const_St ## QWERTY ## Iterator begin() const {return (const_St ## QWERTY ## Iterator)&(*(fV.begin()));}\ 191 St ## QWERTY ## Iterator begin() {return ( St ## QWERTY ## Iterator)&(*(fV.begin()));}\ 192 const_St ## QWERTY ## Iterator end() const {return (const_St ## QWERTY ## Iterator)&(*(fV.end()));}\ 193 St ## QWERTY ## Iterator end() {return ( St ## QWERTY ## Iterator)&(*(fV.end()));}\ 194 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator it)\ 195 {return (St ## QWERTY ## Iterator)Erase((TObject**)it,0);}\ 196 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator fst,St ## QWERTY ## Iterator lst)\ 197 {return (St ## QWERTY ## Iterator)Erase((TObject**)fst,(TObject**)lst,0);}\ 198 St ## QWERTY * &operator[](Int_t i) {return at(i);}\ 199 St ## QWERTY * const &operator[](Int_t i) const {return at(i);}\ 200 void push_back(const St ## QWERTY * const to){fV.push_back((TObject*const)to);}\ 201 \ 202 ClassDef(StPtrVec ## QWERTY ,1) \ 203 };\ 204 \ 205 \ 206 class StSPtrVec ## QWERTY : public StStrArray \ 207 { \ 208 public: \ 209 StSPtrVec ## QWERTY(Int_t sz=0):StStrArray(sz){};\ 210 StSPtrVec ## QWERTY(const StSPtrVec ## QWERTY &from):StStrArray(from){};\ 211 \ 212 St ## QWERTY * const &at(Int_t idx) const {return (St ## QWERTY * const &)fV[idx];}\ 213 St ## QWERTY * &at(Int_t idx) {return (St ## QWERTY * &)fV[idx];}\ 214 \ 215 St ## QWERTY * const &front() const {return (St ## QWERTY * const &)fV.front();}\ 216 St ## QWERTY * &front() {return (St ## QWERTY * &)fV.front();}\ 217 \ 218 St ## QWERTY * const &back() const {return (St ## QWERTY * const &)fV.back();}\ 219 St ## QWERTY * &back() {return (St ## QWERTY * &)fV.back();}\ 220 \ 221 const_St ## QWERTY ## Iterator begin() const {return (const_St ## QWERTY ## Iterator)&(*(fV.begin()));}\ 222 St ## QWERTY ## Iterator begin() {return ( St ## QWERTY ## Iterator)&(*(fV.begin()));}\ 223 const_St ## QWERTY ## Iterator end() const {return (const_St ## QWERTY ## Iterator)&(*(fV.end()));}\ 224 St ## QWERTY ## Iterator end() {return ( St ## QWERTY ## Iterator)&(*(fV.end()));}\ 225 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator it)\ 226 {return (St ## QWERTY ## Iterator)Erase((TObject**)it,1);}\ 227 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator fst,St ## QWERTY ## Iterator lst)\ 228 {return (St ## QWERTY ## Iterator)Erase((TObject**)fst,(TObject**)lst,1);}\ 229 St ## QWERTY * &operator[](Int_t i) {return at(i);}\ 230 St ## QWERTY * const &operator[](Int_t i) const {return at(i);}\ 231 void push_back(const St ## QWERTY *to){StStrArray::push_back((TObject*)to);}\ 232 \ 233 ClassDef(StSPtrVec ## QWERTY,1) \ 234 };\ 235 typedef St ## QWERTY ## Iterator StPtrVec ## QWERTY ## Iterator;\ 236 typedef const_St ## QWERTY ## Iterator StPtrVec ## QWERTY ## ConstIterator;\ 237 typedef St ## QWERTY ## Iterator StSPtrVec ## QWERTY ## Iterator;\ 238 typedef const_St ## QWERTY ## Iterator StSPtrVec ## QWERTY ## ConstIterator;\ 239 240 //______________________________________________________________ 241 #define StCollectionImp(QWERTY) \ 242 \ 243 ClassImpUnique(StPtrVec ## QWERTY ,1 ) \ 244 void StPtrVec ## QWERTY::Streamer(TBuffer& b){StRefArray::Streamer(b);} \ 245 \ 246 ClassImpUnique(StSPtrVec ## QWERTY , 2 ) \ 247 \ 248 void StSPtrVec ## QWERTY::Streamer(TBuffer& b){StStrArray::Streamer(b);} \ 249 250 #endif /*End not __CINT__*/ 251 #endif 252 253