Thread: [Cppunit-cvs] cppunit2/include/cpptl reflectionimpl.py,NONE,1.1 reflectionimpl10.h,NONE,1.1 reflecti
Brought to you by:
blep
From: Baptiste L. <bl...@us...> - 2005-03-04 07:31:00
|
Update of /cvsroot/cppunit/cppunit2/include/cpptl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8198/include/cpptl Modified Files: reflection.h Added Files: reflectionimpl.py reflectionimpl10.h Log Message: * extracted invokable subclass in a specific generated header. --- NEW FILE: reflectionimpl.py --- # script to generate cpptl/reflectionimpl10.h MIN_ARGUMENT_COUNT = 0 MAX_ARGUMENT_COUNT = 10 header =\ """// This script is generated by the python script reflectionimpl.py // Do not edit. #ifndef CPPTL_REFLECTIONIMPL%(MAX_ARGUMENT_COUNT)d_H_INCLUDED # define CPPTL_REFLECTIONIMPL%(MAX_ARGUMENT_COUNT)d_H_INCLUDED namespace CppTL { namespace Impl { %(invokables)s %(invokable_generators)s } // namespace Impl } // namespace CppTL #endif // CPPTL_REFLECTIONIMPL%(MAX_ARGUMENT_COUNT)d_H_INCLUDED """ invokable =\ """ %(invokable_template_decl)s class %(invokable)s : public InvokableBase { public: typedef void (Object::*Member)( %(fn_parameter_types)s ); %(invokable)s( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( %(fn_call)s ); } private: Member member_; }; """ # invokable_template_decl : # template<class Object # ,class Arg1 # ,class Arg2> # invokable : Invokable2 # fn_parameter_types : Arg1, Arg2 # fn_call : # any_cast( call.args_.at(0), Type<Arg1>() ), # any_cast( call.args_.at(1), Type<Arg2>() ) invokable_generator = \ """ %(invokable_template_decl)s Invokable makeInvokable( void (Object::*member)( %(fn_parameter_types)s ) ) { Invokable invokable( InvokableBasePtr( new %(invokable_instantiation)s( member ) ) ); %(push_back_parameter_types)s return invokable; } """ # invokable_instantiation : Invokable2<Object,Arg1,Arg2> # push_back_parameter_types : # invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); # invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); class GenerationParameters(object): def __init__( self, count ): self.count = count invokable_template_parameters = ['Object'] + [ 'Arg%d' % n for n in xrange(1,count+1) ] self.invokable_template_decl = self.makeTemplateDecl( invokable_template_parameters ) self.invokable = 'Invokable%d' % count self.fn_parameter_types = ', '.join( [ 'Arg%d' % n for n in xrange(1,count+1) ] ) self.fn_call = '\n ,'.join( [ 'any_cast( call.args_.at(%d), Type<Arg%d>() )' % (n,n+1) for n in xrange(0,count) ] ) self.invokable_instantiation = self.invokable + self.makeTemplateInstantiation( invokable_template_parameters ) self.push_back_parameter_types = '\n'.join( [ ' invokable.argTypes_.push_back( typeId( Type<Arg%d>() ) );' % (n+1) for n in xrange(0,count) ] ) def __getitem__( self, key ): return getattr( self, key ) def makeTemplateDecl( self, parameters ): if not parameters: return '' return 'template< class ' + ', class '.join( parameters ) + ' >' def makeTemplateInstantiation( self, parameters ): if not parameters: return '' return '< ' + ', '.join( parameters ) + ' >' invokables = '' invokable_generators = '' for argument_count in xrange(MIN_ARGUMENT_COUNT,MAX_ARGUMENT_COUNT+1): parameters = GenerationParameters( argument_count ) invokables += invokable % parameters invokable_generators += invokable_generator % parameters final_header = header % locals() out = file( 'reflectionimpl%d.h' % MAX_ARGUMENT_COUNT, 'wt') out.write( final_header ) out.close() --- NEW FILE: reflectionimpl10.h --- // This script is generated by the python script reflectionimpl.py // Do not edit. #ifndef CPPTL_REFLECTIONIMPL10_H_INCLUDED # define CPPTL_REFLECTIONIMPL10_H_INCLUDED namespace CppTL { namespace Impl { template< class Object > class Invokable0 : public InvokableBase { public: typedef void (Object::*Member)( ); Invokable0( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( ); } private: Member member_; }; template< class Object, class Arg1 > class Invokable1 : public InvokableBase { public: typedef void (Object::*Member)( Arg1 ); Invokable1( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2 > class Invokable2 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2 ); Invokable2( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3 > class Invokable3 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3 ); Invokable3( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3, class Arg4 > class Invokable4 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3, Arg4 ); Invokable4( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ,any_cast( call.args_.at(3), Type<Arg4>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5 > class Invokable5 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3, Arg4, Arg5 ); Invokable5( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ,any_cast( call.args_.at(3), Type<Arg4>() ) ,any_cast( call.args_.at(4), Type<Arg5>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6 > class Invokable6 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6 ); Invokable6( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ,any_cast( call.args_.at(3), Type<Arg4>() ) ,any_cast( call.args_.at(4), Type<Arg5>() ) ,any_cast( call.args_.at(5), Type<Arg6>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7 > class Invokable7 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7 ); Invokable7( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ,any_cast( call.args_.at(3), Type<Arg4>() ) ,any_cast( call.args_.at(4), Type<Arg5>() ) ,any_cast( call.args_.at(5), Type<Arg6>() ) ,any_cast( call.args_.at(6), Type<Arg7>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8 > class Invokable8 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8 ); Invokable8( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ,any_cast( call.args_.at(3), Type<Arg4>() ) ,any_cast( call.args_.at(4), Type<Arg5>() ) ,any_cast( call.args_.at(5), Type<Arg6>() ) ,any_cast( call.args_.at(6), Type<Arg7>() ) ,any_cast( call.args_.at(7), Type<Arg8>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9 > class Invokable9 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9 ); Invokable9( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ,any_cast( call.args_.at(3), Type<Arg4>() ) ,any_cast( call.args_.at(4), Type<Arg5>() ) ,any_cast( call.args_.at(5), Type<Arg6>() ) ,any_cast( call.args_.at(6), Type<Arg7>() ) ,any_cast( call.args_.at(7), Type<Arg8>() ) ,any_cast( call.args_.at(8), Type<Arg9>() ) ); } private: Member member_; }; template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9, class Arg10 > class Invokable10 : public InvokableBase { public: typedef void (Object::*Member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10 ); Invokable10( Member member ) : member_( member ) { } void invoke( MethodCall &call ) const { Object &object = *any_cast( call.holder_, Type<Object *>() ); (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ,any_cast( call.args_.at(1), Type<Arg2>() ) ,any_cast( call.args_.at(2), Type<Arg3>() ) ,any_cast( call.args_.at(3), Type<Arg4>() ) ,any_cast( call.args_.at(4), Type<Arg5>() ) ,any_cast( call.args_.at(5), Type<Arg6>() ) ,any_cast( call.args_.at(6), Type<Arg7>() ) ,any_cast( call.args_.at(7), Type<Arg8>() ) ,any_cast( call.args_.at(8), Type<Arg9>() ) ,any_cast( call.args_.at(9), Type<Arg10>() ) ); } private: Member member_; }; template< class Object > Invokable makeInvokable( void (Object::*member)( ) ) { Invokable invokable( InvokableBasePtr( new Invokable0< Object >( member ) ) ); return invokable; } template< class Object, class Arg1 > Invokable makeInvokable( void (Object::*member)( Arg1 ) ) { Invokable invokable( InvokableBasePtr( new Invokable1< Object, Arg1 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); return invokable; } template< class Object, class Arg1, class Arg2 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2 ) ) { Invokable invokable( InvokableBasePtr( new Invokable2< Object, Arg1, Arg2 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3 ) ) { Invokable invokable( InvokableBasePtr( new Invokable3< Object, Arg1, Arg2, Arg3 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3, class Arg4 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3, Arg4 ) ) { Invokable invokable( InvokableBasePtr( new Invokable4< Object, Arg1, Arg2, Arg3, Arg4 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg4>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3, Arg4, Arg5 ) ) { Invokable invokable( InvokableBasePtr( new Invokable5< Object, Arg1, Arg2, Arg3, Arg4, Arg5 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg4>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg5>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6 ) ) { Invokable invokable( InvokableBasePtr( new Invokable6< Object, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg4>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg5>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg6>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7 ) ) { Invokable invokable( InvokableBasePtr( new Invokable7< Object, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg4>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg5>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg6>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg7>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8 ) ) { Invokable invokable( InvokableBasePtr( new Invokable8< Object, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg4>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg5>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg6>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg7>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg8>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9 ) ) { Invokable invokable( InvokableBasePtr( new Invokable9< Object, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg4>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg5>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg6>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg7>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg8>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg9>() ) ); return invokable; } template< class Object, class Arg1, class Arg2, class Arg3, class Arg4, class Arg5, class Arg6, class Arg7, class Arg8, class Arg9, class Arg10 > Invokable makeInvokable( void (Object::*member)( Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10 ) ) { Invokable invokable( InvokableBasePtr( new Invokable10< Object, Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10 >( member ) ) ); invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg3>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg4>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg5>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg6>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg7>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg8>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg9>() ) ); invokable.argTypes_.push_back( typeId( Type<Arg10>() ) ); return invokable; } } // namespace Impl } // namespace CppTL #endif // CPPTL_REFLECTIONIMPL10_H_INCLUDED Index: reflection.h =================================================================== RCS file: /cvsroot/cppunit/cppunit2/include/cpptl/reflection.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** reflection.h 3 Mar 2005 20:57:14 -0000 1.3 --- reflection.h 4 Mar 2005 07:30:32 -0000 1.4 *************** *** 42,45 **** --- 42,46 ---- }; + class InvokableBase { *************** *** 53,126 **** - template<class Object> - class Invokable0 : public InvokableBase - { - public: - typedef void (Object::*Member)(); - - Invokable0( Member member ) - : member_( member ) - { - } - - void invoke( MethodCall &call ) const - { - Object &object = *any_cast( call.holder_, Type<Object *>() ); - (object.*member_)(); - } - - private: - Member member_; - }; - - - template<class Object - ,class Arg1> - class Invokable1 : public InvokableBase - { - public: - typedef void (Object::*Member)( Arg1 a1 ); - - Invokable1( Member member ) - : member_( member ) - { - } - - void invoke( MethodCall &call ) const - { - Object &object = *any_cast( call.holder_, Type<Object *>() ); - (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ) ); - } - - private: - Member member_; - }; - - - template<class Object - ,class Arg1 - ,class Arg2> - class Invokable2: public InvokableBase - { - public: - typedef void (Object::*Member)( Arg1 a1, Arg2 a2 ); - - Invokable2( Member member ) - : member_( member ) - { - } - - void invoke( MethodCall &call ) const - { - Object &object = *any_cast( call.holder_, Type<Object *>() ); - (object.*member_)( any_cast( call.args_.at(0), Type<Arg1>() ), - any_cast( call.args_.at(1), Type<Arg2>() ) ); - } - - private: - Member member_; - }; - - class Invokable { --- 54,57 ---- *************** *** 140,169 **** - template<class Object> - Invokable makeInvokable( void (Object::*member)() ) - { - Invokable invokable( InvokableBasePtr( new Invokable0<Object>( member ) ) ); - return invokable; - } - - - template<class Object, class Arg1> - Invokable makeInvokable( void (Object::*member)( Arg1 a1 ) ) - { - Invokable invokable( InvokableBasePtr( new Invokable1<Object,Arg1>( member ) ) ); - invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); - return invokable; - } - - - template<class Object, class Arg1, class Arg2> - Invokable makeInvokable( void (Object::*member)( Arg1 a1, Arg2 a2 ) ) - { - Invokable invokable( InvokableBasePtr( new Invokable2<Object,Arg1,Arg2>( member ) ) ); - invokable.argTypes_.push_back( typeId( Type<Arg1>() ) ); - invokable.argTypes_.push_back( typeId( Type<Arg2>() ) ); - return invokable; - } - class AttributAccessor { --- 71,74 ---- *************** *** 181,184 **** --- 86,90 ---- }; + template<class Object, class AttributType> class AttributAccessorImpl : public AttributAccessor *************** *** 214,217 **** --- 120,124 ---- }; + template<class Object, class TheAttributType> AttributAccessorPtr makeAccessor( TheAttributType Object::*attribut ) *************** *** 324,327 **** --- 231,239 ---- + } // namespace CppTL + + + + # define CPPTL_REFLECT_CLASS_BEGIN( ClassType ) \ typedef ClassType _Reflection_SelfType; \ *************** *** 357,363 **** - } // namespace CppTL - # include <cpptl/reflection.inl> #endif // CPPTL_REFLECTION_H_INCLUDED --- 269,274 ---- # include <cpptl/reflection.inl> + # include <cpptl/reflectionimpl10.h> #endif // CPPTL_REFLECTION_H_INCLUDED |