ROOT logo
// @(#)root/reflex:$Id$
// Author: Markus Frank 2004

// Copyright CERN, CH-1211 Geneva 23, 2004-2006, All rights reserved.
//
// Permission to use, copy, modify, and distribute this software for any
// purpose is hereby granted without fee, provided that this copyright and
// permissions notice appear in all copies and derivatives.
//
// This software is provided "as is" without express or implied warranty.

#ifndef Reflex_CollectionProxy
#define Reflex_CollectionProxy 1 1

#include <cstddef>
#include <assert.h>
#include <vector>
#include <map>
#include <set>

// Macro indicating the version of the Collection Proxy interface followed
// by this Reflex build, this must match the version number of
// ROOT_COLLECTIONPROXY_VERSION in ROOT's TVirtutalCollectionProxy.h

#define REFLEX_COLLECTIONPROXY_VERSION 3

// Forward declarations

class TVirtualCollectionProxy;

namespace std {
   template <class T, class A> class deque;
   //template <class T, class A> class vector;
   template <class T, class A> class list;
   template <class T, class A> class queue;
   template <class T, class A> class stack;
   //template <class K, class T, class A> class set;
   //template <class K, class T, class A> class multiset;
   //template <class K, class T, class R, class A> class map;
   //template <class K, class T, class R, class A> class multimap;
   //template <class T> class allocator;
}
// Hash map forward declarations
#if defined(__GNUC__)
namespace __gnu_cxx {  // GNU GCC
   template <class T, class F, class E, class A> class hash_set;
   template <class T, class F, class E, class A> class hash_multiset;
   template <class K, class T, class F, class E, class A> class hash_map;
   template <class K, class T, class F, class E, class A> class hash_multimap;
}
#elif  defined(_WIN32)
namespace stdext {     // Visual C++
   template <class K, class T, class A> class hash_set;
   template <class K, class T, class A> class hash_multiset;
   template <class K, class T, class R, class A> class hash_map;
   template <class K, class T, class R, class A> class hash_multimap;
}
#endif

namespace Reflex  {
#ifndef __CINT__
   struct EnvironBase {
   EnvironBase(): fIdx(0),
         fSize(0),
         fObject(0),
         fStart(0),
         fTemp(0),
         fDeleteTemp(false),
         fRefSize(1),
         fSpace(0) {
      //   fprintf("Running default constructor on %p\n",this);
   }


      virtual ~EnvironBase() {}

      size_t fIdx;
      size_t fSize;
      void* fObject;
      void* fStart;
      void* fTemp;
      bool fDeleteTemp;
      int fRefSize;
      size_t fSpace;
   };

   template <typename T> struct Environ: public EnvironBase {
      typedef T Iter_t;
      Iter_t fIterator;
      T&
         iter() { return fIterator; }

      static void*
         Create() {
         return new Environ();
      }
   };
#else
   struct EnvironBase;
   template <typename T> struct Environ;
#endif

   template <typename T> struct Address {
      static void*
      address(T ref) {
         return (void*)& ref;
      }
   };
   
   // Same value as TVirtualCollectionProxy.
   static const unsigned int fgIteratorArenaSize = 16; // greater than sizeof(void*) + sizeof(UInt_t)

    /** @class template TCollectionProxyInfo::IteratorValue 
    *
    * Small helper to encapsulate whether to return the value
    * pointed to by the iterator or its address.
    *
    **/

      template <typename Cont_t, typename value> struct IteratorValue {
         static void* get(typename Cont_t::iterator &iter) {
            return (void*)&(*iter);
         }
      };

      template <typename Cont_t, typename value_ptr> struct IteratorValue<Cont_t, value_ptr*> {
         static void* get(typename Cont_t::iterator &iter) {
            return (void*)(*iter);
         }
      };

      template <> struct IteratorValue<std::vector<bool>,bool> {
         static void* get(std::vector<bool>::iterator & /* iter */) {
            return 0;
         }
      };

   /** @class template TCollectionProxyInfo::Iterators 
    *
    * Small helper to implement the function to create,access and destroy
    * iterators.
    *
    **/

      template <typename Cont_t, bool large = false> 
      struct Iterators {
         typedef Cont_t *PCont_t;
         typedef typename Cont_t::iterator iterator;

         static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *) {
            PCont_t c = PCont_t(coll);
            new (*begin_arena) iterator(c->begin());
            new (*end_arena) iterator(c->end());
         }
         static void* copy(void *dest_arena, const void *source_ptr) {
            iterator *source = (iterator *)(source_ptr);
            new (dest_arena) iterator(*source);
            return dest_arena; 
         }
         static void* next(void *iter_loc, const void *end_loc) {
            iterator *end = (iterator *)(end_loc);
            iterator *iter = (iterator *)(iter_loc);
            if (*iter != *end) {
               void *result = IteratorValue<Cont_t, typename Cont_t::value_type>::get(*iter);
               ++(*iter);
               return result;
            }
            return 0;
         }
         static void destruct1(void *iter_ptr) {
            iterator *start = (iterator *)(iter_ptr);
            start->~iterator();
         }
         static void destruct2(void *begin_ptr, void *end_ptr) {
            iterator *start = (iterator *)(begin_ptr);
            iterator *end = (iterator *)(end_ptr);
            start->~iterator();
            end->~iterator();
         }
      };

      // For Vector we take an extra short cut to avoid derefencing
      // the iterator all the time and redefine the 'address' of the
      // iterator as the iterator itself.  This requires special handling
      // in the looper (see TStreamerInfoAction) but is much faster.
      template <typename T> struct Iterators<std::vector<T>, false> {
         typedef std::vector<T> Cont_t;
         typedef Cont_t *PCont_t;
         typedef typename Cont_t::iterator iterator;

         static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *) {
            PCont_t c = PCont_t(coll);
            if (c->empty()) {
               *begin_arena = 0;
               *end_arena = 0;
               return;
            }
            *begin_arena = &(*c->begin());
#ifdef R__VISUAL_CPLUSPLUS
            *end_arena = &(*(c->end()-1)) + 1; // On windows we can not dererence the end iterator at all.
#else
            // coverity[past_the_end] Safe on other platforms
            *end_arena = &(*c->end());
#endif
         }
         static void* copy(void *dest, const void *source) {
            *(void**)dest = *(void**)source;
            return dest; 
         }
         static void* next(void * /* iter_loc */, const void * /* end_loc */) {
            // Should not be used.
            assert(0 && "Intentionally not implemented, do not use.");
            return 0;
         }
         static void destruct1(void  * /* iter_ptr */) {
            // Nothing to do
         }
         static void destruct2(void * /* begin_ptr */, void * /* end_ptr */) {
            // Nothing to do
         }
      };

      template <> struct Iterators<std::vector<bool>, false> {
         typedef std::vector<bool> Cont_t;
         typedef Cont_t *PCont_t;
         typedef Cont_t::iterator iterator;

         static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *) {
            PCont_t c = PCont_t(coll);
            new (*begin_arena) iterator(c->begin());
            new (*end_arena) iterator(c->end());
         }
         static void* copy(void *dest_arena, const void *source_ptr) {
            iterator *source = (iterator *)(source_ptr);
            new (dest_arena) iterator(*source);
            return dest_arena; 
         }
         static void* next(void *iter_loc, const void *end_loc) {
            iterator *end = (iterator *)(end_loc);
            iterator *iter = (iterator *)(iter_loc);
            if (*iter != *end) {
               void *result = IteratorValue<Cont_t, Cont_t::value_type>::get(*iter);
               ++(*iter);
               return result;
            }
            return 0;
         }
         static void destruct1(void *iter_ptr) {
            iterator *start = (iterator *)(iter_ptr);
            start->~iterator();
         }
         static void destruct2(void *begin_ptr, void *end_ptr) {
            iterator *start = (iterator *)(begin_ptr);
            iterator *end = (iterator *)(end_ptr);
            start->~iterator();
            end->~iterator();
         }
      };

      template <typename Cont_t> struct Iterators<Cont_t, /* large= */ true > {
         typedef Cont_t *PCont_t;
         typedef typename Cont_t::iterator iterator;

         static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *) {
            PCont_t  c = PCont_t(coll);
            *begin_arena = new iterator(c->begin());
            *end_arena = new iterator(c->end());        
         }
         static void* copy(void * /*dest_arena*/, const void *source_ptr) {
            iterator *source = (iterator *)(source_ptr);
            void *iter = new iterator(*source);
            return iter;
         }
         static void* next(void *iter_loc, const void *end_loc) {
            iterator *end = (iterator *)(end_loc);
            iterator *iter = (iterator *)(iter_loc);
            if (*iter != *end) {
               void *result = IteratorValue<Cont_t, typename Cont_t::value_type>::get(*iter);
               ++(*iter);
               return result;
            }
            return 0;
         }
         static void destruct1(void *begin_ptr) {
            iterator *start = (iterator *)(begin_ptr);
            delete start;
         }
         static void destruct2(void *begin_ptr, void *end_ptr) {
            iterator *start = (iterator *)(begin_ptr);
            iterator *end = (iterator *)(end_ptr);
            delete start;
            delete end;
         }
      };

      template <class T> struct CollType
