[pygccxml-commit] SF.net SVN: pygccxml:[1798] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2010-01-13 10:38:29
|
Revision: 1798 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1798&view=rev Author: roman_yakovenko Date: 2010-01-13 10:38:19 +0000 (Wed, 13 Jan 2010) Log Message: ----------- integrating inout_static_matrix implementation Modified Paths: -------------- pyplusplus_dev/pyplusplus/function_transformers/transformers.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/ft_inout_static_matrix_to_be_exported.hpp pyplusplus_dev/unittests/ft_inout_static_matrix_tester.py Modified: pyplusplus_dev/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2010-01-13 09:48:10 UTC (rev 1797) +++ pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2010-01-13 10:38:19 UTC (rev 1798) @@ -716,8 +716,9 @@ 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 ) + raise RuntimeError( '"output_static_matrix" transformation does not support virtual functions yet.' ) + #self.__configure_v_mem_fun_override( controller.override_controller ) + #self.__configure_v_mem_fun_default( controller.default_controller ) # inout_static_matrix_t class inout_static_matrix_t(transformer.transformer_t): @@ -756,42 +757,46 @@ return [ code_repository.convenience.file_name ] def __configure_sealed(self, controller): - global _seq2arr - global _mat2seq + global _pymatrix2cmatrix + global _cmatrix2pymatrix w_arg = controller.find_wrapper_arg( self.arg.name ) w_arg.type = declarations.dummy_type_t( "boost::python::object" ) # Declare a variable that will hold the C matrix... native_matrix = controller.declare_variable( self.matrix_item_type , "native_" + self.arg.name - , '[%d][%d]' % (self.rows, self.columns) - ) + , '[%d][%d]' % (self.rows, self.columns) ) - pre_call = string.Template('pyplus_conv::ensure_uniform_sequence< $type >( $pylist, $array_size );') - controller.add_pre_call_code(pre_call.substitute(type='boost::python::list', pylist=w_arg.name,array_size=self.rows)) + conversion_code = _pymatrix2cmatrix.substitute( type=self.matrix_item_type + , pymatrix=w_arg.name + , columns='%d' % self.columns + , row=controller.register_variable_name( "row" ) + , rows='%d' % self.rows + , native_matrix=native_matrix ) - #TODO: may be a better idea is move this loop to the generated code. - for i in range(0,self.rows): - copy_pylist2arr = _seq2arr.substitute( type=self.matrix_item_type - , pylist=w_arg.name+"["+str(i)+"]" - , array_size=self.columns - , native_array=native_matrix+'['+str(i)+']' ) + controller.add_pre_call_code( conversion_code ) - controller.add_pre_call_code( copy_pylist2arr ) + controller.modify_arg_expression( self.arg_index, native_matrix ) + + #adding just declared variable to the original function call expression controller.modify_arg_expression( self.arg_index, native_matrix ) - pylist = controller.declare_variable( declarations.dummy_type_t( "boost::python::list" ) + # Declare a Python list which will receive the output... + pymatrix = controller.declare_variable( declarations.dummy_type_t( "boost::python::list" ) , 'py_' + self.arg.name ) - copy_mat2pylist = _mat2seq.substitute( native_matrix = native_matrix - , rows=self.rows - , columns=self.columns - , pylist=pylist) - controller.add_post_call_code( copy_mat2pylist ) + conversion_code = _cmatrix2pymatrix.substitute( pymatrix=pymatrix + , columns='%d' % self.columns + , row=controller.register_variable_name( "row" ) + , pyrow=controller.register_variable_name( "pyrow" ) + , rows='%d' % self.rows + , native_matrix=native_matrix ) + + controller.add_post_call_code( conversion_code ) #adding the variable to return variables list - controller.return_variable( pylist ) + controller.return_variable( pymatrix ) def __configure_v_mem_fun_default( self, controller ): self.__configure_sealed( controller ) @@ -815,8 +820,9 @@ 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 ) + raise RuntimeError( '"output_static_matrix" transformation does not support virtual functions yet.' ) + #self.__configure_v_mem_fun_override( controller.override_controller ) + #self.__configure_v_mem_fun_default( controller.default_controller ) # input_c_buffer_t class input_c_buffer_t(transformer.transformer_t): Added: pyplusplus_dev/unittests/data/ft_inout_static_matrix_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/ft_inout_static_matrix_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/ft_inout_static_matrix_to_be_exported.hpp 2010-01-13 10:38:19 UTC (rev 1798) @@ -0,0 +1,28 @@ +// Copyright 2004-2008 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __ft_inout_static_matrix_to_be_exported_hpp__ +#define __ft_inout_static_matrix_to_be_exported_hpp__ + +#include <cmath> +#include <string> +#include <iostream> + +namespace ft{ + +int sum_and_fill( int m[2][3], int value ){ + int result = 0; + for( int r = 0; r < 2; ++r ){ + for( int c = 0; c < 3; ++c ){ + result += m[r][c]; + m[r][c] *= value; + } + } + return result; +} + +} + +#endif//__ft_inout_static_matrix_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/ft_inout_static_matrix_tester.py =================================================================== --- pyplusplus_dev/unittests/ft_inout_static_matrix_tester.py (rev 0) +++ pyplusplus_dev/unittests/ft_inout_static_matrix_tester.py 2010-01-13 10:38:19 UTC (rev 1798) @@ -0,0 +1,49 @@ +# Copyright 2004-2008 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +import sys +import math +import unittest +import fundamental_tester_base +from pygccxml import declarations +from pyplusplus import function_transformers as ft +from pyplusplus.module_builder import call_policies + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'ft_inout_static_matrix' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + mb.global_ns.calldefs().create_with_signature = True + + sum_and_fill = mb.free_fun( 'sum_and_fill' ) + sum_and_fill.add_transformation( ft.inout_static_matrix('m', rows=2, columns=3) ) + + #calculate = mb.mem_fun( 'calculate' ) + #calculate.add_transformation( ft.input_static_matrix('m', rows=3, columns=5) ) + + def run_tests(self, module): + """Run the actual unit tests""" + m = [ [1, 2, 3], [4,5,6] ] + result = module.sum_and_fill( m, -1 ) + self.failUnless( 21 == result[0] ) + self.failUnless( [ [-1, -2, -3], [-4,-5,-6] ] == result[1]) + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2010-01-13 09:48:10 UTC (rev 1797) +++ pyplusplus_dev/unittests/test_all.py 2010-01-13 10:38:19 UTC (rev 1798) @@ -124,6 +124,7 @@ import indexing_suites2_support_tester import ft_input_static_matrix_tester import ft_output_static_matrix_tester +import ft_inout_static_matrix_tester testers = [ algorithms_tester @@ -236,6 +237,7 @@ , indexing_suites2_support_tester , ft_input_static_matrix_tester , ft_output_static_matrix_tester + , ft_inout_static_matrix_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. |