[Cppunit-cvs] cppunit2/include/cpptl reflection.h,1.4,1.5 reflectionimpl.py,1.2,1.3 reflectionimpl10
Brought to you by:
blep
From: Baptiste L. <bl...@us...> - 2005-03-05 10:15:22
|
Update of /cvsroot/cppunit/cppunit2/include/cpptl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8769/include/cpptl Modified Files: reflection.h reflectionimpl.py reflectionimpl10.h Log Message: * added support for reflection of method with return value Index: reflectionimpl.py =================================================================== RCS file: /cvsroot/cppunit/cppunit2/include/cpptl/reflectionimpl.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** reflectionimpl.py 5 Mar 2005 09:41:00 -0000 1.2 --- reflectionimpl.py 5 Mar 2005 10:15:12 -0000 1.3 *************** *** 14,17 **** --- 14,22 ---- %(invokables)s + template< class Arg> + void setReturnType( Invokable &invokable, Type<Arg> ) + { + invokable.returnType_ = typeId( Type<Arg>() ); + } template< class Arg1 > *************** *** 51,55 **** { public: ! typedef void (Object::*Member)( %(fn_parameter_types)s )%(const_method)s; %(invokable)s( Member member ) --- 56,60 ---- { public: ! typedef %(return_type)s (Object::*Member)( %(fn_parameter_types)s )%(const_method)s; %(invokable)s( Member member ) *************** *** 61,65 **** { Object &object = *any_cast( call.holder_, Type<Object *>() ); ! (object.*member_)( %(fn_call)s ); } --- 66,70 ---- { Object &object = *any_cast( call.holder_, Type<Object *>() ); ! %(return_keyword)s(object.*member_)( %(fn_call)s ); } *************** *** 74,79 **** --- 79,86 ---- # ,class Arg2> # invokable : Invokable2 + # return_type : void # fn_parameter_types : Arg1, Arg2 # const_method : const + # return_keyword : return # fn_call : # any_cast( call.args_.at(0), Type<Arg1>() ), *************** *** 83,91 **** """ %(invokable_template_decl)s ! Invokable makeInvokable( void (Object::*member)( %(fn_parameter_types)s )%(const_method)s ) { Invokable invokable( InvokableBasePtr( new %(invokable_instantiation)s( member ) ) ); ! %(push_back_parameter_types)s ! return invokable; } """ --- 90,97 ---- """ %(invokable_template_decl)s ! Invokable makeInvokable%(return_suffix)s( %(return_type)s (Object::*member)( %(fn_parameter_types)s )%(const_method)s ) { Invokable invokable( InvokableBasePtr( new %(invokable_instantiation)s( member ) ) ); ! %(push_back_parameter_types)s%(set_return_type)s return invokable; } """ *************** *** 94,110 **** # invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); # invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); class GenerationParameters(object): ! def __init__( self, count, is_const ): self.count = count self.is_const = is_const args = [ 'Arg%d' % n for n in xrange(1,count+1) ] ! invokable_template_parameters = ['Object'] + args self.invokable_template_decl = self.makeTemplateDecl( invokable_template_parameters ) if is_const: ! self.invokable = 'InvokableConst%d' % count else: ! self.invokable = 'Invokable%d' % count self.fn_parameter_types = ', '.join( args ) self.const_method = (is_const and ' const') or '' --- 100,123 ---- # invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); # invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); + # set_return_type: + # setReturnType( invokable, Type<Return>() ); class GenerationParameters(object): ! def __init__( self, count, is_const, has_return ): self.count = count self.is_const = is_const args = [ 'Arg%d' % n for n in xrange(1,count+1) ] ! return_param = (has_return and ['Return']) or [] ! return_suffix = (has_return and 'R') or '' ! self.return_suffix = return_suffix ! self.return_type = (has_return and 'Return') or 'void' ! self.return_keyword = (has_return and 'call.result_ = ') or '' ! invokable_template_parameters = ['Object'] + return_param + args self.invokable_template_decl = self.makeTemplateDecl( invokable_template_parameters ) if is_const: ! self.invokable = 'InvokableConst%d%s' % (count,return_suffix) else: ! self.invokable = 'Invokable%d%s' % (count,return_suffix) self.fn_parameter_types = ', '.join( args ) self.const_method = (is_const and ' const') or '' *************** *** 113,116 **** --- 126,130 ---- self.invokable_instantiation = self.invokable + self.makeTemplateInstantiation( invokable_template_parameters ) self.push_back_parameter_types = self.makePushBackParameterTypes( args ) + self.set_return_type = (has_return and ' setReturnType( invokable, Type<Return>() );\n') or '' def __getitem__( self, key ): *************** *** 142,148 **** for argument_count in xrange(MIN_ARGUMENT_COUNT,MAX_ARGUMENT_COUNT+1): for is_const in (False,True): ! parameters = GenerationParameters( argument_count, is_const ) ! invokables += invokable % parameters ! invokable_generators += invokable_generator % parameters final_header = header % locals() --- 156,163 ---- for argument_count in xrange(MIN_ARGUMENT_COUNT,MAX_ARGUMENT_COUNT+1): for is_const in (False,True): ! for has_return in (False,True): ! parameters = GenerationParameters( argument_count, is_const, has_return ) ! invokables += invokable % parameters ! invokable_generators += invokable_generator % parameters final_header = header % locals() Index: reflectionimpl10.h =================================================================== RCS file: /cvsroot/cppunit/cppunit2/include/cpptl/reflectionimpl10.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** reflectionimpl10.h 5 Mar 2005 09:41:00 -0000 1.2 --- reflectionimpl10.h 5 Mar 2005 10:15:12 -0000 1.3 *************** *** 27,30 **** --- 27,51 ---- }; + template< class Object, class Return > + class Invokable0R : public InvokableBase + { + public: + typedef Return (Object::*Member)( ); + + Invokable0R( Member member ) [...1055 lines suppressed...] } *************** *** 801,805 **** --- 1545,1560 ---- registerArgTypes( invokable, Type<Arg7>(), Type<Arg8>(), Type<Arg9>() ); registerArgTypes( invokable, Type<Arg10>() ); + return invokable; + } + template< class Object, class Return, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9, class Arg10 > + Invokable makeInvokableR( Return (Object::*member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10 ) const ) + { + Invokable invokable( InvokableBasePtr( new InvokableConst10R< Object, Return, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10 >( member ) ) ); + registerArgTypes( invokable, Type<Arg1>(), Type<Arg2>(), Type<Arg3>() ); + registerArgTypes( invokable, Type<Arg4>(), Type<Arg5>(), Type<Arg6>() ); + registerArgTypes( invokable, Type<Arg7>(), Type<Arg8>(), Type<Arg9>() ); + registerArgTypes( invokable, Type<Arg10>() ); + setReturnType( invokable, Type<Return>() ); return invokable; } Index: reflection.h =================================================================== RCS file: /cvsroot/cppunit/cppunit2/include/cpptl/reflection.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** reflection.h 4 Mar 2005 07:30:32 -0000 1.4 --- reflection.h 5 Mar 2005 10:15:12 -0000 1.5 *************** *** 251,254 **** --- 251,261 ---- } + # define CPPTL_REFLECT_METHOD_WITH_RETURN( method ) \ + { \ + ::CppTL::Impl::Invokable invokable = ::CppTL::Impl::makeInvokableR( \ + &_Reflection_SelfType::method ); \ + class_.addMethod( #method, invokable ); \ + } + # define CPPTL_REFLECT_RENAMED_ATTRIBUT( attribut, name ) \ { \ |