#ifdef _KCC  // KAI compiler
      : public Address<typename T::value_type&>
#else
      : public Address<typename T::const_reference>
#endif
      {
#ifdef _KCC  // KAI compiler
         typedef Address<typename T::value_type&> Address_t;
#else
         typedef Address<typename T::const_reference> Address_t;
#endif
         typedef T Cont_t;
         typedef typename T::iterator Iter_t;
         typedef typename T::value_type Value_t;
         typedef Reflex::Environ<Iter_t> Env_t;
         typedef Env_t* PEnv_t;
         typedef Cont_t* PCont_t;
         typedef Value_t* PValue_t;

         static inline PCont_t
            object(void* ptr) {
            return PCont_t(PEnv_t(ptr)->fObject);
         }


         static void*
            size(void* env) {
            PEnv_t e = PEnv_t(env);
            e->fSize = PCont_t(e->fObject)->size();
            return &e->fSize;
         }


         static void*
            clear(void* env) {
            object(env)->clear();
            return 0;
         }


         static void*
            first(void* env) {
            PEnv_t e = PEnv_t(env);
            PCont_t c = PCont_t(e->fObject);
            // Assume iterators do not need destruction
            e->fIterator = c->begin();
            e->fSize = c->size();

            if (0 == e->fSize) { return e->fStart = 0; }
#ifdef _KCC  // KAI compiler
            typename T::value_type& ref = *(e->iter());
#else
            typename T::const_reference ref = *(e->iter());
#endif
            return e->fStart = Address_t::address(ref);
         }


         static void*
            next(void* env) {
            PEnv_t e = PEnv_t(env);
            PCont_t c = PCont_t(e->fObject);

            for ( ; e->fIdx > 0 && e->iter() != c->end(); ++(e->iter()), --e->fIdx) {}

            // TODO: Need to find something for going backwards....
            if (e->iter() == c->end()) { return 0; }
#ifdef _KCC  // KAI compiler
            typename T::value_type& ref = *(e->iter());
#else
            typename T::const_reference ref = *(e->iter());
#endif
            return Address_t::address(ref);
         }


         static void*
            construct(void* what, size_t size) {
            PValue_t m = PValue_t(what);

            for (size_t i = 0; i < size; ++i, ++m) {
               ::new (m) Value_t();
            }
            return 0;
         }


         static void*
            collect(void* coll, void *array) {
            PCont_t c = PCont_t(coll);
            PValue_t m = PValue_t(array);

            for (Iter_t i = c->begin(); i != c->end(); ++i, ++m) {
               ::new (m) Value_t(*i);
            }
            return 0;
         }


         static void
            destruct(void* what, size_t size) {
            PValue_t m = PValue_t(what);

            for (size_t i = 0; i < size; ++i, ++m) {
               m->~Value_t();
            }
         }

         static const bool fgLargeIterator = sizeof(typename Cont_t::iterator) > fgIteratorArenaSize;
         typedef Iterators<Cont_t,fgLargeIterator> Iterators_t;

      };

   /** @class TCollectionProxy::Map TCollectionProxy.h TCollectionProxy.h
    *
    * Small helper to encapsulate all necessary data accesses for
    * containers like vector, list, deque
    *
    * @author  M.Frank
    * @version 1.0
    * @date    10/10/2004
    */
   template <class T> struct Pushback: public CollType<T> {
      typedef T Cont_t;
      typedef typename T::iterator Iter_t;
      typedef typename T::value_type Value_t;
      typedef Environ<Iter_t> Env_t;
      typedef Env_t* PEnv_t;
      typedef Cont_t* PCont_t;
      typedef Value_t* PValue_t;
      static void resize(void* obj, size_t n) {
         PCont_t c = PCont_t(obj);
         c->resize(n);
      }

      static void*
         feed(void*from,void *to,size_t size) {
         PValue_t m = PValue_t(from);
         PCont_t c  = PCont_t(to);

         for (size_t i = 0; i < size; ++i, ++m) {
            c->push_back(*m);
         }
         return 0;
      }


      static int
         value_offset() {
         return 0;
      }


   };

   /** @class TCollectionProxy::Map TCollectionProxy.h TCollectionProxy.h
    *
    * Small helper to encapsulate all necessary data accesses for
    * containers like set, multiset etc.
    *
    * @author  M.Frank
    * @version 1.0
    * @date    10/10/2004
    */
   template <class T> struct Insert: public CollType<T> {
      typedef T Cont_t;
      typedef typename T::iterator Iter_t;
      typedef typename T::value_type Value_t;
      typedef Environ<Iter_t> Env_t;
      typedef Env_t* PEnv_t;
      typedef Cont_t* PCont_t;
      typedef Value_t* PValue_t;

      static void*
         feed(void*from,void*to,size_t size) {
         PValue_t m = PValue_t(from);
         PCont_t c  = PCont_t(to);

         for (size_t i = 0; i < size; ++i, ++m) {
            c->insert(*m);
         }
         return 0;
      }


      static void resize(void* /* obj */, size_t) { }


      static int
         value_offset() {
         return 0;
      }


   };

   /** @class TCollectionProxy::Map TCollectionProxy.h TCollectionProxy.h
    *
    * Small helper to encapsulate all necessary data accesses for
    * containers like Set, multiset etc.
    *
    * @author  M.Frank
    * @version 1.0
    * @date    10/10/2004
    */
   template <class T> struct MapInsert: public CollType<T> {
      typedef T Cont_t;
      typedef typename T::iterator Iter_t;
      typedef typename T::value_type Value_t;
      typedef Environ<Iter_t> Env_t;
      typedef Env_t* PEnv_t;
      typedef Cont_t* PCont_t;
      typedef Value_t* PValue_t;

      static void*
         feed(void*from,void *to,size_t size) {
         PValue_t m = PValue_t(from);
         PCont_t  c = PCont_t(to);

         for (size_t i = 0; i < size; ++i, ++m) {
            c->insert(*m);
         }
         return 0;
      }


      static void resize(void* /* obj */, size_t) {
      }


      static int
         value_offset() {
         return ((char*) &((PValue_t(0x1000))->second)) - ((char*) PValue_t(0x1000));
      }


   };

