ROOT logo
// @(#)root/reflex:$Id: FunctionBuilder.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_FunctionBuilder
#define Reflex_FunctionBuilder

// Include files
#include "Reflex/Reflex.h"

namespace Reflex {

   // forward declarations
   class FunctionMember;
   class Type;

   /** 
   * @class FunctionBuilder FunctionBuilder.h Reflex/Builder/FunctionBuilder.h
   * @author Pere Mato
   * @date 1/8/2004
   * @ingroup RefBld
   */
   class RFLX_API FunctionBuilder {

   public:    

      /** constructor */
      FunctionBuilder( const Type & typ,
         const char * nam,
         StubFunction stubFP,
         void * stubCtx,
         const char * params, 
         unsigned char modifiers );


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


      /** AddProperty will add a property
      * @param  key the property key
      * @param  value the value of the property
      * @return a reference to the building class
      */
      FunctionBuilder & AddProperty( const char * key, 
         Any value );
      FunctionBuilder & AddProperty( const char * key,
         const char * value );


      /**
      * ToMember will return the member currently being built
      * @return member currently being built
      */
      Member ToMember();

   private:

      /** function member */
      Member fFunction;

   }; // class FunctionBuilder


   /** 
   * @class FunctionBuilderImpl FunctionBuilder.h Reflex/Builder/FunctionBuilder.h
   * @author Pere Mato
   * @date 3/8/2004
   * @ingroup RefBld
   */
   class RFLX_API FunctionBuilderImpl {

   public:

      /** constructor */
      FunctionBuilderImpl( const char * nam, 
         const Type & typ,
         StubFunction stubFP,
         void * stubCtx,
         const char * params, 
         unsigned char modifiers = 0 );


      /** destructor */
      ~FunctionBuilderImpl();


      /** AddProperty will add a property 
      * @param  key the property key
      * @param  value the value of the property
      * @return a reference to the building class
      */
      void AddProperty( const char * key, 
         Any value );
      void AddProperty( const char * key, 
         const char * value );


      /**
      * ToMember will return the member currently being built
      * @return member currently being built
      */
      Member ToMember();

   private:

      /** function member being built */
      Member fFunction;

   }; // class FunctionBuilderImpl


   /** 
   * @class FunctionBuilderT FunctionBuilder.h Reflex/Builder/FunctionBuilder.h
   * @author Pere Mato
   * @date 1/8/2004
   * @ingroup RefBld
   */
   template < typename F > class FunctionBuilderT {

   public:    

      /** constructor */
      FunctionBuilderT( const char * nam,
         StubFunction stubFP,
         void * stubCtx,
         const char * params, 
         unsigned char modifiers );

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


      /** AddProperty will add a property
      * @param  key the property key
      * @param  value the value of the property
      * @return a reference to the building class
      */
      template < typename P >
      FunctionBuilderT & AddProperty( const char * key, P value );


      /**
      * ToMember will return the member currently being built
      * @return member currently being built
      */
      Member ToMember();

   private:

      /** function builder implemenation */
      FunctionBuilderImpl fFunctionBuilderImpl;

   }; //class FunctionBuilderT

} // namespace Reflex

#include "Reflex/Builder/TypeBuilder.h"

//-------------------------------------------------------------------------------
template < typename  F > 
inline Reflex::FunctionBuilderT<F>::FunctionBuilderT( const char * nam, 
                                                            StubFunction stubFP,
                                                            void * stubCtx,
                                                            const char * params, 
                                                            unsigned char modifiers )
//-------------------------------------------------------------------------------
   : fFunctionBuilderImpl( nam,
                           FunctionDistiller<F>::Get(),
                           stubFP,
                           stubCtx,
                           params,
                           modifiers ) { }
      

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


//-------------------------------------------------------------------------------
template < typename F > inline Reflex::Member
Reflex::FunctionBuilderT<F>::ToMember() {
//-------------------------------------------------------------------------------
   return fFunctionBuilderImpl.ToMember();
}

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