ROOT logo
// @(#)root/reflex:$Id: TypedefBuilder.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_TypedefBuilder
#define Reflex_TypedefBuilder

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

namespace Reflex {
// forward declarations

/**
 * @class TypedefBuilderImpl TypedefBuilder.h Reflex/Builder/TypedefBuilderImpl.h
 * @author Stefan Roiser
 * @date 14/3/2005
 * @ingroup RefBld
 */
class RFLX_API TypedefBuilderImpl {
public:
   /** constructor */
   TypedefBuilderImpl(const char* typ,
                      const Type &typedefType);


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


   /**
    * AddProperty will add a property to the typedef currently being built
    * @param  key the PropertyNth key
    * @param  value the value of the PropertyNth
    */
   void AddProperty(const char* key,
                    Any value);


   /**
    * AddProperty will add a property to the typedef currently being built
    * @param  key the PropertyNth key
    * @param  value the value of the PropertyNth
    */
   void AddProperty(const char* key,
                    const char* value);


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

private:
   /** the typedef currently being built */
   Type fTypedef;

};    // class TypdefBuilderImpl


/**
 * @class TypedefBuilder TypedefBuilder.h Reflex/Builder/TypedefBuilder.h
 * @author Stefan Roiser
 * @date 30/3/2004
 * @ingroup RefBld
 */
template <typename T>
class TypedefBuilder  {
public:
   /** constructor */
   TypedefBuilder(const char* nam);


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


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


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

private:
   /** the type of the typedef */
   TypedefBuilderImpl fTypedefBuilderImpl;

};    // class TypedefBuilder

} // namespace Reflex

//-------------------------------------------------------------------------------
template <typename T>
inline Reflex::TypedefBuilder<T>::TypedefBuilder(const char* nam)
//-------------------------------------------------------------------------------
   : fTypedefBuilderImpl(nam, TypeDistiller<T>::Get()) {
}


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


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


#endif // Reflex_TypedefBuilder
 TypedefBuilder.h:1
 TypedefBuilder.h:2
 TypedefBuilder.h:3
 TypedefBuilder.h:4
 TypedefBuilder.h:5
 TypedefBuilder.h:6
 TypedefBuilder.h:7
 TypedefBuilder.h:8
 TypedefBuilder.h:9
 TypedefBuilder.h:10
 TypedefBuilder.h:11
 TypedefBuilder.h:12
 TypedefBuilder.h:13
 TypedefBuilder.h:14
 TypedefBuilder.h:15
 TypedefBuilder.h:16
 TypedefBuilder.h:17
 TypedefBuilder.h:18
 TypedefBuilder.h:19
 TypedefBuilder.h:20
 TypedefBuilder.h:21
 TypedefBuilder.h:22
 TypedefBuilder.h:23
 TypedefBuilder.h:24
 TypedefBuilder.h:25
 TypedefBuilder.h:26
 TypedefBuilder.h:27
 TypedefBuilder.h:28
 TypedefBuilder.h:29
 TypedefBuilder.h:30
 TypedefBuilder.h:31
 TypedefBuilder.h:32
 TypedefBuilder.h:33
 TypedefBuilder.h:34
 TypedefBuilder.h:35
 TypedefBuilder.h:36
 TypedefBuilder.h:37
 TypedefBuilder.h:38
 TypedefBuilder.h:39
 TypedefBuilder.h:40
 TypedefBuilder.h:41
 TypedefBuilder.h:42
 TypedefBuilder.h:43
 TypedefBuilder.h:44
 TypedefBuilder.h:45
 TypedefBuilder.h:46
 TypedefBuilder.h:47
 TypedefBuilder.h:48
 TypedefBuilder.h:49
 TypedefBuilder.h:50
 TypedefBuilder.h:51
 TypedefBuilder.h:52
 TypedefBuilder.h:53
 TypedefBuilder.h:54
 TypedefBuilder.h:55
 TypedefBuilder.h:56
 TypedefBuilder.h:57
 TypedefBuilder.h:58
 TypedefBuilder.h:59
 TypedefBuilder.h:60
 TypedefBuilder.h:61
 TypedefBuilder.h:62
 TypedefBuilder.h:63
 TypedefBuilder.h:64
 TypedefBuilder.h:65
 TypedefBuilder.h:66
 TypedefBuilder.h:67
 TypedefBuilder.h:68
 TypedefBuilder.h:69
 TypedefBuilder.h:70
 TypedefBuilder.h:71
 TypedefBuilder.h:72
 TypedefBuilder.h:73
 TypedefBuilder.h:74
 TypedefBuilder.h:75
 TypedefBuilder.h:76
 TypedefBuilder.h:77
 TypedefBuilder.h:78
 TypedefBuilder.h:79
 TypedefBuilder.h:80
 TypedefBuilder.h:81
 TypedefBuilder.h:82
 TypedefBuilder.h:83
 TypedefBuilder.h:84
 TypedefBuilder.h:85
 TypedefBuilder.h:86
 TypedefBuilder.h:87
 TypedefBuilder.h:88
 TypedefBuilder.h:89
 TypedefBuilder.h:90
 TypedefBuilder.h:91
 TypedefBuilder.h:92
 TypedefBuilder.h:93
 TypedefBuilder.h:94
 TypedefBuilder.h:95
 TypedefBuilder.h:96
 TypedefBuilder.h:97
 TypedefBuilder.h:98
 TypedefBuilder.h:99
 TypedefBuilder.h:100
 TypedefBuilder.h:101
 TypedefBuilder.h:102
 TypedefBuilder.h:103
 TypedefBuilder.h:104
 TypedefBuilder.h:105
 TypedefBuilder.h:106
 TypedefBuilder.h:107
 TypedefBuilder.h:108
 TypedefBuilder.h:109
 TypedefBuilder.h:110
 TypedefBuilder.h:111
 TypedefBuilder.h:112
 TypedefBuilder.h:113
 TypedefBuilder.h:114
 TypedefBuilder.h:115
 TypedefBuilder.h:116
 TypedefBuilder.h:117
 TypedefBuilder.h:118
 TypedefBuilder.h:119
 TypedefBuilder.h:120
 TypedefBuilder.h:121
 TypedefBuilder.h:122
 TypedefBuilder.h:123
 TypedefBuilder.h:124
 TypedefBuilder.h:125
 TypedefBuilder.h:126
 TypedefBuilder.h:127
 TypedefBuilder.h:128
 TypedefBuilder.h:129
 TypedefBuilder.h:130
 TypedefBuilder.h:131
 TypedefBuilder.h:132
 TypedefBuilder.h:133
 TypedefBuilder.h:134
 TypedefBuilder.h:135
 TypedefBuilder.h:136
 TypedefBuilder.h:137
 TypedefBuilder.h:138
 TypedefBuilder.h:139
 TypedefBuilder.h:140
 TypedefBuilder.h:141