ROOT logo
// @(#)root/reflex:$Id: EnumBuilder.h 28992 2009-06-15 09:20:22Z axel $
// Author: Stefan Roiser 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_EnumBuilder
#define Reflex_EnumBuilder

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

namespace Reflex{

   // forward declarations
   class Enum;

   /**
   * @class EnumBuilder EnumBuilder.h Reflex/Builder/EnumBuilder.h
   * @author Stefan Roiser
   * @date 14/3/2005
   * @ingroup RefBld
   */
   class RFLX_API EnumBuilder {

   public:

      /** constructor */
      EnumBuilder( const char * name,
         const std::type_info & ti,
         unsigned int modifiers = 0 );


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


      /** 
      * AddProperty will add a PropertyNth to the PropertyNth stack
      * which will be emptied with the next enum / item build
      * @param  key the PropertyNth key
      * @param  value the value of the PropertyNth
      * @return a reference to the building class
      */
      EnumBuilder &  AddItem ( const char * nam,
         long value );


      /** 
      * AddProperty will add a PropertyNth 
      * @param  key the PropertyNth key
      * @param  value the value of the PropertyNth
      */
      EnumBuilder & AddProperty( const char * key,
         Any value );


      /** 
      * AddProperty will add a PropertyNth 
      * @param  key the PropertyNth key
      * @param  value the value of the PropertyNth
      */
      EnumBuilder &  AddProperty( const char * key,
         const char * value );


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

   private:

      /** current enum being built */
      Enum * fEnum;

      /** last added enum item */
      Member fLastMember;

   }; // class EnumBuilder


   /** 
   * @class EnumBuilder EnumBuilder.h Reflex/Builder/EnumBuilder.h
   * @author Stefan Roiser
   * @ingroup RefBld
   * @date 30/3/2004
   */
   template < typename T >
   class EnumBuilderT  {

   public:            

      /** constructor */
      EnumBuilderT( unsigned int modifiers = 0 );


      /** constructor */
      EnumBuilderT( const char * nam, 
         unsigned int modifiers = 0 );


      /** destructor */
      virtual ~EnumBuilderT() {}


      /** 
      * AddItem add a new item in the enum
      * @param  Name item Name
      * @param  value the value of the item
      * @return a reference to the building class
      */
      EnumBuilderT & AddItem( const char * nam, 
         long value );


      /** 
      * AddProperty will add a PropertyNth to the PropertyNth stack
      * which will be emptied with the next enum / item build
      * @param  key the PropertyNth key
      * @param  value the value of the PropertyNth
      * @return a reference to the building class
      */
      template  < typename P >
      EnumBuilderT & AddProperty( const char * key, 
         P value );


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

   private:

      /** the enums and values */
      EnumBuilder fEnumBuilderImpl;

   }; // class EnumBuilder

} // namespace Reflex

//-------------------------------------------------------------------------------
template < typename T >
inline Reflex::EnumBuilderT<T>::EnumBuilderT( unsigned int modifiers ) 
//-------------------------------------------------------------------------------
   : fEnumBuilderImpl( Tools::Demangle( typeid(T) ).c_str(), 
                       typeid(T),
                       modifiers ) {}


//-------------------------------------------------------------------------------
template < typename T >
inline Reflex::EnumBuilderT<T>::EnumBuilderT( const char * nam, 
                                                    unsigned int modifiers )
//-------------------------------------------------------------------------------
   : fEnumBuilderImpl( nam, 
                       typeid(UnknownType),
                       modifiers ) {}


//-------------------------------------------------------------------------------
template < typename T >
inline Reflex::EnumBuilderT<T> & 
Reflex::EnumBuilderT<T>::AddItem( const char * nam, 
                                        long value ) {
//-------------------------------------------------------------------------------
   fEnumBuilderImpl.AddItem( nam, value );
   return * this;
}


//-------------------------------------------------------------------------------
template < typename T > template < typename P >
inline Reflex::EnumBuilderT<T> & 
Reflex::EnumBuilderT<T>::AddProperty( const char * key, 
                                            P value ) {
//-------------------------------------------------------------------------------
   fEnumBuilderImpl.AddProperty( key, value );
   return * this;
}


//-------------------------------------------------------------------------------
template < typename T > inline Reflex::Type
Reflex::EnumBuilderT<T>::ToType() {
//-------------------------------------------------------------------------------
   return fEnumBuilderImpl.ToType();
}
   


