[pygccxml-commit] SF.net SVN: pygccxml:[1830] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2010-03-21 07:24:35
|
Revision: 1830 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1830&view=rev Author: roman_yakovenko Date: 2010-03-21 07:24:29 +0000 (Sun, 21 Mar 2010) Log Message: ----------- adding ability to expose some protected variables Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.cpp pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites2_support_tester.py pyplusplus_dev/unittests/member_variables_protected_tester.py pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2010-03-21 07:13:52 UTC (rev 1829) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2010-03-21 07:24:29 UTC (rev 1830) @@ -437,8 +437,39 @@ def __init__(self, variable ): code_creator.code_creator_t.__init__( self ) declaration_based.declaration_based_t.__init__( self, declaration=variable) + self.__is_protected = bool( variable.access_type == declarations.ACCESS_TYPES.PROTECTED ) @property + def public_accessor_name(self): + return "pyplusplus_%s_accessor" % self.declaration.name + + def generate_public_accessor( self ): + tmpl = os.linesep.join([ + "%(static)s%(const_item_type)s%(item_type)s* %(accessor_name)s()%(const_function)s{" + , " return %(name)s;" + , "}" + ]) + constness = '' + const_function = '' + if declarations.is_const( self.declaration.type ): + constness = 'const ' + const_function = ' const' + + static = '' + if self.declaration.type_qualifiers.has_static: + static = 'static ' + const_function = '' + + return tmpl % { + 'static' : static + , 'const_item_type' : constness + , 'item_type' : declarations.array_item_type( self.declaration.type ).decl_string + , 'accessor_name': self.public_accessor_name + , 'name' : self.declaration.name + , 'const_function' : const_function + } + + @property def wrapper_type( self ): tmpl = "%(namespace)s::%(constness)sarray_1_t< %(item_type)s, %(array_size)d>" @@ -455,7 +486,10 @@ @property def wrapped_class_type( self ): - wrapped_cls_type = declarations.declarated_t( self.declaration.parent ) + if self.__is_protected: + wrapped_cls_type = declarations.dummy_type_t( self.parent.full_name ) + else: + wrapped_cls_type = declarations.declarated_t( self.declaration.parent ) if declarations.is_const( self.declaration.type ): wrapped_cls_type = declarations.const_t( wrapped_cls_type ) return declarations.reference_t( wrapped_cls_type ) @@ -477,26 +511,40 @@ def wrapper_creator_full_name(self): return '::'.join( [self.parent.full_name, self.wrapper_creator_name] ) - def _create_impl( self ): + def _create_impl( self ): + result = [] + if self.__is_protected: + result.append( self.generate_public_accessor() ) + result.append( '' ) + tmpl = [ "static %(wrapper_type)s" ] if self.declaration.type_qualifiers.has_static: tmpl.append( "%(wrapper_creator_name)s(){" ) - tmpl.append( self.indent( "return %(wrapper_type)s( %(parent_class_type)s::%(mem_var_ref)s );" ) ) + if self.__is_protected: + tmpl.append( self.indent( "return %(wrapper_type)s( %(wrapped_class_type_only)s::%(public_accessor_name)s() );" ) ) + else: + tmpl.append( self.indent( "return %(wrapper_type)s( %(parent_class_type)s::%(mem_var_ref)s );" ) ) else: tmpl.append( "%(wrapper_creator_name)s( %(wrapped_class_type)s inst ){" ) - tmpl.append( self.indent( "return %(wrapper_type)s( inst.%(mem_var_ref)s );" ) ) + if self.__is_protected: + tmpl.append( self.indent( "return %(wrapper_type)s( inst.%(public_accessor_name)s() );" ) ) + else: + tmpl.append( self.indent( "return %(wrapper_type)s( inst.%(mem_var_ref)s );" ) ) + tmpl.append( "}" ) - + tmpl = os.linesep.join( tmpl ) - - return tmpl % { - 'wrapper_type' : self.wrapper_type.decl_string - , 'parent_class_type' : self.parent.declaration.partial_decl_string - , 'wrapper_creator_name' : self.wrapper_creator_name - , 'wrapped_class_type' : self.wrapped_class_type.decl_string - , 'mem_var_ref' : self.declaration.name - } + result.append( tmpl % { 'wrapper_type' : self.wrapper_type.decl_string + , 'parent_class_type' : self.parent.declaration.partial_decl_string + , 'wrapper_creator_name' : self.wrapper_creator_name + , 'wrapped_class_type' : self.wrapped_class_type.decl_string + , 'wrapped_class_type_only' : self.parent.full_name + , 'mem_var_ref' : self.declaration.name + , 'public_accessor_name' : self.public_accessor_name + } ) + return os.linesep.join( result ) + def _get_system_files_impl( self ): return [code_repository.array_1.file_name] Modified: pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.cpp =================================================================== --- pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.cpp 2010-03-21 07:13:52 UTC (rev 1829) +++ pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.cpp 2010-03-21 07:24:29 UTC (rev 1830) @@ -9,10 +9,10 @@ const array_t::variable_t array_t::vars[] = { array_t::variable_t(), array_t::variable_t(), array_t::variable_t() }; array_t::variable_t array_t::vars_nonconst[] = { array_t::variable_t(), array_t::variable_t(), array_t::variable_t() }; - +/* int point::instance_count = 0; const point::color point::default_color = point::red; - +*/ unsigned int get_a(const bit_fields_t& inst){ return inst.a; } @@ -24,7 +24,7 @@ unsigned int get_b(const bit_fields_t& inst){ return inst.b; } - +/* namespace pointers{ std::auto_ptr<tree_node_t> create_tree(){ @@ -50,5 +50,5 @@ int xxx = 1997; int* image_t::none_image = &xxx; } - +*/ } Modified: pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.hpp 2010-03-21 07:13:52 UTC (rev 1829) +++ pyplusplus_dev/unittests/data/member_variables_protected_to_be_exported.hpp 2010-03-21 07:24:29 UTC (rev 1830) @@ -10,7 +10,7 @@ #include <iostream> namespace member_variables{ - +/* struct point{ enum color{ red, green, blue }; @@ -35,7 +35,7 @@ static int instance_count; static const color default_color; }; - +*/ struct bit_fields_t{ friend unsigned int get_a(const bit_fields_t& inst); friend void set_a( bit_fields_t& inst, unsigned int new_value ); @@ -69,13 +69,13 @@ int get_ivars_item( int index ){ return ivars[index]; } - +protected: static const variable_t vars[3]; static variable_t vars_nonconst[3]; int ivars[10]; int ivars2[10]; }; - +/* namespace pointers{ struct tree_node_t; @@ -193,7 +193,7 @@ void * userData; }; -} +}*/ } #endif//__member_variables_protected_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/indexing_suites2_support_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_support_tester.py 2010-03-21 07:13:52 UTC (rev 1829) +++ pyplusplus_dev/unittests/indexing_suites2_support_tester.py 2010-03-21 07:24:29 UTC (rev 1830) @@ -13,9 +13,9 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'indexing_suites2_support' - + def __init__( self, *args ): - fundamental_tester_base.fundamental_tester_base_t.__init__( + fundamental_tester_base.fundamental_tester_base_t.__init__( self , tester_t.EXTENSION_NAME , indexing_suite_version=2 @@ -26,22 +26,18 @@ fvector = declarations.remove_declarated( fvector.type ) fvector.indexing_suite.call_policies \ = module_builder.call_policies.return_internal_reference() - + def run_tests( self, module): v = module.foo_vector() f = module.foo() f.bar = 0 v.append(f) self.failUnless( v[0].bar == 0 ) - v[0].bar = 10 + v[0].bar = 10 self.failUnless( v[0].bar == 10 ) - x = module.create_set_strings() - self.failUnless( len(x) == 0 ) - x = module.ffff() - self.failUnless( len(x) == 0 ) - + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite Modified: pyplusplus_dev/unittests/member_variables_protected_tester.py =================================================================== --- pyplusplus_dev/unittests/member_variables_protected_tester.py 2010-03-21 07:13:52 UTC (rev 1829) +++ pyplusplus_dev/unittests/member_variables_protected_tester.py 2010-03-21 07:24:29 UTC (rev 1830) @@ -9,7 +9,10 @@ import unittest import fundamental_tester_base from pygccxml import declarations +from pyplusplus import decl_wrappers +decl_wrappers.variable_t.EXPOSE_PROTECTED_VARIABLES = True + class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'member_variables_protected' @@ -19,22 +22,13 @@ , tester_t.EXTENSION_NAME , *args ) - def is_protected_var( self, var ): - if not isinstance( var.parent, declarations.class_t ): - return False - if var.access_type == declarations.ACCESS_TYPES.PROTECTED: - return True - else: - return False - def customize(self, mb ): - mb.variables( self.is_protected_var ).use_make_functions = True - mb.variable( 'prefered_color' ).alias = 'PreferedColor' + #mb.variable( 'prefered_color' ).alias = 'PreferedColor' mb.classes().always_expose_using_scope = True - image = mb.class_( 'image_t' ) - image.var( 'data' ).expose_address = True - image.var( 'none_image' ).expose_address = True - mb.class_( 'Andy' ).var('userData').expose_address = True + #image = mb.class_( 'image_t' ) + #image.var( 'data' ).expose_address = True + #image.var( 'none_image' ).expose_address = True + #mb.class_( 'Andy' ).var('userData').expose_address = True def change_default_color( self, module ): module.point.default_color = module.point.color.blue @@ -47,17 +41,17 @@ bf.b = value def run_tests(self, module): - self.failIfRaisesAny( module.point ) - xypoint = module.point() - self.failUnless( module.point.instance_count == 1) - self.failUnless( xypoint.instance_count == 1) - self.failUnless( module.point.default_color == module.point.color.red) - self.failUnless( xypoint.default_color == module.point.color.red) - self.failUnless( xypoint.x == -1) - self.failUnless( xypoint.y == 2 ) - self.failUnless( xypoint.PreferedColor == xypoint.color.blue ) - self.failUnlessRaises( Exception, self.change_default_color ) - self.failUnlessRaises( Exception, self.change_prefered_color ) + #self.failIfRaisesAny( module.point ) + #xypoint = module.point() + #self.failUnless( module.point.instance_count == 1) + #self.failUnless( xypoint.instance_count == 1) + #self.failUnless( module.point.default_color == module.point.color.red) + #self.failUnless( xypoint.default_color == module.point.color.red) + #self.failUnless( xypoint.x == -1) + #self.failUnless( xypoint.y == 2 ) + #self.failUnless( xypoint.PreferedColor == xypoint.color.blue ) + #self.failUnlessRaises( Exception, self.change_default_color ) + #self.failUnlessRaises( Exception, self.change_prefered_color ) bf = module.bit_fields_t() module.set_a( bf, 1 ) @@ -65,43 +59,43 @@ self.failUnless( bf.b == module.get_b( bf ) ) self.failIfNotRaisesAny( lambda: self.set_b( bf, 23 ) ) - tree = module.create_tree() - self.failUnless( tree.parent is None ) - self.failUnless( tree.data.value == 0 ) - self.failUnless( tree.right is None ) - self.failUnless( tree.left ) - self.failUnless( tree.left.data.value == 1 ) + #tree = module.create_tree() + #self.failUnless( tree.parent is None ) + #self.failUnless( tree.data.value == 0 ) + #self.failUnless( tree.right is None ) + #self.failUnless( tree.left ) + #self.failUnless( tree.left.data.value == 1 ) - tree.right = module.create_tree() - self.failUnless( tree.right.parent is None ) - self.failUnless( tree.right.data.value == 0 ) - self.failUnless( tree.right.right is None ) - self.failUnless( tree.right.left ) - self.failUnless( tree.right.left.data.value == 1 ) + #tree.right = module.create_tree() + #self.failUnless( tree.right.parent is None ) + #self.failUnless( tree.right.data.value == 0 ) + #self.failUnless( tree.right.right is None ) + #self.failUnless( tree.right.left ) + #self.failUnless( tree.right.left.data.value == 1 ) - mem_var_str = module.mem_var_str_t() - mem_var_str.identity( module.mem_var_str_t.class_name ) + #mem_var_str = module.mem_var_str_t() + #mem_var_str.identity( module.mem_var_str_t.class_name ) - image = module.image_t() + #image = module.image_t() - data_type = ctypes.POINTER( ctypes.c_int ) - data = data_type.from_address( image.data ) - for j in range(5): - self.failUnless( j == data[j] ) - - int_array = ctypes.c_int * 5 - array = int_array() - for i in range( 5 ): - array[i] = 2*i - image.data = ctypes.addressof(array) - data = data_type.from_address( image.data ) - for j in range(5): - self.failUnless( j*2 == data[j] ) - - data_type = ctypes.POINTER( ctypes.c_int ) - data = data_type.from_address( module.image_t.none_image ) - self.failUnless( 1997 == data.contents.value ) + #data_type = ctypes.POINTER( ctypes.c_int ) + #data = data_type.from_address( image.data ) + #for j in range(5): + #self.failUnless( j == data[j] ) + #int_array = ctypes.c_int * 5 + #array = int_array() + #for i in range( 5 ): + #array[i] = 2*i + #image.data = ctypes.addressof(array) + #data = data_type.from_address( image.data ) + #for j in range(5): + #self.failUnless( j*2 == data[j] ) + + #data_type = ctypes.POINTER( ctypes.c_int ) + #data = data_type.from_address( module.image_t.none_image ) + #self.failUnless( 1997 == data.contents.value ) + array = module.array_t() self.failUnless( len( array.ivars ) == 10 ) @@ -116,8 +110,6 @@ array.ivars[index] = index * index self.failUnless( array.get_ivars_item( index ) == index * index ) - #~ import pdb - #~ pdb.set_trace() self.failUnless( len( module.array_t.vars ) == 3 ) for i in range( len( module.array_t.vars ) ): Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2010-03-21 07:13:52 UTC (rev 1829) +++ pyplusplus_dev/unittests/test_all.py 2010-03-21 07:24:29 UTC (rev 1830) @@ -126,6 +126,7 @@ import ft_output_static_matrix_tester import ft_inout_static_matrix_tester import ft_inout_static_array_tester +import member_variables_protected_tester testers = [ algorithms_tester @@ -240,6 +241,7 @@ , ft_output_static_matrix_tester , ft_inout_static_matrix_tester , ft_inout_static_array_tester + , member_variables_protected_tester # , ogre_generate_tester too much time ] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |