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