ROOT logo
// @(#)root/reflex:$Id$
// Author: Stefan Roiser 2004

// Copyright CERN, CH-1211 Geneva 23, 2004-2010, 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_ClassBuilder
#define Reflex_ClassBuilder

// Include files
#include "Reflex/Kernel.h"
#include "Reflex/Tools.h"
#include "Reflex/Member.h"
#include "Reflex/Callback.h"
#include "Reflex/Builder/TypeBuilder.h"

// Forward declaration for 'friendship' purpose.
namespace Cint { namespace Internal {} }

namespace Reflex {

/* Helper class to avoid compiler warning about casting function pointer
** to void pointer.
*/
class BuilderFunc2Void {
   typedef void (*funcptr_t)();

   union funcptr_and_voidptr {
      typedef void (*funcptr_t)();

      funcptr_and_voidptr(void *val) : _read(val) {}

      void *_read;
      funcptr_t _write;
   };

   funcptr_and_voidptr _tmp;
public:
   template <typename T>
   BuilderFunc2Void( T vfp ) : _tmp(0) {
      _tmp._write = ( funcptr_t )vfp;
   }

   operator void*() const {
      return _tmp._read;
   }
};

// forward declarations
class Class;
class ClassBuilder;
class OnDemandBuilderForScope;

template <typename C> class ClassBuilderT;

/**
 * @class ClassBuilderImpl ClassBuilder.h Reflex/Builder/ClassBuilder.h
 * @author Stefan Roiser
 * @date 30/3/2004
 * @ingroup RefBld
 */
class RFLX_API ClassBuilderImpl {
public:
   /** constructor */
   ClassBuilderImpl(const char* nam, const std::type_info & ti, size_t size, unsigned int modifiers = 0, TYPE typ = CLASS);
   ClassBuilderImpl(Class* cl);

   /** destructor */
   virtual ~ClassBuilderImpl();

   /**
    * AddBase will add the information about one BaseAt class
    * @param  Name of the BaseAt class
    * @param  OffsetFP function pointer for Offset calculation
    * @param  modifiers the modifiers of the class
    */
   void AddBase(const Type& bas,
                OffsetFunction offsFP,
                unsigned int modifiers = 0);

   /** AddDataMember will add the information about one data
    * MemberAt of the class
    *
    * @param  Name of the data MemberAt
    * @param  At of the data MemberAt
    * @param  Offset of the data MemberAt
    * @param  modifiers the modifiers of the data MemberAt
    */
   void AddDataMember(const char* nam,
                      const Type& typ,
                      size_t offs,
                      unsigned int modifiers = 0);

   /** AddFunctionMember will add the information about one
    * function MemberAt of the class
    *
    * @param  Name of the function MemberAt
    * @param  At of the function MemberAt
    * @param  stubFP Stub function pointer for the function
    * @param  stubCxt Stub user context for the stub function
    * @param  params parameter names and default values (semi-colon separated)
    * @param  modifiers the modifiers of the function MemberAt
    */
   void AddFunctionMember(const char* nam,
                          const Type& typ,
                          StubFunction stubFP,
                          void* stubCtx = 0,
                          const char* params = 0,
                          unsigned int modifiers = 0);

   void AddTypedef(const Type& typ,
                   const char* def);

   void AddEnum(const char* nam,
                const char* values,
                const std::type_info* ti,
                unsigned int modifiers = 0);

   // This is for anonymous union support.
   //void addUnion(const char* nam, const char* values, const std::type_info& ti, unsigned int modifiers = 0);


   /** AddProperty will add a PropertyNth to the PropertyNth stack
    * which will be emtpied with the next call of a builder
    * class and attached to the item built with this call
    *
    * @param  key the PropertyNth key
    * @param  value the value of the PropertyNth
    */
   void AddProperty(const char* key,
                    Any value);
   void AddProperty(const char* key,
                    const char* value);
   void AddProperty(const char* key,
                    const Literal& value) { AddProperty(key, (const char*)value); }


   /**
    * Register an on demand builder for data members with this class.
    */
   void AddOnDemandDataMemberBuilder(OnDemandBuilderForScope* odb);

   /**
    * Register an on demand builder for function members with this class.
    */
   void AddOnDemandFunctionMemberBuilder(OnDemandBuilderForScope* odb);

   /** SetSizeOf will set the SizeOf property for this class.
    * It currently ignore all actual content.
    * @size Size of the class
    */
   void SetSizeOf(size_t size);

   /*
    * ToType will return the currently produced Type (class)
    * @return the type currently being built
    */
   Type ToType();

protected:
   friend class ClassBuilder;
   template <class C> friend class ClassBuilderT;

   /**
    * EnableCallback Enable or disable the callback call in the destructor
    * @param  enable true to enable callback call, false to disable callback call
    */
   void EnableCallback(bool enable = true);

private:
   /** current class being built */
   Class* fClass;

   /** last added MemberAt */
   Member fLastMember;

   /** flag, true if this is truly building a new class */
   bool fNewClass;

   /** flag, fire callback in destructor */
   bool fCallbackEnabled;

};    // class ClassBuilderImpl


/**
 * @class ClassBuilder ClassBuilder.h Reflex/Builder/ClassBuilder.h
 * @author Stefan Roiser
 * @date 24/5/2004
 * @ingroup RefBld
 */
class RFLX_API ClassBuilder {
public:
   /** constructor */
   ClassBuilder(const char* nam, const std::type_info & ti, size_t size, unsigned int modifiers = 0, TYPE typ = CLASS);
   ClassBuilder(Class* cl);

   /** destructor */
   virtual ~ClassBuilder();