#endif // Reflex_EnumBuilder
 EnumBuilder.h:1
 EnumBuilder.h:2
 EnumBuilder.h:3
 EnumBuilder.h:4
 EnumBuilder.h:5
 EnumBuilder.h:6
 EnumBuilder.h:7
 EnumBuilder.h:8
 EnumBuilder.h:9
 EnumBuilder.h:10
 EnumBuilder.h:11
 EnumBuilder.h:12
 EnumBuilder.h:13
 EnumBuilder.h:14
 EnumBuilder.h:15
 EnumBuilder.h:16
 EnumBuilder.h:17
 EnumBuilder.h:18
 EnumBuilder.h:19
 EnumBuilder.h:20
 EnumBuilder.h:21
 EnumBuilder.h:22
 EnumBuilder.h:23
 EnumBuilder.h:24
 EnumBuilder.h:25
 EnumBuilder.h:26
 EnumBuilder.h:27
 EnumBuilder.h:28
 EnumBuilder.h:29
 EnumBuilder.h:30
 EnumBuilder.h:31
 EnumBuilder.h:32
 EnumBuilder.h:33
 EnumBuilder.h:34
 EnumBuilder.h:35
 EnumBuilder.h:36
 EnumBuilder.h:37
 EnumBuilder.h:38
 EnumBuilder.h:39
 EnumBuilder.h:40
 EnumBuilder.h:41
 EnumBuilder.h:42
 EnumBuilder.h:43
 EnumBuilder.h:44
 EnumBuilder.h:45
 EnumBuilder.h:46
 EnumBuilder.h:47
 EnumBuilder.h:48
 EnumBuilder.h:49
 EnumBuilder.h:50
 EnumBuilder.h:51
 EnumBuilder.h:52
 EnumBuilder.h:53
 EnumBuilder.h:54
 EnumBuilder.h:55
 EnumBuilder.h:56
 EnumBuilder.h:57
 EnumBuilder.h:58
 EnumBuilder.h:59
 EnumBuilder.h:60
 EnumBuilder.h:61
 EnumBuilder.h:62
 EnumBuilder.h:63
 EnumBuilder.h:64
 EnumBuilder.h:65
 EnumBuilder.h:66
 EnumBuilder.h:67
 EnumBuilder.h:68
 EnumBuilder.h:69
 EnumBuilder.h:70
 EnumBuilder.h:71
 EnumBuilder.h:72
 EnumBuilder.h:73
 EnumBuilder.h:74
 EnumBuilder.h:75
 EnumBuilder.h:76
 EnumBuilder.h:77
 EnumBuilder.h:78
 EnumBuilder.h:79
 EnumBuilder.h:80
 EnumBuilder.h:81
 EnumBuilder.h:82
 EnumBuilder.h:83
 EnumBuilder.h:84
 EnumBuilder.h:85
 EnumBuilder.h:86
 EnumBuilder.h:87
 EnumBuilder.h:88
 EnumBuilder.h:89
 EnumBuilder.h:90
 EnumBuilder.h:91
 EnumBuilder.h:92
 EnumBuilder.h:93
 EnumBuilder.h:94
 EnumBuilder.h:95
 EnumBuilder.h:96
 EnumBuilder.h:97
 EnumBuilder.h:98
 EnumBuilder.h:99
 EnumBuilder.h:100
 EnumBuilder.h:101
 EnumBuilder.h:102
 EnumBuilder.h:103
 EnumBuilder.h:104
 EnumBuilder.h:105
 EnumBuilder.h:106
 EnumBuilder.h:107
 EnumBuilder.h:108
 EnumBuilder.h:109
 EnumBuilder.h:110
 EnumBuilder.h:111
 EnumBuilder.h:112
 EnumBuilder.h:113
 EnumBuilder.h:114
 EnumBuilder.h:115
 EnumBuilder.h:116
 EnumBuilder.h:117
 EnumBuilder.h:118
 EnumBuilder.h:119
 EnumBuilder.h:120
 EnumBuilder.h:121
 EnumBuilder.h:122
 EnumBuilder.h:123
 EnumBuilder.h:124
 EnumBuilder.h:125
 EnumBuilder.h:126
 EnumBuilder.h:127
 EnumBuilder.h:128
 EnumBuilder.h:129
 EnumBuilder.h:130
 EnumBuilder.h:131
 EnumBuilder.h:132
 EnumBuilder.h:133
 EnumBuilder.h:134
 EnumBuilder.h:135
 EnumBuilder.h:136
 EnumBuilder.h:137
 EnumBuilder.h:138
 EnumBuilder.h:139
 EnumBuilder.h:140
 EnumBuilder.h:141
 EnumBuilder.h:142
 EnumBuilder.h:143
 EnumBuilder.h:144
 EnumBuilder.h:145
 EnumBuilder.h:146
 EnumBuilder.h:147
 EnumBuilder.h:148
 EnumBuilder.h:149
 EnumBuilder.h:150
 EnumBuilder.h:151
 EnumBuilder.h:152
 EnumBuilder.h:153
 EnumBuilder.h:154
 EnumBuilder.h:155
 EnumBuilder.h:156
 EnumBuilder.h:157
 EnumBuilder.h:158
 EnumBuilder.h:159
 EnumBuilder.h:160
 EnumBuilder.h:161
 EnumBuilder.h:162
 EnumBuilder.h:163
 EnumBuilder.h:164
 EnumBuilder.h:165
 EnumBuilder.h:166
 EnumBuilder.h:167
 EnumBuilder.h:168
 EnumBuilder.h:169
 EnumBuilder.h:170
 EnumBuilder.h:171
 EnumBuilder.h:172
 EnumBuilder.h:173
 EnumBuilder.h:174
 EnumBuilder.h:175
 EnumBuilder.h:176
 EnumBuilder.h:177
 EnumBuilder.h:178
 EnumBuilder.h:179
 EnumBuilder.h:180
 EnumBuilder.h:181
 EnumBuilder.h:182
 EnumBuilder.h:183
 EnumBuilder.h:184
 EnumBuilder.h:185
 EnumBuilder.h:186
 EnumBuilder.h:187
 EnumBuilder.h:188
 EnumBuilder.h:189
 EnumBuilder.h:190
 EnumBuilder.h:191
 EnumBuilder.h:192
 EnumBuilder.h:193
 EnumBuilder.h:194
 EnumBuilder.h:195
 EnumBuilder.h:196
 EnumBuilder.h:197
 EnumBuilder.h:198
 EnumBuilder.h:199
 EnumBuilder.h:200
 EnumBuilder.h:201