ROOT logo
// @(#)root/reflex:$Id: FunctionBuilder.cxx 25042 2008-08-04 22:30:34Z russo $
// 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_BUILD
#define REFLEX_BUILD
#endif

#include "Reflex/Builder/FunctionBuilder.h"

#include "Reflex/PropertyList.h"
#include "Reflex/Scope.h"
#include "Reflex/Any.h"
#include "Reflex/Type.h"
#include "Reflex/Tools.h"
#include "Reflex/internal/OwnedMember.h"

#include "FunctionMember.h"
#include "FunctionMemberTemplateInstance.h"
#include "Namespace.h"


//-------------------------------------------------------------------------------
Reflex::FunctionBuilder::~FunctionBuilder() {
//-------------------------------------------------------------------------------
// Functionbuilder destructor used for call backs.
   FireFunctionCallback( fFunction );
}


//-------------------------------------------------------------------------------
Reflex::FunctionBuilder & 
Reflex::FunctionBuilder::AddProperty( const char * key, 
                                            const char * value ) {
//-------------------------------------------------------------------------------
// Add property info to this function as string.
   fFunction.Properties().AddProperty( key , value );
   return * this;
}


//-------------------------------------------------------------------------------
Reflex::FunctionBuilder & 
Reflex::FunctionBuilder::AddProperty( const char * key, 
                                            Any value ) {
//-------------------------------------------------------------------------------
// Add property info to this function as Any object.
   fFunction.Properties().AddProperty( key , value );
   return * this;
}


//-------------------------------------------------------------------------------
Reflex::Member Reflex::FunctionBuilder::ToMember() {
//-------------------------------------------------------------------------------
   // Return the function currently being built.
   return fFunction;
}


//-------------------------------------------------------------------------------
Reflex::FunctionBuilderImpl::FunctionBuilderImpl( const char * nam, 
                                                        const Type & typ,
                                                        StubFunction stubFP,
                                                        void * stubCtx,
                                                        const char * params, 
                                                        unsigned char modifiers) 
   : fFunction( Member(0)) {
//-------------------------------------------------------------------------------
// Create function type dictionary info (internal).
   std::string fullname( nam );
   std::string declScope;
   std::string funcName;
   size_t pos = Tools::GetTemplateName(nam).rfind( "::" );
   // Name contains declaring At
   if ( pos != std::string::npos ) {   
      funcName  = fullname.substr( pos + 2 );
      declScope = fullname.substr( 0, pos ); 
   }
   else {
      funcName  = nam;
      declScope = "";
   }

   Scope sc = Scope::ByName(declScope);
   if ( ! sc ) {
      // Let's create the namespace here
      sc = (new Namespace(declScope.c_str()))->ThisScope();
   }

   if ( ! sc.IsNamespace() ) throw RuntimeError("Declaring scope is not a namespace");
   if ( Tools::IsTemplated( funcName.c_str()))
      fFunction = Member( new FunctionMemberTemplateInstance( funcName.c_str(),
                                                              typ,
                                                              stubFP,
                                                              stubCtx,
                                                              params,
                                                              modifiers,
                                                              sc ));
   else fFunction = Member(new FunctionMember(funcName.c_str(), 
                                              typ, 
                                              stubFP, 
                                              stubCtx, 
                                              params, 
                                              modifiers));
   sc.AddFunctionMember(fFunction);
}


//-------------------------------------------------------------------------------
Reflex::FunctionBuilderImpl::~FunctionBuilderImpl() {
//-------------------------------------------------------------------------------
// FunctionBuilder destructor.
   FireFunctionCallback( fFunction );
}
 

//-------------------------------------------------------------------------------
void Reflex::FunctionBuilderImpl::AddProperty( const char * key, 
                                                     const char * value ) {
//-------------------------------------------------------------------------------
// Add property info to this function type.
   fFunction.Properties().AddProperty( key , value );
}


//-------------------------------------------------------------------------------
void Reflex::FunctionBuilderImpl::AddProperty( const char * key, 
                                                     Any value ) {
//-------------------------------------------------------------------------------
// Add property info to this function type.
   fFunction.Properties().AddProperty( key , value );
}


//-------------------------------------------------------------------------------
Reflex::Member Reflex::FunctionBuilderImpl::ToMember() {
//-------------------------------------------------------------------------------
   // Return the function member currently being built.
   return fFunction;
}


//-------------------------------------------------------------------------------
Reflex::FunctionBuilder::FunctionBuilder(const Type& typ, const char* nam, StubFunction stubFP, void* stubCtx, const char* params, unsigned char modifiers) : fFunction(Member(0))
{
   // Create function dictionary type information.
   std::string declScope(Tools::GetScopeName(nam));
   std::string funcName(Tools::GetBaseName(nam));
   Scope sc = Scope::ByName(declScope);
   if (!sc) {
      // Let's create the namespace here
      sc = (new Namespace(declScope.c_str()))->ThisScope();
   }
   if (!sc.IsNamespace()) {
      throw RuntimeError("Declaring scope is not a namespace");
   }
   if (Tools::IsTemplated(funcName.c_str())) {
      fFunction = Member(new FunctionMemberTemplateInstance(funcName.c_str(), typ, stubFP, stubCtx, params, modifiers, sc));
   }
   else {
      fFunction = Member(new FunctionMember(funcName.c_str(), typ, stubFP, stubCtx, params, modifiers));
   }
   sc.AddFunctionMember(fFunction);
}

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