   /**
    * AddBase will add the information about one BaseAt class
    * @param  Name of the BaseAt class
    * @param  OffsetFP function pointer for Offset calculation
    * @param  modifiers the modifiers of the class
    */
   template <class C, class B> ClassBuilder& AddBase(unsigned int modifiers = 0);
   ClassBuilder& AddBase(const Type& bas,
                         OffsetFunction offsFP,
                         unsigned int modifiers = 0);

   /** AddDataMember will add the information about one data
    * MemberAt of the class
    *
    * @param  Name of the data MemberAt
    * @param  Offset of data MemberAt
    * @param  modifiers the modifiers of the data MemberAt
    * @return a reference to the ClassBuilder
    */
   template <class T> ClassBuilder& AddDataMember(const char* nam,
                                                  size_t offs,
                                                  unsigned int modifiers = 0);
   ClassBuilder& AddDataMember(const Type& typ,
                               const char* nam,
                               size_t offs,
                               unsigned int modifiers = 0);

   /** AddFunctionMember will add the information about one
    * function MemberAt of the class
    *
    * @param  Name of the function MemberAt
    * @param  function templated function MemberAt to extract At information
    * @param  stubFP Stub function pointer for the function
    * @param  stubCxt Stub user context for the stub function
    * @param  params pamater names and default values (semi-colon separated)
    * @param  modifiers the modifiers of the data MemberAt
    * @return a reference to the ClassBuilder
    */
   template <class F> ClassBuilder& AddFunctionMember(const char* nam,
                                                      StubFunction stubFP,
                                                      void* stubCtx = 0,
                                                      const char* params = 0,
                                                      unsigned int modifiers = 0);
   ClassBuilder& AddFunctionMember(const Type& typ,
                                   const char* nam,
                                   StubFunction stubFP,
                                   void* stubCtx = 0,
                                   const char* params = 0,
                                   unsigned int modifiers = 0);

   template <typename TD> ClassBuilder& AddTypedef(const char* def);
   ClassBuilder& AddTypedef(const Type& typ,
                            const char* def);
   ClassBuilder& AddTypedef(const char* typ,
                            const char* def);

   template <typename E> ClassBuilder& AddEnum(const char* values,
                                               unsigned int modifiers = 0);

   ClassBuilder& AddEnum(const char* nam,
                         const char* values,
                         const std::type_info* ti = 0,
                         unsigned int modifiers = 0);

   // This is for anonymous union support.
   //ClassBuilder& addUnion(const char* nam, const char* values, unsigned int modifiers);


   /** AddProperty will add a PropertyNth to the last defined
    * data MemberAt, method or class.
    * @param  key the PropertyNth key
    * @param  value the value of the PropertyNth
    * @return a reference to the building class
    */
   template <typename P> ClassBuilder& AddProperty(const char* key,
                                                   P value);

   /**
    * Register an on demand data member builder with this class.
    */
   ClassBuilder& AddOnDemandDataMemberBuilder(OnDemandBuilderForScope* odb);

   /**
    * Register an on demand function member builder with this class.
    */
   ClassBuilder& AddOnDemandFunctionMemberBuilder(OnDemandBuilderForScope* odb);

   /** SetSizeOf will set the SizeOf property for this class.
    * It currently ignore all actual content.
    * @size Size of the class
    */
   ClassBuilder& SetSizeOf(size_t size);

   /*
    * ToType will return the currently produced Type (class)
    * @return the type currently being built
    */
   Type ToType();

protected:
#ifdef G__COMMON_H
   friend int::G__search_tagname(const char*, int);
   friend void Cint::Internal::G__set_stdio();
   friend void Cint::Internal::G__create_bytecode_arena();
#endif

   /**
    * EnableCallback Enable or disable the callback call in the destructor
    * @param  enable true to enable callback call, false to disable callback call
    */
   ClassBuilder& EnableCallback(bool enable = true);

private:
   ClassBuilderImpl fClassBuilderImpl;

};    // class ClassBuilder


/**
 * @class ClassBuilderT ClassBuilder.h Reflex/Builder/ClassBuilder.h
 * @author Stefan Roiser
 * @date 30/3/2004
 * @ingroup RefBld
 */
template <class C>
class ClassBuilderT {
public:
   /** constructor */
   ClassBuilderT(unsigned int modifiers = 0,
                 TYPE typ = CLASS);


   /** constructor */
   ClassBuilderT(const char* nam,
                 unsigned int modifiers = 0,
                 TYPE typ = CLASS);


   /**
    * AddBase will add the information about one BaseAt class
    * @param  Name of the BaseAt class
    * @param  OffsetFP function pointer for Offset calculation
    * @param  modifiers the modifiers of the class
    */
   template <class B>
   ClassBuilderT& AddBase(unsigned int modifiers = 0);
   ClassBuilderT& AddBase(const Type& bas,
                          OffsetFunction offsFP,
                          unsigned int modifiers = 0);


   /** AddDataMember will add the information about one data
    * MemberAt of the class
    *
    * @param  Name of the data MemberAt
    * @param  Offset of data MemberAt
    * @param  modifiers the modifiers of the data MemberAt
    * @return a reference to the ClassBuilderT
    */
   template <class T>
   ClassBuilderT& AddDataMember(const char* nam,
                                size_t offs,
                                unsigned int modifiers = 0);
   ClassBuilderT& AddDataMember(const Type& typ,
                                const char* nam,
                                size_t offs,
                                unsigned int modifiers = 0);