#ifndef __CINT__
   // Need specialization for boolean references due to stupid STL vector<bool>
   template <> inline void* Reflex::Address<std::vector<bool, std::allocator<bool> >::const_reference
      >::address(std::vector<bool, std::allocator<bool> >::const_reference) {
      return 0;
   }


#endif

}

#include <vector>
namespace Reflex  {
   /** @class CollFuncTable
    *
    * Table containing pointers to concrete functions to manipulate
    * Collections in a generic way
    *
    * @author  M.Frank
    */
   struct RFLX_API CollFuncTable  {
      size_t iter_size;
      size_t value_diff;
      int value_offset;
      void*  (*size_func)(void*);
      void   (*resize_func)(void*,size_t);
      void*  (*clear_func)(void*);
      void*  (*first_func)(void*);
      void*  (*next_func)(void*);
      void*  (*construct_func)(void*,size_t);
      void   (*destruct_func)(void*,size_t);
      void*  (*feed_func)(void*,void*,size_t);
      void*  (*collect_func)(void*,void*);
      void*  (*create_env)();

      // Set of function of direct iteration of the collections.
      void (*fCreateIterators)(void *collection, void **begin_arena, void **end_arena, TVirtualCollectionProxy *proxy);
      // begin_arena and end_arena should contain the location of 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.
      
      void* (*fCopyIterator)(void *dest, const void *source);
      // Copy the iterator source, into dest.   dest should contain should contain the location of memory arena  of size fgIteratorSize.
      // If the collection iterator are 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 and its address returned by modifying the value of dest.
      
      void* (*fNext)(void *iter, const void *end);
      // iter and end should be pointer to respectively an iterator to be incremented and the result of colleciton.end()
      // 'Next' will increment the iterator 'iter' and return 0 if the iterator reached the end.
      // If the end is not reached, 'Next' will return the address of the content unless the collection contains pointers in
      // which case 'Next' will return the value of the pointer.
      
      void (*fDeleteSingleIterator)(void *iter);
      void (*fDeleteTwoIterators)(void *begin, void *end);
      // If the sizeof iterator is greater than fgIteratorArenaSize, call delete on the addresses,
      // Otherwise just call the iterator's destructor.
    };

   template <typename T> struct CFTGenerator {
      static CollFuncTable*
      Generate() {
         typedef typename T::Value_t Value_t;
         typedef std::pair<Value_t, Value_t> Pair_t;
         Pair_t* ptr = (Pair_t*) 0x1000;
         CollFuncTable* p = new CollFuncTable();
         p->iter_size = sizeof(typename T::Iter_t);
         p->value_diff = ((char*) &ptr->second) - ((char*) &ptr->first);
         p->value_offset = T::value_offset();
         p->size_func = T::size;
         p->first_func = T::first;
         p->next_func = T::next;
         p->clear_func = T::clear;
         p->resize_func = T::resize;
         p->collect_func = T::collect;
         p->construct_func = T::construct;
         p->destruct_func = T::destruct;
         p->feed_func = T::feed;
         p->create_env = T::Env_t::Create;

         p->fCreateIterators = T::Iterators_t::create;
         p->fCopyIterator = T::Iterators_t::copy;
         p->fNext = T::Iterators_t::next;
         p->fDeleteSingleIterator = T::Iterators_t::destruct1;
         p->fDeleteTwoIterators = T::Iterators_t::destruct2;
         return p;
      } // Generate


   };
   struct CFTNullGenerator {
      static void*
      Void_func(void*) {
         return 0;
      }


      static void*
      Void_func0() { return 0; }

      static void
      Void_func2b(void*,size_t) { ; }

      static void*
      Void_func2c(void*,void*) { return 0; }

      static void*
      Void_func2(void*,size_t) { return 0; }

      static void*
      Void_func3(void*,void*,size_t) { return 0; }

      static CollFuncTable*
      Generate() {
         CollFuncTable* p = new CollFuncTable();
         p->iter_size = 4;
         p->value_diff = 0;
         p->value_offset = 0;
         p->size_func = Void_func;
         p->first_func = Void_func;
         p->next_func = Void_func;
         p->clear_func = Void_func;
         p->resize_func = Void_func2b;
         p->collect_func = Void_func2c;
         p->construct_func = Void_func2;
         p->destruct_func = Void_func2b;
         p->feed_func = Void_func3;
         p->create_env = Void_func0;

         p->fCreateIterators = 0;
         p->fCopyIterator = 0;
         p->fNext = 0;
         p->fDeleteSingleIterator = 0;
         p->fDeleteTwoIterators = 0;

         return p;
      } // Generate


   };
   // General proxy (dummy)
   template <typename A> struct Proxy {};

   // Specialization for std::vector
   template <class T, class A> struct Proxy<std::vector<T, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Pushback<std::vector<T, A> > >::Generate();
      }


   };
   // Specialization for std::list
   template <class T, class A> struct Proxy<std::list<T, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Pushback<std::list<T, A> > >::Generate();
      }


   };
   // Specialization for std::deque
   template <class T, class A> struct Proxy<std::deque<T, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Pushback<std::deque<T, A> > >::Generate();
      }


   };
   // Specialization for std::set
   template <class K, class T, class A> struct Proxy<std::set<K, T, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Insert<std::set<K, T, A> > >::Generate();
      }


   };
   // Specialization for std::multiset
   template <class K, class T, class A> struct Proxy<std::multiset<K, T, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Insert<std::multiset<K, T, A> > >::Generate();
      }


   };
   // Specialization for std::map
   template <class K, class T, class R, class A> struct Proxy<std::map<K, T, R, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<MapInsert<std::map<K, T, R, A> > >::Generate();
      }


   };
   // Specialization for std::multimap
   template <class K, class T, class R, class A> struct Proxy<std::multimap<K, T, R, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<MapInsert<std::multimap<K, T, R, A> > >::Generate();
      }


   };
   // Specialization for std::queue -- not implemented
   template <class K, class T> struct Proxy<std::queue<K, T> > {
      static CollFuncTable*
         Generate() { return CFTNullGenerator::Generate(); }

   };
   // Specialization for std::stack -- not implemented
   template <class K, class T> struct Proxy<std::stack<K, T> > {
      static CollFuncTable*
         Generate() { return CFTNullGenerator::Generate(); }

   };
#if defined(__GNUC__)
   // Specialization for __gnu_cxx::hash_set
   template <class T, class F, class E, class A> struct Proxy<__gnu_cxx::hash_set<T, F, E, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Insert<__gnu_cxx::hash_set<T, F, E, A> > >::Generate();
      }


   };
   // Specialization for __gnu_cxx::hash_multiset
   template <class T, class F, class E, class A> struct Proxy<__gnu_cxx::hash_multiset<T, F, E, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Insert<__gnu_cxx::hash_multiset<T, F, E, A> > >::Generate();
      }


   };
   // Specialization for __gnu_cxx::hash_map
   template <class K, class T, class F, class E, class A> struct Proxy<__gnu_cxx::hash_map<K, T, F, E, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<MapInsert<__gnu_cxx::hash_map<K, T, F, E, A> > >::Generate();
      }


   };
   // Specialization for __gnu_cxx::hash_multimap
   template <class K, class T, class F, class E, class A> struct Proxy<__gnu_cxx::hash_multimap<K, T, F, E, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<MapInsert<__gnu_cxx::hash_multimap<K, T, F, E, A> > >::Generate();
      }


   };
