[pygccxml-commit] SF.net SVN: pygccxml: [765] pyplusplus_dev_ft
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-11-29 20:12:39
|
Revision: 765 http://svn.sourceforge.net/pygccxml/?rev=765&view=rev Author: roman_yakovenko Date: 2006-11-29 12:10:52 -0800 (Wed, 29 Nov 2006) Log Message: ----------- adding treatment for array transformers for virtual mem fun Modified Paths: -------------- pyplusplus_dev_ft/pyplusplus/code_creators/calldef_transformed.py pyplusplus_dev_ft/pyplusplus/function_transformers/transformers.py pyplusplus_dev_ft/unittests/data/function_transformations_to_be_exported.hpp pyplusplus_dev_ft/unittests/function_transformations_tester.py Modified: pyplusplus_dev_ft/pyplusplus/code_creators/calldef_transformed.py =================================================================== --- pyplusplus_dev_ft/pyplusplus/code_creators/calldef_transformed.py 2006-11-29 15:05:10 UTC (rev 764) +++ pyplusplus_dev_ft/pyplusplus/code_creators/calldef_transformed.py 2006-11-29 20:10:52 UTC (rev 765) @@ -384,9 +384,11 @@ tmpl_values['py_function_var'] = cntrl.py_function_var tmpl_values['function_alias'] = self.declaration.alias tmpl_values['declare_py_variables'] \ - = os.linesep.join( map( lambda var: var.declare_var_string(), cntrl.py_variables ) ) - tmpl_values['py_pre_call'] = os.linesep.join( cntrl.py_pre_call ) - tmpl_values['py_post_call'] = os.linesep.join( cntrl.py_post_call ) + = os.linesep + os.linesep.join( map( lambda var: self.indent( var.declare_var_string(), 2 ) + , cntrl.py_variables ) ) + + tmpl_values['py_pre_call'] = os.linesep + self.indent( os.linesep.join( cntrl.py_pre_call ), 2 ) + tmpl_values['py_post_call'] = os.linesep + self.indent( os.linesep.join( cntrl.py_post_call ), 2 ) tmpl_values['py_arg_expressions'] = '' if cntrl.py_arg_expressions: tmpl_values['py_arg_expressions'] \ Modified: pyplusplus_dev_ft/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev_ft/pyplusplus/function_transformers/transformers.py 2006-11-29 15:05:10 UTC (rev 764) +++ pyplusplus_dev_ft/pyplusplus/function_transformers/transformers.py 2006-11-29 20:10:52 UTC (rev 765) @@ -137,6 +137,9 @@ w_arg = controller.find_wrapper_arg( self.arg.name ) w_arg.type = remove_ref_or_ptr( self.arg.type ) + def __configure_v_mem_fun_default( self, controller ): + self.__configure_sealed( controller ) + def configure_mem_fun( self, controller ): self.__configure_sealed( controller ) @@ -144,7 +147,7 @@ self.__configure_sealed( controller ) def configure_virtual_mem_fun( self, controller ): - self.__configure_sealed( controller.default_controller ) + self.__configure_v_mem_fun_default( controller.default_controller ) # inout_t class inout_t(transformer.transformer_t): @@ -177,7 +180,10 @@ w_arg.type = remove_ref_or_ptr( self.arg.type ) #adding the variable to return variables list controller.return_variable( w_arg.name ) - + + def __configure_v_mem_fun_default( self, controller ): + self.__configure_sealed( controller ) + def __configure_v_mem_fun_override( self, controller ): tmpl = string.Template( '$name = boost::python::extract< $type >( pyplus_conv::get_out_argument( $py_result, "$name" ) );' ) @@ -194,8 +200,16 @@ def configure_virtual_mem_fun( self, controller ): self.__configure_v_mem_fun_override( controller.override_controller ) - self.__configure_sealed( controller.default_controller ) + self.__configure_v_mem_fun_default( controller.default_controller ) + +_seq2arr = string.Template( os.linesep.join([ + 'pyplus_conv::ensure_uniform_sequence< $type >( $pylist, $array_size );' + , 'pyplus_conv::copy_sequence( $pylist, pyplus_conv::array_inserter( $native_array, $array_size ) );'])) + +_arr2seq = string.Template( + 'pyplus_conv::copy_container( $native_array, $native_array + $array_size, pyplus_conv::list_inserter( $pylist ) );' ) + class input_array_t(transformer.transformer_t): """Handles an input array with fixed size. @@ -228,14 +242,8 @@ """Returns list of header files that transformer generated code depends on.""" return [ code_repository.convenience.file_name ] - @property - def pre_call_tmpl( self ): - pre_call = [] - pre_call.append( 'pyplus_conv::ensure_uniform_sequence< $type >( $pylist, $array_size );' ) - pre_call.append( 'pyplus_conv::copy_sequence( $pylist, pyplus_conv::array_inserter( $native_array, $array_size ) );' ) - return string.Template( os.linesep.join( pre_call ) ) - def __configure_sealed(self, controller): + global _seq2arr w_arg = controller.find_wrapper_arg( self.arg.name ) w_arg.type = declarations.dummy_type_t( "boost::python::object" ) @@ -243,22 +251,41 @@ native_array = controller.declare_variable( self.array_item_type , "native_" + self.arg.name , '[%d]' % self.array_size ) + + copy_pylist2arr = _seq2arr.substitute( type=self.array_item_type + , pylist=w_arg.name + , array_size=self.array_size + , native_array=native_array ) - seq2arr = self.pre_call_tmpl.substitute( type=self.array_item_type - , pylist=w_arg.name - , array_size=self.array_size - , native_array=native_array ) + controller.add_pre_call_code( copy_pylist2arr ) - controller.add_pre_call_code( seq2arr ) - controller.modify_arg_expression( self.arg_index, native_array ) + def __configure_v_mem_fun_default( self, controller ): + self.__configure_sealed( controller ) + + def __configure_v_mem_fun_override( self, controller ): + global _arr2seq + pylist = controller.declare_py_variable( declarations.dummy_type_t( 'boost::python::list' ) + , 'py_' + self.arg.name ) + + copy_arr2pylist = _arr2seq.substitute( native_array=self.arg.name + , array_size=self.array_size + , pylist=pylist ) + + controller.add_py_pre_call_code( copy_arr2pylist ) + def configure_mem_fun( self, controller ): self.__configure_sealed( controller ) def configure_free_fun(self, controller ): self.__configure_sealed( controller ) + def configure_virtual_mem_fun( self, controller ): + self.__configure_v_mem_fun_override( controller.override_controller ) + self.__configure_v_mem_fun_default( controller.default_controller ) + + # output_array_t class output_array_t(transformer.transformer_t): """Handles an output array of a fixed size. @@ -293,11 +320,8 @@ """Returns list of header files that transformer generated code depends on.""" return [ code_repository.convenience.file_name ] - @property - def post_call_tmpl( self ): - return string.Template( 'pyplus_conv::copy_container( $native_array, $native_array + $array_size, pyplus_conv::list_inserter( $pylist ) );' ) - def __configure_sealed(self, controller): + global _arr2seq #removing arg from the function wrapper definition controller.remove_wrapper_arg( self.arg.name ) @@ -313,17 +337,41 @@ pylist = controller.declare_variable( declarations.dummy_type_t( "boost::python::list" ) , 'py_' + self.arg.name ) - arr2seq = self.post_call_tmpl.substitute( native_array=native_array - , array_size=self.array_size - , pylist=pylist ) + copy_arr2pylist = _arr2seq.substitute( native_array=native_array + , array_size=self.array_size + , pylist=pylist ) - controller.add_post_call_code( arr2seq ) + controller.add_post_call_code( copy_arr2pylist ) #adding the variable to return variables list controller.return_variable( pylist ) - + + def __configure_v_mem_fun_default( self, controller ): + self.__configure_sealed( controller ) + + def __configure_v_mem_fun_override( self, controller ): + global _seq2arr + seq = controller.declare_py_variable( declarations.dummy_type_t( 'boost::python::object' ) + , 'py_' + self.arg.name ) + controller.remove_py_arg( self.arg_index ) + tmpl = string.Template( '$seq = pyplus_conv::get_out_argument( $py_result, "$name" );' ) + get_ref_to_seq = tmpl.substitute( seq=seq + , py_result=controller.py_result_variable.name + , name=self.arg.name ) + controller.add_py_post_call_code( get_ref_to_seq ) + + copy_pylist2arr = _seq2arr.substitute( type=self.array_item_type + , pylist=seq + , array_size=self.array_size + , native_array=self.arg.name ) + controller.add_py_post_call_code( copy_pylist2arr ) + def configure_mem_fun( self, controller ): self.__configure_sealed( controller ) def configure_free_fun(self, controller ): self.__configure_sealed( controller ) + + def configure_virtual_mem_fun( self, controller ): + self.__configure_v_mem_fun_override( controller.override_controller ) + self.__configure_v_mem_fun_default( controller.default_controller ) Modified: pyplusplus_dev_ft/unittests/data/function_transformations_to_be_exported.hpp =================================================================== --- pyplusplus_dev_ft/unittests/data/function_transformations_to_be_exported.hpp 2006-11-29 15:05:10 UTC (rev 764) +++ pyplusplus_dev_ft/unittests/data/function_transformations_to_be_exported.hpp 2006-11-29 20:10:52 UTC (rev 765) @@ -125,17 +125,17 @@ return in; } - //~ // A method taking an input array of fixed size - //~ virtual int fixed_input_array(int v[3]) { - //~ return v[0]+v[1]+v[2]; - //~ } + // A method taking an input array of fixed size + virtual int fixed_input_array(int v[3]) { + return v[0]+v[1]+v[2]; + } - //~ // A method with a output array of fixed size - //~ virtual void fixed_output_array(int v[3]) { - //~ v[0] = 1; - //~ v[1] = 2; - //~ v[2] = 3; - //~ } + // A method with a output array of fixed size + virtual void fixed_output_array(int v[3]) { + v[0] = 1; + v[1] = 2; + v[2] = 3; + } unsigned int m_width; unsigned int m_height; @@ -161,13 +161,13 @@ return v; } -//~ // This is used for calling img.fixed_output_array() on an instance passed -//~ // in by Python. -//~ int image_fixed_output_array( image_t& img) { - //~ int v[3]; - //~ img.fixed_output_array(v); - //~ return v[0]+v[1]+v[2]; -//~ } +// This is used for calling img.fixed_output_array() on an instance passed +// in by Python. +int image_fixed_output_array( image_t& img) { + int v[3]; + img.fixed_output_array(v); + return v[0]+v[1]+v[2]; +} ////////////////////////////////////////////////////////////////////// Modified: pyplusplus_dev_ft/unittests/function_transformations_tester.py =================================================================== --- pyplusplus_dev_ft/unittests/function_transformations_tester.py 2006-11-29 15:05:10 UTC (rev 764) +++ pyplusplus_dev_ft/unittests/function_transformations_tester.py 2006-11-29 20:10:52 UTC (rev 765) @@ -8,6 +8,7 @@ import math import unittest import fundamental_tester_base +from named_tuple import named_tuple from pyplusplus import function_transformers as ft from pyplusplus.module_builder import call_policies @@ -52,8 +53,8 @@ image.member_function( "get_one_value" ).add_transformation( ft.output(0) ) image.member_function( "get_size2" ).add_transformation( ft.output(0), ft.output(1) ) image.member_function( "input_arg" ).add_transformation( ft.input(0) ) - #~ image.member_function( "fixed_input_array" ).add_transformation( ft.input_array(0,3) ) - #~ image.member_function( "fixed_output_array" ).add_transformation( ft.output_array(0,3) ) + image.member_function( "fixed_input_array" ).add_transformation( ft.input_array(0,3) ) + image.member_function( "fixed_output_array" ).add_transformation( ft.output_array(0,3) ) mb.free_function("get_cpp_instance").call_policies \ = call_policies.return_value_policy(call_policies.reference_existing_object) mb.variable( "cpp_instance" ).exclude() @@ -114,12 +115,12 @@ # Check the input_arg method self.assertEqual(img.input_arg(5), 5) - #~ # Check the fixed_input_array method - #~ self.assertEqual(img.fixed_input_array([1,2,3]), 6) - #~ self.assertEqual(img.fixed_input_array((1,2,3)), 6) + # Check the fixed_input_array method + self.assertEqual(img.fixed_input_array([1,2,3]), 6) + self.assertEqual(img.fixed_input_array((1,2,3)), 6) - #~ # Check the fixed_output_array method - #~ self.assertEqual(img.fixed_output_array(), [1,2,3]) + # Check the fixed_output_array method + self.assertEqual(img.fixed_output_array(), [1,2,3]) self.assertEqual(module.ft_private_destructor_t.get_value(), 21) @@ -134,16 +135,16 @@ def get_one_value(self): return self.m_height+1 - #~ def fixed_output_array(self): - #~ # Produce a correct return value - #~ if self.fixed_output_array_mode==0: - #~ return (2,5,7) - #~ # Produce the wrong type - #~ elif self.fixed_output_array_mode==1: - #~ return 5 - #~ # Produce a sequence with the wrong number of items - #~ elif self.fixed_output_array_mode==2: - #~ return (2,5) + def fixed_output_array(self): + # Produce a correct return value + if self.fixed_output_array_mode==0: + return named_tuple( v=(2,5,7) ) + # Produce the wrong type + elif self.fixed_output_array_mode==1: + return 5 + # Produce a sequence with the wrong number of items + elif self.fixed_output_array_mode==2: + return named_tuple( v=(2,5) ) pyimg1 = py_image1_t(3,7) @@ -156,12 +157,12 @@ # Check if the Python class can also be passed back to C++ self.assertEqual(module.get_image_one_value(pyimg1), 4) - #~ # Check if fixed_output_array() is correctly called from C++ - #~ self.assertEqual(module.image_fixed_output_array(pyimg1), 14) - #~ pyimg1.fixed_output_array_mode = 1 - #~ self.assertRaises(TypeError, lambda : module.image_fixed_output_array(pyimg1)) - #~ pyimg1.fixed_output_array_mode = 2 - #~ self.assertRaises(ValueError, lambda : module.image_fixed_output_array(pyimg1)) + # Check if fixed_output_array() is correctly called from C++ + self.assertEqual(module.image_fixed_output_array(pyimg1), 14) + pyimg1.fixed_output_array_mode = 1 + self.assertRaises(TypeError, lambda : module.image_fixed_output_array(pyimg1)) + pyimg1.fixed_output_array_mode = 2 + self.assertRaises(ValueError, lambda : module.image_fixed_output_array(pyimg1)) class py_image2_t(module.image_t): def __init__(self, h, w): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |