// @(#)root/reflex:$Id: EnumBuilder.h 22729 2008-03-19 10:20:10Z pcanal $
// 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

Last change: Wed Jun 25 08:31:13 2008
Last generated: 2008-06-25 08:31

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.