00001 #ifndef _StRegistry_
00002 #define _StRegistry_
00003
00004
00006
00007
00008
00010
00011 #include <assert.h>
00012 #include "TString.h"
00013 #include "TObject.h"
00014 #include "StObject.h"
00015
00016 class TObject;
00017 #include <vector>
00018 #include <algorithm>
00019 using std::vector;
00020 using std::random_shuffle;
00021 typedef vector<TObject*> VecTObj;
00022 #ifndef __CINT__
00023 typedef vector<TObject*>::iterator VecTObjIter;
00024 typedef vector<TObject*>::const_iterator const_VecTObjIter;
00025 typedef VecTObjIter StObjArrayIter;
00026 typedef VecTObjIter StStrArrayIter;
00027 typedef VecTObjIter StRefArrayIter;
00028 typedef const_VecTObjIter const_StObjArrayIter;
00029 typedef const_VecTObjIter const_StStrArrayIter;
00030 typedef const_VecTObjIter const_StRefArrayIter;
00031 #endif
00033 #ifdef __CINT__NEVER
00034 class VecTObj;
00035 class VecTObjIter;
00036 class const_VecTObjIter;
00037 class StObjArrayIter;
00038 class StStrArrayIter;
00039 class StRefArrayIter;
00040 class const_StObjArrayIter;
00041 class const_StStrArrayIter;
00042 class const_StRefArrayIter;
00043 #endif
00044
00045 class StObjLink : public TObject
00046 {
00047 public:
00048 StObjLink(const StObject *p=0) {fLink=(StObject*)p;}
00049 StObjLink(const StObjLink &from):TObject() {fLink=(StObject*)from.fLink;}
00050 ~StObjLink() {fLink=0;}
00051
00052 StObjLink &operator=(StObjLink &from){fLink=from.fLink;return *this;}
00053 StObjLink &operator=(StObject *obj) {fLink=obj; return *this;}
00054 StObject &operator*() {return *fLink;}
00055 StObject *operator->() {return fLink;}
00056
00057
00058 StObject* get() {return fLink;}
00059 virtual Bool_t IsFolder() const {return 1;}
00060 virtual void Browse(TBrowser* b);
00061
00062
00063 StObject *fLink;
00064 ClassDef(StObjLink,1)
00065 };
00066
00067 template<class T>
00068 class StLink : public StObjLink {
00069 public:
00070 typedef T element_type;
00071 StLink(T *p = 0):StObjLink(p){};
00072 StLink<T> &operator=(T *obj) {fLink=obj; return *this;}
00073 StLink<T> &operator=(const StLink<T> &fr) {fLink=(StObject*)fr.fLink; return *this;}
00074 T &operator*() {return *((T*)fLink);}
00075 T *operator->() {return (T*)fLink; }
00076 const T *operator->() const {return (const T*)fLink; }
00077 operator const T *() const{return (const T*)fLink; }
00078 operator T *&() {return ( T*&)fLink; }
00079 };
00080
00081
00082 class StObjArray;
00083 class StStrArray;
00084 class StRefArray;
00085
00086
00087 class StObjArray : public StObject {
00088 public:
00089 StObjArray(Int_t sz=0){if(sz) resize(sz);}
00090 virtual ~StObjArray(){}
00091 virtual void Browse(TBrowser *b);
00092 void random_shuffle(int start=0,int end=0x7fffffff);
00093 size_t capacity() const {return fV.capacity();}
00094 size_t max_size() const {return fV.max_size();}
00095 void clear() {fV.clear() ;}
00096 void pop_back() {fV.pop_back() ;}
00097 int empty() const {return fV.empty() ;}
00098 size_t size () const {return fV.size() ;}
00099 void reserve(size_t sz) {fV.reserve(sz) ;}
00100 void resize(size_t sz,TObject *v=0) {fV.resize(sz,v);}
00101 virtual Bool_t IsFolder() const;
00102 TObject * &at(int i) {return fV[i];}
00103 void put_at(TObject *obj,int i){fV[i]=obj;}
00104
00105 TObject * const &front() const { return fV.front();}
00106 TObject * &front() { return fV.front();}
00107
00108 TObject * const &back() const { return fV.back();}
00109 TObject * &back() { return fV.back();}
00110 TObject * find(const char *name) const;
00111
00112 #ifndef __CINT__
00113 const_VecTObjIter begin() const {return fV.begin();}
00114 VecTObjIter begin() {return fV.begin();}
00115 const_VecTObjIter end() const {return fV.end();}
00116 VecTObjIter end() {return fV.end();}
00117 TObject** Erase(TObject** it ,int del);
00118 TObject** Erase(TObject** fst,TObject** lst,int del);
00119 #endif
00121 TObject *& operator[](Int_t i) {return fV[i];}
00122 TObject * const &operator[](Int_t i) const {return fV[i];}
00123 void push_back(const TObject * const to){fV.push_back((TObject*)to);}
00124 Int_t getEntries() const;
00125 void ls(const char *tit="") const;
00126 void Print(const char *tit="") const { ls(tit); }
00127 protected:
00128
00129 VecTObj fV;
00130
00131 ClassDef(StObjArray,4)
00132 };
00133
00134
00135 class StStrArray : public StObjArray {
00136 protected:
00137
00138
00139
00140 public:
00141 StStrArray(Int_t sz=0);
00142 StStrArray(const StStrArray &from);
00143 virtual ~StStrArray();
00144 void operator=(const StStrArray &a);
00145
00146 void push_back(const TObject *to);
00147 void put_at(TObject *obj,int i);
00148 void clear();
00149 virtual void makeZombie(int flg);
00150 private:
00151 ClassDef(StStrArray,3)
00152 };
00153
00154
00155 class StRefArray : public StObjArray
00156 {
00157 public:
00158 StRefArray(Int_t sz=0);
00159 StRefArray(const StRefArray &from);
00160 ~StRefArray(){};
00161 ClassDef(StRefArray,3)
00162 };
00163
00164
00165
00166
00167
00168 #ifndef __CINT__
00169 #define StCollectionDef(QWERTY) \
00170 class St ## QWERTY;\
00171 typedef St ## QWERTY** St ## QWERTY ## Iterator;\
00172 typedef St ## QWERTY * const * const_St ## QWERTY ## Iterator;\
00173 \
00174 class StPtrVec ## QWERTY : public StRefArray \
00175 { \
00176 public: \
00177 StPtrVec ## QWERTY(Int_t sz=0):StRefArray(sz){};\
00178 StPtrVec ## QWERTY(const StPtrVec ## QWERTY &from):StRefArray(from){};\
00179 virtual ~StPtrVec ## QWERTY(){};\
00180 \
00181 St ## QWERTY * const &at(Int_t idx) const {return (St ## QWERTY * const &)fV[idx];}\
00182 St ## QWERTY * &at(Int_t idx) {return (St ## QWERTY * &)fV[idx];}\
00183 \
00184 St ## QWERTY * const &front() const {return (St ## QWERTY * const &)fV.front();}\
00185 St ## QWERTY * &front() {return (St ## QWERTY * &)fV.front();}\
00186 \
00187 St ## QWERTY * const &back() const {return (St ## QWERTY * const &)fV.back();}\
00188 St ## QWERTY * &back() {return (St ## QWERTY * &)fV.back();}\
00189 \
00190 const_St ## QWERTY ## Iterator begin() const {return (const_St ## QWERTY ## Iterator)&(*(fV.begin()));}\
00191 St ## QWERTY ## Iterator begin() {return ( St ## QWERTY ## Iterator)&(*(fV.begin()));}\
00192 const_St ## QWERTY ## Iterator end() const {return (const_St ## QWERTY ## Iterator)&(*(fV.end()));}\
00193 St ## QWERTY ## Iterator end() {return ( St ## QWERTY ## Iterator)&(*(fV.end()));}\
00194 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator it)\
00195 {return (St ## QWERTY ## Iterator)Erase((TObject**)it,0);}\
00196 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator fst,St ## QWERTY ## Iterator lst)\
00197 {return (St ## QWERTY ## Iterator)Erase((TObject**)fst,(TObject**)lst,0);}\
00198 St ## QWERTY * &operator[](Int_t i) {return at(i);}\
00199 St ## QWERTY * const &operator[](Int_t i) const {return at(i);}\
00200 void push_back(const St ## QWERTY * const to){fV.push_back((TObject*const)to);}\
00201 \
00202 ClassDef(StPtrVec ## QWERTY ,1) \
00203 };\
00204 \
00205 \
00206 class StSPtrVec ## QWERTY : public StStrArray \
00207 { \
00208 public: \
00209 StSPtrVec ## QWERTY(Int_t sz=0):StStrArray(sz){};\
00210 StSPtrVec ## QWERTY(const StSPtrVec ## QWERTY &from):StStrArray(from){};\
00211 \
00212 St ## QWERTY * const &at(Int_t idx) const {return (St ## QWERTY * const &)fV[idx];}\
00213 St ## QWERTY * &at(Int_t idx) {return (St ## QWERTY * &)fV[idx];}\
00214 \
00215 St ## QWERTY * const &front() const {return (St ## QWERTY * const &)fV.front();}\
00216 St ## QWERTY * &front() {return (St ## QWERTY * &)fV.front();}\
00217 \
00218 St ## QWERTY * const &back() const {return (St ## QWERTY * const &)fV.back();}\
00219 St ## QWERTY * &back() {return (St ## QWERTY * &)fV.back();}\
00220 \
00221 const_St ## QWERTY ## Iterator begin() const {return (const_St ## QWERTY ## Iterator)&(*(fV.begin()));}\
00222 St ## QWERTY ## Iterator begin() {return ( St ## QWERTY ## Iterator)&(*(fV.begin()));}\
00223 const_St ## QWERTY ## Iterator end() const {return (const_St ## QWERTY ## Iterator)&(*(fV.end()));}\
00224 St ## QWERTY ## Iterator end() {return ( St ## QWERTY ## Iterator)&(*(fV.end()));}\
00225 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator it)\
00226 {return (St ## QWERTY ## Iterator)Erase((TObject**)it,1);}\
00227 St ## QWERTY ## Iterator erase(St ## QWERTY ## Iterator fst,St ## QWERTY ## Iterator lst)\
00228 {return (St ## QWERTY ## Iterator)Erase((TObject**)fst,(TObject**)lst,1);}\
00229 St ## QWERTY * &operator[](Int_t i) {return at(i);}\
00230 St ## QWERTY * const &operator[](Int_t i) const {return at(i);}\
00231 void push_back(const St ## QWERTY *to){StStrArray::push_back((TObject*)to);}\
00232 \
00233 ClassDef(StSPtrVec ## QWERTY,1) \
00234 };\
00235 typedef St ## QWERTY ## Iterator StPtrVec ## QWERTY ## Iterator;\
00236 typedef const_St ## QWERTY ## Iterator StPtrVec ## QWERTY ## ConstIterator;\
00237 typedef St ## QWERTY ## Iterator StSPtrVec ## QWERTY ## Iterator;\
00238 typedef const_St ## QWERTY ## Iterator StSPtrVec ## QWERTY ## ConstIterator;\
00239
00240
00241 #define StCollectionImp(QWERTY) \
00242 \
00243 ClassImpUnique(StPtrVec ## QWERTY ,1 ) \
00244 void StPtrVec ## QWERTY::Streamer(TBuffer& b){StRefArray::Streamer(b);} \
00245 \
00246 ClassImpUnique(StSPtrVec ## QWERTY , 2 ) \
00247 \
00248 void StSPtrVec ## QWERTY::Streamer(TBuffer& b){StStrArray::Streamer(b);} \
00249
00250 #endif
00251 #endif
00252