   /** AddFunctionMember will add the information about one
    * function MemberAt of the class
    *
    * @param  Name of the function MemberAt
    * @param  function templated function MemberAt to extract At information
    * @param  stubFP Stub function pointer for the function
    * @param  stubCxt Stub user context for the stub function
    * @param  params pamater names and default values (semi-colon separated)
    * @param  modifiers the modifiers of the data MemberAt
    * @return a reference to the ClassBuilder
    */
   template <class F>
   ClassBuilderT& AddFunctionMember(const char* nam,
                                    StubFunction stubFP,
                                    void* stubCtx = 0,
                                    const char* params = 0,
                                    unsigned int modifiers = 0);
   ClassBuilderT& AddFunctionMember(const Type& typ,
                                    const char* nam,
                                    StubFunction stubFP,
                                    void* stubCtx = 0,
                                    const char* params = 0,
                                    unsigned int modifiers = 0);

   template <typename TD>
   ClassBuilderT& AddTypedef(const char* def);
   ClassBuilderT& AddTypedef(const Type& typ,
                             const char* def);
   ClassBuilderT& AddTypedef(const char* typ,
                             const char* def);

   template <typename E>
   ClassBuilderT& AddEnum(const char* values,
                          unsigned int modifiers = 0);
   ClassBuilderT& AddEnum(const char* nam,
                          const char* values,
                          const std::type_info* ti = 0,
                          unsigned int modifiers = 0);

   //ClassBuilderT & addUnion( const char * nam,
   //                          const char * values,
   //                          unsigned int modifiers );


   /** AddProperty will add a PropertyNth to the last defined
    * data MemberAt, method or class.
    * @param  key the PropertyNth key
    * @param  value the value of the PropertyNth
    * @return a reference to the building class
    */
   template <typename P>
   ClassBuilderT& AddProperty(const char* key,
                              P value);


   /**
    * Register an on demand data member builder with this class.
    */
   void AddOnDemandDataMemberBuilder(OnDemandBuilderForScope* odb);


   /**
    * Register an on demand function member builder with this class.
    */
   void AddOnDemandFunctionMemberBuilder(OnDemandBuilderForScope* odb);


   /** SetSizeOf will set the SizeOf property for this class.
    * It currently ignore all actual content.
    * @size Size of the class
    */
   ClassBuilderT& SetSizeOf(size_t size);

   /*
    * ToType will return the currently produced Type (class)
    * @return the type currently being built
    */
   Type ToType();

protected:
   /**
    * EnableCallback Enable or disable the callback call in the destructor
    * @param  enable true to enable callback call, false to disable callback call
    */
   ClassBuilderT& EnableCallback(bool enable = true);

private:
   ClassBuilderImpl fClassBuilderImpl;

};    // class ClassBuilderT

} // namespace Reflex

//______________________________________________________________________________
template <typename C, typename B> inline Reflex::ClassBuilder&
Reflex::ClassBuilder::AddBase(unsigned int modifiers) {
   fClassBuilderImpl.AddBase(GetType<B>(), BaseOffset<C, B>::Get(), modifiers);
   return *this;
}


//______________________________________________________________________________
template <typename T> inline Reflex::ClassBuilder&
Reflex::ClassBuilder::AddDataMember(const char* nam,
                                    size_t offs,
                                    unsigned int modifiers) {
   fClassBuilderImpl.AddDataMember(nam, TypeDistiller<T>::Get(), offs, modifiers);
   return *this;
}


//______________________________________________________________________________
template <typename F> inline Reflex::ClassBuilder&
Reflex::ClassBuilder::AddFunctionMember(const char* nam,
                                        StubFunction stubFP,
                                        void* stubCtx,
                                        const char* params,
                                        unsigned int modifiers) {
   fClassBuilderImpl.AddFunctionMember(nam, FunctionDistiller<F>::Get(), stubFP, stubCtx, params, modifiers);
   return *this;
}


//______________________________________________________________________________
template <typename TD> inline Reflex::ClassBuilder&
Reflex::ClassBuilder::AddTypedef(const char* def) {
   fClassBuilderImpl.AddTypedef(TypeDistiller<TD>::Get(), def);
   return *this;
}


//______________________________________________________________________________
template <typename E> inline Reflex::ClassBuilder&
Reflex::ClassBuilder::AddEnum(const char* values,
                              unsigned int modifiers) {
   fClassBuilderImpl.AddEnum(Tools::Demangle(typeid(E)).c_str(), values, &typeid(E), modifiers);
   return *this;
}


//______________________________________________________________________________
template <typename P> inline Reflex::ClassBuilder&
Reflex::ClassBuilder::AddProperty(const char* key,
                                  P value) {
   fClassBuilderImpl.AddProperty(key, value);
   return *this;
}


//______________________________________________________________________________
template <typename C> inline
Reflex::ClassBuilderT<C>::ClassBuilderT(unsigned int modifiers, TYPE typ):
   fClassBuilderImpl(Tools::Demangle(typeid(C)).c_str(), typeid(C), sizeof(C), modifiers, typ) {
}


//______________________________________________________________________________
template <class C> inline
Reflex::ClassBuilderT<C>::ClassBuilderT(const char* nam, unsigned int modifiers, TYPE typ):
   fClassBuilderImpl(nam, typeid(C), sizeof(C), modifiers, typ) {
}


//______________________________________________________________________________
template <typename C> template <typename B> inline
Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddBase(unsigned int modifiers) {
   fClassBuilderImpl.AddBase(GetType<B>(), BaseOffset<C, B>::Get(), modifiers);
   return *this;
}


//______________________________________________________________________________
template <class C> inline
Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddBase(const Type& bas,
           OffsetFunction offsFP,
           unsigned int modifiers) {
   fClassBuilderImpl.AddBase(bas, offsFP, modifiers);
   return *this;
}