#elif defined(_WIN32)
   // Specialization for stdext::hash_multiset
   template <class K, class T, class A> struct Proxy<stdext::hash_multiset<K, T, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Insert<stdext::hash_multiset<K, T, A> > >::Generate();
      }


   };
   // Specialization for stdext::hash_set
   template <class K, class T, class A> struct Proxy<stdext::hash_set<K, T, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Insert<stdext::hash_set<K, T, A> > >::Generate();
      }


   };
   // Specialization for stdext::hash_map
   template <class K, class T, class R, class A> struct Proxy<stdext::hash_map<K, T, R, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<MapInsert<stdext::hash_map<K, T, R, A> > >::Generate();
      }


   };
   // Specialization for stdext::hash_multimap
   template <class K, class T, class R, class A> struct Proxy<stdext::hash_multimap<K, T, R, A> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<MapInsert<stdext::hash_multimap<K, T, R, A> > >::Generate();
      }


   };
#endif

   // Specialization for std::bitset
   template <typename B> struct StdBitSetHelper {};


#ifndef __CINT__
   template <typename Bitset_t> struct CollType<StdBitSetHelper<Bitset_t> > : public Address<const bool&> {
      typedef Bitset_t Cont_t;
      typedef std::pair<size_t, bool> Iter_t;
      typedef bool Value_t;
      typedef Environ<Iter_t> Env_t;
      typedef Env_t* PEnv_t;
      typedef Cont_t* PCont_t;
      typedef Value_t* PValue_t;

      virtual ~CollType() {}

      static inline PCont_t
         object(void* ptr) {
         return PCont_t(PEnv_t(ptr)->fObject);
      }


      static void*
         size(void* env) {
         PEnv_t e = PEnv_t(env);
         e->fSize = PCont_t(e->fObject)->size();
         return &e->fSize;
      }


      static void*
         clear(void* env) {
         object(env)->reset();
         return 0;
      }


      static void*
         first(void* env) {
         PEnv_t e = PEnv_t(env);
         PCont_t c = PCont_t(e->fObject);
         e->fIterator.first = 0;
         e->fIterator.second = c->size() > 0 ? c->test(e->fIterator.first) : false;      // Iterator actually hold the value.
         e->fSize = c->size();
         return 0;
      }


      static void*
         next(void* env) {
         PEnv_t e = PEnv_t(env);
         PCont_t c = PCont_t(e->fObject);

         for ( ; e->fIdx > 0 && e->fIterator.first != c->size(); ++(e->fIterator.first), --e->fIdx) {}
         e->fIterator.second = (e->fIterator.first != c->size()) ? c->test(e->fIterator.first) : false;
         return 0;
      }


      static void*
         construct(void*,size_t) {
         // Nothing to construct.
         return 0;
      }


      static void*
         collect(void* coll, void *array) {
         PCont_t c = PCont_t(coll);
         PValue_t m = PValue_t(array);    // 'start' is a buffer outside the container.

         for (size_t i = 0; i != c->size(); ++i, ++m) {
            *m = c->test(i);
         }
         return 0;
      }


      static void
         destruct(void*,size_t) {
         // Nothing to destruct.
      }

      struct Iterators {
         typedef Cont_t *PCont_t;
         union PtrSize_t { size_t fIndex; void *fAddress; };
         typedef std::pair<PtrSize_t,bool> iterator;
         // In the end iterator we store the bitset pointer
         // and do not use the 'second' part of the pair.
         // In the other iterator we store the index
         // and the value.

         static void create(void *coll, void **begin_arena, void **end_arena, TVirtualCollectionProxy *) {
            iterator *begin = new (*begin_arena) iterator;
            begin->first.fIndex = 0;
            begin->second = false;
            iterator *end = new (*end_arena) iterator;
            end->first.fAddress = coll;
            end->second = false;
         }
         static void* copy(void *dest_arena, const void *source_ptr) {
            const iterator *source = (const iterator *)(source_ptr);
            new (dest_arena) iterator(*source);
            return dest_arena;
         }
         static void* next(void *iter_loc, const void *end_loc) {
            const iterator *end = (const iterator *)(end_loc);
            PCont_t c = (PCont_t)end->first.fAddress;
            iterator *iter = (iterator *)(iter_loc);
            if (iter->first.fIndex != c->size()) {
               iter->second = c->test(iter->first.fIndex);
               ++(iter->first.fIndex);
            }
            return &(iter->second);
         }
         static void destruct1(void *iter_ptr) {
            iterator *start = (iterator *)(iter_ptr);
            start->~iterator();
         }
         static void destruct2(void *begin_ptr, void *end_ptr) {
            iterator *start = (iterator *)(begin_ptr);
            iterator *end = (iterator *)(end_ptr);
            start->~iterator();
            end->~iterator();
         }
      };
      typedef Iterators Iterators_t;

   };

   template <typename Bitset_t>
      struct Pushback<StdBitSetHelper<Bitset_t> > : public CollType<StdBitSetHelper<Bitset_t> > {
      typedef Bitset_t Cont_t;
      typedef bool Iter_t;
      typedef bool Value_t;
      typedef Environ<Iter_t> Env_t;
      typedef Env_t* PEnv_t;
      typedef Cont_t* PCont_t;
      typedef Value_t* PValue_t;

      static void resize(void* /*obj*/, size_t) { }


      static void*
         feed(void* env) {
         PEnv_t e = PEnv_t(env);
         PCont_t c = PCont_t(e->fObject);
         PValue_t m = PValue_t(e->fStart);    // Here start is actually a 'buffer' outside the container.

         for (size_t i = 0; i < e->fSize; ++i, ++m) {
            c->set(i, *m);
         }
         return 0;
      }

      static void*
         feed(void* from, void* to, size_t size) {
         PValue_t m = PValue_t(from);
         PCont_t c  = PCont_t(to);

         for (size_t i = 0; i < size; ++i, ++m) {
            c->set(i, *m);
         }
         return 0;
      }


      static int
         value_offset() {
         return 0;
      }


   };
#endif

   template <typename B> struct Proxy<StdBitSetHelper<B> > {
      static CollFuncTable*
         Generate() {
         return CFTGenerator<Pushback<StdBitSetHelper<B> > >::Generate();
      }


   };
}

