[pygccxml-commit] SF.net SVN: pygccxml: [260] pyplusplus_dev/unittests
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-06-28 14:32:55
|
Revision: 260 Author: roman_yakovenko Date: 2006-06-28 07:32:24 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=260&view=rev Log Message: ----------- Adding works_on_instance to base class of all code creators. This small refactoring was a must, in order to add indexing suite 2 functionality. Otherwise, the generated code could not be compiled. Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/custom.py pyplusplus_dev/pyplusplus/code_creators/enum.py pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/fundamental_tester_base.py pyplusplus_dev/unittests/indexing_suites2_tester.py pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-06-28 14:32:24 UTC (rev 260) @@ -18,6 +18,7 @@ code_creator.code_creator_t.__init__(self, parent=parent) self._array_type = array_type self._call_policies = self._guess_call_policies() + self.works_on_instance = False def _get_array_type( self ): return self._array_type Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 14:32:24 UTC (rev 260) @@ -6,14 +6,10 @@ import os import types import scoped -import custom import calldef import algorithm import smart_pointers import declaration_based -import array_1_registrator -import member_variable -import indexing_suites from pygccxml import declarations class class_declaration_t( scoped.scoped_t ): @@ -21,6 +17,7 @@ scoped.scoped_t.__init__( self , parent=parent , declaration=class_inst ) + self.works_on_instance = False def _generate_class_definition(self): class_identifier = algorithm.create_identifier( self, '::boost::python::class_' ) @@ -41,6 +38,12 @@ def _get_class_var_name(self): return self.alias + '_exposer' class_var_name = property( _get_class_var_name ) + + def is_exposed_using_scope(self): + if self.declaration.always_expose_using_scope: + return True + return bool( filter( lambda cc: not cc.works_on_instance, self.creators ) ) + def _generate_code_with_scope(self): result = [] @@ -54,14 +57,13 @@ result[-1] = result[-1] + ' ' + scope_var_name result[-1] = result[-1] + '( %s );' % self.class_var_name - for x in self.creators: - if not ( x is used_init ): - if self._should_creator_be_exported_under_scope( x ): - result.append( x.create() ) - elif isinstance( x, custom.custom_t ) and x.works_on_instance == False: - result.append( '%s;' % x.create() ) - else: - result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) + for x in creators: + if x is used_init: + continue + if not x.works_on_instance: + result.append( x.create() ) + else: + result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) code = os.linesep.join( result ) @@ -72,7 +74,7 @@ return os.linesep.join( result ) def _create_impl(self): - if self.declaration.always_expose_using_scope: + if self.is_exposed_using_scope: return self._generate_code_with_scope() else: return self._generate_code_no_scope() @@ -87,6 +89,7 @@ , parent=parent , declaration=class_inst ) self._wrapper = wrapper + self.works_on_instance = False def _get_wrapper( self ): return self._wrapper @@ -239,25 +242,6 @@ result.append( ';' ) return ''.join( result ) - def _should_creator_be_exported_under_scope(self, inst ): - if isinstance( inst, ( indexing_suites.indexing_suite1_t, indexing_suites.indexing_suite2_t ) ): - return False - if isinstance( inst, declaration_based.declaration_based_t ) \ - and isinstance( inst.declaration - , ( declarations.enumeration_t, declarations.class_t ) ): - return True - # If there is a custom text that won't apply as call on instance - if isinstance( inst, custom.custom_t ) and inst.works_on_instance == False: - return True - - if isinstance( inst, array_1_registrator.array_1_registrator_t ): - return True - - if isinstance( inst, member_variable.mem_var_ref_t ): - return True - - return False - def _get_class_var_name(self): return self.alias + '_exposer' class_var_name = property( _get_class_var_name ) @@ -283,13 +267,12 @@ creators = self.creators + self._get_base_operators(base_classes, base_creators) for x in creators: - if not ( x is used_init ): - if self._should_creator_be_exported_under_scope( x ): - result.append( x.create() ) - elif isinstance( x, custom.custom_t ) and x.works_on_instance == False: - result.append( '%s;' % x.create() ) - else: - result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) + if x is used_init: + continue + if not x.works_on_instance: + result.append( x.create() ) + else: + result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) code = os.linesep.join( result ) @@ -300,9 +283,9 @@ return os.linesep.join( result ) def is_exposed_using_scope(self): - scoped_exporters = filter( lambda x: self._should_creator_be_exported_under_scope( x ) - , self.creators ) - return bool( self.declaration.always_expose_using_scope or scoped_exporters ) + if self.declaration.always_expose_using_scope: + return True + return bool( filter( lambda cc: not cc.works_on_instance, self.creators ) ) def _create_impl(self): if self.is_exposed_using_scope(): Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2006-06-28 14:32:24 UTC (rev 260) @@ -34,7 +34,15 @@ assert isinstance( parent, code_creator_t ) self._parent = parent self._target_configuration = None + self._works_on_instance = True + + def _get_works_on_instance(self): + return self._works_on_instance + def _set_works_on_instance(self, works_on_instance): + self._works_on_instance = works_on_instance + works_on_instance = property( _get_works_on_instance, _set_works_on_instance ) + def _get_parent( self ): return self._parent def _set_parent( self, new_parent ): Modified: pyplusplus_dev/pyplusplus/code_creators/custom.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/custom.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/custom.py 2006-06-28 14:32:24 UTC (rev 260) @@ -12,13 +12,7 @@ Ex: ObjInst."CustomCode" """ code_creator.code_creator_t.__init__(self, parent) - self._works_on_instance = works_on_instance - - def _get_works_on_instance(self): - return self._works_on_instance - def _set_works_on_instance(self, works_on_instance): - self._works_on_instance = works_on_instance - works_on_instance = property( _get_works_on_instance, _set_works_on_instance ) + self.works_on_instance = works_on_instance def _create_impl(self): raise NotImplementedError() Modified: pyplusplus_dev/pyplusplus/code_creators/enum.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/enum.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/enum.py 2006-06-28 14:32:24 UTC (rev 260) @@ -15,6 +15,7 @@ declaration_based.declaration_based_t.__init__( self , parent=parent , declaration=enum) + self.works_on_instance = False def _get_value_aliases(self): return self.declaration.value_aliases Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 14:32:24 UTC (rev 260) @@ -49,11 +49,60 @@ class indexing_suite2_t( declaration_based.declaration_based_t ): def __init__(self, container, parent=None ): declaration_based.declaration_based_t.__init__( self, declaration=container, parent=parent ) + self.__method_mask_var_name = "methods_mask" + self.works_on_instance = not self.does_user_disable_methods() - def _get_configuration( self ): - return self.declaration.indexing_suite - configuration = property( _get_configuration ) - + def does_user_disable_methods( self ): + return bool( self.declaration.indexing_suite.disabled_methods_groups ) \ + or bool( self.declaration.indexing_suite.disable_methods ) + + def generate_algorithm_mask( self ): + indexing = algorithm.create_identifier(self, "::boost::python::indexing" ) + disable = [] + for group in self.declaration.indexing_suite.disabled_methods_groups: + group_id = algorithm.create_identifier(self, "::boost::python::indexing::%s_methods" % group ) + disable.append( group_id ) + for method in self.declaration.indexing_suite.disable_methods: + method_id = algorithm.create_identifier(self, "::boost::python::indexing::method_" + method ) + disable.append( method_id ) + answer = [ 'unsigned long const %s = ' % self.__method_mask_var_name ] + answer.append( algorithm.create_identifier(self, "::boost::python::indexing::all_methods" ) ) + answer.append( ' & ~' ) + if 1 == len ( disable ): + answer.append( disable[0] ) + else: + answer.append( '( ' ) + answer.append( ' | '.join( disable ) ) + answer.append( ' ) ' ) + answer.append( ';' ) + return ''.join( answer ) + def _create_impl( self ): - container_suite = algorithm.create_identifier(self, "::boost::python::indexing::container_suite" ) - return "def( %s< %s >() )" % ( container_suite, self.decl_identifier ) \ No newline at end of file + answer = [] + if self.does_user_disable_methods(): + answer.append( self.generate_algorithm_mask() ) + answer.append( os.linesep ) + if not self.works_on_instance: + answer.append( '%s.def( ' % self.parent.class_var_name) + else: + answer.append( 'def( ' ) + answer.append( algorithm.create_identifier(self, "::boost::python::indexing::container_suite" ) ) + answer.append( '< ' ) + answer.append( self.decl_identifier ) + if self.does_user_disable_methods(): + answer.append( self.PARAM_SEPARATOR ) + answer.append( self.__method_mask_var_name ) + answer.append( ' >' ) + if self.declaration.indexing_suite.call_policies: + answer.append( '::with_policies(%s)' + % self.declaration.indexing_suite.call_policies.create( self ) ) + else: + answer.append( '()' ) + answer.append( ' )' ) + if not self.works_on_instance: + answer.append( ';' ) + return ''.join( answer ) + + + + Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-06-28 14:32:24 UTC (rev 260) @@ -426,6 +426,7 @@ , wrapper=wrapper , parent=parent) self.param_sep = os.linesep + self.indent( self.PARAM_SEPARATOR, 2 ) + self.works_on_instance = False def _create_getter( self ): answer = ['def'] Modified: pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2006-06-28 14:32:24 UTC (rev 260) @@ -42,6 +42,7 @@ declaration_based.declaration_based_t.__init__( self, class_creator.declaration, parent ) self._smart_ptr = smart_ptr self._class_creator = class_creator + self.works_on_instance = False def _get_smart_ptr( self ): return self._smart_ptr @@ -76,6 +77,7 @@ declaration_based.declaration_based_t.__init__( self, source, parent ) self._target = target self._smart_ptr = smart_ptr + self.works_on_instance = False def _get_target(self): return self._target Modified: pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py 2006-06-28 14:32:24 UTC (rev 260) @@ -13,7 +13,8 @@ declaration_based.declaration_based_t.__init__( self , parent=parent , declaration=unnamed_enum) - + self.works_on_instance = False + def _get_value_aliases(self): return self.declaration.value_aliases def _set_value_aliases(self, value_aliases): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 14:32:24 UTC (rev 260) @@ -36,10 +36,10 @@ , 'delitem_slice', 'reverse', 'append', 'insert', 'extend', 'sort' ) METHOD_GROUPS = { - 'slice_methods' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) - , 'search_methods' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) - , 'reorder_methods' : ( 'method_sort', 'method_reverse' ) - , 'insert_methods' : ( 'method_append', 'method_insert', 'method_extend' ) + 'slice' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) + , 'search' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) + , 'reorder' : ( 'method_sort', 'method_reverse' ) + , 'insert' : ( 'method_append', 'method_insert', 'method_extend' ) } def __init__( self, container_class, container_traits ): Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 14:32:24 UTC (rev 260) @@ -358,7 +358,7 @@ def create_explanation(cls): msg = '//WARNING: the next line of code will not compile, because "%s" does not have operator== !' msg = msg % cls.indexing_suite.value_type().decl_string - return code_creators.custom_text_t( msg ) + return code_creators.custom_text_t( msg, False ) def create_cls_cc( cls ): if isinstance( cls, declarations.class_t ): Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2006-06-28 14:32:24 UTC (rev 260) @@ -17,7 +17,7 @@ class fundamental_tester_base_t( unittest.TestCase ): SUFFIX_TO_BE_EXPORTED = '_to_be_exported.hpp' - def __init__(self, module_name, indexing_suite_version=1, *args ): + def __init__(self, module_name, *args, **keywd ): unittest.TestCase.__init__(self, *args) self.__module_name = module_name self.__to_be_exported_header \ @@ -28,8 +28,9 @@ , self.__module_name + '.cpp' ) self.__generated_scons_file_name = os.path.join( autoconfig.build_dir , self.__module_name + '.scons' ) - self.__indexing_suite_version = indexing_suite_version + self.__indexing_suite_version = keywd.get( 'indexing_suite_version', 1 ) + def failIfRaisesAny(self, callableObj, *args, **kwargs): try: callableObj(*args, **kwargs) Modified: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2006-06-28 14:32:24 UTC (rev 260) @@ -17,9 +17,9 @@ def __init__( self, *args ): fundamental_tester_base.fundamental_tester_base_t.__init__( self - , tester_t.EXTENSION_NAME - , 2 - , *args ) + , tester_t.EXTENSION_NAME + , indexing_suite_version=2 + , *args) #~ @staticmethod #~ def matcher( item, decl ): @@ -30,10 +30,12 @@ #~ return True #~ return False - #~ def customize(self, generator): - #~ item = generator.class_( 'item_t' ) - #~ items = generator.class_( lambda decl: self.matcher( item, decl ) ) - #~ items.alias = "items_t" + def customize(self, generator): + ivector = generator.global_ns.typedef( 'ivector' ) + ivector = declarations.remove_declarated( ivector.type ) + ivector.indexing_suite.disable_method( 'extend' ) + ivector.indexing_suite.disable_methods_group( 'reorder' ) + #ivector.indexing_suite.call_policies = module_builder.call_policies.default_call_policies() def run_tests( self, module): iv = module.ivector() Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/unittests/test_all.py 2006-06-28 14:32:24 UTC (rev 260) @@ -109,7 +109,6 @@ , vector3_tester , default_args_tester , abstract_classes_tester - , classes_tester , indexing_suites2_tester ] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |