ROOT logo
// @(#)root/reflex:$Id: EnumBuilder.h 29288 2009-07-01 13:03:35Z 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