ROOT logo
// @(#)root/reflex:$Id: UnionBuilder.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_UnionBuilder
#define Reflex_UnionBuilder

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

namespace Reflex {
// forward declarations
class Union;
class Type;

/**
 * @class UnionBuilderImpl UnionBuilder.h Reflex/Builder/UnionBuilder.h
 * @author Stefan Roiser
 * @date 14/3/2005
 * @ingroup RefBld
 */
class RFLX_API UnionBuilderImpl {
public:
   /** constructor */
   UnionBuilderImpl(const char* nam, size_t size, const std::type_info & ti, unsigned int modifiers = 0, TYPE typ = UNION);

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

   /**
    * AddItem will add one union item
    * @param Name the Name of the union item
    * @param At the At of the union item
    */
   void AddItem(const char* nam,
                const Type& typ);

   /** AddDataMember will add the information about one data
    * MemberAt of the union
    *
    * @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 union
    *
    * @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);

   /**
    * AddProperty will add a PropertyNth to the PropertyNth stack
    * which will be emtpied with the next build of a union
    * or union item
    * @param  key the PropertyNth key
    * @param  value the value of the PropertyNth
    * @return a reference to the building class
    */

   void AddProperty(const char* key,
                    Any value);
   void AddProperty(const char* key,
                    const char* value);

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

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

protected:
   friend class UnionBuilder;

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

private:
   /** the union currently being built */
   Union* fUnion;

   /** the last union item built */
   Member fLastMember;

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

}; // class UnionBuilderImpl


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

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

   /**
    * AddItem will add one union item
    * @param Name the Name of the union item
    * @param At the At of the union item
    * @return a reference to the UnionBuilder
    */
   template <typename T> UnionBuilder& AddItem(const char* nam);

   /**
    * AddItem will add one union item
    * @param Name the Name of the union item
    * @param At the At of the union item
    * @return a reference to the UnionBuilder
    */
   UnionBuilder& AddItem(const char* nam,
                         const char* typ);

   /** AddDataMember will add the information about one data
    * MemberAt of the union
    *
    * @param  Name of the data MemberAt
    * @param  Offset of data MemberAt
    * @param  modifiers the modifiers of the data MemberAt
    * @return a reference to the UnionBuilder
    */
   template <class T> UnionBuilder& AddDataMember(const char* nam,
                                                  size_t offs,
                                                  unsigned int modifiers = 0);
   UnionBuilder& 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 union
    *
    * @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 parameter names and default values (semi-colon separated)
    * @param  modifiers the modifiers of the data MemberAt
    * @return a reference to the UnionBuilder
    */
   template <class F> UnionBuilder& AddFunctionMember(const char* nam,
                                                      StubFunction stubFP,
                                                      void* stubCtx = 0,
                                                      const char* params = 0,
                                                      unsigned int modifiers = 0);
   UnionBuilder& AddFunctionMember(const Type& typ,
                                   const char* nam,
                                   StubFunction stubFP,
                                   void* stubCtx = 0,
                                   const char* params = 0,
                                   unsigned int modifiers = 0);

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

   /** SetSizeOf will set the SizeOf property for this union.
    * It currently ignores all actual content.
    * @size Size of the union
    */
   UnionBuilder& 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);
#endif

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

private:
   /** the union information */
   UnionBuilderImpl fUnionBuilderImpl;

}; //class UnionBuilder

} // namespace Reflex

//-------------------------------------------------------------------------------
template <typename T> Reflex::UnionBuilder&
Reflex::UnionBuilder::AddItem(const char* nam) {
   // -- !!! Obsolete, do not use.
   fUnionBuilderImpl.AddItem(nam, TypeDistiller<T>::Get());
   return *this;
}


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


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


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


