Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "TGo4Iter.h"
00015
00016 #include "TGo4Slot.h"
00017 #include "TGo4Proxy.h"
00018
00019 TGo4Iter::TGo4Iter() :
00020 TGo4AccessWrapper(),
00021 fSlot(0),
00022 fLevels(),
00023 fStatus(-1),
00024 fFullName(),
00025 fLevelChange(0)
00026 {
00027 }
00028
00029 TGo4Iter::TGo4Iter(TGo4Slot* slot, Bool_t onlyslots) :
00030 TGo4AccessWrapper(),
00031 fSlot(slot),
00032 fOnlySlots(onlyslots),
00033 fLevels(),
00034 fStatus(-1),
00035 fFullName(),
00036 fLevelChange(0)
00037 {
00038 }
00039
00040 TGo4Iter::~TGo4Iter()
00041 {
00042 fLevels.Delete();
00043 }
00044
00045 Bool_t TGo4Iter::next(Bool_t goesinto)
00046 {
00047 fLevelChange = 0;
00048
00049 if (fStatus==1) return kFALSE;
00050
00051 Int_t lastlevel = level();
00052
00053 TGo4LevelIter* iter = 0;
00054
00055 Bool_t wasfolder = kFALSE;
00056
00057 if (fStatus==-1) {
00058 iter = (fSlot==0) ? 0 : fSlot->MakeLevelIter();
00059 if (iter!=0) fLevels.Add(iter);
00060 } else {
00061 iter = (TGo4LevelIter*) fLevels.Last();
00062
00063 wasfolder = fOnlySlots ? iter->isslotsfolder() : iter->isfolder();
00064
00065 if ((iter!=0) && wasfolder && goesinto) {
00066 TGo4LevelIter* subiter = iter->subiterator();
00067 if (subiter!=0) {
00068 fLevels.Add(subiter);
00069 iter = subiter;
00070 }
00071 }
00072 }
00073
00074 while ((iter!=0) && !iter->next()) {
00075 fLevels.Remove(iter);
00076 delete iter;
00077 iter = (TGo4LevelIter*) fLevels.Last();
00078 }
00079
00080 fFullName = "";
00081
00082 if (iter!=0)
00083 for(int n=0;n<=fLevels.GetLast();n++) {
00084 TGo4LevelIter* it = (TGo4LevelIter*) fLevels.At(n);
00085 if (n>0) fFullName.Append("/");
00086 fFullName.Append(it->name());
00087 }
00088
00089 fStatus = (iter!=0) ? 0 : 1;
00090
00091 fLevelChange = level() - lastlevel;
00092
00093
00094
00095
00096
00097 if (wasfolder) fLevelChange--;
00098
00099 return (fStatus==0);
00100 }
00101
00102 Bool_t TGo4Iter::nextobj()
00103 {
00104 while (next())
00105 if (!isfolder()) return kTRUE;
00106 return kFALSE;
00107 }
00108
00109 Bool_t TGo4Iter::isfolder()
00110 {
00111 TGo4LevelIter* iter = currentiter();
00112 return (iter==0) ? kFALSE : (fOnlySlots ? iter->isslotsfolder() : iter->isfolder());
00113 }
00114
00115 const char* TGo4Iter::getname()
00116 {
00117 TGo4LevelIter* iter = currentiter();
00118 return iter==0 ? 0 : iter->name();
00119 }
00120
00121 const char* TGo4Iter::getinfo()
00122 {
00123 TGo4LevelIter* iter = currentiter();
00124 return iter==0 ? 0 : iter->info();
00125 }
00126
00127 Int_t TGo4Iter::getsizeinfo()
00128 {
00129 TGo4LevelIter* iter = currentiter();
00130 return iter==0 ? 0 : iter->sizeinfo();
00131 }
00132
00133 Int_t TGo4Iter::getflag(const char* flagname)
00134 {
00135 TGo4LevelIter* iter = currentiter();
00136 return ((iter==0) || (flagname==0)) ? -1 : iter->getflag(flagname);
00137 }
00138
00139 Int_t TGo4Iter::getkindofitem()
00140 {
00141 TGo4LevelIter* iter = currentiter();
00142 return iter==0 ? -1 : iter->GetKind();
00143 }
00144
00145 const char* TGo4Iter::getclassname()
00146 {
00147 TGo4LevelIter* iter = currentiter();
00148 return iter==0 ? 0 : iter->GetClassName();
00149 }
00150
00151
00152 const char* TGo4Iter::getfullname()
00153 {
00154 return (fStatus!=0) ? 0 : fFullName.Data();
00155 }
00156
00157 Int_t TGo4Iter::level() const
00158 {
00159 return (fStatus!=0) ? -1 : fLevels.GetLast();
00160 }
00161
00162 TGo4Access* TGo4Iter::ProvideAccess(const char* name)
00163 {
00164 return (fStatus!=0) ? 0 : fSlot->ProvideSlotAccess(fFullName.Data());
00165 }
00166
00167 TGo4Slot* TGo4Iter::getslot() const
00168 {
00169 if (fStatus!=0) return 0;
00170 TGo4LevelIter* iter = (TGo4LevelIter*) fLevels.Last();
00171 return iter==0 ? 0 : iter->getslot();
00172 }