2
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License as
6
* published by the Free Software Foundation; version 2 of the
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20
#ifndef _GRTPP_MODULE_CPP_H_
21
#define _GRTPP_MODULE_CPP_H_
23
#include "base/trackable.h"
32
//----------------------------------------------------------------------
35
template<class C> struct traits { typedef C Type; };
36
template<class C> struct traits<const C&> { typedef C Type; };
37
template<class C> struct traits<C&> { typedef C Type; };
39
template<class T> struct grt_content_type { static const Type id= UnknownType; };
40
template<> struct grt_content_type<ListRef<internal::Integer> > { static const Type id= IntegerType; };
41
template<> struct grt_content_type<ListRef<internal::Double> > { static const Type id= DoubleType; };
42
template<> struct grt_content_type<ListRef<internal::String> > { static const Type id= StringType; };
43
template<class T> struct grt_content_type<ListRef<T> > { static const Type id= ObjectType; };
45
template<class T> struct grt_content_class_name { typedef T value; };
46
template<class T> struct grt_content_class_name <Ref<T> > { typedef T value; };
47
template<class T> struct grt_content_class_name <ListRef<T> > { typedef T value; };
50
template<class T> struct grt_type_for_native { typedef T Type; };
51
template<> struct grt_type_for_native<int> { typedef IntegerRef Type; };
52
template<> struct grt_type_for_native<long> { typedef IntegerRef Type; };
53
template<> struct grt_type_for_native<double> { typedef DoubleRef Type; };
54
template<> struct grt_type_for_native<const std::string&> { typedef StringRef Type; };
55
template<> struct grt_type_for_native<std::string> { typedef StringRef Type; };
59
template<class T> struct grt_class_name_if_object
61
static std::string get() { return T::static_class_name(); }
64
template<> struct grt_class_name_if_object<IntegerRef>
66
static std::string get() { return ""; }
69
template<> struct grt_class_name_if_object<DoubleRef>
71
static std::string get() { return ""; }
74
template<> struct grt_class_name_if_object<StringRef>
76
static std::string get() { return ""; }
79
template<> struct grt_class_name_if_object<DictRef>
81
static std::string get() { return ""; }
84
template<class T> struct grt_class_name_if_object<ListRef<T> >
86
static std::string get() { return ""; }
91
template<class T, bool B> struct grt_content_struct_name
93
static std::string get() { return ""; }
96
template<class T> struct grt_content_struct_name<T, true>
98
static std::string get() { return T::static_class_name(); }
101
template<class T> struct grt_content_struct_name<Ref<T>, true>
103
static std::string get() { return T::static_class_name(); }
106
template<class T> struct grt_content_struct_name<ListRef<T>, true>
108
static std::string get() { return T::static_class_name(); }
111
// This template checks if B is castable to A
112
// boolean value Is_super_subclass<A, B>::value
113
// is available during compile time and can be used with other templates
114
template<class A, class B> class Is_super_subclass
117
struct CharSized { char c; };
118
struct Char2Sized { char c, d; };
119
static CharSized selector(...);
120
static Char2Sized selector(A*);
123
static const bool value =
124
(sizeof(selector(makeB())) == sizeof(Char2Sized));
128
// Allows implementation of modules in C++ by subclassing
130
//----------------------------------------------------------------------
131
// Basic definitions for modules and interfaces
132
typedef std::vector<std::string> InterfaceList;
133
class ModuleFunctorBase;
135
// this base class is only used by InterfaceImplBase and ModuleImplBase
136
// all other subclasses only need to inherit from one of these 2
140
InterfaceList _implemented_interfaces;
142
virtual ~InterfaceData() {};
147
class InterfaceImplBase : virtual public InterfaceData
150
template<class InterfaceClass> static void Register(GRT *grt)
152
InterfaceClass::register_interface(grt);
155
virtual ~InterfaceImplBase() {};
161
class ModuleFunctorBase;
162
class CPPModuleLoader;
165
class MYSQLGRT_PUBLIC Interface : public Module
168
static Interface *create(GRT *grt, const char *name, ...);
170
bool check_conformance(const Module *module) const;
173
Interface(CPPModuleLoader *loader);
178
class MYSQLGRT_PUBLIC CPPModule : virtual public InterfaceData, public Module, public base::trackable
180
friend class CPPModuleLoader;
182
typedef CPPModuleLoader Loader;
183
virtual ~CPPModule();
185
virtual std::string get_module_datadir();
187
std::string get_resource_file_path(const std::string &file);
189
void set_name(const std::string &name);
192
CPPModule(CPPModuleLoader *loader);
195
std::list<ModuleFunctorBase*> _functors;
197
virtual void init_module()= 0;
198
virtual void initialization_done() {};
200
void register_functions(ModuleFunctorBase *first, ...);
204
typedef CPPModule ModuleImplBase;
206
class MYSQLGRT_PUBLIC CPPModuleLoader : public ModuleLoader
209
CPPModuleLoader(GRT *grt);
210
virtual ~CPPModuleLoader();
212
virtual bool load_library(const std::string &path) { return false; }
213
virtual bool run_script_file(const std::string &path) { return false; }
214
virtual bool run_script(const std::string &script) { return false; }
215
virtual bool check_file_extension(const std::string &path);
217
virtual std::string get_loader_name() { return "cpp"; }
219
virtual Module *init_module(const std::string &path);
221
virtual void refresh();
225
//--------------------------------------------------------------------------------
226
// For Modules Implemented in C++
229
// this must be in interface classes to enable their registration
230
#define DECLARE_REGISTER_INTERFACE(the_class, ...)\
231
the_class() { std::string name= grt::get_type_name(typeid(*this)); _implemented_interfaces.push_back(name.substr(0, name.length()-4)); /* truncate Impl part*/ }\
232
static void register_interface(grt::GRT *grt) {\
233
std::string name= grt::get_type_name(typeid(the_class));\
234
grt->register_new_interface(grt::Interface::create(grt, name.c_str(), __VA_ARGS__, NULL));\
238
// this must be put in the public section of the modules class
239
#define DEFINE_INIT_MODULE(VERSION, AUTHOR, parent_class, first_function, ...)\
240
virtual void init_module()\
242
set_name(grt::get_type_name(typeid(*this)));\
243
_meta_version= VERSION; _meta_author= AUTHOR;\
244
_extends= typeid(parent_class) == typeid(grt::CPPModule) ? "" : grt::get_type_name(typeid(parent_class));\
245
if (g_str_has_suffix(_extends.c_str(), "Impl"))\
246
_extends= _extends.substr(0, _extends.length()-4);\
247
register_functions(first_function, __VA_ARGS__, NULL);\
248
initialization_done();\
251
#define DEFINE_INIT_MODULE_DOC(VERSION, AUTHOR, DOC, parent_class, first_function, ...)\
252
virtual void init_module()\
254
set_name(grt::get_type_name(typeid(*this)));\
255
_meta_version= VERSION; _meta_author= AUTHOR; _meta_description= DOC;\
256
_extends= typeid(parent_class) == typeid(grt::CPPModule) ? "" : grt::get_type_name(typeid(parent_class));\
257
if (g_str_has_suffix(_extends.c_str(), "Impl"))\
258
_extends= _extends.substr(0, _extends.length()-4);\
259
register_functions(first_function, __VA_ARGS__, NULL);\
260
initialization_done();\
265
template<class T_arg> ArgSpec& get_param_info(const char *argdoc = 0, int i = 0)
269
if (argdoc && *argdoc)
271
const char *line_end;
272
while ((line_end = strchr(argdoc, '\n')) && i > 0)
280
const char *s = strchr(argdoc, ' ');
281
if (s && (!line_end || s < line_end))
283
p.name = std::string(argdoc, s-argdoc);
284
p.doc = line_end ? std::string(s+1, line_end-s-1) : std::string(s+1);
288
p.name = line_end ? std::string(argdoc, line_end-argdoc) : std::string(argdoc);
293
throw std::logic_error("Module function argument documentation has wrong number of items");
301
p.type.base.type= grt_type_for_native<T_arg>::Type::RefType::static_type();
303
if (p.type.base.type == ObjectType)
305
if (typeid(T_arg) != typeid(internal::Object))
307
const bool castable_to_object_value=
308
Is_super_subclass<internal::Object, typename grt_content_class_name<T_arg>::value>::value;
309
p.type.base.object_class=
310
grt_content_struct_name<typename grt_content_class_name<T_arg>::value, castable_to_object_value>::get();
313
else if (p.type.base.type == ListType)
315
p.type.content.type= grt_content_type<T_arg>::id;
316
if (p.type.content.type == ObjectType)
318
const bool castable_to_object_value=
319
Is_super_subclass<internal::Object, typename grt_content_class_name<T_arg>::value>::value;
320
p.type.content.object_class=
321
grt_content_struct_name<typename grt_content_class_name<T_arg>::value, castable_to_object_value>::get();
324
else if (p.type.base.type == DictType)
326
p.type.content.type= AnyType;
333
class ModuleFunctorBase
336
TypeSpec _return_type;
339
typedef std::vector<ArgSpec> Function_param_list;
345
Function_param_list _signature;
348
explicit ModuleFunctorBase(const char *name, const char *doc= "", const char *argdoc= "")
349
: _doc(doc ? doc : ""), _argdoc(argdoc ? argdoc : "")
351
const char *c= strrchr(name, ':');
359
const char* get_name() const { return _name; }
360
const char* get_doc() const { return _doc; }
361
const Function_param_list& get_signature() const { return _signature; }
362
const TypeSpec& get_return_type() const { return _return_type; }
364
virtual ValueRef perform_call(const BaseListRef &arglist)= 0;
367
MYX_GRT_ERROR call(const BaseListRef &arglist, ValueRef &result)
371
result= perform_call(arglist);
372
//if (result_value) // NULL return values are valid --alfredo
374
*result= myx_grt_dict_new(NULL);
375
myx_grt_dict_item_set_value(*result, "value", result_value);
377
myx_grt_value_release(result_value);
381
catch (const grt_runtime_error &exc)
383
*result= make_error(NULL, exc.what(), exc.detail());
385
catch (const std::exception &exc)
387
*result= make_error(NULL, exc.what(), "");
391
*result= make_error(NULL, "exception during function execution", "");
393
return MYX_GRT_FUNCTION_CALL_ERROR;
398
grt_value_for_type is needed to ensure that the type we get
399
(on it's output) is of a subclass of GenereicValue i.e.
403
template<class T> ValueRef grt_value_for_type(const T& t)
408
inline ValueRef grt_value_for_type(bool t)
410
return IntegerRef(t);
413
inline ValueRef grt_value_for_type(int t)
415
return IntegerRef(t);
418
inline ValueRef grt_value_for_type(long t)
420
return IntegerRef(t);
423
inline ValueRef grt_value_for_type(double t)
428
inline ValueRef grt_value_for_type(const std::string& t)
434
native_value_for_grt_type converts a value of ValueRef type to type T.
435
T can be either a subclass of ValueRef or a simple type for with
436
specialization Value<T> is available
439
template<typename T> struct native_value_for_grt_type
441
static T convert(const ValueRef& t)
443
return T::cast_from(t);
448
struct native_value_for_grt_type<IntegerRef>
450
static long convert(const ValueRef& t)
452
return IntegerRef::cast_from(t).operator long();
457
struct native_value_for_grt_type<long>
459
static long convert(const ValueRef& t)
461
return IntegerRef::cast_from(t).operator long();
466
struct native_value_for_grt_type<int>
468
static int convert(const ValueRef& t)
470
return (int)IntegerRef::cast_from(t).operator long();
475
struct native_value_for_grt_type<bool>
477
static bool convert(const ValueRef& t)
479
return IntegerRef::cast_from(t).operator long() != 0;
484
struct native_value_for_grt_type<DoubleRef>
486
static double convert(const ValueRef& t)
488
return DoubleRef::cast_from(t).operator double();
493
struct native_value_for_grt_type<double>
495
static double convert(const ValueRef& t)
497
return DoubleRef::cast_from(t).operator double();
502
struct native_value_for_grt_type<StringRef>
504
static std::string convert(const ValueRef& t)
507
return StringRef::cast_from(t).operator std::string();
508
throw std::invalid_argument("invalid null argument");
514
struct native_value_for_grt_type<std::string>
516
static std::string convert(const ValueRef& t)
519
return StringRef::cast_from(t).operator std::string();
520
throw std::invalid_argument("invalid null argument");
525
template<class T_ret, class T_obj>
526
class ModuleFunctor0 : public ModuleFunctorBase
528
typedef T_ret (T_obj::*function_type)();
529
function_type _funcptr;
534
virtual ValueRef perform_call(const BaseListRef &arglist)
536
return grt_value_for_type((_obj->*_funcptr)());
541
ModuleFunctor0(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
542
: ModuleFunctorBase(name, doc, argdoc), _funcptr(func), _obj(obj)
544
_return_type= get_param_info<T_ret>().type;
548
template<class T_ret, class T_obj, class T_arg1>
549
class ModuleFunctor1 : public ModuleFunctorBase
551
typedef T_ret (T_obj::*function_type)(T_arg1);
552
function_type _funcptr;
557
virtual ValueRef perform_call(const BaseListRef &args)
559
// BaseListRef args(arglist);
560
T_arg1 arg1= native_value_for_grt_type<typename traits<T_arg1>::Type>::convert(args[0]);
561
return grt_value_for_type((_obj->*_funcptr)(arg1));
565
ModuleFunctor1(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
566
: ModuleFunctorBase(name, doc, argdoc), _funcptr(func), _obj(obj)
568
_signature.push_back(get_param_info<typename traits<T_arg1>::Type>(argdoc, 0));
569
_return_type= get_param_info<typename traits<T_ret>::Type>().type;
573
template<class T_ret, class T_obj, class T_arg1, class T_arg2>
574
class ModuleFunctor2 : public ModuleFunctorBase
576
typedef T_ret (T_obj::*function_type)(T_arg1, T_arg2);
577
function_type _funcptr;
582
virtual ValueRef perform_call(const BaseListRef &args)
584
// BaseListRef args(arglist);
585
T_arg1 arg1= native_value_for_grt_type<typename traits<T_arg1>::Type>::convert(args[0]);
586
T_arg2 arg2= native_value_for_grt_type<typename traits<T_arg2>::Type>::convert(args[1]);
587
return grt_value_for_type((_obj->*_funcptr)(arg1, arg2));
591
ModuleFunctor2(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
592
: ModuleFunctorBase(name, doc), _funcptr(func), _obj(obj)
594
_signature.push_back(get_param_info<typename traits<T_arg1>::Type>(argdoc, 0));
595
_signature.push_back(get_param_info<typename traits<T_arg2>::Type>(argdoc, 1));
596
_return_type= get_param_info<typename traits<T_ret>::Type>().type;
600
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3>
601
class ModuleFunctor3 : public ModuleFunctorBase
603
typedef T_ret (T_obj::*function_type)(T_arg1, T_arg2, T_arg3);
604
function_type _funcptr;
609
virtual ValueRef perform_call(const BaseListRef &args)
611
// BaseListRef args(arglist);
612
T_arg1 arg1= native_value_for_grt_type<typename traits<T_arg1>::Type>::convert(args[0]);
613
T_arg2 arg2= native_value_for_grt_type<typename traits<T_arg2>::Type>::convert(args[1]);
614
T_arg3 arg3= native_value_for_grt_type<typename traits<T_arg3>::Type>::convert(args[2]);
615
return grt_value_for_type((_obj->*_funcptr)(arg1, arg2, arg3));
619
ModuleFunctor3(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
620
: ModuleFunctorBase(name, doc, argdoc), _funcptr(func), _obj(obj)
622
_signature.push_back(get_param_info<typename traits<T_arg1>::Type>(argdoc, 0));
623
_signature.push_back(get_param_info<typename traits<T_arg2>::Type>(argdoc, 1));
624
_signature.push_back(get_param_info<typename traits<T_arg3>::Type>(argdoc, 2));
625
_return_type= get_param_info<typename traits<T_ret>::Type>().type;
629
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4>
630
class ModuleFunctor4 : public ModuleFunctorBase
632
typedef T_ret (T_obj::*function_type)(T_arg1, T_arg2, T_arg3, T_arg4);
633
function_type _funcptr;
638
virtual ValueRef perform_call(const BaseListRef &args)
640
// BaseListRef args(arglist);
641
T_arg1 arg1= native_value_for_grt_type<typename traits<T_arg1>::Type>::convert(args[0]);
642
T_arg2 arg2= native_value_for_grt_type<typename traits<T_arg2>::Type>::convert(args[1]);
643
T_arg3 arg3= native_value_for_grt_type<typename traits<T_arg3>::Type>::convert(args[2]);
644
T_arg4 arg4= native_value_for_grt_type<typename traits<T_arg4>::Type>::convert(args[3]);
645
return grt_value_for_type((_obj->*_funcptr)(arg1, arg2, arg3, arg4));
649
ModuleFunctor4(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
650
: ModuleFunctorBase(name, doc, argdoc), _funcptr(func), _obj(obj)
652
_signature.push_back(get_param_info<typename traits<T_arg1>::Type>(argdoc, 0));
653
_signature.push_back(get_param_info<typename traits<T_arg2>::Type>(argdoc, 1));
654
_signature.push_back(get_param_info<typename traits<T_arg3>::Type>(argdoc, 2));
655
_signature.push_back(get_param_info<typename traits<T_arg4>::Type>(argdoc, 3));
656
_return_type= get_param_info<typename traits<T_ret>::Type>().type;
660
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5>
661
class ModuleFunctor5 : public ModuleFunctorBase
663
typedef T_ret (T_obj::*function_type)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5);
664
function_type _funcptr;
669
virtual ValueRef perform_call(const BaseListRef &args)
671
// BaseListRef args(arglist);
672
T_arg1 arg1= native_value_for_grt_type<typename traits<T_arg1>::Type>::convert(args[0]);
673
T_arg2 arg2= native_value_for_grt_type<typename traits<T_arg2>::Type>::convert(args[1]);
674
T_arg3 arg3= native_value_for_grt_type<typename traits<T_arg3>::Type>::convert(args[2]);
675
T_arg4 arg4= native_value_for_grt_type<typename traits<T_arg4>::Type>::convert(args[3]);
676
T_arg5 arg5= native_value_for_grt_type<typename traits<T_arg5>::Type>::convert(args[4]);
677
return grt_value_for_type((_obj->*_funcptr)(arg1, arg2, arg3, arg4, arg5));
681
ModuleFunctor5(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
682
: ModuleFunctorBase(name, doc, argdoc), _funcptr(func), _obj(obj)
684
_signature.push_back(get_param_info<typename traits<T_arg1>::Type>(argdoc, 0));
685
_signature.push_back(get_param_info<typename traits<T_arg2>::Type>(argdoc, 1));
686
_signature.push_back(get_param_info<typename traits<T_arg3>::Type>(argdoc, 2));
687
_signature.push_back(get_param_info<typename traits<T_arg4>::Type>(argdoc, 3));
688
_signature.push_back(get_param_info<typename traits<T_arg5>::Type>(argdoc, 4));
689
_return_type= get_param_info<typename traits<T_ret>::Type>().type;
693
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5, class T_arg6>
694
class ModuleFunctor6 : public ModuleFunctorBase
696
typedef T_ret (T_obj::*function_type)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6);
697
function_type _funcptr;
702
virtual ValueRef perform_call(const BaseListRef &args)
704
// BaseListRef args(arglist);
705
T_arg1 arg1= native_value_for_grt_type<typename traits<T_arg1>::Type>::convert(args[0]);
706
T_arg2 arg2= native_value_for_grt_type<typename traits<T_arg2>::Type>::convert(args[1]);
707
T_arg3 arg3= native_value_for_grt_type<typename traits<T_arg3>::Type>::convert(args[2]);
708
T_arg4 arg4= native_value_for_grt_type<typename traits<T_arg4>::Type>::convert(args[3]);
709
T_arg5 arg5= native_value_for_grt_type<typename traits<T_arg5>::Type>::convert(args[4]);
710
T_arg6 arg6= native_value_for_grt_type<typename traits<T_arg6>::Type>::convert(args[5]);
711
return grt_value_for_type((_obj->*_funcptr)(arg1, arg2, arg3, arg4, arg5, arg6));
715
ModuleFunctor6(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
716
: ModuleFunctorBase(name, doc, argdoc), _funcptr(func), _obj(obj)
718
_signature.push_back(get_param_info<typename traits<T_arg1>::Type>(argdoc, 0));
719
_signature.push_back(get_param_info<typename traits<T_arg2>::Type>(argdoc, 1));
720
_signature.push_back(get_param_info<typename traits<T_arg3>::Type>(argdoc, 2));
721
_signature.push_back(get_param_info<typename traits<T_arg4>::Type>(argdoc, 3));
722
_signature.push_back(get_param_info<typename traits<T_arg5>::Type>(argdoc, 4));
723
_signature.push_back(get_param_info<typename traits<T_arg6>::Type>(argdoc, 5));
724
_return_type= get_param_info<typename traits<T_ret>::Type>().type;
728
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5, class T_arg6, class T_arg7>
729
class ModuleFunctor7 : public ModuleFunctorBase
731
typedef T_ret (T_obj::*function_type)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7);
732
function_type _funcptr;
737
virtual ValueRef perform_call(const BaseListRef &args)
739
// BaseListRef args(arglist);
740
T_arg1 arg1= native_value_for_grt_type<typename traits<T_arg1>::Type>::convert(args[0]);
741
T_arg2 arg2= native_value_for_grt_type<typename traits<T_arg2>::Type>::convert(args[1]);
742
T_arg3 arg3= native_value_for_grt_type<typename traits<T_arg3>::Type>::convert(args[2]);
743
T_arg4 arg4= native_value_for_grt_type<typename traits<T_arg4>::Type>::convert(args[3]);
744
T_arg5 arg5= native_value_for_grt_type<typename traits<T_arg5>::Type>::convert(args[4]);
745
T_arg6 arg6= native_value_for_grt_type<typename traits<T_arg6>::Type>::convert(args[5]);
746
T_arg7 arg7= native_value_for_grt_type<typename traits<T_arg7>::Type>::convert(args[6]);
747
return grt_value_for_type((_obj->*_funcptr)(arg1, arg2, arg3, arg4, arg5, arg6, arg7));
751
ModuleFunctor7(const char *name, T_obj *obj, function_type func, const char *doc= "", const char *argdoc= "")
752
: ModuleFunctorBase(name, doc, argdoc), _funcptr(func), _obj(obj)
754
_signature.push_back(get_param_info<typename traits<T_arg1>::Type>(argdoc, 0));
755
_signature.push_back(get_param_info<typename traits<T_arg2>::Type>(argdoc, 1));
756
_signature.push_back(get_param_info<typename traits<T_arg3>::Type>(argdoc, 2));
757
_signature.push_back(get_param_info<typename traits<T_arg4>::Type>(argdoc, 3));
758
_signature.push_back(get_param_info<typename traits<T_arg5>::Type>(argdoc, 4));
759
_signature.push_back(get_param_info<typename traits<T_arg6>::Type>(argdoc, 5));
760
_signature.push_back(get_param_info<typename traits<T_arg7>::Type>(argdoc, 6));
761
_return_type= get_param_info<typename traits<T_ret>::Type>().type;
765
// module functor wrappers (0 - 7 args)
767
template<class T_ret, class T_obj>
768
ModuleFunctor0<T_ret, T_obj>
769
*module_fun(T_obj *obj, T_ret (T_obj::*func)(), const char *name, const char *doc= "", const char *argdoc= "")
771
return new ModuleFunctor0<T_ret, T_obj>(name, obj, func, doc, argdoc);
774
template<class T_ret, class T_obj, class T_arg1>
775
ModuleFunctor1<T_ret, T_obj, T_arg1>
776
*module_fun(T_obj *obj, T_ret (T_obj::*func)(T_arg1), const char *name, const char *doc= "", const char *argdoc= "")
778
return new ModuleFunctor1<T_ret, T_obj, T_arg1>(name, obj, func, doc, argdoc);
781
template<class T_ret, class T_obj, class T_arg1, class T_arg2>
782
ModuleFunctor2<T_ret, T_obj, T_arg1, T_arg2>
783
*module_fun(T_obj *obj, T_ret (T_obj::*func)(T_arg1, T_arg2), const char *name, const char *doc= "", const char *argdoc= "")
785
return new ModuleFunctor2<T_ret, T_obj, T_arg1, T_arg2>(name, obj, func, doc, argdoc);
788
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3>
789
ModuleFunctor3<T_ret, T_obj, T_arg1, T_arg2, T_arg3>
790
*module_fun(T_obj *obj, T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3), const char *name, const char *doc= "", const char *argdoc= "")
792
return new ModuleFunctor3<T_ret, T_obj, T_arg1, T_arg2, T_arg3>(name, obj, func, doc, argdoc);
795
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4>
796
ModuleFunctor4<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4>
797
*module_fun(T_obj *obj, T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4), const char *name, const char *doc= "", const char *argdoc= "")
799
return new ModuleFunctor4<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4>(name, obj, func, doc, argdoc);
802
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5>
803
ModuleFunctor5<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>
804
*module_fun(T_obj *obj, T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5), const char *name, const char *doc= "", const char *argdoc= "")
806
return new ModuleFunctor5<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>(name, obj, func, doc, argdoc);
809
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5, class T_arg6>
810
ModuleFunctor6<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>
811
*module_fun(T_obj *obj, T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6), const char *name, const char *doc= "", const char *argdoc= "")
813
return new ModuleFunctor6<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>(name, obj, func, doc, argdoc);
816
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5, class T_arg6, class T_arg7>
817
ModuleFunctor7<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>
818
*module_fun(T_obj *obj, T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7), const char *name, const char *doc= "", const char *argdoc= "")
820
return new ModuleFunctor7<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>(name, obj, func, doc, argdoc);
823
// interface functor wrappers (0 - 7 args)
825
template<class T_ret, class T_obj>
826
ModuleFunctor0<T_ret, T_obj>
827
*interface_fun(T_ret (T_obj::*func)(), const char *name)
829
return new ModuleFunctor0<T_ret, T_obj>(name, NULL, func);
832
template<class T_ret, class T_obj, class T_arg1>
833
ModuleFunctor1<T_ret, T_obj, T_arg1>
834
*interface_fun(T_ret (T_obj::*func)(T_arg1), const char *name)
836
return new ModuleFunctor1<T_ret, T_obj, T_arg1>(name, NULL, func);
839
template<class T_ret, class T_obj, class T_arg1, class T_arg2>
840
ModuleFunctor2<T_ret, T_obj, T_arg1, T_arg2>
841
*interface_fun(T_ret (T_obj::*func)(T_arg1, T_arg2), const char *name)
843
return new ModuleFunctor2<T_ret, T_obj, T_arg1, T_arg2>(name, NULL, func);
846
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3>
847
ModuleFunctor3<T_ret, T_obj, T_arg1, T_arg2, T_arg3>
848
*interface_fun(T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3), const char *name)
850
return new ModuleFunctor3<T_ret, T_obj, T_arg1, T_arg2, T_arg3>(name, NULL, func);
853
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4>
854
ModuleFunctor4<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4>
855
*interface_fun(T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4), const char *name)
857
return new ModuleFunctor4<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4>(name, NULL, func);
860
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5>
861
ModuleFunctor5<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>
862
*interface_fun(T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5), const char *name)
864
return new ModuleFunctor5<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>(name, NULL, func);
867
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5, class T_arg6>
868
ModuleFunctor6<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>
869
*interface_fun(T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6), const char *name)
871
return new ModuleFunctor6<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>(name, NULL, func);
874
template<class T_ret, class T_obj, class T_arg1, class T_arg2, class T_arg3, class T_arg4, class T_arg5, class T_arg6, class T_arg7>
875
ModuleFunctor7<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>
876
*interface_fun(T_ret (T_obj::*func)(T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7), const char *name)
878
return new ModuleFunctor7<T_ret, T_obj, T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>(name, NULL, func);
881
#define DECLARE_INTERFACE_FUNCTION(qualified_name) interface_fun(&qualified_name, #qualified_name)
882
#define DECLARE_MODULE_FUNCTION(qualified_name) module_fun(this, &qualified_name, #qualified_name)
883
#define DECLARE_MODULE_FUNCTION_DOC(qualified_name, doc, argdoc) module_fun(this, &qualified_name, #qualified_name, doc, argdoc)
885
#define DECLARE_NAMED_INTERFACE_FUNCTION(qualified_name, name) interface_fun(&qualified_name, name)
886
#define DECLARE_NAMED_MODULE_FUNCTION(qualified_name, name) module_fun(this, &qualified_name, name)
887
#define DECLARE_NAMED_MODULE_FUNCTION_DOC(qualified_name, name, doc) module_fun(this, &qualified_name, name, doc)
891
//----------------------------------------------------------------------------
893
// DLL modules must declare the following
895
#if defined(__WIN__) || defined(_WIN32) || defined(_WIN64)
896
#define GRT_MODULE_ENTRY_POINT_PUBLIC __declspec(dllexport)
898
#define GRT_MODULE_ENTRY_POINT_PUBLIC
901
#define GRT_MODULE_ENTRY_POINT(moduleName)\
903
GRT_MODULE_ENTRY_POINT_PUBLIC grt::Module *grt_module_init(grt::CPPModuleLoader *loader, const char* grt_version)\
905
moduleName *module= new moduleName(loader);\
906
module->init_module();\