#endif // Reflex_UnionBuilder
 UnionBuilder.h:1
 UnionBuilder.h:2
 UnionBuilder.h:3
 UnionBuilder.h:4
 UnionBuilder.h:5
 UnionBuilder.h:6
 UnionBuilder.h:7
 UnionBuilder.h:8
 UnionBuilder.h:9
 UnionBuilder.h:10
 UnionBuilder.h:11
 UnionBuilder.h:12
 UnionBuilder.h:13
 UnionBuilder.h:14
 UnionBuilder.h:15
 UnionBuilder.h:16
 UnionBuilder.h:17
 UnionBuilder.h:18
 UnionBuilder.h:19
 UnionBuilder.h:20
 UnionBuilder.h:21
 UnionBuilder.h:22
 UnionBuilder.h:23
 UnionBuilder.h:24
 UnionBuilder.h:25
 UnionBuilder.h:26
 UnionBuilder.h:27
 UnionBuilder.h:28
 UnionBuilder.h:29
 UnionBuilder.h:30
 UnionBuilder.h:31
 UnionBuilder.h:32
 UnionBuilder.h:33
 UnionBuilder.h:34
 UnionBuilder.h:35
 UnionBuilder.h:36
 UnionBuilder.h:37
 UnionBuilder.h:38
 UnionBuilder.h:39
 UnionBuilder.h:40
 UnionBuilder.h:41
 UnionBuilder.h:42
 UnionBuilder.h:43
 UnionBuilder.h:44
 UnionBuilder.h:45
 UnionBuilder.h:46
 UnionBuilder.h:47
 UnionBuilder.h:48
 UnionBuilder.h:49
 UnionBuilder.h:50
 UnionBuilder.h:51
 UnionBuilder.h:52
 UnionBuilder.h:53
 UnionBuilder.h:54
 UnionBuilder.h:55
 UnionBuilder.h:56
 UnionBuilder.h:57
 UnionBuilder.h:58
 UnionBuilder.h:59
 UnionBuilder.h:60
 UnionBuilder.h:61
 UnionBuilder.h:62
 UnionBuilder.h:63
 UnionBuilder.h:64
 UnionBuilder.h:65
 UnionBuilder.h:66
 UnionBuilder.h:67
 UnionBuilder.h:68
 UnionBuilder.h:69
 UnionBuilder.h:70
 UnionBuilder.h:71
 UnionBuilder.h:72
 UnionBuilder.h:73
 UnionBuilder.h:74
 UnionBuilder.h:75
 UnionBuilder.h:76
 UnionBuilder.h:77
 UnionBuilder.h:78
 UnionBuilder.h:79
 UnionBuilder.h:80
 UnionBuilder.h:81
 UnionBuilder.h:82
 UnionBuilder.h:83
 UnionBuilder.h:84
 UnionBuilder.h:85
 UnionBuilder.h:86
 UnionBuilder.h:87
 UnionBuilder.h:88
 UnionBuilder.h:89
 UnionBuilder.h:90
 UnionBuilder.h:91
 UnionBuilder.h:92
 UnionBuilder.h:93
 UnionBuilder.h:94
 UnionBuilder.h:95
 UnionBuilder.h:96
 UnionBuilder.h:97
 UnionBuilder.h:98
 UnionBuilder.h:99
 UnionBuilder.h:100
 UnionBuilder.h:101
 UnionBuilder.h:102
 UnionBuilder.h:103
 UnionBuilder.h:104
 UnionBuilder.h:105
 UnionBuilder.h:106
 UnionBuilder.h:107
 UnionBuilder.h:108
 UnionBuilder.h:109
 UnionBuilder.h:110
 UnionBuilder.h:111
 UnionBuilder.h:112
 UnionBuilder.h:113
 UnionBuilder.h:114
 UnionBuilder.h:115
 UnionBuilder.h:116
 UnionBuilder.h:117
 UnionBuilder.h:118
 UnionBuilder.h:119
 UnionBuilder.h:120
 UnionBuilder.h:121
 UnionBuilder.h:122
 UnionBuilder.h:123
 UnionBuilder.h:124
 UnionBuilder.h:125
 UnionBuilder.h:126
 UnionBuilder.h:127
 UnionBuilder.h:128
 UnionBuilder.h:129
 UnionBuilder.h:130
 UnionBuilder.h:131
 UnionBuilder.h:132
 UnionBuilder.h:133
 UnionBuilder.h:134
 UnionBuilder.h:135
 UnionBuilder.h:136
 UnionBuilder.h:137
 UnionBuilder.h:138
 UnionBuilder.h:139
 UnionBuilder.h:140
 UnionBuilder.h:141
 UnionBuilder.h:142
 UnionBuilder.h:143
 UnionBuilder.h:144
 UnionBuilder.h:145
 UnionBuilder.h:146
 UnionBuilder.h:147
 UnionBuilder.h:148
 UnionBuilder.h:149
 UnionBuilder.h:150
 UnionBuilder.h:151
 UnionBuilder.h:152
 UnionBuilder.h:153
 UnionBuilder.h:154
 UnionBuilder.h:155
 UnionBuilder.h:156
 UnionBuilder.h:157
 UnionBuilder.h:158
 UnionBuilder.h:159
 UnionBuilder.h:160
 UnionBuilder.h:161
 UnionBuilder.h:162
 UnionBuilder.h:163
 UnionBuilder.h:164
 UnionBuilder.h:165
 UnionBuilder.h:166
 UnionBuilder.h:167
 UnionBuilder.h:168
 UnionBuilder.h:169
 UnionBuilder.h:170
 UnionBuilder.h:171
 UnionBuilder.h:172
 UnionBuilder.h:173
 UnionBuilder.h:174
 UnionBuilder.h:175
 UnionBuilder.h:176
 UnionBuilder.h:177
 UnionBuilder.h:178
 UnionBuilder.h:179
 UnionBuilder.h:180
 UnionBuilder.h:181
 UnionBuilder.h:182
 UnionBuilder.h:183
 UnionBuilder.h:184
 UnionBuilder.h:185
 UnionBuilder.h:186
 UnionBuilder.h:187
 UnionBuilder.h:188
 UnionBuilder.h:189
 UnionBuilder.h:190
 UnionBuilder.h:191
 UnionBuilder.h:192
 UnionBuilder.h:193
 UnionBuilder.h:194
 UnionBuilder.h:195
 UnionBuilder.h:196
 UnionBuilder.h:197
 UnionBuilder.h:198
 UnionBuilder.h:199
 UnionBuilder.h:200
 UnionBuilder.h:201
 UnionBuilder.h:202
 UnionBuilder.h:203
 UnionBuilder.h:204
 UnionBuilder.h:205
 UnionBuilder.h:206
 UnionBuilder.h:207
 UnionBuilder.h:208
 UnionBuilder.h:209
 UnionBuilder.h:210
 UnionBuilder.h:211
 UnionBuilder.h:212
 UnionBuilder.h:213
 UnionBuilder.h:214
 UnionBuilder.h:215
 UnionBuilder.h:216
 UnionBuilder.h:217
 UnionBuilder.h:218
 UnionBuilder.h:219
 UnionBuilder.h:220
 UnionBuilder.h:221
 UnionBuilder.h:222
 UnionBuilder.h:223
 UnionBuilder.h:224
 UnionBuilder.h:225
 UnionBuilder.h:226
 UnionBuilder.h:227
 UnionBuilder.h:228
 UnionBuilder.h:229
 UnionBuilder.h:230
 UnionBuilder.h:231
 UnionBuilder.h:232
 UnionBuilder.h:233
 UnionBuilder.h:234
 UnionBuilder.h:235
 UnionBuilder.h:236
 UnionBuilder.h:237
 UnionBuilder.h:238
 UnionBuilder.h:239
 UnionBuilder.h:240
 UnionBuilder.h:241
 UnionBuilder.h:242
 UnionBuilder.h:243
 UnionBuilder.h:244
 UnionBuilder.h:245
 UnionBuilder.h:246
 UnionBuilder.h:247
 UnionBuilder.h:248
 UnionBuilder.h:249
 UnionBuilder.h:250
 UnionBuilder.h:251
 UnionBuilder.h:252
 UnionBuilder.h:253
 UnionBuilder.h:254
 UnionBuilder.h:255
 UnionBuilder.h:256
 UnionBuilder.h:257
 UnionBuilder.h:258
 UnionBuilder.h:259
 UnionBuilder.h:260
 UnionBuilder.h:261
 UnionBuilder.h:262
 UnionBuilder.h:263
 UnionBuilder.h:264
 UnionBuilder.h:265
 UnionBuilder.h:266
 UnionBuilder.h:267
 UnionBuilder.h:268
 UnionBuilder.h:269
 UnionBuilder.h:270
 UnionBuilder.h:271
 UnionBuilder.h:272
 UnionBuilder.h:273
 UnionBuilder.h:274
 UnionBuilder.h:275
 UnionBuilder.h:276