#endif // Reflex_CollectionProxy
 CollectionProxy.h:1
 CollectionProxy.h:2
 CollectionProxy.h:3
 CollectionProxy.h:4
 CollectionProxy.h:5
 CollectionProxy.h:6
 CollectionProxy.h:7
 CollectionProxy.h:8
 CollectionProxy.h:9
 CollectionProxy.h:10
 CollectionProxy.h:11
 CollectionProxy.h:12
 CollectionProxy.h:13
 CollectionProxy.h:14
 CollectionProxy.h:15
 CollectionProxy.h:16
 CollectionProxy.h:17
 CollectionProxy.h:18
 CollectionProxy.h:19
 CollectionProxy.h:20
 CollectionProxy.h:21
 CollectionProxy.h:22
 CollectionProxy.h:23
 CollectionProxy.h:24
 CollectionProxy.h:25
 CollectionProxy.h:26
 CollectionProxy.h:27
 CollectionProxy.h:28
 CollectionProxy.h:29
 CollectionProxy.h:30
 CollectionProxy.h:31
 CollectionProxy.h:32
 CollectionProxy.h:33
 CollectionProxy.h:34
 CollectionProxy.h:35
 CollectionProxy.h:36
 CollectionProxy.h:37
 CollectionProxy.h:38
 CollectionProxy.h:39
 CollectionProxy.h:40
 CollectionProxy.h:41
 CollectionProxy.h:42
 CollectionProxy.h:43
 CollectionProxy.h:44
 CollectionProxy.h:45
 CollectionProxy.h:46
 CollectionProxy.h:47
 CollectionProxy.h:48
 CollectionProxy.h:49
 CollectionProxy.h:50
 CollectionProxy.h:51
 CollectionProxy.h:52
 CollectionProxy.h:53
 CollectionProxy.h:54
 CollectionProxy.h:55
 CollectionProxy.h:56
 CollectionProxy.h:57
 CollectionProxy.h:58
 CollectionProxy.h:59
 CollectionProxy.h:60
 CollectionProxy.h:61
 CollectionProxy.h:62
 CollectionProxy.h:63
 CollectionProxy.h:64
 CollectionProxy.h:65
 CollectionProxy.h:66
 CollectionProxy.h:67
 CollectionProxy.h:68
 CollectionProxy.h:69
 CollectionProxy.h:70
 CollectionProxy.h:71
 CollectionProxy.h:72
 CollectionProxy.h:73
 CollectionProxy.h:74
 CollectionProxy.h:75
 CollectionProxy.h:76
 CollectionProxy.h:77
 CollectionProxy.h:78
 CollectionProxy.h:79
 CollectionProxy.h:80
 CollectionProxy.h:81
 CollectionProxy.h:82
 CollectionProxy.h:83
 CollectionProxy.h:84
 CollectionProxy.h:85
 CollectionProxy.h:86
 CollectionProxy.h:87
 CollectionProxy.h:88
 CollectionProxy.h:89
 CollectionProxy.h:90
 CollectionProxy.h:91
 CollectionProxy.h:92
 CollectionProxy.h:93
 CollectionProxy.h:94
 CollectionProxy.h:95
 CollectionProxy.h:96
 CollectionProxy.h:97
 CollectionProxy.h:98
 CollectionProxy.h:99
 CollectionProxy.h:100
 CollectionProxy.h:101
 CollectionProxy.h:102
 CollectionProxy.h:103
 CollectionProxy.h:104
 CollectionProxy.h:105
 CollectionProxy.h:106
 CollectionProxy.h:107
 CollectionProxy.h:108
 CollectionProxy.h:109
 CollectionProxy.h:110
 CollectionProxy.h:111
 CollectionProxy.h:112
 CollectionProxy.h:113
 CollectionProxy.h:114
 CollectionProxy.h:115
 CollectionProxy.h:116
 CollectionProxy.h:117
 CollectionProxy.h:118
 CollectionProxy.h:119
 CollectionProxy.h:120
 CollectionProxy.h:121
 CollectionProxy.h:122
 CollectionProxy.h:123
 CollectionProxy.h:124
 CollectionProxy.h:125
 CollectionProxy.h:126
 CollectionProxy.h:127
 CollectionProxy.h:128
 CollectionProxy.h:129
 CollectionProxy.h:130
 CollectionProxy.h:131
 CollectionProxy.h:132
 CollectionProxy.h:133
 CollectionProxy.h:134
 CollectionProxy.h:135
 CollectionProxy.h:136
 CollectionProxy.h:137
 CollectionProxy.h:138
 CollectionProxy.h:139
 CollectionProxy.h:140
 CollectionProxy.h:141
 CollectionProxy.h:142
 CollectionProxy.h:143
 CollectionProxy.h:144
 CollectionProxy.h:145
 CollectionProxy.h:146
 CollectionProxy.h:147
 CollectionProxy.h:148
 CollectionProxy.h:149
 CollectionProxy.h:150
 CollectionProxy.h:151
 CollectionProxy.h:152
 CollectionProxy.h:153
 CollectionProxy.h:154
 CollectionProxy.h:155
 CollectionProxy.h:156
 CollectionProxy.h:157
 CollectionProxy.h:158
 CollectionProxy.h:159
 CollectionProxy.h:160
 CollectionProxy.h:161
 CollectionProxy.h:162
 CollectionProxy.h:163
 CollectionProxy.h:164
 CollectionProxy.h:165
 CollectionProxy.h:166
 CollectionProxy.h:167
 CollectionProxy.h:168
 CollectionProxy.h:169
 CollectionProxy.h:170
 CollectionProxy.h:171
 CollectionProxy.h:172
 CollectionProxy.h:173
 CollectionProxy.h:174
 CollectionProxy.h:175
 CollectionProxy.h:176
 CollectionProxy.h:177
 CollectionProxy.h:178
 CollectionProxy.h:179
 CollectionProxy.h:180
 CollectionProxy.h:181
 CollectionProxy.h:182
 CollectionProxy.h:183
 CollectionProxy.h:184
 CollectionProxy.h:185
 CollectionProxy.h:186
 CollectionProxy.h:187
 CollectionProxy.h:188
 CollectionProxy.h:189
 CollectionProxy.h:190
 CollectionProxy.h:191
 CollectionProxy.h:192
 CollectionProxy.h:193
 CollectionProxy.h:194
 CollectionProxy.h:195
 CollectionProxy.h:196
 CollectionProxy.h:197
 CollectionProxy.h:198
 CollectionProxy.h:199
 CollectionProxy.h:200
 CollectionProxy.h:201
 CollectionProxy.h:202
 CollectionProxy.h:203
 CollectionProxy.h:204
 CollectionProxy.h:205
 CollectionProxy.h:206
 CollectionProxy.h:207
 CollectionProxy.h:208
 CollectionProxy.h:209
 CollectionProxy.h:210
 CollectionProxy.h:211
 CollectionProxy.h:212
 CollectionProxy.h:213
 CollectionProxy.h:214
 CollectionProxy.h:215
 CollectionProxy.h:216
 CollectionProxy.h:217
 CollectionProxy.h:218
 CollectionProxy.h:219
 CollectionProxy.h:220
 CollectionProxy.h:221
 CollectionProxy.h:222
 CollectionProxy.h:223
 CollectionProxy.h:224
 CollectionProxy.h:225
 CollectionProxy.h:226
 CollectionProxy.h:227
 CollectionProxy.h:228
 CollectionProxy.h:229
 CollectionProxy.h:230
 CollectionProxy.h:231
 CollectionProxy.h:232
 CollectionProxy.h:233
 CollectionProxy.h:234
 CollectionProxy.h:235
 CollectionProxy.h:236
 CollectionProxy.h:237
 CollectionProxy.h:238
 CollectionProxy.h:239
 CollectionProxy.h:240
 CollectionProxy.h:241
 CollectionProxy.h:242
 CollectionProxy.h:243
 CollectionProxy.h:244
 CollectionProxy.h:245
 CollectionProxy.h:246
 CollectionProxy.h:247
 CollectionProxy.h:248
 CollectionProxy.h:249
 CollectionProxy.h:250
 CollectionProxy.h:251
 CollectionProxy.h:252
 CollectionProxy.h:253
 CollectionProxy.h:254
 CollectionProxy.h:255
 CollectionProxy.h:256
 CollectionProxy.h:257
 CollectionProxy.h:258
 CollectionProxy.h:259
 CollectionProxy.h:260
 CollectionProxy.h:261
 CollectionProxy.h:262
 CollectionProxy.h:263
 CollectionProxy.h:264
 CollectionProxy.h:265
 CollectionProxy.h:266
 CollectionProxy.h:267
 CollectionProxy.h:268
 CollectionProxy.h:269
 CollectionProxy.h:270
 CollectionProxy.h:271
 CollectionProxy.h:272
 CollectionProxy.h:273
 CollectionProxy.h:274
 CollectionProxy.h:275
 CollectionProxy.h:276
 CollectionProxy.h:277
 CollectionProxy.h:278
 CollectionProxy.h:279
 CollectionProxy.h:280
 CollectionProxy.h:281
 CollectionProxy.h:282
 CollectionProxy.h:283
 CollectionProxy.h:284
 CollectionProxy.h:285
 CollectionProxy.h:286
 CollectionProxy.h:287
 CollectionProxy.h:288
 CollectionProxy.h:289
 CollectionProxy.h:290
 CollectionProxy.h:291
 CollectionProxy.h:292
 CollectionProxy.h:293
 CollectionProxy.h:294
 CollectionProxy.h:295
 CollectionProxy.h:296
 CollectionProxy.h:297
 CollectionProxy.h:298
 CollectionProxy.h:299
 CollectionProxy.h:300
 CollectionProxy.h:301
 CollectionProxy.h:302
 CollectionProxy.h:303
 CollectionProxy.h:304
 CollectionProxy.h:305
 CollectionProxy.h:306
 CollectionProxy.h:307
 CollectionProxy.h:308
 CollectionProxy.h:309
 CollectionProxy.h:310
 CollectionProxy.h:311
 CollectionProxy.h:312
 CollectionProxy.h:313
 CollectionProxy.h:314
 CollectionProxy.h:315
 CollectionProxy.h:316
 CollectionProxy.h:317
 CollectionProxy.h:318
 CollectionProxy.h:319
 CollectionProxy.h:320
 CollectionProxy.h:321
 CollectionProxy.h:322
 CollectionProxy.h:323
 CollectionProxy.h:324
 CollectionProxy.h:325
 CollectionProxy.h:326
 CollectionProxy.h:327
 CollectionProxy.h:328
 CollectionProxy.h:329
 CollectionProxy.h:330
 CollectionProxy.h:331
 CollectionProxy.h:332
 CollectionProxy.h:333
 CollectionProxy.h:334
 CollectionProxy.h:335
 CollectionProxy.h:336
 CollectionProxy.h:337
 CollectionProxy.h:338
 CollectionProxy.h:339
 CollectionProxy.h:340
 CollectionProxy.h:341
 CollectionProxy.h:342
 CollectionProxy.h:343
 CollectionProxy.h:344
 CollectionProxy.h:345
 CollectionProxy.h:346
 CollectionProxy.h:347
 CollectionProxy.h:348
 CollectionProxy.h:349
 CollectionProxy.h:350
 CollectionProxy.h:351
 CollectionProxy.h:352
 CollectionProxy.h:353
 CollectionProxy.h:354
 CollectionProxy.h:355
 CollectionProxy.h:356
 CollectionProxy.h:357
 CollectionProxy.h:358
 CollectionProxy.h:359
 CollectionProxy.h:360
 CollectionProxy.h:361
 CollectionProxy.h:362
 CollectionProxy.h:363
 CollectionProxy.h:364
 CollectionProxy.h:365
 CollectionProxy.h:366
 CollectionProxy.h:367
 CollectionProxy.h:368
 CollectionProxy.h:369
 CollectionProxy.h:370
 CollectionProxy.h:371
 CollectionProxy.h:372
 CollectionProxy.h:373
 CollectionProxy.h:374
 CollectionProxy.h:375
 CollectionProxy.h:376
 CollectionProxy.h:377
 CollectionProxy.h:378
 CollectionProxy.h:379
 CollectionProxy.h:380
 CollectionProxy.h:381
 CollectionProxy.h:382
 CollectionProxy.h:383
 CollectionProxy.h:384
 CollectionProxy.h:385
 CollectionProxy.h:386
 CollectionProxy.h:387
 CollectionProxy.h:388
 CollectionProxy.h:389
 CollectionProxy.h:390
 CollectionProxy.h:391
 CollectionProxy.h:392
 CollectionProxy.h:393
 CollectionProxy.h:394
 CollectionProxy.h:395
 CollectionProxy.h:396
 CollectionProxy.h:397
 CollectionProxy.h:398
 CollectionProxy.h:399
 CollectionProxy.h:400
 CollectionProxy.h:401
 CollectionProxy.h:402
 CollectionProxy.h:403
 CollectionProxy.h:404
 CollectionProxy.h:405
 CollectionProxy.h:406
 CollectionProxy.h:407
 CollectionProxy.h:408
 CollectionProxy.h:409
 CollectionProxy.h:410
 CollectionProxy.h:411
 CollectionProxy.h:412
 CollectionProxy.h:413
 CollectionProxy.h:414
 CollectionProxy.h:415
 CollectionProxy.h:416
 CollectionProxy.h:417
 CollectionProxy.h:418
 CollectionProxy.h:419
 CollectionProxy.h:420
 CollectionProxy.h:421
 CollectionProxy.h:422
 CollectionProxy.h:423
 CollectionProxy.h:424
 CollectionProxy.h:425
 CollectionProxy.h:426
 CollectionProxy.h:427
 CollectionProxy.h:428
 CollectionProxy.h:429
 CollectionProxy.h:430
 CollectionProxy.h:431
 CollectionProxy.h:432
 CollectionProxy.h:433
 CollectionProxy.h:434
 CollectionProxy.h:435
 CollectionProxy.h:436
 CollectionProxy.h:437
 CollectionProxy.h:438
 CollectionProxy.h:439
 CollectionProxy.h:440
 CollectionProxy.h:441
 CollectionProxy.h:442
 CollectionProxy.h:443
 CollectionProxy.h:444
 CollectionProxy.h:445
 CollectionProxy.h:446
 CollectionProxy.h:447
 CollectionProxy.h:448
 CollectionProxy.h:449
 CollectionProxy.h:450
 CollectionProxy.h:451
 CollectionProxy.h:452
 CollectionProxy.h:453
 CollectionProxy.h:454
 CollectionProxy.h:455
 CollectionProxy.h:456
 CollectionProxy.h:457
 CollectionProxy.h:458
 CollectionProxy.h:459
 CollectionProxy.h:460
 CollectionProxy.h:461
 CollectionProxy.h:462
 CollectionProxy.h:463
 CollectionProxy.h:464
 CollectionProxy.h:465
 CollectionProxy.h:466
 CollectionProxy.h:467
 CollectionProxy.h:468
 CollectionProxy.h:469
 CollectionProxy.h:470
 CollectionProxy.h:471
 CollectionProxy.h:472
 CollectionProxy.h:473
 CollectionProxy.h:474
 CollectionProxy.h:475
 CollectionProxy.h:476
 CollectionProxy.h:477
 CollectionProxy.h:478
 CollectionProxy.h:479
 CollectionProxy.h:480
 CollectionProxy.h:481
 CollectionProxy.h:482
 CollectionProxy.h:483
 CollectionProxy.h:484
 CollectionProxy.h:485
 CollectionProxy.h:486
 CollectionProxy.h:487
 CollectionProxy.h:488
 CollectionProxy.h:489
 CollectionProxy.h:490
 CollectionProxy.h:491
 CollectionProxy.h:492
 CollectionProxy.h:493
 CollectionProxy.h:494
 CollectionProxy.h:495
 CollectionProxy.h:496
 CollectionProxy.h:497
 CollectionProxy.h:498
 CollectionProxy.h:499
 CollectionProxy.h:500
 CollectionProxy.h:501
 CollectionProxy.h:502
 CollectionProxy.h:503
 CollectionProxy.h:504
 CollectionProxy.h:505
 CollectionProxy.h:506
 CollectionProxy.h:507
 CollectionProxy.h:508
 CollectionProxy.h:509
 CollectionProxy.h:510
 CollectionProxy.h:511
 CollectionProxy.h:512
 CollectionProxy.h:513
 CollectionProxy.h:514
 CollectionProxy.h:515
 CollectionProxy.h:516
 CollectionProxy.h:517
 CollectionProxy.h:518
 CollectionProxy.h:519
 CollectionProxy.h:520
 CollectionProxy.h:521
 CollectionProxy.h:522
 CollectionProxy.h:523
 CollectionProxy.h:524
 CollectionProxy.h:525
 CollectionProxy.h:526
 CollectionProxy.h:527
 CollectionProxy.h:528
 CollectionProxy.h:529
 CollectionProxy.h:530
 CollectionProxy.h:531
 CollectionProxy.h:532
 CollectionProxy.h:533
 CollectionProxy.h:534
 CollectionProxy.h:535
 CollectionProxy.h:536
 CollectionProxy.h:537
 CollectionProxy.h:538
 CollectionProxy.h:539
 CollectionProxy.h:540
 CollectionProxy.h:541
 CollectionProxy.h:542
 CollectionProxy.h:543
 CollectionProxy.h:544
 CollectionProxy.h:545
 CollectionProxy.h:546
 CollectionProxy.h:547
 CollectionProxy.h:548
 CollectionProxy.h:549
 CollectionProxy.h:550
 CollectionProxy.h:551
 CollectionProxy.h:552
 CollectionProxy.h:553
 CollectionProxy.h:554
 CollectionProxy.h:555
 CollectionProxy.h:556
 CollectionProxy.h:557
 CollectionProxy.h:558
 CollectionProxy.h:559
 CollectionProxy.h:560
 CollectionProxy.h:561
 CollectionProxy.h:562
 CollectionProxy.h:563
 CollectionProxy.h:564
 CollectionProxy.h:565
 CollectionProxy.h:566
 CollectionProxy.h:567
 CollectionProxy.h:568
 CollectionProxy.h:569
 CollectionProxy.h:570
 CollectionProxy.h:571
 CollectionProxy.h:572
 CollectionProxy.h:573
 CollectionProxy.h:574
 CollectionProxy.h:575
 CollectionProxy.h:576
 CollectionProxy.h:577
 CollectionProxy.h:578
 CollectionProxy.h:579
 CollectionProxy.h:580
 CollectionProxy.h:581
 CollectionProxy.h:582
 CollectionProxy.h:583
 CollectionProxy.h:584
 CollectionProxy.h:585
 CollectionProxy.h:586
 CollectionProxy.h:587
 CollectionProxy.h:588
 CollectionProxy.h:589
 CollectionProxy.h:590
 CollectionProxy.h:591
 CollectionProxy.h:592
 CollectionProxy.h:593
 CollectionProxy.h:594
 CollectionProxy.h:595
 CollectionProxy.h:596
 CollectionProxy.h:597
 CollectionProxy.h:598
 CollectionProxy.h:599
 CollectionProxy.h:600
 CollectionProxy.h:601
 CollectionProxy.h:602
 CollectionProxy.h:603
 CollectionProxy.h:604
 CollectionProxy.h:605
 CollectionProxy.h:606
 CollectionProxy.h:607
 CollectionProxy.h:608
 CollectionProxy.h:609
 CollectionProxy.h:610
 CollectionProxy.h:611
 CollectionProxy.h:612
 CollectionProxy.h:613
 CollectionProxy.h:614
 CollectionProxy.h:615
 CollectionProxy.h:616
 CollectionProxy.h:617
 CollectionProxy.h:618
 CollectionProxy.h:619
 CollectionProxy.h:620
 CollectionProxy.h:621
 CollectionProxy.h:622
 CollectionProxy.h:623
 CollectionProxy.h:624
 CollectionProxy.h:625
 CollectionProxy.h:626
 CollectionProxy.h:627
 CollectionProxy.h:628
 CollectionProxy.h:629
 CollectionProxy.h:630
 CollectionProxy.h:631
 CollectionProxy.h:632
 CollectionProxy.h:633
 CollectionProxy.h:634
 CollectionProxy.h:635
 CollectionProxy.h:636
 CollectionProxy.h:637
 CollectionProxy.h:638
 CollectionProxy.h:639
 CollectionProxy.h:640
 CollectionProxy.h:641
 CollectionProxy.h:642
 CollectionProxy.h:643
 CollectionProxy.h:644
 CollectionProxy.h:645
 CollectionProxy.h:646
 CollectionProxy.h:647
 CollectionProxy.h:648
 CollectionProxy.h:649
 CollectionProxy.h:650
 CollectionProxy.h:651
 CollectionProxy.h:652
 CollectionProxy.h:653
 CollectionProxy.h:654
 CollectionProxy.h:655
 CollectionProxy.h:656
 CollectionProxy.h:657
 CollectionProxy.h:658
 CollectionProxy.h:659
 CollectionProxy.h:660
 CollectionProxy.h:661
 CollectionProxy.h:662
 CollectionProxy.h:663
 CollectionProxy.h:664
 CollectionProxy.h:665
 CollectionProxy.h:666
 CollectionProxy.h:667
 CollectionProxy.h:668
 CollectionProxy.h:669
 CollectionProxy.h:670
 CollectionProxy.h:671
 CollectionProxy.h:672
 CollectionProxy.h:673
 CollectionProxy.h:674
 CollectionProxy.h:675
 CollectionProxy.h:676
 CollectionProxy.h:677
 CollectionProxy.h:678
 CollectionProxy.h:679
 CollectionProxy.h:680
 CollectionProxy.h:681
 CollectionProxy.h:682
 CollectionProxy.h:683
 CollectionProxy.h:684
 CollectionProxy.h:685
 CollectionProxy.h:686
 CollectionProxy.h:687
 CollectionProxy.h:688
 CollectionProxy.h:689
 CollectionProxy.h:690
 CollectionProxy.h:691
 CollectionProxy.h:692
 CollectionProxy.h:693
 CollectionProxy.h:694
 CollectionProxy.h:695
 CollectionProxy.h:696
 CollectionProxy.h:697
 CollectionProxy.h:698
 CollectionProxy.h:699
 CollectionProxy.h:700
 CollectionProxy.h:701
 CollectionProxy.h:702
 CollectionProxy.h:703
 CollectionProxy.h:704
 CollectionProxy.h:705
 CollectionProxy.h:706
 CollectionProxy.h:707
 CollectionProxy.h:708
 CollectionProxy.h:709
 CollectionProxy.h:710
 CollectionProxy.h:711
 CollectionProxy.h:712
 CollectionProxy.h:713
 CollectionProxy.h:714
 CollectionProxy.h:715
 CollectionProxy.h:716
 CollectionProxy.h:717
 CollectionProxy.h:718
 CollectionProxy.h:719
 CollectionProxy.h:720
 CollectionProxy.h:721
 CollectionProxy.h:722
 CollectionProxy.h:723
 CollectionProxy.h:724
 CollectionProxy.h:725
 CollectionProxy.h:726
 CollectionProxy.h:727
 CollectionProxy.h:728
 CollectionProxy.h:729
 CollectionProxy.h:730
 CollectionProxy.h:731
 CollectionProxy.h:732
 CollectionProxy.h:733
 CollectionProxy.h:734
 CollectionProxy.h:735
 CollectionProxy.h:736
 CollectionProxy.h:737
 CollectionProxy.h:738
 CollectionProxy.h:739
 CollectionProxy.h:740
 CollectionProxy.h:741
 CollectionProxy.h:742
 CollectionProxy.h:743
 CollectionProxy.h:744
 CollectionProxy.h:745
 CollectionProxy.h:746
 CollectionProxy.h:747
 CollectionProxy.h:748
 CollectionProxy.h:749
 CollectionProxy.h:750
 CollectionProxy.h:751
 CollectionProxy.h:752
 CollectionProxy.h:753
 CollectionProxy.h:754
 CollectionProxy.h:755
 CollectionProxy.h:756
 CollectionProxy.h:757
 CollectionProxy.h:758
 CollectionProxy.h:759
 CollectionProxy.h:760
 CollectionProxy.h:761
 CollectionProxy.h:762
 CollectionProxy.h:763
 CollectionProxy.h:764
 CollectionProxy.h:765
 CollectionProxy.h:766
 CollectionProxy.h:767
 CollectionProxy.h:768
 CollectionProxy.h:769
 CollectionProxy.h:770
 CollectionProxy.h:771
 CollectionProxy.h:772
 CollectionProxy.h:773
 CollectionProxy.h:774
 CollectionProxy.h:775
 CollectionProxy.h:776
 CollectionProxy.h:777
 CollectionProxy.h:778
 CollectionProxy.h:779
 CollectionProxy.h:780
 CollectionProxy.h:781
 CollectionProxy.h:782
 CollectionProxy.h:783
 CollectionProxy.h:784
 CollectionProxy.h:785
 CollectionProxy.h:786
 CollectionProxy.h:787
 CollectionProxy.h:788
 CollectionProxy.h:789
 CollectionProxy.h:790
 CollectionProxy.h:791
 CollectionProxy.h:792
 CollectionProxy.h:793
 CollectionProxy.h:794
 CollectionProxy.h:795
 CollectionProxy.h:796
 CollectionProxy.h:797
 CollectionProxy.h:798
 CollectionProxy.h:799
 CollectionProxy.h:800
 CollectionProxy.h:801
 CollectionProxy.h:802
 CollectionProxy.h:803
 CollectionProxy.h:804
 CollectionProxy.h:805
 CollectionProxy.h:806
 CollectionProxy.h:807
 CollectionProxy.h:808
 CollectionProxy.h:809
 CollectionProxy.h:810
 CollectionProxy.h:811
 CollectionProxy.h:812
 CollectionProxy.h:813
 CollectionProxy.h:814
 CollectionProxy.h:815
 CollectionProxy.h:816
 CollectionProxy.h:817
 CollectionProxy.h:818
 CollectionProxy.h:819
 CollectionProxy.h:820
 CollectionProxy.h:821
 CollectionProxy.h:822
 CollectionProxy.h:823
 CollectionProxy.h:824
 CollectionProxy.h:825
 CollectionProxy.h:826
 CollectionProxy.h:827
 CollectionProxy.h:828
 CollectionProxy.h:829
 CollectionProxy.h:830
 CollectionProxy.h:831
 CollectionProxy.h:832
 CollectionProxy.h:833
 CollectionProxy.h:834
 CollectionProxy.h:835
 CollectionProxy.h:836
 CollectionProxy.h:837
 CollectionProxy.h:838
 CollectionProxy.h:839
 CollectionProxy.h:840
 CollectionProxy.h:841
 CollectionProxy.h:842
 CollectionProxy.h:843
 CollectionProxy.h:844
 CollectionProxy.h:845
 CollectionProxy.h:846
 CollectionProxy.h:847
 CollectionProxy.h:848
 CollectionProxy.h:849
 CollectionProxy.h:850
 CollectionProxy.h:851
 CollectionProxy.h:852
 CollectionProxy.h:853
 CollectionProxy.h:854
 CollectionProxy.h:855
 CollectionProxy.h:856
 CollectionProxy.h:857
 CollectionProxy.h:858
 CollectionProxy.h:859
 CollectionProxy.h:860
 CollectionProxy.h:861
 CollectionProxy.h:862
 CollectionProxy.h:863
 CollectionProxy.h:864
 CollectionProxy.h:865
 CollectionProxy.h:866
 CollectionProxy.h:867
 CollectionProxy.h:868
 CollectionProxy.h:869
 CollectionProxy.h:870
 CollectionProxy.h:871
 CollectionProxy.h:872
 CollectionProxy.h:873
 CollectionProxy.h:874
 CollectionProxy.h:875
 CollectionProxy.h:876
 CollectionProxy.h:877
 CollectionProxy.h:878
 CollectionProxy.h:879
 CollectionProxy.h:880
 CollectionProxy.h:881
 CollectionProxy.h:882
 CollectionProxy.h:883
 CollectionProxy.h:884
 CollectionProxy.h:885
 CollectionProxy.h:886
 CollectionProxy.h:887
 CollectionProxy.h:888
 CollectionProxy.h:889
 CollectionProxy.h:890
 CollectionProxy.h:891
 CollectionProxy.h:892
 CollectionProxy.h:893
 CollectionProxy.h:894
 CollectionProxy.h:895
 CollectionProxy.h:896
 CollectionProxy.h:897
 CollectionProxy.h:898
 CollectionProxy.h:899
 CollectionProxy.h:900
 CollectionProxy.h:901
 CollectionProxy.h:902
 CollectionProxy.h:903
 CollectionProxy.h:904
 CollectionProxy.h:905
 CollectionProxy.h:906
 CollectionProxy.h:907
 CollectionProxy.h:908
 CollectionProxy.h:909
 CollectionProxy.h:910
 CollectionProxy.h:911
 CollectionProxy.h:912
 CollectionProxy.h:913
 CollectionProxy.h:914
 CollectionProxy.h:915
 CollectionProxy.h:916
 CollectionProxy.h:917
 CollectionProxy.h:918
 CollectionProxy.h:919
 CollectionProxy.h:920
 CollectionProxy.h:921
 CollectionProxy.h:922
 CollectionProxy.h:923
 CollectionProxy.h:924
 CollectionProxy.h:925
 CollectionProxy.h:926
 CollectionProxy.h:927
 CollectionProxy.h:928
 CollectionProxy.h:929
 CollectionProxy.h:930
 CollectionProxy.h:931
 CollectionProxy.h:932
 CollectionProxy.h:933
 CollectionProxy.h:934
 CollectionProxy.h:935
 CollectionProxy.h:936
 CollectionProxy.h:937
 CollectionProxy.h:938
 CollectionProxy.h:939
 CollectionProxy.h:940
 CollectionProxy.h:941
 CollectionProxy.h:942
 CollectionProxy.h:943
 CollectionProxy.h:944
 CollectionProxy.h:945
 CollectionProxy.h:946
 CollectionProxy.h:947
 CollectionProxy.h:948
 CollectionProxy.h:949
 CollectionProxy.h:950
 CollectionProxy.h:951
 CollectionProxy.h:952
 CollectionProxy.h:953
 CollectionProxy.h:954
 CollectionProxy.h:955
 CollectionProxy.h:956
 CollectionProxy.h:957
 CollectionProxy.h:958
 CollectionProxy.h:959
 CollectionProxy.h:960
 CollectionProxy.h:961
 CollectionProxy.h:962
 CollectionProxy.h:963
 CollectionProxy.h:964
 CollectionProxy.h:965
 CollectionProxy.h:966
 CollectionProxy.h:967
 CollectionProxy.h:968
 CollectionProxy.h:969
 CollectionProxy.h:970
 CollectionProxy.h:971
 CollectionProxy.h:972
 CollectionProxy.h:973
 CollectionProxy.h:974
 CollectionProxy.h:975
 CollectionProxy.h:976
 CollectionProxy.h:977
 CollectionProxy.h:978
 CollectionProxy.h:979
 CollectionProxy.h:980
 CollectionProxy.h:981
 CollectionProxy.h:982
 CollectionProxy.h:983
 CollectionProxy.h:984
 CollectionProxy.h:985
 CollectionProxy.h:986
 CollectionProxy.h:987
 CollectionProxy.h:988
 CollectionProxy.h:989
 CollectionProxy.h:990
 CollectionProxy.h:991
 CollectionProxy.h:992
 CollectionProxy.h:993
 CollectionProxy.h:994
 CollectionProxy.h:995
 CollectionProxy.h:996
 CollectionProxy.h:997
 CollectionProxy.h:998
 CollectionProxy.h:999
 CollectionProxy.h:1000
 CollectionProxy.h:1001
 CollectionProxy.h:1002
 CollectionProxy.h:1003
 CollectionProxy.h:1004
 CollectionProxy.h:1005
 CollectionProxy.h:1006
 CollectionProxy.h:1007
 CollectionProxy.h:1008
 CollectionProxy.h:1009
 CollectionProxy.h:1010
 CollectionProxy.h:1011
 CollectionProxy.h:1012
 CollectionProxy.h:1013
 CollectionProxy.h:1014
 CollectionProxy.h:1015