// @(#)root/io:$Id$
// Author: Markus Frank  28/10/04

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/
#ifndef ROOT_TGenCollectionProxy
#define ROOT_TGenCollectionProxy

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGenCollectionProxy
//
// Proxy around an arbitrary container, which implements basic
// functionality and iteration.
//
// In particular this is used to implement splitting and abstract
// element access of any container. Access to compiled code is necessary
// to implement the abstract iteration sequence and functionality like
// size(), clear(), resize(). resize() may be a void operation.
//
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TVirtualCollectionProxy
#include "TVirtualCollectionProxy.h"
#endif

#ifndef ROOT_TCollectionProxyInfo
#include "TCollectionProxyInfo.h"
#endif

#ifndef ROOT_Rtypeinfo
#include "Rtypeinfo.h"
#endif

#include <atomic>
#include <string>
#include <map>
#include <stdlib.h>

class TObjArray;
class TCollectionProxyFactory;

class TGenCollectionProxy
   : public TVirtualCollectionProxy
{

   // Friend declaration
   friend class TCollectionProxyFactory;

public:

#ifdef R__HPUX
   typedef const type_info&      Info_t;
#else
   typedef const std::type_info& Info_t;
#endif

   enum {
      // Those 'bits' are used in conjunction with CINT's bit to store the 'type'
      // info into one int
      kBIT_ISSTRING   = 0x20000000,  // We can optimized a value operation when the content are strings
      kBIT_ISTSTRING  = 0x40000000,
      kBOOL_t = 21
   };

   /** @class TGenCollectionProxy::Value TGenCollectionProxy.h TGenCollectionProxy.h
    *
    * Small helper to describe the Value_type or the key_type
    * of an STL container.
    *
    * @author  M.Frank
    * @version 1.0
    * @date    10/10/2004
    */
   struct Value  {
      ROOT::NewFunc_t fCtor;       // Method cache for containee constructor
      ROOT::DesFunc_t fDtor;       // Method cache for containee destructor
      ROOT::DelFunc_t fDelete;     // Method cache for containee delete
      UInt_t          fCase;       // type of data of Value_type
      UInt_t          fProperties; // Additional properties of the value type (kNeedDelete)
      TClassRef       fType;       // TClass reference of Value_type in collection
      EDataType       fKind;       // kind of ROOT-fundamental type
      size_t          fSize;       // fSize of the contained object

      // Default copy constructor has the correct implementation.

      // Initializing constructor
      Value(const std::string& info, Bool_t silent);
      // Delete individual item from STL container
      void DeleteItem(void* ptr);

      Bool_t IsValid();
   };

   /**@class StreamHelper
    *
    * Helper class to facilitate I/O
    *
    * @author  M.Frank
    * @version 1.0
    * @date    10/10/2004
    */
   union StreamHelper  {
      Bool_t       boolean;
      Char_t       s_char;
      Short_t      s_short;
      Int_t        s_int;
      Long_t       s_long;
      Long64_t     s_longlong;
      Float_t      flt;
      Double_t     dbl;
      UChar_t      u_char;
      UShort_t     u_short;
      UInt_t       u_int;
      ULong_t      u_long;
      ULong64_t    u_longlong;
      void*        p_void;
      void**       pp_void;
      char*        kchar;
      TString*     tstr;
      void* ptr()  {
         return *(&this->p_void);
      }
      std::string* str()  {
         return (std::string*)this;
      }
      const char* c_str()  {
         return ((std::string*)this)->c_str();
      }
      const char* c_pstr()  {
         return (*(std::string**)this)->c_str();
      }
      void set(void* p)  {
         *(&this->p_void) = p;
      }
      void read_std_string(TBuffer& b) {
         TString s;
         s.Streamer(b);
         ((std::string*)this)->assign(s.Data());
      }
      void* read_tstring(TBuffer& b)  {
         *((TString*)this) = "";
         ((TString*)this)->Streamer(b);
         return this;
      }
      void read_std_string_pointer(TBuffer& b) {
         TString s;
         std::string* str2 = (std::string*)ptr();
         if (!str2) str2 = new std::string();
         s.Streamer(b);
         *str2 = s;
         set(str2);
      }
      void write_std_string_pointer(TBuffer& b)  {
         const char* c;
         if (ptr()) {
            std::string* strptr = (*(std::string**)this);
            c = (const char*)(strptr->c_str());
         } else c = "";
         TString(c).Streamer(b);
      }
      void read_any_object(Value* v, TBuffer& b)  {
         void* p = ptr();
         if ( p )  {
            if ( v->fDelete )  {    // Compiled content: call Destructor
               (*v->fDelete)(p);
            }
            else if ( v->fType )  { // Emulated content: call TClass::Delete
               v->fType->Destructor(p);
            }
            else if ( v->fDtor )  {
               (*v->fDtor)(p);
               ::operator delete(p);
            }
            else  {
               ::operator delete(p);
            }
         }
         set( b.ReadObjectAny(v->fType) );
      }

      void read_tstring_pointer(Bool_t vsn3, TBuffer& b)  {
         TString* s = (TString*)ptr();
         if ( vsn3 )  {
            if ( !s ) s = new TString();
            else s->Clear();
            s->Streamer(b);
            set(s);
            return;
         }
         if ( s ) delete s;
         set( b.ReadObjectAny(TString::Class()) );
      }
      void write_tstring_pointer(TBuffer& b)  {
         b.WriteObjectAny(ptr(), TString::Class());
      }
   };

   /** @class TGenCollectionProxy::Method TGenCollectionProxy.h TGenCollectionProxy.h
    *
    * Small helper to execute (compiler) generated function for the
    * access to STL or other containers.
    *
    * @author  M.Frank
    * @version 1.0
    * @date    10/10/2004
    */
   class Method  {
   public:
      typedef void* (*Call_t)(void*);
      Call_t call;
      Method() : call(0)                       {      }
      Method(Call_t c) : call(c)               {      }
      Method(const Method& m) : call(m.call)   {      }
      Method &operator=(const Method& m) { call = m.call; return *this; }
      void* invoke(void* obj) const { return (*call)(obj); }
   };

   /** @class TGenCollectionProxy::Method TGenCollectionProxy.h TGenCollectionProxy.h
    *
    * Small helper to execute (compiler) generated function for the
    * access to STL or other containers.
    *
    * @author  M.Frank
    * @version 1.0
    * @date    10/10/2004
    */
   class Method0  {
   public:
      typedef void* (*Call_t)();
      Call_t call;
      Method0() : call(0)                       {      }
      Method0(Call_t c) : call(c)               {      }
      Method0(const Method0& m) : call(m.call)   {      }
      Method0 &operator=(const Method0& m) { call = m.call; return *this; }
      void* invoke() const { return (*call)(); }
   };

   /** @class TGenCollectionProxy::TStaging
    *
    * Small helper to stage the content of an associative
    * container when reading and before inserting it in the
    * actual collection.
    *
    * @author  Ph.Canal
    * @version 1.0
    * @date    20/08/2010
    */
   class TStaging  {
      void   *fTarget;   // Pointer to the collection we are staging for.
      void   *fContent;  // Pointer to the content
      size_t  fReserved; // Amount of space already reserved.
      size_t  fSize;     // Number of elements
      size_t  fSizeOf;   // size of each elements

      TStaging(const TStaging&);            // Not implemented.
      TStaging &operator=(const TStaging&); // Not implemented.

   public:
      TStaging(size_t size, size_t size_of) : fTarget(0), fContent(0), fReserved(0), fSize(size), fSizeOf(size_of)
      {
         // Usual constructor.  Reserves the required number of elements.
         fReserved = fSize;
         fContent = ::malloc(fReserved * fSizeOf);
      }

      ~TStaging() {
         // Usual destructor
         ::free(fContent);
      }

      void   *GetContent() {
         // Return the location of the array of content.
         return fContent;
      }
      void   *GetEnd() {
         // Return the 'end' of the array of content.
         return ((char*)fContent) + fSize*fSizeOf;
      }
      size_t  GetSize() {
         // Return the number of elements.
         return fSize;
      }
      void   *GetTarget() {
         // Get the address of the collection we are staging for.
         return fTarget;
      }
      void    Resize(size_t nelement) {
         if (fReserved < nelement) {
            fReserved = nelement;
            fContent = ::realloc(fContent,fReserved * fSizeOf);
         }
         fSize = nelement;
      }
      void SetTarget(void *target) {
         // Set the collection we are staging for.
         fTarget = target;
      }
   };

protected:
   typedef ROOT::TCollectionProxyInfo::Environ<char[64]> Env_t;
   typedef ROOT::TCollectionProxyInfo::EnvironBase EnvironBase_t;
   typedef std::vector<TStaging*>          Staged_t;  // Collection of pre-allocated staged array for associative containers.
   typedef std::vector<EnvironBase_t*>     Proxies_t;
   mutable TObjArray *fReadMemberWise;                                   //Array of bundle of TStreamerInfoActions to stream out (read)
   mutable std::map<std::string, TObjArray*> *fConversionReadMemberWise; //Array of bundle of TStreamerInfoActions to stream out (read) derived from another class.
   mutable TStreamerInfoActions::TActionSequence *fWriteMemberWise;
   typedef void (*Sizing_t)(void *obj, size_t size);
   typedef void* (*Feedfunc_t)(void *from, void *to, size_t size);
   typedef void* (*Collectfunc_t)(void *from, void *to);
   typedef void* (*ArrIterfunc_t)(void *from, size_t size);

   std::string   fName;      // Name of the class being proxied.
   Bool_t        fPointers;  // Flag to indicate if containee has pointers (key or value)
   Method        fClear;     // Method cache for container accessors: clear container
   Method        fSize;      // Container accessors: size of container
   Sizing_t      fResize;    // Container accessors: resize container
   Method        fFirst;     // Container accessors: generic iteration: first
   Method        fNext;      // Container accessors: generic iteration: next
   ArrIterfunc_t fConstruct; // Container accessors: block construct
   Sizing_t      fDestruct;  // Container accessors: block destruct
   Feedfunc_t    fFeed;      // Container accessors: block feed
   Collectfunc_t fCollect;   // Method to collect objects from container
   Method0       fCreateEnv; // Method to allocate an Environment holder.
   std::atomic<Value*> fValue;     // Descriptor of the container value type
   Value*        fVal;       // Descriptor of the Value_type
   Value*        fKey;       // Descriptor of the key_type
   EnvironBase_t*fEnv;       // Address of the currently proxied object
   int           fValOffset; // Offset from key to value (in maps)
   int           fValDiff;   // Offset between two consecutive value_types (memory layout).
   Proxies_t     fProxyList; // Stack of recursive proxies
   Proxies_t     fProxyKept; // Optimization: Keep proxies once they were created
   Staged_t      fStaged;    // Optimization: Keep staged array once they were created
   int           fSTL_type;  // STL container type
   Info_t        fTypeinfo;  // Type information
   TClass*       fOnFileClass; // On file class

   CreateIterators_t    fFunctionCreateIterators;
   CopyIterator_t       fFunctionCopyIterator;
   Next_t               fFunctionNextIterator;
   DeleteIterator_t     fFunctionDeleteIterator;
   DeleteTwoIterators_t fFunctionDeleteTwoIterators;

   // Late initialization of collection proxy
   TGenCollectionProxy* Initialize(Bool_t silent) const;
   // Some hack to avoid const-ness.
   virtual TGenCollectionProxy* InitializeEx(Bool_t silent);
   // Call to delete/destruct individual contained item.
   virtual void DeleteItem(Bool_t force, void* ptr) const;
   // Allow to check function pointers.
   void CheckFunctions()  const;

   // Set pointer to the TClass representing the content.
   virtual void UpdateValueClass(const TClass *oldcl, TClass *newcl);

private:
   TGenCollectionProxy(); // not implemented on purpose.

public:

   // Virtual copy constructor.
   virtual TVirtualCollectionProxy* Generate() const;

   // Copy constructor.
   TGenCollectionProxy(const TGenCollectionProxy& copy);

private:
   // Assignment operator
   TGenCollectionProxy &operator=(const TGenCollectionProxy&); // Not Implemented

public:
   // Initializing constructor
   TGenCollectionProxy(Info_t typ, size_t iter_size);
   TGenCollectionProxy(const ROOT::TCollectionProxyInfo &info, TClass *cl);

   // Standard destructor.
   virtual ~TGenCollectionProxy();

   // Return a pointer to the TClass representing the container.
   virtual TClass *GetCollectionClass() const;

   // Return the type of collection see TClassEdit::ESTLType
   virtual Int_t   GetCollectionType() const;

   // Return the offset between two consecutive value_types (memory layout).
   virtual ULong_t   GetIncrement() const;

   // Return the sizeof the collection object.
   virtual UInt_t Sizeof() const;

   // Push new proxy environment.
   virtual void PushProxy(void *objstart);

   // Pop old proxy environment.
   virtual void PopProxy();

   // Return true if the content is of type 'pointer to'.
   virtual Bool_t HasPointers() const;

   // Return a pointer to the TClass representing the content.
   virtual TClass *GetValueClass() const;

   // If the content is a simple numerical value, return its type (see TDataType).
   virtual EDataType GetType() const;

   // Return the address of the value at index 'idx'.
   virtual void *At(UInt_t idx);

   // Clear the container.
   virtual void Clear(const char *opt = "");

   // Resize the container.
   virtual void Resize(UInt_t n, Bool_t force_delete);

   // Return the current size of the container.
   virtual UInt_t Size() const;

   // Block allocation of containees.
   virtual void* Allocate(UInt_t n, Bool_t forceDelete);

   // Insert data into the container where data is a C-style array of the actual type contained in the collection
   // of the given size.   For associative container (map, etc.), the data type is the pair<key,value>.
   virtual void  Insert(const void *data, void *container, size_t size);

   // Block commit of containees.
   virtual void Commit(void* env);

   // Streamer function.
   virtual void Streamer(TBuffer &refBuffer);

   // Streamer I/O overload.
   virtual void Streamer(TBuffer &refBuffer, void *pObject, int siz);

   // TClassStreamer I/O overload.
   virtual void operator()(TBuffer &refBuffer, void *pObject);

   // Routine to read the content of the buffer into 'obj'.
   virtual void ReadBuffer(TBuffer &b, void *obj);
   virtual void ReadBuffer(TBuffer &b, void *obj, const TClass *onfileClass);

   virtual void SetOnFileClass( TClass* cl ) { fOnFileClass = cl; }
   virtual TClass* GetOnFileClass() const { return fOnFileClass; }

   // MemberWise actions
   virtual TStreamerInfoActions::TActionSequence *GetConversionReadMemberWiseActions(TClass *oldClass, Int_t version);
   virtual TStreamerInfoActions::TActionSequence *GetReadMemberWiseActions(Int_t version);
   virtual TStreamerInfoActions::TActionSequence *GetWriteMemberWiseActions();

   // Set of functions to iterate easily throught the collection

   virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read = kTRUE);
   // typedef void (*CreateIterators_t)(void *collection, void **begin_arena, void **end_arena);
   // begin_arena and end_arena should contain the location of a memory arena of size fgIteratorSize.
   // If the collection iterator are of that size or less, the iterators will be constructed in place in those location (new with placement)
   // Otherwise the iterators will be allocated via a regular new and their address returned by modifying the value of begin_arena and end_arena.

   virtual CopyIterator_t GetFunctionCopyIterator(Bool_t read = kTRUE);
   // typedef void* (*CopyIterator_t)(void **dest, const void *source);
   // Copy the iterator source, into dest.   dest should contain the location of a memory arena of size fgIteratorSize.
   // If the collection iterator is of that size or less, the iterator will be constructed in place in this location (new with placement)
   // Otherwise the iterator will be allocated via a regular new.
   // The actual address of the iterator is returned in both case.

   virtual Next_t GetFunctionNext(Bool_t read = kTRUE);
   // typedef void* (*Next_t)(void *iter, const void *end);
   // iter and end should be pointers to respectively an iterator to be incremented and the result of collection.end()
   // If the iterator has not reached the end of the collection, 'Next' increment the iterator 'iter' and return 0 if
   // the iterator reached the end.
   // If the end was not reached, 'Next' returns the address of the content pointed to by the iterator before the
   // incrementation ; if the collection contains pointers, 'Next' will return the value of the pointer.

   virtual DeleteIterator_t GetFunctionDeleteIterator(Bool_t read = kTRUE);
   virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read = kTRUE);
   // typedef void (*DeleteIterator_t)(void *iter);
   // typedef void (*DeleteTwoIterators_t)(void *begin, void *end);
   // If the size of the iterator is greater than fgIteratorArenaSize, call delete on the addresses,
   // Otherwise just call the iterator's destructor.

};

