12 #ifndef ROOT_TVirtualCollectionIterators
13 #define ROOT_TVirtualCollectionIterators
24 class TVirtualCollectionIterators
27 TVirtualCollectionIterators() =
delete;
28 TVirtualCollectionIterators(
const TVirtualCollectionIterators&) =
delete;
35 typedef TVirtualCollectionProxy::CreateIterators_t CreateIterators_t;
36 typedef TVirtualCollectionProxy::DeleteTwoIterators_t DeleteTwoIterators_t;
38 char fBeginBuffer[TVirtualCollectionProxy::fgIteratorArenaSize];
39 char fEndBuffer[TVirtualCollectionProxy::fgIteratorArenaSize];
42 CreateIterators_t fCreateIterators;
43 DeleteTwoIterators_t fDeleteTwoIterators;
45 TVirtualCollectionIterators(TVirtualCollectionProxy *proxy, Bool_t read_from_file = kTRUE) : fBegin( &(fBeginBuffer[0]) ), fEnd(&(fEndBuffer[0])), fCreateIterators(0), fDeleteTwoIterators(0)
52 fCreateIterators = proxy->GetFunctionCreateIterators(read_from_file);
53 fDeleteTwoIterators = proxy->GetFunctionDeleteTwoIterators(read_from_file);
55 ::Fatal(
"TIterators::TIterators",
"Created with out a collection proxy!\n");
59 TVirtualCollectionIterators(CreateIterators_t creator, DeleteTwoIterators_t destruct) : fBegin( &(fBeginBuffer[0]) ), fEnd(&(fEndBuffer[0])), fCreateIterators(creator), fDeleteTwoIterators(destruct)
64 inline void CreateIterators(
void *collection, TVirtualCollectionProxy *proxy)
68 fCreateIterators(collection, &fBegin, &fEnd, proxy);
71 inline ~TVirtualCollectionIterators()
75 if (fBegin != &(fBeginBuffer[0])) {
77 fDeleteTwoIterators(fBegin,fEnd);
83 class TGenericCollectionIterator
86 TVirtualCollectionIterators fIterators;
89 class RegularIterator;
92 TGenericCollectionIterator() =
delete;
93 TGenericCollectionIterator(
const TGenericCollectionIterator&) =
delete;
95 TGenericCollectionIterator(
void *collection, TVirtualCollectionProxy *proxy, Bool_t read_from_file = kTRUE) :
96 fIterators(proxy,read_from_file)
100 fIterators.CreateIterators(collection,proxy);
103 virtual ~TGenericCollectionIterator()
110 virtual void *Next() = 0;
112 virtual void* operator*()
const = 0;
114 virtual operator bool()
const = 0;
116 TGenericCollectionIterator& operator++() { Next();
return *
this; }
118 static TGenericCollectionIterator *New(
void *collection, TVirtualCollectionProxy *proxy);
121 class TGenericCollectionIterator::RegularIterator :
public TGenericCollectionIterator {
122 typedef TVirtualCollectionProxy::Next_t Next_t;
129 RegularIterator(
void *collection, TVirtualCollectionProxy *proxy, Bool_t read_from_file) :
130 TGenericCollectionIterator(collection,proxy,read_from_file),
131 fNext( proxy->GetFunctionNext(read_from_file) ),
139 fCurrent = fNext(fIterators.fBegin,fIterators.fEnd);
143 virtual void* operator*()
const {
return fCurrent; }
145 operator bool()
const {
return fStarted ? fCurrent != 0 : kTRUE; }
149 class TGenericCollectionIterator::VectorIterator :
public TGenericCollectionIterator {
154 inline void *GetValue()
const {
155 if ((
bool)*
this)
return fHasPointer ? *(
void**)fIterators.fBegin : fIterators.fBegin;
160 VectorIterator(
void *collection, TVirtualCollectionProxy *proxy, Bool_t read_from_file) :
161 TGenericCollectionIterator(collection,proxy,read_from_file),
162 fIncrement(proxy->GetIncrement()),
163 fHasPointer(proxy->HasPointers())
168 if ( ! (
bool)*
this )
return 0;
169 void *result = GetValue();
170 fIterators.fBegin = ((
char*)fIterators.fBegin) + fIncrement;
174 virtual void* operator*()
const {
return GetValue(); }
176 operator bool()
const {
return fIterators.fBegin != fIterators.fEnd; }
180 inline TGenericCollectionIterator *TGenericCollectionIterator::New(
void *collection, TVirtualCollectionProxy *proxy)
182 if (proxy->GetCollectionType() == ROOT::kSTLvector) {
183 return new VectorIterator(collection, proxy, kFALSE);
185 return new RegularIterator(collection, proxy, kFALSE);
193 class TVirtualCollectionPtrIterators
196 typedef TVirtualCollectionProxy::Next_t Next_t;
197 typedef TVirtualCollectionProxy::CopyIterator_t Copy_t;
198 typedef TVirtualCollectionProxy::CreateIterators_t CreateIterators_t;
199 typedef TVirtualCollectionProxy::DeleteIterator_t Delete_t;
200 typedef TVirtualCollectionProxy::DeleteTwoIterators_t DeleteTwoIterators_t;
203 TVirtualCollectionPtrIterators();
204 TVirtualCollectionPtrIterators(
const TVirtualCollectionPtrIterators&);
206 CreateIterators_t fCreateIterators;
207 DeleteTwoIterators_t fDeleteTwoIterators;
211 char fRawBeginBuffer[TVirtualCollectionProxy::fgIteratorArenaSize];
212 char fRawEndBuffer[TVirtualCollectionProxy::fgIteratorArenaSize];
214 struct TInternalIterator {
216 TInternalIterator &operator=(
const TInternalIterator&);
218 TInternalIterator() : fCopy(0),fDelete(0),fNext(0),fIter(0) {}
219 TInternalIterator(
const TInternalIterator &source) : fCopy(source.fCopy),fDelete(source.fDelete),fNext(source.fNext),fIter(0) {}
228 TInternalIterator fBeginBuffer;
229 TInternalIterator fEndBuffer;
239 TVirtualCollectionPtrIterators(TVirtualCollectionProxy *proxy) : fCreateIterators(0), fDeleteTwoIterators(0), fAllocated(kFALSE),
240 fBegin( &(fRawBeginBuffer[0]) ),
241 fEnd( &(fRawEndBuffer[0]) )
246 fCreateIterators = proxy->GetFunctionCreateIterators();
247 fDeleteTwoIterators = proxy->GetFunctionDeleteTwoIterators();
249 fEndBuffer.fCopy = fBeginBuffer.fCopy = proxy->GetFunctionCopyIterator();
250 fEndBuffer.fNext = fBeginBuffer.fNext = proxy->GetFunctionNext();
251 fEndBuffer.fDelete = fBeginBuffer.fDelete = proxy->GetFunctionDeleteIterator();
253 ::Fatal(
"TIterators::TIterators",
"Created with out a collection proxy!\n");
257 inline void CreateIterators(
void *collection, TVirtualCollectionProxy *proxy)
261 fBegin = &(fRawBeginBuffer[0]);
262 fEnd = &(fRawEndBuffer[0]);
263 fCreateIterators(collection, &fBegin, &fEnd, proxy);
264 if (fBegin != &(fRawBeginBuffer[0])) {
268 fBeginBuffer.fIter = fBegin;
269 fEndBuffer.fIter = fEnd;
270 fBegin = &fBeginBuffer;
274 inline ~TVirtualCollectionPtrIterators()
278 fDeleteTwoIterators(fBeginBuffer.fIter,fEndBuffer.fIter);
282 static void *Next(
void *iter,
const void *end)
284 TInternalIterator *internal_iter = (TInternalIterator*) iter;
285 TInternalIterator *internal_end = (TInternalIterator*) end;
287 void **ptr = (
void**)internal_iter->fNext(internal_iter->fIter,internal_end->fIter);
292 static void DeleteIterator(
void *iter)
294 TInternalIterator *internal_iter = (TInternalIterator*) iter;
295 if (internal_iter->fDelete) {
296 internal_iter->fDelete(internal_iter->fIter);
300 static void *CopyIterator(
void *dest,
const void *source)
302 TInternalIterator *internal_source = (TInternalIterator*)source;
303 TInternalIterator *internal_dest =
new TInternalIterator(*internal_source);
305 void *newiter = internal_source->fCopy(dest,internal_source->fIter);
306 if (newiter == dest) {
307 internal_dest->fDelete = 0;
309 internal_dest->fIter = newiter;
310 return internal_dest;
316 struct TVirtualVectorIterators
319 TVirtualVectorIterators(
const TVirtualVectorIterators&);
326 typedef TVirtualCollectionProxy::CreateIterators_t CreateIterators_t;
331 TVirtualVectorIterators(TVirtualCollectionProxy * ) : fBegin(0), fEnd(0)
336 TVirtualVectorIterators(CreateIterators_t ) : fBegin(0), fEnd(0)
341 TVirtualVectorIterators() : fBegin(0), fEnd(0)
346 inline void CreateIterators(
void *collection)
352 std::vector<char> *vec = (std::vector<char>*)collection;
358 fBegin= &(*vec->begin());
359 #ifdef R__VISUAL_CPLUSPLUS
360 fEnd = &(*(vec->end()-1)) + 1;
363 fEnd = &(*vec->end());
369 #endif // ROOT_TVirtualCollectionIterators