//______________________________________________________________________________
template <class C> template <class T> inline
Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddDataMember(const char* nam,
                 size_t offs,
                 unsigned int modifiers) {
   fClassBuilderImpl.AddDataMember(nam, TypeDistiller<T>::Get(), offs, modifiers);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C> inline
Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddDataMember(const Type& typ,
                 const char* nam,
                 size_t offs,
                 unsigned int modifiers) {
   fClassBuilderImpl.AddDataMember(nam, typ, offs, modifiers);
   return *this;
}


//______________________________________________________________________________
template <typename C> template <typename F> inline 
Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddFunctionMember(const char* nam,
                     StubFunction stubFP,
                     void* stubCtx,
                     const char* params,
                     unsigned int modifiers) {
   fClassBuilderImpl.AddFunctionMember(nam, FunctionDistiller<F>::Get(), stubFP, stubCtx, params, modifiers);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddFunctionMember(const Type& typ,
                     const char* nam,
                     StubFunction stubFP,
                     void* stubCtx,
                     const char* params,
                     unsigned int modifiers) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.AddFunctionMember(nam,
                                       typ,
                                       stubFP,
                                       stubCtx,
                                       params,
                                       modifiers);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C> template <typename TD>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddTypedef(const char* def) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.AddTypedef(TypeDistiller<TD>::Get(),
                                def);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddTypedef(const char* typ,
              const char* def) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.AddTypedef(TypeBuilder(typ),
                                def);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddTypedef(const Type& typ,
              const char* def) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.AddTypedef(typ,
                                def);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C> template <typename E>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddEnum(const char* values,
           unsigned int modifiers) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.AddEnum(Tools::Demangle(typeid(E)).c_str(),
                             values,
                             &typeid(E),
                             modifiers);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddEnum(const char* nam,
           const char* values,
           const std::type_info* ti,
           unsigned int modifiers) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.AddEnum(nam,
                             values,
                             ti,
                             modifiers);
   return *this;
}


/*/-------------------------------------------------------------------------------
   template < class C >
   inline Reflex::ClassBuilderT<C> &
   Reflex::ClassBuilderT<C>::addUnion( const char * nam,
   const char * values,
   unsigned int modifiers ) {
   //-------------------------------------------------------------------------------
   fClassBuilderImpl.addUnion( nam, values, modifiers );
   return * this;
   }
 */


//-------------------------------------------------------------------------------
template <class C> template <class P>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::AddProperty(const char* key,
               P value) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.AddProperty(key, value);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::EnableCallback(bool enable /* = true */) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.EnableCallback(enable);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C>
inline Reflex::ClassBuilderT<C>&
Reflex::ClassBuilderT<C>::SetSizeOf(size_t size) {
//-------------------------------------------------------------------------------
   fClassBuilderImpl.SetSizeOf(size);
   return *this;
}


//-------------------------------------------------------------------------------
template <class C> inline Reflex::Type
Reflex::ClassBuilderT<C>::ToType() {
//-------------------------------------------------------------------------------
   return fClassBuilderImpl.ToType();
}


//-------------------------------------------------------------------------------
template <class C> inline void
Reflex::ClassBuilderT<C>::AddOnDemandDataMemberBuilder(OnDemandBuilderForScope* odb) {
//-------------------------------------------------------------------------------
// Register an on demand builder with this class.
   fClassBuilderImpl.AddOnDemandDataMemberBuilder(odb);
}

//-------------------------------------------------------------------------------
template <class C> inline void
Reflex::ClassBuilderT<C>::AddOnDemandFunctionMemberBuilder(OnDemandBuilderForScope* odb) {
//-------------------------------------------------------------------------------
// Register an on demand builder with this class.
   fClassBuilderImpl.AddOnDemandFunctionMemberBuilder(odb);
}

#endif // Reflex_ClassBuilder
 ClassBuilder.h:1
 ClassBuilder.h:2
 ClassBuilder.h:3
 ClassBuilder.h:4
 ClassBuilder.h:5
 ClassBuilder.h:6
 ClassBuilder.h:7
 ClassBuilder.h:8
 ClassBuilder.h:9
 ClassBuilder.h:10
 ClassBuilder.h:11
 ClassBuilder.h:12
 ClassBuilder.h:13
 ClassBuilder.h:14
 ClassBuilder.h:15
 ClassBuilder.h:16
 ClassBuilder.h:17
 ClassBuilder.h:18
 ClassBuilder.h:19
 ClassBuilder.h:20
 ClassBuilder.h:21
 ClassBuilder.h:22
 ClassBuilder.h:23
 ClassBuilder.h:24
 ClassBuilder.h:25
 ClassBuilder.h:26
 ClassBuilder.h:27
 ClassBuilder.h:28
 ClassBuilder.h:29
 ClassBuilder.h:30
 ClassBuilder.h:31
 ClassBuilder.h:32
 ClassBuilder.h:33
 ClassBuilder.h:34
 ClassBuilder.h:35
 ClassBuilder.h:36
 ClassBuilder.h:37
 ClassBuilder.h:38
 ClassBuilder.h:39
 ClassBuilder.h:40
 ClassBuilder.h:41
 ClassBuilder.h:42
 ClassBuilder.h:43
 ClassBuilder.h:44
 ClassBuilder.h:45
 ClassBuilder.h:46
 ClassBuilder.h:47
 ClassBuilder.h:48
 ClassBuilder.h:49
 ClassBuilder.h:50
 ClassBuilder.h:51
 ClassBuilder.h:52
 ClassBuilder.h:53
 ClassBuilder.h:54
 ClassBuilder.h:55
 ClassBuilder.h:56
 ClassBuilder.h:57
 ClassBuilder.h:58
 ClassBuilder.h:59
 ClassBuilder.h:60
 ClassBuilder.h:61
 ClassBuilder.h:62
 ClassBuilder.h:63
 ClassBuilder.h:64
 ClassBuilder.h:65
 ClassBuilder.h:66
 ClassBuilder.h:67
 ClassBuilder.h:68
 ClassBuilder.h:69
 ClassBuilder.h:70
 ClassBuilder.h:71
 ClassBuilder.h:72
 ClassBuilder.h:73
 ClassBuilder.h:74
 ClassBuilder.h:75
 ClassBuilder.h:76
 ClassBuilder.h:77
 ClassBuilder.h:78
 ClassBuilder.h:79
 ClassBuilder.h:80
 ClassBuilder.h:81
 ClassBuilder.h:82
 ClassBuilder.h:83
 ClassBuilder.h:84
 ClassBuilder.h:85
 ClassBuilder.h:86
 ClassBuilder.h:87
 ClassBuilder.h:88
 ClassBuilder.h:89
 ClassBuilder.h:90
 ClassBuilder.h:91
 ClassBuilder.h:92
 ClassBuilder.h:93
 ClassBuilder.h:94
 ClassBuilder.h:95
 ClassBuilder.h:96
 ClassBuilder.h:97
 ClassBuilder.h:98
 ClassBuilder.h:99
 ClassBuilder.h:100
 ClassBuilder.h:101
 ClassBuilder.h:102
 ClassBuilder.h:103
 ClassBuilder.h:104
 ClassBuilder.h:105
 ClassBuilder.h:106
 ClassBuilder.h:107
 ClassBuilder.h:108
 ClassBuilder.h:109
 ClassBuilder.h:110
 ClassBuilder.h:111
 ClassBuilder.h:112
 ClassBuilder.h:113
 ClassBuilder.h:114
 ClassBuilder.h:115
 ClassBuilder.h:116
 ClassBuilder.h:117
 ClassBuilder.h:118
 ClassBuilder.h:119
 ClassBuilder.h:120
 ClassBuilder.h:121
 ClassBuilder.h:122
 ClassBuilder.h:123
 ClassBuilder.h:124
 ClassBuilder.h:125
 ClassBuilder.h:126
 ClassBuilder.h:127
 ClassBuilder.h:128
 ClassBuilder.h:129
 ClassBuilder.h:130
 ClassBuilder.h:131
 ClassBuilder.h:132
 ClassBuilder.h:133
 ClassBuilder.h:134
 ClassBuilder.h:135
 ClassBuilder.h:136
 ClassBuilder.h:137
 ClassBuilder.h:138
 ClassBuilder.h:139
 ClassBuilder.h:140
 ClassBuilder.h:141
 ClassBuilder.h:142
 ClassBuilder.h:143
 ClassBuilder.h:144
 ClassBuilder.h:145
 ClassBuilder.h:146
 ClassBuilder.h:147
 ClassBuilder.h:148
 ClassBuilder.h:149
 ClassBuilder.h:150
 ClassBuilder.h:151
 ClassBuilder.h:152
 ClassBuilder.h:153
 ClassBuilder.h:154
 ClassBuilder.h:155
 ClassBuilder.h:156
 ClassBuilder.h:157
 ClassBuilder.h:158
 ClassBuilder.h:159
 ClassBuilder.h:160
 ClassBuilder.h:161
 ClassBuilder.h:162
 ClassBuilder.h:163
 ClassBuilder.h:164
 ClassBuilder.h:165
 ClassBuilder.h:166
 ClassBuilder.h:167
 ClassBuilder.h:168
 ClassBuilder.h:169
 ClassBuilder.h:170
 ClassBuilder.h:171
 ClassBuilder.h:172
 ClassBuilder.h:173
 ClassBuilder.h:174
 ClassBuilder.h:175
 ClassBuilder.h:176
 ClassBuilder.h:177
 ClassBuilder.h:178
 ClassBuilder.h:179
 ClassBuilder.h:180
 ClassBuilder.h:181
 ClassBuilder.h:182
 ClassBuilder.h:183
 ClassBuilder.h:184
 ClassBuilder.h:185
 ClassBuilder.h:186
 ClassBuilder.h:187
 ClassBuilder.h:188
 ClassBuilder.h:189
 ClassBuilder.h:190
 ClassBuilder.h:191
 ClassBuilder.h:192
 ClassBuilder.h:193
 ClassBuilder.h:194
 ClassBuilder.h:195
 ClassBuilder.h:196
 ClassBuilder.h:197
 ClassBuilder.h:198
 ClassBuilder.h:199
 ClassBuilder.h:200
 ClassBuilder.h:201
 ClassBuilder.h:202
 ClassBuilder.h:203
 ClassBuilder.h:204
 ClassBuilder.h:205
 ClassBuilder.h:206
 ClassBuilder.h:207
 ClassBuilder.h:208
 ClassBuilder.h:209
 ClassBuilder.h:210
 ClassBuilder.h:211
 ClassBuilder.h:212
 ClassBuilder.h:213
 ClassBuilder.h:214
 ClassBuilder.h:215
 ClassBuilder.h:216
 ClassBuilder.h:217
 ClassBuilder.h:218
 ClassBuilder.h:219
 ClassBuilder.h:220
 ClassBuilder.h:221
 ClassBuilder.h:222
 ClassBuilder.h:223
 ClassBuilder.h:224
 ClassBuilder.h:225
 ClassBuilder.h:226
 ClassBuilder.h:227
 ClassBuilder.h:228
 ClassBuilder.h:229
 ClassBuilder.h:230
 ClassBuilder.h:231
 ClassBuilder.h:232
 ClassBuilder.h:233
 ClassBuilder.h:234
 ClassBuilder.h:235
 ClassBuilder.h:236
 ClassBuilder.h:237
 ClassBuilder.h:238
 ClassBuilder.h:239
 ClassBuilder.h:240
 ClassBuilder.h:241
 ClassBuilder.h:242
 ClassBuilder.h:243
 ClassBuilder.h:244
 ClassBuilder.h:245
 ClassBuilder.h:246
 ClassBuilder.h:247
 ClassBuilder.h:248
 ClassBuilder.h:249
 ClassBuilder.h:250
 ClassBuilder.h:251
 ClassBuilder.h:252
 ClassBuilder.h:253
 ClassBuilder.h:254
 ClassBuilder.h:255
 ClassBuilder.h:256
 ClassBuilder.h:257
 ClassBuilder.h:258
 ClassBuilder.h:259
 ClassBuilder.h:260
 ClassBuilder.h:261
 ClassBuilder.h:262
 ClassBuilder.h:263
 ClassBuilder.h:264
 ClassBuilder.h:265
 ClassBuilder.h:266
 ClassBuilder.h:267
 ClassBuilder.h:268
 ClassBuilder.h:269
 ClassBuilder.h:270
 ClassBuilder.h:271
 ClassBuilder.h:272
 ClassBuilder.h:273
 ClassBuilder.h:274
 ClassBuilder.h:275
 ClassBuilder.h:276
 ClassBuilder.h:277
 ClassBuilder.h:278
 ClassBuilder.h:279
 ClassBuilder.h:280
 ClassBuilder.h:281
 ClassBuilder.h:282
 ClassBuilder.h:283
 ClassBuilder.h:284
 ClassBuilder.h:285
 ClassBuilder.h:286
 ClassBuilder.h:287
 ClassBuilder.h:288
 ClassBuilder.h:289
 ClassBuilder.h:290
 ClassBuilder.h:291
 ClassBuilder.h:292
 ClassBuilder.h:293
 ClassBuilder.h:294
 ClassBuilder.h:295
 ClassBuilder.h:296
 ClassBuilder.h:297
 ClassBuilder.h:298
 ClassBuilder.h:299
 ClassBuilder.h:300
 ClassBuilder.h:301
 ClassBuilder.h:302
 ClassBuilder.h:303
 ClassBuilder.h:304
 ClassBuilder.h:305
 ClassBuilder.h:306
 ClassBuilder.h:307
 ClassBuilder.h:308
 ClassBuilder.h:309
 ClassBuilder.h:310
 ClassBuilder.h:311
 ClassBuilder.h:312
 ClassBuilder.h:313
 ClassBuilder.h:314
 ClassBuilder.h:315
 ClassBuilder.h:316
 ClassBuilder.h:317
 ClassBuilder.h:318
 ClassBuilder.h:319
 ClassBuilder.h:320
 ClassBuilder.h:321
 ClassBuilder.h:322
 ClassBuilder.h:323
 ClassBuilder.h:324
 ClassBuilder.h:325
 ClassBuilder.h:326
 ClassBuilder.h:327
 ClassBuilder.h:328
 ClassBuilder.h:329
 ClassBuilder.h:330
 ClassBuilder.h:331
 ClassBuilder.h:332
 ClassBuilder.h:333
 ClassBuilder.h:334
 ClassBuilder.h:335
 ClassBuilder.h:336
 ClassBuilder.h:337
 ClassBuilder.h:338
 ClassBuilder.h:339
 ClassBuilder.h:340
 ClassBuilder.h:341
 ClassBuilder.h:342
 ClassBuilder.h:343
 ClassBuilder.h:344
 ClassBuilder.h:345
 ClassBuilder.h:346
 ClassBuilder.h:347
 ClassBuilder.h:348
 ClassBuilder.h:349
 ClassBuilder.h:350
 ClassBuilder.h:351
 ClassBuilder.h:352
 ClassBuilder.h:353
 ClassBuilder.h:354
 ClassBuilder.h:355
 ClassBuilder.h:356
 ClassBuilder.h:357
 ClassBuilder.h:358
 ClassBuilder.h:359
 ClassBuilder.h:360
 ClassBuilder.h:361
 ClassBuilder.h:362
 ClassBuilder.h:363
 ClassBuilder.h:364
 ClassBuilder.h:365
 ClassBuilder.h:366
 ClassBuilder.h:367
 ClassBuilder.h:368
 ClassBuilder.h:369
 ClassBuilder.h:370
 ClassBuilder.h:371
 ClassBuilder.h:372
 ClassBuilder.h:373
 ClassBuilder.h:374
 ClassBuilder.h:375
 ClassBuilder.h:376
 ClassBuilder.h:377
 ClassBuilder.h:378
 ClassBuilder.h:379
 ClassBuilder.h:380
 ClassBuilder.h:381
 ClassBuilder.h:382
 ClassBuilder.h:383
 ClassBuilder.h:384
 ClassBuilder.h:385
 ClassBuilder.h:386
 ClassBuilder.h:387
 ClassBuilder.h:388
 ClassBuilder.h:389
 ClassBuilder.h:390
 ClassBuilder.h:391
 ClassBuilder.h:392
 ClassBuilder.h:393
 ClassBuilder.h:394
 ClassBuilder.h:395
 ClassBuilder.h:396
 ClassBuilder.h:397
 ClassBuilder.h:398
 ClassBuilder.h:399
 ClassBuilder.h:400
 ClassBuilder.h:401
 ClassBuilder.h:402
 ClassBuilder.h:403
 ClassBuilder.h:404
 ClassBuilder.h:405
 ClassBuilder.h:406
 ClassBuilder.h:407
 ClassBuilder.h:408
 ClassBuilder.h:409
 ClassBuilder.h:410
 ClassBuilder.h:411
 ClassBuilder.h:412
 ClassBuilder.h:413
 ClassBuilder.h:414
 ClassBuilder.h:415
 ClassBuilder.h:416
 ClassBuilder.h:417
 ClassBuilder.h:418
 ClassBuilder.h:419
 ClassBuilder.h:420
 ClassBuilder.h:421
 ClassBuilder.h:422
 ClassBuilder.h:423
 ClassBuilder.h:424
 ClassBuilder.h:425
 ClassBuilder.h:426
 ClassBuilder.h:427
 ClassBuilder.h:428
 ClassBuilder.h:429
 ClassBuilder.h:430
 ClassBuilder.h:431
 ClassBuilder.h:432
 ClassBuilder.h:433
 ClassBuilder.h:434
 ClassBuilder.h:435
 ClassBuilder.h:436
 ClassBuilder.h:437
 ClassBuilder.h:438
 ClassBuilder.h:439
 ClassBuilder.h:440
 ClassBuilder.h:441
 ClassBuilder.h:442
 ClassBuilder.h:443
 ClassBuilder.h:444
 ClassBuilder.h:445
 ClassBuilder.h:446
 ClassBuilder.h:447
 ClassBuilder.h:448
 ClassBuilder.h:449
 ClassBuilder.h:450
 ClassBuilder.h:451
 ClassBuilder.h:452
 ClassBuilder.h:453
 ClassBuilder.h:454
 ClassBuilder.h:455
 ClassBuilder.h:456
 ClassBuilder.h:457
 ClassBuilder.h:458
 ClassBuilder.h:459
 ClassBuilder.h:460
 ClassBuilder.h:461
 ClassBuilder.h:462
 ClassBuilder.h:463
 ClassBuilder.h:464
 ClassBuilder.h:465
 ClassBuilder.h:466
 ClassBuilder.h:467
 ClassBuilder.h:468
 ClassBuilder.h:469
 ClassBuilder.h:470
 ClassBuilder.h:471
 ClassBuilder.h:472
 ClassBuilder.h:473
 ClassBuilder.h:474
 ClassBuilder.h:475
 ClassBuilder.h:476
 ClassBuilder.h:477
 ClassBuilder.h:478
 ClassBuilder.h:479
 ClassBuilder.h:480
 ClassBuilder.h:481
 ClassBuilder.h:482
 ClassBuilder.h:483
 ClassBuilder.h:484
 ClassBuilder.h:485
 ClassBuilder.h:486
 ClassBuilder.h:487
 ClassBuilder.h:488
 ClassBuilder.h:489
 ClassBuilder.h:490
 ClassBuilder.h:491
 ClassBuilder.h:492
 ClassBuilder.h:493
 ClassBuilder.h:494
 ClassBuilder.h:495
 ClassBuilder.h:496
 ClassBuilder.h:497
 ClassBuilder.h:498
 ClassBuilder.h:499
 ClassBuilder.h:500
 ClassBuilder.h:501
 ClassBuilder.h:502
 ClassBuilder.h:503
 ClassBuilder.h:504
 ClassBuilder.h:505
 ClassBuilder.h:506
 ClassBuilder.h:507
 ClassBuilder.h:508
 ClassBuilder.h:509
 ClassBuilder.h:510
 ClassBuilder.h:511
 ClassBuilder.h:512
 ClassBuilder.h:513
 ClassBuilder.h:514
 ClassBuilder.h:515
 ClassBuilder.h:516
 ClassBuilder.h:517
 ClassBuilder.h:518
 ClassBuilder.h:519
 ClassBuilder.h:520
 ClassBuilder.h:521
 ClassBuilder.h:522
 ClassBuilder.h:523
 ClassBuilder.h:524
 ClassBuilder.h:525
 ClassBuilder.h:526
 ClassBuilder.h:527
 ClassBuilder.h:528
 ClassBuilder.h:529
 ClassBuilder.h:530
 ClassBuilder.h:531
 ClassBuilder.h:532
 ClassBuilder.h:533
 ClassBuilder.h:534
 ClassBuilder.h:535
 ClassBuilder.h:536
 ClassBuilder.h:537
 ClassBuilder.h:538
 ClassBuilder.h:539
 ClassBuilder.h:540
 ClassBuilder.h:541
 ClassBuilder.h:542
 ClassBuilder.h:543
 ClassBuilder.h:544
 ClassBuilder.h:545
 ClassBuilder.h:546
 ClassBuilder.h:547
 ClassBuilder.h:548
 ClassBuilder.h:549
 ClassBuilder.h:550
 ClassBuilder.h:551
 ClassBuilder.h:552
 ClassBuilder.h:553
 ClassBuilder.h:554
 ClassBuilder.h:555
 ClassBuilder.h:556
 ClassBuilder.h:557
 ClassBuilder.h:558
 ClassBuilder.h:559
 ClassBuilder.h:560
 ClassBuilder.h:561
 ClassBuilder.h:562
 ClassBuilder.h:563
 ClassBuilder.h:564
 ClassBuilder.h:565
 ClassBuilder.h:566
 ClassBuilder.h:567
 ClassBuilder.h:568
 ClassBuilder.h:569
 ClassBuilder.h:570
 ClassBuilder.h:571
 ClassBuilder.h:572
 ClassBuilder.h:573
 ClassBuilder.h:574
 ClassBuilder.h:575
 ClassBuilder.h:576
 ClassBuilder.h:577
 ClassBuilder.h:578
 ClassBuilder.h:579
 ClassBuilder.h:580
 ClassBuilder.h:581
 ClassBuilder.h:582
 ClassBuilder.h:583
 ClassBuilder.h:584
 ClassBuilder.h:585
 ClassBuilder.h:586
 ClassBuilder.h:587
 ClassBuilder.h:588
 ClassBuilder.h:589
 ClassBuilder.h:590
 ClassBuilder.h:591
 ClassBuilder.h:592
 ClassBuilder.h:593
 ClassBuilder.h:594
 ClassBuilder.h:595
 ClassBuilder.h:596
 ClassBuilder.h:597
 ClassBuilder.h:598
 ClassBuilder.h:599
 ClassBuilder.h:600
 ClassBuilder.h:601
 ClassBuilder.h:602
 ClassBuilder.h:603
 ClassBuilder.h:604
 ClassBuilder.h:605
 ClassBuilder.h:606
 ClassBuilder.h:607
 ClassBuilder.h:608
 ClassBuilder.h:609
 ClassBuilder.h:610
 ClassBuilder.h:611
 ClassBuilder.h:612
 ClassBuilder.h:613
 ClassBuilder.h:614
 ClassBuilder.h:615
 ClassBuilder.h:616
 ClassBuilder.h:617
 ClassBuilder.h:618
 ClassBuilder.h:619
 ClassBuilder.h:620
 ClassBuilder.h:621
 ClassBuilder.h:622
 ClassBuilder.h:623
 ClassBuilder.h:624
 ClassBuilder.h:625
 ClassBuilder.h:626
 ClassBuilder.h:627
 ClassBuilder.h:628
 ClassBuilder.h:629
 ClassBuilder.h:630
 ClassBuilder.h:631
 ClassBuilder.h:632
 ClassBuilder.h:633
 ClassBuilder.h:634
 ClassBuilder.h:635
 ClassBuilder.h:636
 ClassBuilder.h:637
 ClassBuilder.h:638
 ClassBuilder.h:639
 ClassBuilder.h:640
 ClassBuilder.h:641
 ClassBuilder.h:642
 ClassBuilder.h:643
 ClassBuilder.h:644
 ClassBuilder.h:645
 ClassBuilder.h:646
 ClassBuilder.h:647
 ClassBuilder.h:648
 ClassBuilder.h:649
 ClassBuilder.h:650
 ClassBuilder.h:651
 ClassBuilder.h:652
 ClassBuilder.h:653
 ClassBuilder.h:654
 ClassBuilder.h:655
 ClassBuilder.h:656
 ClassBuilder.h:657
 ClassBuilder.h:658
 ClassBuilder.h:659
 ClassBuilder.h:660
 ClassBuilder.h:661
 ClassBuilder.h:662
 ClassBuilder.h:663
 ClassBuilder.h:664
 ClassBuilder.h:665
 ClassBuilder.h:666
 ClassBuilder.h:667
 ClassBuilder.h:668
 ClassBuilder.h:669
 ClassBuilder.h:670
 ClassBuilder.h:671
 ClassBuilder.h:672
 ClassBuilder.h:673
 ClassBuilder.h:674
 ClassBuilder.h:675
 ClassBuilder.h:676
 ClassBuilder.h:677
 ClassBuilder.h:678
 ClassBuilder.h:679
 ClassBuilder.h:680
 ClassBuilder.h:681
 ClassBuilder.h:682
 ClassBuilder.h:683
 ClassBuilder.h:684
 ClassBuilder.h:685
 ClassBuilder.h:686
 ClassBuilder.h:687
 ClassBuilder.h:688
 ClassBuilder.h:689
 ClassBuilder.h:690
 ClassBuilder.h:691
 ClassBuilder.h:692
 ClassBuilder.h:693
 ClassBuilder.h:694
 ClassBuilder.h:695
 ClassBuilder.h:696
 ClassBuilder.h:697
 ClassBuilder.h:698
 ClassBuilder.h:699
 ClassBuilder.h:700
 ClassBuilder.h:701
 ClassBuilder.h:702
 ClassBuilder.h:703
 ClassBuilder.h:704
 ClassBuilder.h:705
 ClassBuilder.h:706
 ClassBuilder.h:707
 ClassBuilder.h:708
 ClassBuilder.h:709
 ClassBuilder.h:710
 ClassBuilder.h:711
 ClassBuilder.h:712
 ClassBuilder.h:713
 ClassBuilder.h:714
 ClassBuilder.h:715
 ClassBuilder.h:716
 ClassBuilder.h:717
 ClassBuilder.h:718
 ClassBuilder.h:719
 ClassBuilder.h:720
 ClassBuilder.h:721
 ClassBuilder.h:722
 ClassBuilder.h:723
 ClassBuilder.h:724
 ClassBuilder.h:725
 ClassBuilder.h:726
 ClassBuilder.h:727
 ClassBuilder.h:728
 ClassBuilder.h:729
 ClassBuilder.h:730
 ClassBuilder.h:731
 ClassBuilder.h:732
 ClassBuilder.h:733
 ClassBuilder.h:734
 ClassBuilder.h:735
 ClassBuilder.h:736
 ClassBuilder.h:737
 ClassBuilder.h:738
 ClassBuilder.h:739
 ClassBuilder.h:740
 ClassBuilder.h:741
 ClassBuilder.h:742
 ClassBuilder.h:743
 ClassBuilder.h:744
 ClassBuilder.h:745
 ClassBuilder.h:746
 ClassBuilder.h:747