template <typename T>
struct AnyCollectionProxy : public TGenCollectionProxy  {
   AnyCollectionProxy()
      : TGenCollectionProxy(typeid(T::Cont_t),sizeof(T::Iter_t))
   {
      // Constructor.
      fValDiff        = sizeof(T::Value_t);
      fValOffset      = T::value_offset();
      fSize.call      = T::size;
      fResize         = T::resize;
      fNext.call      = T::next;
      fFirst.call     = T::first;
      fClear.call     = T::clear;
      fConstruct      = T::construct;
      fDestruct       = T::destruct;
      fFeed           = T::feed;
      CheckFunctions();
   }
   virtual ~AnyCollectionProxy() {  }
};

#endif

 TGenCollectionProxy.h:1
 TGenCollectionProxy.h:2
 TGenCollectionProxy.h:3
 TGenCollectionProxy.h:4
 TGenCollectionProxy.h:5
 TGenCollectionProxy.h:6
 TGenCollectionProxy.h:7
 TGenCollectionProxy.h:8
 TGenCollectionProxy.h:9
 TGenCollectionProxy.h:10
 TGenCollectionProxy.h:11
 TGenCollectionProxy.h:12
 TGenCollectionProxy.h:13
 TGenCollectionProxy.h:14
 TGenCollectionProxy.h:15
 TGenCollectionProxy.h:16
 TGenCollectionProxy.h:17
 TGenCollectionProxy.h:18
 TGenCollectionProxy.h:19
 TGenCollectionProxy.h:20
 TGenCollectionProxy.h:21
 TGenCollectionProxy.h:22
 TGenCollectionProxy.h:23
 TGenCollectionProxy.h:24
 TGenCollectionProxy.h:25
 TGenCollectionProxy.h:26
 TGenCollectionProxy.h:27
 TGenCollectionProxy.h:28
 TGenCollectionProxy.h:29
 TGenCollectionProxy.h:30
 TGenCollectionProxy.h:31
 TGenCollectionProxy.h:32
 TGenCollectionProxy.h:33
 TGenCollectionProxy.h:34
 TGenCollectionProxy.h:35
 TGenCollectionProxy.h:36
 TGenCollectionProxy.h:37
 TGenCollectionProxy.h:38
 TGenCollectionProxy.h:39
 TGenCollectionProxy.h:40
 TGenCollectionProxy.h:41
 TGenCollectionProxy.h:42
 TGenCollectionProxy.h:43
 TGenCollectionProxy.h:44
 TGenCollectionProxy.h:45
 TGenCollectionProxy.h:46
 TGenCollectionProxy.h:47
 TGenCollectionProxy.h:48
 TGenCollectionProxy.h:49
 TGenCollectionProxy.h:50
 TGenCollectionProxy.h:51
 TGenCollectionProxy.h:52
 TGenCollectionProxy.h:53
 TGenCollectionProxy.h:54
 TGenCollectionProxy.h:55
 TGenCollectionProxy.h:56
 TGenCollectionProxy.h:57
 TGenCollectionProxy.h:58
 TGenCollectionProxy.h:59
 TGenCollectionProxy.h:60
 TGenCollectionProxy.h:61
 TGenCollectionProxy.h:62
 TGenCollectionProxy.h:63
 TGenCollectionProxy.h:64
 TGenCollectionProxy.h:65
 TGenCollectionProxy.h:66
 TGenCollectionProxy.h:67
 TGenCollectionProxy.h:68
 TGenCollectionProxy.h:69
 TGenCollectionProxy.h:70
 TGenCollectionProxy.h:71
 TGenCollectionProxy.h:72
 TGenCollectionProxy.h:73
 TGenCollectionProxy.h:74
 TGenCollectionProxy.h:75
 TGenCollectionProxy.h:76
 TGenCollectionProxy.h:77
 TGenCollectionProxy.h:78
 TGenCollectionProxy.h:79
 TGenCollectionProxy.h:80
 TGenCollectionProxy.h:81
 TGenCollectionProxy.h:82
 TGenCollectionProxy.h:83
 TGenCollectionProxy.h:84
 TGenCollectionProxy.h:85
 TGenCollectionProxy.h:86
 TGenCollectionProxy.h:87
 TGenCollectionProxy.h:88
 TGenCollectionProxy.h:89
 TGenCollectionProxy.h:90
 TGenCollectionProxy.h:91
 TGenCollectionProxy.h:92
 TGenCollectionProxy.h:93
 TGenCollectionProxy.h:94
 TGenCollectionProxy.h:95
 TGenCollectionProxy.h:96
 TGenCollectionProxy.h:97
 TGenCollectionProxy.h:98
 TGenCollectionProxy.h:99
 TGenCollectionProxy.h:100
 TGenCollectionProxy.h:101
 TGenCollectionProxy.h:102
 TGenCollectionProxy.h:103
 TGenCollectionProxy.h:104
 TGenCollectionProxy.h:105
 TGenCollectionProxy.h:106
 TGenCollectionProxy.h:107
 TGenCollectionProxy.h:108
 TGenCollectionProxy.h:109
 TGenCollectionProxy.h:110
 TGenCollectionProxy.h:111
 TGenCollectionProxy.h:112
 TGenCollectionProxy.h:113
 TGenCollectionProxy.h:114
 TGenCollectionProxy.h:115
 TGenCollectionProxy.h:116
 TGenCollectionProxy.h:117
 TGenCollectionProxy.h:118
 TGenCollectionProxy.h:119
 TGenCollectionProxy.h:120
 TGenCollectionProxy.h:121
 TGenCollectionProxy.h:122
 TGenCollectionProxy.h:123
 TGenCollectionProxy.h:124
 TGenCollectionProxy.h:125
 TGenCollectionProxy.h:126
 TGenCollectionProxy.h:127
 TGenCollectionProxy.h:128
 TGenCollectionProxy.h:129
 TGenCollectionProxy.h:130
 TGenCollectionProxy.h:131
 TGenCollectionProxy.h:132
 TGenCollectionProxy.h:133
 TGenCollectionProxy.h:134
 TGenCollectionProxy.h:135
 TGenCollectionProxy.h:136
 TGenCollectionProxy.h:137
 TGenCollectionProxy.h:138
 TGenCollectionProxy.h:139
 TGenCollectionProxy.h:140
 TGenCollectionProxy.h:141
 TGenCollectionProxy.h:142
 TGenCollectionProxy.h:143
 TGenCollectionProxy.h:144
 TGenCollectionProxy.h:145
 TGenCollectionProxy.h:146
 TGenCollectionProxy.h:147
 TGenCollectionProxy.h:148
 TGenCollectionProxy.h:149
 TGenCollectionProxy.h:150
 TGenCollectionProxy.h:151
 TGenCollectionProxy.h:152
 TGenCollectionProxy.h:153
 TGenCollectionProxy.h:154
 TGenCollectionProxy.h:155
 TGenCollectionProxy.h:156
 TGenCollectionProxy.h:157
 TGenCollectionProxy.h:158
 TGenCollectionProxy.h:159
 TGenCollectionProxy.h:160
 TGenCollectionProxy.h:161
 TGenCollectionProxy.h:162
 TGenCollectionProxy.h:163
 TGenCollectionProxy.h:164
 TGenCollectionProxy.h:165
 TGenCollectionProxy.h:166
 TGenCollectionProxy.h:167
 TGenCollectionProxy.h:168
 TGenCollectionProxy.h:169
 TGenCollectionProxy.h:170
 TGenCollectionProxy.h:171
 TGenCollectionProxy.h:172
 TGenCollectionProxy.h:173
 TGenCollectionProxy.h:174
 TGenCollectionProxy.h:175
 TGenCollectionProxy.h:176
 TGenCollectionProxy.h:177
 TGenCollectionProxy.h:178
 TGenCollectionProxy.h:179
 TGenCollectionProxy.h:180
 TGenCollectionProxy.h:181
 TGenCollectionProxy.h:182
 TGenCollectionProxy.h:183
 TGenCollectionProxy.h:184
 TGenCollectionProxy.h:185
 TGenCollectionProxy.h:186
 TGenCollectionProxy.h:187
 TGenCollectionProxy.h:188
 TGenCollectionProxy.h:189
 TGenCollectionProxy.h:190
 TGenCollectionProxy.h:191
 TGenCollectionProxy.h:192
 TGenCollectionProxy.h:193
 TGenCollectionProxy.h:194
 TGenCollectionProxy.h:195
 TGenCollectionProxy.h:196
 TGenCollectionProxy.h:197
 TGenCollectionProxy.h:198
 TGenCollectionProxy.h:199
 TGenCollectionProxy.h:200
 TGenCollectionProxy.h:201
 TGenCollectionProxy.h:202
 TGenCollectionProxy.h:203
 TGenCollectionProxy.h:204
 TGenCollectionProxy.h:205
 TGenCollectionProxy.h:206
 TGenCollectionProxy.h:207
 TGenCollectionProxy.h:208
 TGenCollectionProxy.h:209
 TGenCollectionProxy.h:210
 TGenCollectionProxy.h:211
 TGenCollectionProxy.h:212
 TGenCollectionProxy.h:213
 TGenCollectionProxy.h:214
 TGenCollectionProxy.h:215
 TGenCollectionProxy.h:216
 TGenCollectionProxy.h:217
 TGenCollectionProxy.h:218
 TGenCollectionProxy.h:219
 TGenCollectionProxy.h:220
 TGenCollectionProxy.h:221
 TGenCollectionProxy.h:222
 TGenCollectionProxy.h:223
 TGenCollectionProxy.h:224
 TGenCollectionProxy.h:225
 TGenCollectionProxy.h:226
 TGenCollectionProxy.h:227
 TGenCollectionProxy.h:228
 TGenCollectionProxy.h:229
 TGenCollectionProxy.h:230
 TGenCollectionProxy.h:231
 TGenCollectionProxy.h:232
 TGenCollectionProxy.h:233
 TGenCollectionProxy.h:234
 TGenCollectionProxy.h:235
 TGenCollectionProxy.h:236
 TGenCollectionProxy.h:237
 TGenCollectionProxy.h:238
 TGenCollectionProxy.h:239
 TGenCollectionProxy.h:240
 TGenCollectionProxy.h:241
 TGenCollectionProxy.h:242
 TGenCollectionProxy.h:243
 TGenCollectionProxy.h:244
 TGenCollectionProxy.h:245
 TGenCollectionProxy.h:246
 TGenCollectionProxy.h:247
 TGenCollectionProxy.h:248
 TGenCollectionProxy.h:249
 TGenCollectionProxy.h:250
 TGenCollectionProxy.h:251
 TGenCollectionProxy.h:252
 TGenCollectionProxy.h:253
 TGenCollectionProxy.h:254
 TGenCollectionProxy.h:255
 TGenCollectionProxy.h:256
 TGenCollectionProxy.h:257
 TGenCollectionProxy.h:258
 TGenCollectionProxy.h:259
 TGenCollectionProxy.h:260
 TGenCollectionProxy.h:261
 TGenCollectionProxy.h:262
 TGenCollectionProxy.h:263
 TGenCollectionProxy.h:264
 TGenCollectionProxy.h:265
 TGenCollectionProxy.h:266
 TGenCollectionProxy.h:267
 TGenCollectionProxy.h:268
 TGenCollectionProxy.h:269
 TGenCollectionProxy.h:270
 TGenCollectionProxy.h:271
 TGenCollectionProxy.h:272
 TGenCollectionProxy.h:273
 TGenCollectionProxy.h:274
 TGenCollectionProxy.h:275
 TGenCollectionProxy.h:276
 TGenCollectionProxy.h:277
 TGenCollectionProxy.h:278
 TGenCollectionProxy.h:279
 TGenCollectionProxy.h:280
 TGenCollectionProxy.h:281
 TGenCollectionProxy.h:282
 TGenCollectionProxy.h:283
 TGenCollectionProxy.h:284
 TGenCollectionProxy.h:285
 TGenCollectionProxy.h:286
 TGenCollectionProxy.h:287
 TGenCollectionProxy.h:288
 TGenCollectionProxy.h:289
 TGenCollectionProxy.h:290
 TGenCollectionProxy.h:291
 TGenCollectionProxy.h:292
 TGenCollectionProxy.h:293
 TGenCollectionProxy.h:294
 TGenCollectionProxy.h:295
 TGenCollectionProxy.h:296
 TGenCollectionProxy.h:297
 TGenCollectionProxy.h:298
 TGenCollectionProxy.h:299
 TGenCollectionProxy.h:300
 TGenCollectionProxy.h:301
 TGenCollectionProxy.h:302
 TGenCollectionProxy.h:303
 TGenCollectionProxy.h:304
 TGenCollectionProxy.h:305
 TGenCollectionProxy.h:306
 TGenCollectionProxy.h:307
 TGenCollectionProxy.h:308
 TGenCollectionProxy.h:309
 TGenCollectionProxy.h:310
 TGenCollectionProxy.h:311
 TGenCollectionProxy.h:312
 TGenCollectionProxy.h:313
 TGenCollectionProxy.h:314
 TGenCollectionProxy.h:315
 TGenCollectionProxy.h:316
 TGenCollectionProxy.h:317
 TGenCollectionProxy.h:318
 TGenCollectionProxy.h:319
 TGenCollectionProxy.h:320
 TGenCollectionProxy.h:321
 TGenCollectionProxy.h:322
 TGenCollectionProxy.h:323
 TGenCollectionProxy.h:324
 TGenCollectionProxy.h:325
 TGenCollectionProxy.h:326
 TGenCollectionProxy.h:327
 TGenCollectionProxy.h:328
 TGenCollectionProxy.h:329
 TGenCollectionProxy.h:330
 TGenCollectionProxy.h:331
 TGenCollectionProxy.h:332
 TGenCollectionProxy.h:333
 TGenCollectionProxy.h:334
 TGenCollectionProxy.h:335
 TGenCollectionProxy.h:336
 TGenCollectionProxy.h:337
 TGenCollectionProxy.h:338
 TGenCollectionProxy.h:339
 TGenCollectionProxy.h:340
 TGenCollectionProxy.h:341
 TGenCollectionProxy.h:342
 TGenCollectionProxy.h:343
 TGenCollectionProxy.h:344
 TGenCollectionProxy.h:345
 TGenCollectionProxy.h:346
 TGenCollectionProxy.h:347
 TGenCollectionProxy.h:348
 TGenCollectionProxy.h:349
 TGenCollectionProxy.h:350
 TGenCollectionProxy.h:351
 TGenCollectionProxy.h:352
 TGenCollectionProxy.h:353
 TGenCollectionProxy.h:354
 TGenCollectionProxy.h:355
 TGenCollectionProxy.h:356
 TGenCollectionProxy.h:357
 TGenCollectionProxy.h:358
 TGenCollectionProxy.h:359
 TGenCollectionProxy.h:360
 TGenCollectionProxy.h:361
 TGenCollectionProxy.h:362
 TGenCollectionProxy.h:363
 TGenCollectionProxy.h:364
 TGenCollectionProxy.h:365
 TGenCollectionProxy.h:366
 TGenCollectionProxy.h:367
 TGenCollectionProxy.h:368
 TGenCollectionProxy.h:369
 TGenCollectionProxy.h:370
 TGenCollectionProxy.h:371
 TGenCollectionProxy.h:372
 TGenCollectionProxy.h:373
 TGenCollectionProxy.h:374
 TGenCollectionProxy.h:375
 TGenCollectionProxy.h:376
 TGenCollectionProxy.h:377
 TGenCollectionProxy.h:378
 TGenCollectionProxy.h:379
 TGenCollectionProxy.h:380
 TGenCollectionProxy.h:381
 TGenCollectionProxy.h:382
 TGenCollectionProxy.h:383
 TGenCollectionProxy.h:384
 TGenCollectionProxy.h:385
 TGenCollectionProxy.h:386
 TGenCollectionProxy.h:387
 TGenCollectionProxy.h:388
 TGenCollectionProxy.h:389
 TGenCollectionProxy.h:390
 TGenCollectionProxy.h:391
 TGenCollectionProxy.h:392
 TGenCollectionProxy.h:393
 TGenCollectionProxy.h:394
 TGenCollectionProxy.h:395
 TGenCollectionProxy.h:396
 TGenCollectionProxy.h:397
 TGenCollectionProxy.h:398
 TGenCollectionProxy.h:399
 TGenCollectionProxy.h:400
 TGenCollectionProxy.h:401
 TGenCollectionProxy.h:402
 TGenCollectionProxy.h:403
 TGenCollectionProxy.h:404
 TGenCollectionProxy.h:405
 TGenCollectionProxy.h:406
 TGenCollectionProxy.h:407
 TGenCollectionProxy.h:408
 TGenCollectionProxy.h:409
 TGenCollectionProxy.h:410
 TGenCollectionProxy.h:411
 TGenCollectionProxy.h:412
 TGenCollectionProxy.h:413
 TGenCollectionProxy.h:414
 TGenCollectionProxy.h:415
 TGenCollectionProxy.h:416
 TGenCollectionProxy.h:417
 TGenCollectionProxy.h:418
 TGenCollectionProxy.h:419
 TGenCollectionProxy.h:420
 TGenCollectionProxy.h:421
 TGenCollectionProxy.h:422
 TGenCollectionProxy.h:423
 TGenCollectionProxy.h:424
 TGenCollectionProxy.h:425
 TGenCollectionProxy.h:426
 TGenCollectionProxy.h:427
 TGenCollectionProxy.h:428
 TGenCollectionProxy.h:429
 TGenCollectionProxy.h:430
 TGenCollectionProxy.h:431
 TGenCollectionProxy.h:432
 TGenCollectionProxy.h:433
 TGenCollectionProxy.h:434
 TGenCollectionProxy.h:435
 TGenCollectionProxy.h:436
 TGenCollectionProxy.h:437
 TGenCollectionProxy.h:438
 TGenCollectionProxy.h:439
 TGenCollectionProxy.h:440
 TGenCollectionProxy.h:441
 TGenCollectionProxy.h:442
 TGenCollectionProxy.h:443
 TGenCollectionProxy.h:444
 TGenCollectionProxy.h:445
 TGenCollectionProxy.h:446
 TGenCollectionProxy.h:447
 TGenCollectionProxy.h:448
 TGenCollectionProxy.h:449
 TGenCollectionProxy.h:450
 TGenCollectionProxy.h:451
 TGenCollectionProxy.h:452
 TGenCollectionProxy.h:453
 TGenCollectionProxy.h:454
 TGenCollectionProxy.h:455
 TGenCollectionProxy.h:456
 TGenCollectionProxy.h:457
 TGenCollectionProxy.h:458
 TGenCollectionProxy.h:459
 TGenCollectionProxy.h:460
 TGenCollectionProxy.h:461
 TGenCollectionProxy.h:462
 TGenCollectionProxy.h:463
 TGenCollectionProxy.h:464
 TGenCollectionProxy.h:465
 TGenCollectionProxy.h:466
 TGenCollectionProxy.h:467
 TGenCollectionProxy.h:468
 TGenCollectionProxy.h:469
 TGenCollectionProxy.h:470
 TGenCollectionProxy.h:471
 TGenCollectionProxy.h:472
 TGenCollectionProxy.h:473
 TGenCollectionProxy.h:474
 TGenCollectionProxy.h:475
 TGenCollectionProxy.h:476
 TGenCollectionProxy.h:477
 TGenCollectionProxy.h:478
 TGenCollectionProxy.h:479
 TGenCollectionProxy.h:480
 TGenCollectionProxy.h:481
 TGenCollectionProxy.h:482
 TGenCollectionProxy.h:483
 TGenCollectionProxy.h:484
 TGenCollectionProxy.h:485
 TGenCollectionProxy.h:486
 TGenCollectionProxy.h:487
 TGenCollectionProxy.h:488
 TGenCollectionProxy.h:489
 TGenCollectionProxy.h:490
 TGenCollectionProxy.h:491
 TGenCollectionProxy.h:492
 TGenCollectionProxy.h:493
 TGenCollectionProxy.h:494
 TGenCollectionProxy.h:495
 TGenCollectionProxy.h:496
 TGenCollectionProxy.h:497
 TGenCollectionProxy.h:498
 TGenCollectionProxy.h:499
 TGenCollectionProxy.h:500
 TGenCollectionProxy.h:501
 TGenCollectionProxy.h:502
 TGenCollectionProxy.h:503
 TGenCollectionProxy.h:504
 TGenCollectionProxy.h:505
 TGenCollectionProxy.h:506
 TGenCollectionProxy.h:507
 TGenCollectionProxy.h:508
 TGenCollectionProxy.h:509