Thread: [pygccxml-commit] SF.net SVN: pygccxml:[1373] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-07-17 04:30:55
|
Revision: 1373 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1373&view=rev Author: roman_yakovenko Date: 2008-07-17 04:31:02 +0000 (Thu, 17 Jul 2008) Log Message: ----------- adding ability to expose "this" pointer to python as integer Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/classes_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -135,3 +135,5 @@ from opaque_type_registrator import opaque_type_registrator_t from properties import property_t + +from ctypes_integration_creators import expose_this_t Added: pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -0,0 +1,39 @@ +# Copyright 2004 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 algorithm +import code_creator +import declaration_based +import registration_based +from pygccxml import declarations +from pyplusplus import decl_wrappers +from pyplusplus import code_repository + +class expose_this_t( registration_based.registration_based_t + , declaration_based.declaration_based_t ): + """ + creates code that expose address of the object to Python + """ + + def __init__(self, class_ ): + registration_based.registration_based_t.__init__( self ) + declaration_based.declaration_based_t.__init__( self, declaration=class_) + + def _create_impl(self): + answer = [ 'add_property' ] + answer.append( '( ' ) + answer.append('"this"') + answer.append( self.PARAM_SEPARATOR ) + answer.append( 'pyplus_conv::make_addressof_inst_getter< %s >()' % self.decl_identifier ) + if self.documentation: + answer.append( self.PARAM_SEPARATOR ) + answer.append( self.documentation ) + answer.append( ' ) ' ) + + return ''.join( answer ) + + def _get_system_headers_impl( self ): + return [code_repository.ctypes_integration.file_name] Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -669,8 +669,11 @@ answer.append('"%s"' % self.alias) answer.append( self.PARAM_SEPARATOR ) - answer.append( 'pyplus_conv::make_addressof_getter(&%s)' - % self.decl_identifier ) + if self.declaration.type_qualifiers.has_static: + answer.append( 'not implemented' ) + else: + answer.append( 'pyplus_conv::make_addressof_getter(&%s)' + % self.decl_identifier ) if doc: answer.append( self.PARAM_SEPARATOR ) answer.append( doc ) Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -37,6 +37,13 @@ return boost::uintmax_t( boost::addressof( inst.*offset ) ); } +template< typename TType > +boost::uintmax_t +addressof_inst( const TType &inst){ + return boost::uintmax_t( boost::addressof( inst ) ); +} + + template< typename TType, typename TMemVarType > boost::python::object make_addressof_getter( const TMemVarType TType::* offset ){ @@ -47,6 +54,16 @@ , boost::mpl::vector< boost::uintmax_t, const TType& >() ); } +template< typename TType > +boost::python::object +make_addressof_inst_getter(){ + namespace bpl = boost::python; + namespace pyppc = pyplusplus::convenience; + return bpl::make_function( boost::bind( &pyppc::addressof_inst< TType >, _1 ) + , bpl::default_call_policies() + , boost::mpl::vector< boost::uintmax_t, const TType& >() ); +} + } /*pyplusplus*/ } /*convenience*/ namespace pyplus_conv = pyplusplus::convenience; Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -190,6 +190,7 @@ self._redefined_funcs = None self._require_self_reference = False self._exposed_class_type = self.EXPOSED_CLASS_TYPE.DECLARED + self._expose_this = None def _get_redefine_operators( self ): return self._redefine_operators @@ -628,3 +629,10 @@ self._require_self_reference = require_self_reference require_self_reference = property( _get_require_self_reference, _set_require_self_reference , doc="boolean, if True the first argument to the constructor will be reference to self object" ) + + def _get_expose_this( self ): + return self._expose_this + def _set_expose_this( self, new_value ): + self._expose_this = new_value + expose_this = property( _get_expose_this, _set_expose_this + , doc="boolean, if True an object address( this pointer ) will be exposed to Python as integer.") Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -593,6 +593,10 @@ cls_parent_cc.adopt_creator( cls_cc ) self.curr_code_creator = cls_cc + + if cls_decl.expose_this: + cls_cc.adopt_creator( code_creators.expose_this_t( cls_decl ) ) + for decl in exportable_members: if decl in exposed: continue Modified: pyplusplus_dev/unittests/classes_tester.py =================================================================== --- pyplusplus_dev/unittests/classes_tester.py 2008-07-14 18:58:40 UTC (rev 1372) +++ pyplusplus_dev/unittests/classes_tester.py 2008-07-17 04:31:02 UTC (rev 1373) @@ -10,14 +10,15 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'classes' - + 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 , *args ) - + def customize(self, mb ): + mb.classes().expose_this = True mb.class_( 'fundamental2' ).alias = 'FUNDAMENTAL2' apple = mb.class_( 'apple' ) self.failUnless( apple.alias == 'the_tastest_fruit' ) @@ -29,7 +30,7 @@ self.failUnless( 'PROTECTED_STATIC' in protected_static_t.alias) protected_static_t.alias = 'protected_static_t' - def run_tests(self, module): + def run_tests(self, module): self.failIfRaisesAny( module.fundamental1 ) self.failIfRaisesAny( module.FUNDAMENTAL2 ) @@ -39,21 +40,22 @@ self.failIfRaisesAny( module.noncopyable1 ) self.failIfRaisesAny( module.abstract ) - + self.failIfRaisesAny( module.constructor1 ) self.failIfRaisesAny( module.constructor1, 1, 2 ) self.failIfRaisesAny( module.constructor1, 3, module.constructor1() ) - + self.failIfRaisesAny( module.scope_based_exposer ) self.failIfRaisesAny( lambda: module.scope_based_exposer.EColor.red ) - + self.failUnless( 24 == module.protected_static_t.identity(24) ) self.failUnless( 29 == module.protected_static_t.identity(29) ) self.failUnless( -24 == module.protected_static_t().invert_sign(24) ) self.failUnless( 67 == module.protected_static_t().invert_sign(-67) ) - + self.failUnless( module.protected_static_t().this ) + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-07-21 20:16:46
|
Revision: 1374 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1374&view=rev Author: roman_yakovenko Date: 2008-07-21 20:16:53 +0000 (Mon, 21 Jul 2008) Log Message: ----------- adding ability to expose address of the static variable Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py pyplusplus_dev/unittests/data/member_variables_to_be_exported.cpp pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp pyplusplus_dev/unittests/member_variables_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-07-17 04:31:02 UTC (rev 1373) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-07-21 20:16:53 UTC (rev 1374) @@ -656,30 +656,30 @@ def __init__(self, variable, wrapper=None ): member_variable_base_t.__init__( self, variable=variable, wrapper=wrapper ) - def _create_impl( self ): - doc = '' #static property does not support documentation - if self.declaration.type_qualifiers.has_static: - add_property = 'add_static_property' - else: - if self.documentation: - doc = self.documentation - add_property = 'add_property' - answer = [ add_property ] + def _create_m_var( self ): + answer = [ 'add_property' ] answer.append( '( ' ) answer.append('"%s"' % self.alias) answer.append( self.PARAM_SEPARATOR ) - - if self.declaration.type_qualifiers.has_static: - answer.append( 'not implemented' ) - else: - answer.append( 'pyplus_conv::make_addressof_getter(&%s)' - % self.decl_identifier ) - if doc: + answer.append( 'pyplus_conv::make_addressof_getter(&%s)' + % self.decl_identifier ) + if self.documentation: answer.append( self.PARAM_SEPARATOR ) - answer.append( doc ) + answer.append( self.documentation ) answer.append( ' ) ' ) - return ''.join( answer ) + def _create_s_var( self ): + return 'def( %(def_visitor)s("%(name)s", %(var)s) )' \ + % { 'def_visitor' : 'pyplus_conv::register_addressof_static_var' + , 'name' : self.alias + , 'var' : self.decl_identifier } + + + def _create_impl( self ): + if self.declaration.type_qualifiers.has_static: + return self._create_s_var() + else: + return self._create_m_var() def _get_system_headers_impl( self ): return [code_repository.ctypes_integration.file_name] Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-17 04:31:02 UTC (rev 1373) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-21 20:16:53 UTC (rev 1374) @@ -32,18 +32,17 @@ namespace pyplusplus{ namespace convenience{ template< typename TType, typename TMemVarType > -boost::uintmax_t +boost::uint32_t addressof( const TType &inst, const TMemVarType TType::* offset){ - return boost::uintmax_t( boost::addressof( inst.*offset ) ); + return boost::uint32_t( boost::addressof( inst.*offset ) ); } template< typename TType > -boost::uintmax_t +boost::uint32_t addressof_inst( const TType &inst){ - return boost::uintmax_t( boost::addressof( inst ) ); + return boost::uint32_t( boost::addressof( inst ) ); } - template< typename TType, typename TMemVarType > boost::python::object make_addressof_getter( const TMemVarType TType::* offset ){ @@ -51,7 +50,7 @@ namespace pyppc = pyplusplus::convenience; return bpl::make_function( boost::bind( &pyppc::addressof< TType, TMemVarType >, _1, offset ) , bpl::default_call_policies() - , boost::mpl::vector< boost::uintmax_t, const TType& >() ); + , boost::mpl::vector< boost::uint32_t, const TType& >() ); } template< typename TType > @@ -61,9 +60,32 @@ namespace pyppc = pyplusplus::convenience; return bpl::make_function( boost::bind( &pyppc::addressof_inst< TType >, _1 ) , bpl::default_call_policies() - , boost::mpl::vector< boost::uintmax_t, const TType& >() ); + , boost::mpl::vector< boost::uint32_t, const TType& >() ); } +class register_addressof_static_var : public boost::python::def_visitor<register_addressof_static_var> +{ + friend class boost::python::def_visitor_access; + +public: + + template< typename TVarType > + register_addressof_static_var( const char* name, const TVarType& var ) + : m_name( name ) + , m_address( addressof_inst( var ) ) + {} + + template <class classT> + void visit(classT& c) const{ + boost::python::scope cls_scope( c ); + cls_scope.attr(m_name) = m_address; + } + +private: + boost::uint32_t m_address; + const char* m_name; +}; + } /*pyplusplus*/ } /*convenience*/ namespace pyplus_conv = pyplusplus::convenience; Modified: pyplusplus_dev/unittests/data/member_variables_to_be_exported.cpp =================================================================== --- pyplusplus_dev/unittests/data/member_variables_to_be_exported.cpp 2008-07-17 04:31:02 UTC (rev 1373) +++ pyplusplus_dev/unittests/data/member_variables_to_be_exported.cpp 2008-07-21 20:16:53 UTC (rev 1374) @@ -5,7 +5,7 @@ #include "member_variables_to_be_exported.hpp" -namespace member_variables{ +namespace member_variables{ int point::instance_count = 0; const point::color point::default_color = point::red; @@ -28,17 +28,24 @@ std::auto_ptr<tree_node_t> root( new tree_node_t() ); root->data = new data_t(); root->data->value = 0; - + root->left = new tree_node_t( root.get() ); root->left->data = new data_t(); root->left->data->value = 1; - - return root; + + return root; } } -namespace statics{ +namespace statics{ std::string mem_var_str_t::class_name( "mem_var_str_t" ); } + + +namespace ctypes{ + int xxx = 1997; + int* image_t::none_image = &xxx; } + +} Modified: pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp 2008-07-17 04:31:02 UTC (rev 1373) +++ pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp 2008-07-21 20:16:53 UTC (rev 1374) @@ -160,6 +160,8 @@ } } int* data; + + static int* none_image; }; } Modified: pyplusplus_dev/unittests/member_variables_tester.py =================================================================== --- pyplusplus_dev/unittests/member_variables_tester.py 2008-07-17 04:31:02 UTC (rev 1373) +++ pyplusplus_dev/unittests/member_variables_tester.py 2008-07-21 20:16:53 UTC (rev 1374) @@ -24,6 +24,7 @@ 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 def change_default_color( self, module ): module.point.default_color = module.point.color.blue @@ -96,6 +97,9 @@ for j in range(5): print '%d : %d' % ( j, 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 ) def create_suite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-07-23 19:17:11
|
Revision: 1377 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1377&view=rev Author: roman_yakovenko Date: 2008-07-23 19:17:20 +0000 (Wed, 23 Jul 2008) Log Message: ----------- adding code which will automaticly exclude variables with type "Python immutable* [4]" Modified Paths: -------------- pyplusplus_dev/docs/documentation/www_configuration.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/pyplusplus/messages/warnings_.py Modified: pyplusplus_dev/docs/documentation/www_configuration.py =================================================================== --- pyplusplus_dev/docs/documentation/www_configuration.py 2008-07-22 18:55:08 UTC (rev 1376) +++ pyplusplus_dev/docs/documentation/www_configuration.py 2008-07-23 19:17:20 UTC (rev 1377) @@ -5,7 +5,8 @@ , 'how_to' : 'how to ... ?' , 'doc_string' : 'documentation string' , 'inserting_code' : 'inserting code' - , 'best_practices' : 'best practices' + , 'best_practices' : 'best practices' , 'multi_module_development' : 'multi-module development' , 'split_module' : 'splitting generated code to files' + , 'ctypes_integration' : 'ctypes integration' } Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2008-07-22 18:55:08 UTC (rev 1376) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2008-07-23 19:17:20 UTC (rev 1377) @@ -8,6 +8,7 @@ import decl_wrapper import python_traits import call_policies +import python_traits from pyplusplus import messages from pygccxml import declarations @@ -144,6 +145,8 @@ is_read_only = property( get_is_read_only, set_is_read_only ) def _exportable_impl( self ): + if self.name == 'f': + i = 0 if not self.name: return messages.W1033 if self.bits == 0 and self.name == "": @@ -172,4 +175,10 @@ if isinstance( self.parent, declarations.class_t ): if self.access_type != declarations.ACCESS_TYPES.PUBLIC: return messages.W1039 + if declarations.is_array( type_ ): + item_type = declarations.array_item_type( type_ ) + if declarations.is_pointer( item_type ): + item_type_no_ptr = declarations.remove_pointer( item_type ) + if python_traits.is_immutable( item_type_no_ptr ): + return messages.W1056 return '' Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-07-22 18:55:08 UTC (rev 1376) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-07-23 19:17:20 UTC (rev 1377) @@ -220,6 +220,8 @@ W1055 = warning( "Py++ will generate class wrapper - hand written code should be added to the wrapper class destructor body" ) +W1056 = compilation_error( "Py++ can not expose array of pointers of Python immutable types. Take a look on 'ctypes integration' feature." ) + warnings = globals() all_warning_msgs = [] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-07-23 20:40:51
|
Revision: 1378 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1378&view=rev Author: roman_yakovenko Date: 2008-07-23 20:40:56 +0000 (Wed, 23 Jul 2008) Log Message: ----------- adding from_address function transformation Modified Paths: -------------- pyplusplus_dev/pyplusplus/function_transformers/__init__.py pyplusplus_dev/pyplusplus/function_transformers/transformers.py Added Paths: ----------- pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp pyplusplus_dev/unittests/ft_from_address_tester.py Modified: pyplusplus_dev/pyplusplus/function_transformers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/__init__.py 2008-07-23 19:17:20 UTC (rev 1377) +++ pyplusplus_dev/pyplusplus/function_transformers/__init__.py 2008-07-23 20:40:56 UTC (rev 1378) @@ -59,3 +59,10 @@ def creator( function ): return transformers.transfer_ownership_t( function, *args, **keywd ) return creator + +def from_address( *args, **keywd ): + def creator( function ): + return transformers.from_address_t( function, *args, **keywd ) + return creator + + Modified: pyplusplus_dev/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2008-07-23 19:17:20 UTC (rev 1377) +++ pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2008-07-23 20:40:56 UTC (rev 1378) @@ -38,8 +38,8 @@ return declarations.remove_reference( type_ ) else: raise TypeError( 'Type should be reference or pointer, got %s.' % type_ ) - + # output_t class output_t( transformer.transformer_t ): """Handles a single output variable. @@ -61,7 +61,7 @@ """ self.arg = self.get_argument( arg_ref ) self.arg_index = self.function.arguments.index( self.arg ) - + if not is_ref_or_ptr( self.arg.type ): raise ValueError( '%s\nin order to use "output" transformation, argument %s type must be a reference or a pointer (got %s).' ) \ % ( function, self.arg_ref.name, arg.type) @@ -79,13 +79,13 @@ #declaring new variable, which will keep result var_name = controller.declare_variable( remove_ref_or_ptr( self.arg.type ), self.arg.name ) #adding just declared variable to the original function call expression - controller.modify_arg_expression( self.arg_index, var_name ) + controller.modify_arg_expression( self.arg_index, var_name ) #adding the variable to return variables list controller.return_variable( var_name ) def __configure_v_mem_fun_default( self, controller ): self.__configure_sealed( controller ) - + def __configure_v_mem_fun_override( self, controller ): controller.remove_py_arg( self.arg_index ) tmpl = string.Template( @@ -97,10 +97,10 @@ 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_default( controller.default_controller ) self.__configure_v_mem_fun_override( controller.override_controller ) @@ -108,14 +108,14 @@ # input_t class type_modifier_t(transformer.transformer_t): """Change/modify type of the argument. - + Right now compiler should be able to use implicit conversion """ def __init__(self, function, arg_ref, modifier): """Constructor. - modifier is callable, which take the type of the argument and should return + modifier is callable, which take the type of the argument and should return new type """ transformer.transformer_t.__init__( self, function ) @@ -132,23 +132,23 @@ if not declarations.is_convertible( w_arg.type, self.arg.type ): casting_code = 'reinterpret_cast< %s >( %s )' % ( self.arg.type, w_arg.name ) controller.modify_arg_expression(self.arg_index, casting_code) - + def __configure_v_mem_fun_default( self, controller ): self.__configure_sealed( controller ) 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_default( controller.default_controller ) + self.__configure_v_mem_fun_default( controller.default_controller ) def required_headers( self ): """Returns list of header files that transformer generated code depends on.""" return [] - + # input_t class input_t(type_modifier_t): """Handles a single input variable. @@ -175,6 +175,35 @@ def __str__(self): return "input(%s)"%(self.arg.name) +# input_t +class from_address_t(type_modifier_t): + """Handles a single input variable. + + Replaces the actual argument type with some integral type, so you + can use ctypes package. + + void do_smth(int** image) -> do_smth(unsigned int addressof_image) + + """ + + def __init__(self, function, arg_ref): + """Constructor. + + The specified argument must be a reference or a pointer. + + @param idx: Index of the argument that is an output value (the first arg has index 1). + @type idx: int + """ + modifier = lambda type_: declarations.FUNDAMENTAL_TYPES[ 'unsigned int' ] + type_modifier_t.__init__( self, function, arg_ref, modifier ) + + if not is_ptr_or_array( self.arg.type ): + raise ValueError( '%s\nin order to use "from_address_t" transformation, argument %s type must be a pointer or a array (got %s).' ) \ + % ( function, self.arg_ref.name, arg.type) + + def __str__(self): + return "from_address(%s)"%(self.arg.name) + # inout_t class inout_t(transformer.transformer_t): """Handles a single input/output variable. @@ -193,7 +222,7 @@ transformer.transformer_t.__init__( self, function ) self.arg = self.get_argument( arg_ref ) self.arg_index = self.function.arguments.index( self.arg ) - + if not is_ref_or_ptr( self.arg.type ): raise ValueError( '%s\nin order to use "inout" transformation, argument %s type must be a reference or a pointer (got %s).' ) \ % ( function, self.arg_ref.name, arg.type) @@ -206,10 +235,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" ) );' ) @@ -220,7 +249,7 @@ def configure_mem_fun( self, controller ): self.__configure_sealed( controller ) - + def configure_free_fun(self, controller ): self.__configure_sealed( controller ) @@ -241,7 +270,7 @@ 'pyplus_conv::ensure_uniform_sequence< $type >( $pylist );' , 'pyplus_conv::copy_sequence( $pylist, std::back_inserter( $native_array), boost::type< $type >() );'])) -_arr2seq = string.Template( +_arr2seq = string.Template( 'pyplus_conv::copy_container( $native_array, $native_array + $array_size, pyplus_conv::list_inserter( $pylist ) );' ) class input_static_array_t(transformer.transformer_t): @@ -258,10 +287,10 @@ @type size: int """ transformer.transformer_t.__init__( self, function ) - + self.arg = self.get_argument( arg_ref ) self.arg_index = self.function.arguments.index( self.arg ) - + if not is_ptr_or_array( self.arg.type ): raise ValueError( '%s\nin order to use "input_array" transformation, argument %s type must be a array or a pointer (got %s).' ) \ % ( function, self.arg.name, self.arg.type) @@ -285,41 +314,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 ) - + controller.add_pre_call_code( copy_pylist2arr ) - - controller.modify_arg_expression( self.arg_index, native_array ) + 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 ) - + # s - static class output_static_array_t(transformer.transformer_t): """Handles an output array of a fixed size. @@ -365,16 +394,16 @@ , '[%d]' % self.array_size ) #adding just declared variable to the original function call expression - controller.modify_arg_expression( self.arg_index, native_array ) + controller.modify_arg_expression( self.arg_index, native_array ) # Declare a Python list which will receive the output... pylist = controller.declare_variable( declarations.dummy_type_t( "boost::python::list" ) , 'py_' + self.arg.name ) - + copy_arr2pylist = _arr2seq.substitute( native_array=native_array , array_size=self.array_size , pylist=pylist ) - + controller.add_post_call_code( copy_arr2pylist ) #adding the variable to return variables list @@ -393,16 +422,16 @@ , 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 ) @@ -420,11 +449,11 @@ def __init__(self, function, buffer_arg_ref, size_arg_ref): """Constructor. - @param buffer_arg_ref: "reference" to the buffer argument + @param buffer_arg_ref: "reference" to the buffer argument @param buffer_arg_ref: "reference" to argument, which holds buffer size """ transformer.transformer_t.__init__( self, function ) - + self.buffer_arg = self.get_argument( buffer_arg_ref ) self.buffer_arg_index = self.function.arguments.index( self.buffer_arg ) @@ -453,56 +482,56 @@ global _seq2arr w_buffer_arg = controller.find_wrapper_arg( self.buffer_arg.name ) w_buffer_arg.type = declarations.dummy_type_t( "boost::python::object" ) - + controller.remove_wrapper_arg( self.size_arg.name ) - size_var = controller.declare_variable( + size_var = controller.declare_variable( declarations.remove_const( self.size_arg.type ) , self.size_arg.name , ' = boost::python::len(%s)' % w_buffer_arg.name ) - + # Declare a variable that will hold the C array... - buffer_var = controller.declare_variable( + buffer_var = controller.declare_variable( declarations.dummy_type_t( "std::vector< %s >" % self.buffer_item_type.decl_string ) , "native_" + self.buffer_arg.name ) controller.add_pre_call_code( '%s.reserve( %s );' % ( buffer_var, size_var ) ) - + copy_pylist2arr = _seq2vector.substitute( type=self.buffer_item_type , pylist=w_buffer_arg.name , native_array=buffer_var ) - + controller.add_pre_call_code( copy_pylist2arr ) - - controller.modify_arg_expression( self.buffer_arg_index, '&%s[0]' % buffer_var ) - controller.modify_arg_expression( self.size_arg_index, '%s' % size_var ) + controller.modify_arg_expression( self.buffer_arg_index, '&%s[0]' % buffer_var ) + controller.modify_arg_expression( self.size_arg_index, '%s' % size_var ) + def __configure_v_mem_fun_default( self, controller ): self.__configure_sealed( controller ) - + def __configure_v_mem_fun_override( self, controller ): raise NotImplementedError() #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 ) - + class transfer_ownership_t(type_modifier_t): """see http://boost.org/libs/python/doc/v2/faq.html#ownership """ @@ -524,13 +553,13 @@ naked_type = declarations.remove_declarated( naked_type ) w_arg.type = declarations.dummy_type_t( 'std::auto_ptr< %s >' % naked_type.decl_string ) controller.modify_arg_expression(self.arg_index, w_arg.name + '.release()' ) - + def __configure_v_mem_fun_default( self, controller ): self.__configure_sealed( controller ) def configure_mem_fun( self, controller ): self.__configure_sealed( controller ) - + def configure_free_fun(self, controller ): self.__configure_sealed( controller ) @@ -540,7 +569,7 @@ #TODO: FT for constructor #~ def configure_constructor( self, controller ): #~ self.__configure_sealed( controller ) - + def required_headers( self ): """Returns list of header files that transformer generated code depends on.""" return [] Added: pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp 2008-07-23 20:40:56 UTC (rev 1378) @@ -0,0 +1,25 @@ +// Copyright 2004 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_from_address_to_be_exported_hpp__ +#define __ft_from_address_to_be_exported_hpp__ + +#include <stdexcept> + +inline unsigned long +sum_matrix( unsigned int** matrix, unsigned int rows, unsigned int columns ){ + if( !matrix ){ + throw std::runtime_error( "matrix is null" ); + } + unsigned long result = 0; + for( unsigned int r = 0; r < rows; ++r ){ + for( unsigned int c = 0; c < columns; ++c ){ + result += matrix[r][c]; + } + } + return result; +} + +#endif//__ft_from_address_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/ft_from_address_tester.py =================================================================== --- pyplusplus_dev/unittests/ft_from_address_tester.py (rev 0) +++ pyplusplus_dev/unittests/ft_from_address_tester.py 2008-07-23 20:40:56 UTC (rev 1378) @@ -0,0 +1,58 @@ +# Copyright 2004 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 ctypes +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_from_address' + + 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 + mb.calldef( 'sum_matrix' ).add_transformation( ft.from_address(0) ) + + def run_tests(self, module): + rows = 1 + columns = 1 + matrix_type = ctypes.c_uint * columns * rows + print matrix_type + sum = 0 + counter = 0 + matrix = matrix_type() + for r in range( rows ): + for c in range( columns ): + matrix[r][c] = counter + sum += counter + counter += 1 + print 'matrix filled' + result = module.sum_matrix( ctypes.addressof( matrix ), rows, columns ) + print 'result: ', result + print 'sum : ', sum + +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() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-07-30 18:23:34
|
Revision: 1380 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1380&view=rev Author: roman_yakovenko Date: 2008-07-30 18:23:40 +0000 (Wed, 30 Jul 2008) Log Message: ----------- small bug fix in expose_address Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp pyplusplus_dev/unittests/ft_from_address_tester.py pyplusplus_dev/unittests/member_variables_tester.py Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-27 18:43:00 UTC (rev 1379) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-07-30 18:23:40 UTC (rev 1380) @@ -33,14 +33,22 @@ template< typename TType, typename TMemVarType > boost::uint32_t -addressof( const TType &inst, const TMemVarType TType::* offset){ +addressof( const TType* inst_ptr, const TMemVarType TType::* offset){ + if( !inst_ptr ){ + throw std::runtime_error( "unable to dereference null pointer" ); + } + const TType& inst = *inst_ptr; return boost::uint32_t( boost::addressof( inst.*offset ) ); } template< typename TType > boost::uint32_t -addressof_inst( const TType &inst){ - return boost::uint32_t( boost::addressof( inst ) ); +addressof_inst( const TType* inst_ptr){ + if( !inst_ptr ){ + throw std::runtime_error( "unable to dereference null pointer" ); + } + + return boost::uint32_t( inst_ptr ); } template< typename TType, typename TMemVarType > @@ -50,7 +58,7 @@ namespace pyppc = pyplusplus::convenience; return bpl::make_function( boost::bind( &pyppc::addressof< TType, TMemVarType >, _1, offset ) , bpl::default_call_policies() - , boost::mpl::vector< boost::uint32_t, const TType& >() ); + , boost::mpl::vector< boost::uint32_t, const TType* >() ); } template< typename TType > @@ -60,7 +68,7 @@ namespace pyppc = pyplusplus::convenience; return bpl::make_function( boost::bind( &pyppc::addressof_inst< TType >, _1 ) , bpl::default_call_policies() - , boost::mpl::vector< boost::uint32_t, const TType& >() ); + , boost::mpl::vector< boost::uint32_t, const TType* >() ); } class register_addressof_static_var : public boost::python::def_visitor<register_addressof_static_var> @@ -72,7 +80,7 @@ template< typename TVarType > register_addressof_static_var( const char* name, const TVarType& var ) : m_name( name ) - , m_address( addressof_inst( var ) ) + , m_address( addressof_inst( boost::addressof( var ) ) ) {} template <class classT> Modified: pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp 2008-07-27 18:43:00 UTC (rev 1379) +++ pyplusplus_dev/unittests/data/ft_from_address_to_be_exported.hpp 2008-07-30 18:23:40 UTC (rev 1380) @@ -23,4 +23,24 @@ return result; } +struct ptr_ptr_t{ + + ptr_ptr_t() + : value( new double( 5.9 ) ) + {} + + ~ptr_ptr_t(){ + delete value; + } + + void get_v_address( double** v ){ + if( !v ){ + throw std::runtime_error( "null pointer" ); + *v = value; + } + } + + double* value; +}; + #endif//__ft_from_address_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp 2008-07-27 18:43:00 UTC (rev 1379) +++ pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp 2008-07-30 18:23:40 UTC (rev 1380) @@ -163,6 +163,17 @@ static int* none_image; }; + + class Andy{ + protected: + Andy() : userData(NULL) {} + + virtual ~Andy() {} + + public: + void * userData; + }; + } } Modified: pyplusplus_dev/unittests/ft_from_address_tester.py =================================================================== --- pyplusplus_dev/unittests/ft_from_address_tester.py 2008-07-27 18:43:00 UTC (rev 1379) +++ pyplusplus_dev/unittests/ft_from_address_tester.py 2008-07-30 18:23:40 UTC (rev 1380) @@ -24,9 +24,11 @@ , *args ) def customize( self, mb ): - mb.global_ns.calldefs().create_with_signature = True mb.calldef( 'sum_matrix' ).add_transformation( ft.from_address(0) ) + ptr_ptr = mb.class_( 'ptr_ptr_t' ) + ptr_ptr.var( 'value' ).expose_address = True + ptr_ptr.mem_fun( 'get_v_address' ).add_transformation( ft.from_address(0 ) ) def run_tests(self, module): rows = 10 @@ -43,6 +45,16 @@ result = module.sum_matrix( ctypes.addressof( matrix ), rows, columns ) self.failUnless( result == sum ) + ptr = module.ptr_ptr_t() + double_ptr_type = ctypes.POINTER( ctypes.c_double ) + value = double_ptr_type.from_address( ptr.value ) + self.failUnless( value.contents.value == 5.9 ) + dd = double_ptr_type(ctypes.c_double(0.0) ) + print dir( ctypes.pointer( dd ).contents ) + ptr.get_v_address( ctypes.pointer( dd ).contents.value ) + print ptr.value + print dd.contents.value + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) Modified: pyplusplus_dev/unittests/member_variables_tester.py =================================================================== --- pyplusplus_dev/unittests/member_variables_tester.py 2008-07-27 18:43:00 UTC (rev 1379) +++ pyplusplus_dev/unittests/member_variables_tester.py 2008-07-30 18:23:40 UTC (rev 1380) @@ -25,6 +25,7 @@ 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 @@ -95,8 +96,8 @@ data_type = ctypes.POINTER( ctypes.c_int ) data = data_type.from_address( image.data ) for j in range(5): - print '%d : %d' % ( j, data[j] ) - + self.failUnless( j == 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 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-08-08 12:18:11
|
Revision: 1386 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1386&view=rev Author: roman_yakovenko Date: 2008-08-08 12:18:18 +0000 (Fri, 08 Aug 2008) Log Message: ----------- adding new features: exposing anonymous structs and anonymous unions, exposing variables, that has union as a type Modified Paths: -------------- pyplusplus_dev/docs/documentation/www_configuration.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/enumeration_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/pyplusplus/messages/warnings_.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp pyplusplus_dev/unittests/module_body_tester.py pyplusplus_dev/unittests/unnamed_classes_tester.py Added Paths: ----------- pyplusplus_dev/docs/documentation/ctypes/ pyplusplus_dev/unittests/data/unions_to_be_exported.hpp pyplusplus_dev/unittests/unions_tester.py Removed Paths: ------------- pyplusplus_dev/docs/documentation/ctypes_integration.rest Deleted: pyplusplus_dev/docs/documentation/ctypes_integration.rest =================================================================== --- pyplusplus_dev/docs/documentation/ctypes_integration.rest 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/docs/documentation/ctypes_integration.rest 2008-08-08 12:18:18 UTC (rev 1386) @@ -1,148 +0,0 @@ -================== -ctypes integration -================== - -.. contents:: Table of contents - ------------- -Introduction ------------- - -`Boost.Python`_ is really a very powerful library, but if you are working -with code written in plain "C" - you've got a problem. You have to create -wrappers for almost every function or variable. - -In general, if you want to work with plain "C" code from `Python`_ -you don't have to create any wrapper - you can use `ctypes`_ package. - -About ctypes ------------- -`ctypes`_ is a foreign function library for Python. It provides C -compatible data types, and allows to call functions in dlls/shared -libraries. It can be used to wrap these libraries in pure Python. - - - -The idea behind "ctypes integration" functionality is simple: you -configure `Py++`_ to expose address of the variables or return -values, as integer and than you can use `ctypes`_ `from_address`_ -functionality to access the data. - -Obviously, this approach has its price: - -* it could be very dangerous - you can corrupt your application memory - -* managing memory is not something a typical `Python`_ user get used to. - It is too "low level". - -In my opinion, the better way to go is to "mix": - -1. expose your native code using `Boost.Python`_ and "ctypes integration" - functionality - -2. use `ctypes`_ module to access your data - -3. create high level API: the wrappers, which will ensure the constraints - and will provide more "natural" interface - --------------- -Usage examples --------------- - -Variables ---------- - -Lets say you have the following C++ code: - - .. code-block:: C++ - - struct bytes_t{ - bytes_t(){ - data = new int[5]; - for(int i=0; i<5; i++){ - data[i] = i; - } - } - ... - int* data; - static int* x; - }; - - //somewhere in a cpp file - int* bytes_t::x = new int( 1997 ); - -In order to get access to the ``bytes_t::data`` and ``bytes_t::x`` you -have to turn on ``expose_address`` property to ``True``: - - .. code-block:: Python - - mb = module_builder_t( ... ) - bytes = mb.class_( 'bytes_t' ) - bytes.vars().expose_address = True - -`Py++`_ will generate code, which will expose the address of the variables. - -and now it is a time to show some `ctypes`_ magic: - - .. code-block:: Python - - import ctypes - import your_module as m - - bytes = m.bytes_t() - - data_type = ctypes.POINTER( ctypes.c_int ) - data = data_type.from_address( bytes.data ) - for j in range(5): - print '%d : %d' % ( j, data[j] ) - - data_type = ctypes.POINTER( ctypes.c_int ) - data = data_type.from_address( m.bytes_t.x ) - print x.contents.value - - -"this" pointer --------------- - -`Py++`_ can expose "this" pointer value to `Python`_: - - .. code-block:: Python - - mb = module_builder_t( ... ) - mb.class_( 'bytes_t' ).expose_this = True - -and the usage example: - - .. code-block:: Python - - import ctypes - import your_module as m - - print m.bytes_t().this - - -Warning: I hope you know what you are doing, otherwise don't blame me :-) - ------------------ -Future directions ------------------ - -The functionality is going to be developed father and I intend to add -next features: - -* to expose the result of "sizeof" applied on a class or variable - -* to add new call policy, which will return value of a pointer as integer - -* to port this functionality to 64bit systems - -* to add support for unions - -.. _`ctypes` : http://docs.python.org/lib/module-ctypes.html -.. _`from_address` : http://docs.python.org/lib/ctypes-data-types.html -.. _`Py++` : ./../pyplusplus.html -.. _`pygccxml` : ./../../pygccxml/pygccxml.html -.. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html -.. _`Python`: http://www.python.org -.. _`GCC-XML`: http://www.gccxml.org - Modified: pyplusplus_dev/docs/documentation/www_configuration.py =================================================================== --- pyplusplus_dev/docs/documentation/www_configuration.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/docs/documentation/www_configuration.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -8,5 +8,4 @@ , 'best_practices' : 'best practices' , 'multi_module_development' : 'multi-module development' , 'split_module' : 'splitting generated code to files' - , 'ctypes_integration' : 'ctypes integration' } Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -54,7 +54,7 @@ def _get_create_with_signature(self): if None is self._create_with_signature: self._create_with_signature = bool( self.overloads ) - + if not self._create_with_signature and declarations.templates.is_instantiation( self.name ): self._create_with_signature = True @@ -73,7 +73,7 @@ self._create_with_signature \ = bool( self.parent.calldefs( self.name, recursive=False, allow_empty=True ) ) return self._create_with_signature - + def _set_create_with_signature(self, create_with_signature): self._create_with_signature = create_with_signature create_with_signature = property( _get_create_with_signature, _set_create_with_signature @@ -159,6 +159,8 @@ return '' def _exportable_impl( self ): + if not self.parent.name: + return messages.W1057 % str( self ) all_types = [ arg.type for arg in self.arguments ] all_types.append( self.return_type ) for some_type in all_types: @@ -398,7 +400,7 @@ included = filter( lambda decl: decl.ignore == False, oper.class_types ) if not included: return messages.W1052 % str(oper) - + return '' class member_operator_t( declarations.member_operator_t, calldef_t ): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -370,10 +370,16 @@ def _exportable_impl( self ): if not self.name: - return messages.W1018 - #it is possible to do so, but not for unnamed classes defined under namespace. + named_parent = declarations.get_named_parent( self ) + if not named_parent: + return messages.W1057 % str( self ) + if isinstance( named_parent, declarations.namespace_t ): + return messages.W1018 % str( self ) if self.class_type == declarations.CLASS_TYPES.UNION: - return messages.W1054 + if self.is_wrapper_needed(): + return messages.W1059 % str( self ) + if self.name: + return messages.W1060 % str( self ) if isinstance( self.parent, declarations.namespace_t ): return '' if not self in self.parent.public_members: @@ -587,14 +593,7 @@ if isinstance( member, declarations.destructor_t ): continue if isinstance( member, declarations.variable_t ): - if member.bits: - explanation.append( messages.W1024 % member.name ) - if declarations.is_pointer( member.type ): - explanation.append( messages.W1025 % member.name ) - if declarations.is_reference( member.type ): - explanation.append( messages.W1026 % member.name ) - if declarations.is_array( member.type ): - explanation.append( messages.W1027 % member.name) + explanation.extend( member.is_wrapper_needed() ) if isinstance( member, declarations.class_t ) and member.is_wrapper_needed(): explanation.append( messages.W1028 % member.name) if isinstance( member, declarations.calldef_t ): @@ -636,3 +635,16 @@ self._expose_this = new_value expose_this = property( _get_expose_this, _set_expose_this , doc="boolean, if True an object address( this pointer ) will be exposed to Python as integer.") + + @property + def introduces_new_scope(self): + """returns True, if during exposing this class, new scope will be created + + For example, anonymous structs will be exposed in a parent scope. + """ + if not self.name: + return False + elif self.class_type == declarations.CLASS_TYPES.UNION: + return False + else: + return True Modified: pyplusplus_dev/pyplusplus/decl_wrappers/enumeration_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/enumeration_wrapper.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/decl_wrappers/enumeration_wrapper.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -75,3 +75,8 @@ if len( set( name2value.keys() ) ) != len( set( name2value.values() ) ): msgs.append( messages.W1032 ) return msgs + + def _exportable_impl( self ): + if not self.parent.name: + return messages.W1057 % str( self ) + return '' Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -23,7 +23,8 @@ self._is_read_only = None self._use_make_functions = None self._expose_address = None - + self._expose_value = None + __call_policies_doc__ = \ """There are usecase, when exporting member variable forces Py++ to create accessors functions. Sometime, those functions requires call policies. @@ -56,7 +57,7 @@ def get_setter_call_policies( self ): if None is self._getter_call_policies: if self.apply_smart_ptr_wa or self.use_make_functions: - self._setter_call_policies = call_policies.default_call_policies() + self._setter_call_policies = call_policies.default_call_policies() return self._setter_call_policies def set_setter_call_policies( self, call_policies ): self._setter_call_policies = call_policies @@ -65,15 +66,15 @@ __use_make_functions_doc__ = \ """Generate code using make_getter and make_setter functions - + Basically you don't need to use this, untill you have one of the next use-cases: * member variable is smart pointer - in this case Boost.Python has small problem to expose it right. Using the functions is a work around to the problem. * member variable defined custom r-value converter - may be you don't know - but the conversion is applied only on functions arguments. So you need to + but the conversion is applied only on functions arguments. So you need to use make_getter/make_setter in order to allow user to enjoy from the conversion. - + Setting "apply_smart_ptr_wa" and/or "use_make_functions" to "True" will tell Py++ to generate such code. """ @@ -92,32 +93,64 @@ use_make_functions = property( get_use_make_functions, set_use_make_functions , doc=__use_make_functions_doc__) + def __should_be_exposed_by_address_only(self): + type_ = declarations.remove_alias( self.type ) + type_ = declarations.remove_const( type_ ) + type_ = declarations.remove_pointer( type_ ) + if not declarations.class_traits.is_my_case( type_ ): + return False + cls = declarations.class_traits.get_declaration( type_ ) + if cls.class_type == declarations.CLASS_TYPES.UNION: + return True + elif not cls.name: + return True + else: + return False + __expose_address_doc__ = \ """There are some cases when Boost.Python doesn't provide a convenient way to expose the variable to Python. For example: - + double* x[10]; //or char* buffer; //in case you want to modify the buffer in place - - In this cases Py++ doesn't help too. In these cases it is possible to expose + + In this cases Py++ doesn't help too. In these cases it is possible to expose the actual address of the variable. After that, you can use built-in "ctypes" - package to edit the content of the variable. + package to edit the content of the variable. """ def get_expose_address( self ): + if None is self._expose_address: + self._expose_address = self.__should_be_exposed_by_address_only() return self._expose_address def set_expose_address( self, value ): self._expose_address = value expose_address = property( get_expose_address, set_expose_address , doc= __expose_address_doc__ ) - + __expose_value_doc__ = \ + """Boost.Python is not able to expose unions. Using ctypes module + it is possible to get access to the data stored in a variable, which + has some union type. + + This property controls whether Py++ should expose the variable value + or not. In case, this variable has type union, this property will be False. + """ + def get_expose_value( self ): + if None is self._expose_value: + self._expose_value = not self.__should_be_exposed_by_address_only() + return self._expose_value + def set_expose_value( self, value ): + self._expose_value = value + expose_value = property( get_expose_value, set_expose_value + , doc= __expose_value_doc__ ) + def __find_out_is_read_only(self): type_ = declarations.remove_alias( self.type ) - + if isinstance( type_, declarations.const_t ): return True - + if declarations.is_pointer( type_ ): type_ = declarations.remove_pointer( type_ ) @@ -126,16 +159,16 @@ if isinstance( type_, declarations.const_t ): return True - + if self.apply_smart_ptr_wa: return False #all smart pointers has assign operator - + if isinstance( type_, declarations.declarated_t ) \ and isinstance( type_.declaration, declarations.class_t ) \ and not declarations.has_public_assign( type_.declaration ): return True return False - + def get_is_read_only( self ): if None is self._is_read_only: self._is_read_only = self.__find_out_is_read_only() @@ -145,8 +178,9 @@ is_read_only = property( get_is_read_only, set_is_read_only ) def _exportable_impl( self ): - if self.name == 'f': - i = 0 + if not self.parent.name and self.is_wrapper_needed(): + #return messages.W1057 % str( self ) + return messages.W1058 % str( self ) if not self.name: return messages.W1033 if self.bits == 0 and self.name == "": @@ -172,6 +206,8 @@ cls = declarations.class_traits.get_declaration( type_ ) if not cls.name: return messages.W1038 + #if cls.class_type == declarations.CLASS_TYPES.UNION: + # return messages.W1061 % ( str( self ), str( cls ) ) if isinstance( self.parent, declarations.class_t ): if self.access_type != declarations.ACCESS_TYPES.PUBLIC: return messages.W1039 @@ -182,3 +218,19 @@ if python_traits.is_immutable( item_type_no_ptr ): return messages.W1056 return '' + + def is_wrapper_needed(self): + """returns an explanation( list of str ) why wrapper is needed. + + If wrapper is not needed than [] will be returned. + """ + explanation = [] + if self.bits: + explanation.append( messages.W1024 % self.name ) + if declarations.is_pointer( self.type ): + explanation.append( messages.W1025 % self.name ) + if declarations.is_reference( self.type ): + explanation.append( messages.W1026 % self.name ) + if declarations.is_array( self.type ): + explanation.append( messages.W1027 % self.name) + return explanation Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -99,11 +99,11 @@ W1016 = warning( 'Py++ does not exports non-const casting operators with user defined type as return value. ' - 'This could be change in future.' ) + 'This could be changed in future.' ) W1017 = compilation_error( "Py++ doesn't export non-public casting operators." ) -W1018 = compilation_error( 'Py++ can not expose unnamed classes.' ) +W1018 = compilation_error( 'Py++ can not expose anonymous class "%s", declared in a namespace.' ) W1019 = compilation_error( 'Py++ can not expose private class.' ) @@ -139,7 +139,7 @@ "http://boost.org/libs/python/todo.html#support-for-enums-with-duplicate-values . " "The quick work around is to add new class variable to the exported enum, from Python. " ) -W1033 = compilation_error( "Py++ can not expose unnamed variables" ) +W1033 = compilation_error( "Py++ can not expose anonymous variables" ) W1034 = compilation_error( "Py++ can not expose alignment bit." ) @@ -151,7 +151,7 @@ "Boost.Python library can not expose variables, which are pointer to function." " See http://www.boost.org/libs/python/doc/v2/faq.html#funcptr for more information." ) -W1038 = compilation_error( "Py++ can not expose variables of with unnamed type." ) +W1038 = compilation_error( "Py++ can not expose variables of with anonymous type." ) W1039 = compilation_error( "Py++ doesn't expose private or protected member variables." ) @@ -222,6 +222,21 @@ W1056 = compilation_error( "Py++ can not expose array of pointers of Python immutable types. Take a look on 'ctypes integration' feature." ) +W1057 = compilation_error( 'Py++ can not expose "%s" - it does not belong to named class.' ) + +W1058 = compilation_error( 'Py++ can not expose "%s" it belongs to anonymous class' + ' and requires additional code to expose.' + ' This could be changed in future.') + +W1059 = compilation_error( 'Py++ can not expose "%s" - it requires additional code to expose.' + ' This could be changed in future.') + +W1060 = compilation_error( 'Py++ can not expose "%s" - it has name, Py++ only exposes anonymous unions.' + ' This could be changed in future.') + +W1061 = compilation_error( 'Py++ can not expose "%s" - its type is "%s".' + ' This could be changed in future.') + warnings = globals() all_warning_msgs = [] Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -6,7 +6,7 @@ import os import sys import time - +import types import warnings from pygccxml import parser @@ -97,7 +97,7 @@ self.__registrations_code_head = [] self.__registrations_code_tail = [] - + @property def global_ns( self ): """reference to global namespace""" @@ -108,19 +108,19 @@ return self.__encoding def register_module_dependency( self, other_module_generated_code_dir ): - """``already_exposed`` solution is pretty good when you mix hand-written - modules with Py++ generated. It doesn't work/scale for "true" - multi-module development. This is exactly the reason why ``Py++``_ + """``already_exposed`` solution is pretty good when you mix hand-written + modules with Py++ generated. It doesn't work/scale for "true" + multi-module development. This is exactly the reason why ``Py++``_ offers "semi automatic" solution. - For every exposed module, ``Py++``_ generates "exposed_decl.pypp.txt" file. - This file contains the list of all parsed declarations and whether they - were included or excluded. Later, when you work on another module, you - can tell ``Py++``_ that the current module depends on the previously - generated one. ``Py++``_ will load "exposed_decl.pypp.txt" file and + For every exposed module, ``Py++``_ generates "exposed_decl.pypp.txt" file. + This file contains the list of all parsed declarations and whether they + were included or excluded. Later, when you work on another module, you + can tell ``Py++``_ that the current module depends on the previously + generated one. ``Py++``_ will load "exposed_decl.pypp.txt" file and update the declarations. """ - + db = utils.exposed_decls_db_t() db.load( other_module_generated_code_dir ) db.update_decls( self.global_ns ) @@ -305,6 +305,23 @@ else: self.__registrations_code_head.append( code ) + def add_constants( self, **keywds ): + """adds code that exposes some constants to Python. + + For example: + mb.add_constants( version='"1.2.3"' ) + or + mb.add_constants( **{ version:'"1.2.3"' } ) + will generate next code: + boost::python::scope().attr("version") = "1.2.3"; + """ + tmpl = 'boost::python::scope().attr("%(name)s") = %(value)s;' + for name, value in keywds.items(): + if not isinstance( value, types.StringTypes ): + value = str( value ) + self.add_registration_code( tmpl % dict( name=name, value=value) ) + + def __merge_user_code( self ): for code in self.__declarations_code_tail: self.code_creator.add_declaration_code( code, -1 ) @@ -365,24 +382,24 @@ This could speed-up code generation process by 10-15%. """ self.__merge_user_code() - - files_sum_repository = None + + files_sum_repository = None if use_files_sum_repository: cache_file = os.path.join( dir_name, self.code_creator.body.name + '.md5.sum' ) files_sum_repository = file_writers.cached_repository_t( cache_file ) - + written_files = [] if None is huge_classes: - written_files = file_writers.write_multiple_files( + written_files = file_writers.write_multiple_files( self.code_creator , dir_name , files_sum_repository=files_sum_repository , encoding=self.encoding) else: - written_files = file_writers.write_class_multiple_files( + written_files = file_writers.write_class_multiple_files( self.code_creator , dir_name - , huge_classes + , huge_classes , files_sum_repository=files_sum_repository , encoding=self.encoding) self.__work_on_unused_files( dir_name, written_files, on_unused_file_found ) @@ -411,18 +428,18 @@ This could speed-up code generation process by 10-15%. """ self.__merge_user_code() - - files_sum_repository = None + + files_sum_repository = None if use_files_sum_repository: cache_file = os.path.join( dir_name, self.code_creator.body.name + '.md5.sum' ) files_sum_repository = file_writers.cached_repository_t( cache_file ) - + written_files = file_writers.write_balanced_files( self.code_creator , dir_name , number_of_buckets=number_of_files , files_sum_repository=files_sum_repository , encoding=self.encoding) - + self.__work_on_unused_files( dir_name, written_files, on_unused_file_found ) return written_files @@ -470,7 +487,7 @@ , header_file=header_file , recursive=recursive) var = variable - + def variables( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None ): """Please see L{decl_wrappers.scopedef_t} class documentation""" return self.global_ns.variables( name=name @@ -480,7 +497,7 @@ , header_file=header_file , recursive=recursive) vars = variables - + def calldef( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): """Please see L{decl_wrappers.scopedef_t} class documentation""" return self.global_ns.calldef( name=name @@ -651,7 +668,7 @@ , header_file=header_file , recursive=recursive ) free_fun = free_function - + def free_functions( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): """Please see L{decl_wrappers.namespace_t} class documentation""" return self.global_ns.free_functions( name=name @@ -662,7 +679,7 @@ , header_file=header_file , recursive=recursive) free_funs = free_functions - + def free_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): """Please see L{decl_wrappers.namespace_t} class documentation""" return self.global_ns.free_operator( name=name Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -19,16 +19,6 @@ ACCESS_TYPES = declarations.ACCESS_TYPES VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES -#TODO: add print decl_wrapper.readme messages -#class Foo{ -# union { -# struct { -# float r,g,b,a; -# }; -# float val[4]; -# }; -# }; - class creator_t( declarations.decl_visitor_t ): """Creating code creators. @@ -561,7 +551,11 @@ exportable_members = self.curr_decl.get_exportable_members(sort_algorithms.sort) wrapper = None - cls_cc = code_creators.class_t( class_inst=self.curr_decl ) + cls_cc = None + if cls_decl.introduces_new_scope: + cls_cc = code_creators.class_t( class_inst=self.curr_decl ) + else: + cls_cc = self.curr_code_creator if self.curr_decl.is_wrapper_needed(): wrapper = code_creators.class_wrapper_t( declaration=self.curr_decl @@ -591,7 +585,8 @@ exposed = self.expose_overloaded_mem_fun_using_macro( cls_decl, cls_cc ) - cls_parent_cc.adopt_creator( cls_cc ) + if cls_decl.introduces_new_scope: + cls_parent_cc.adopt_creator( cls_cc ) self.curr_code_creator = cls_cc if cls_decl.expose_this: @@ -672,6 +667,9 @@ self.curr_code_creator.adopt_creator( creator_type(self.curr_decl) ) return + if not self.curr_decl.expose_value: + return + if declarations.is_array( self.curr_decl.type ): if self._register_array_1( self.curr_decl.type ): array_1_registrator = code_creators.array_1_registrator_t( array_type=self.curr_decl.type ) Modified: pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -6,7 +6,7 @@ """defines class, which informs user about used, but unexposed declarations""" import os -from pyplusplus import utils +from pyplusplus import utils from pyplusplus import messages from pygccxml import declarations from pyplusplus import decl_wrappers @@ -17,19 +17,19 @@ object.__init__( self ) self.__exported_decls = [] self.__logger = logger - + def add_exported( self, decl ): - self.__exported_decls.append( decl ) + self.__exported_decls.append( decl ) def __select_duplicate_aliases( self, decls ): duplicated = {} for decl in decls: if not duplicated.has_key( decl.alias ): duplicated[ decl.alias ] = set() - duplicated[ decl.alias ].add( decl ) + duplicated[ decl.alias ].add( decl ) for alias, buggy_decls in duplicated.items(): if 1 == len( buggy_decls ): - del duplicated[ alias ] + del duplicated[ alias ] return duplicated def __report_duplicate_aliases_impl( self, control_decl, duplicated ): @@ -39,7 +39,7 @@ warning = messages.W1047 % ( control_decl.alias , os.linesep.join( map( str, buggy_decls ) ) ) self.__logger.warn( "%s;%s" % ( control_decl, warning ) ) - + if isinstance( control_decl, declarations.class_t ): query = lambda i_decl: isinstance( i_decl, declarations.class_types ) \ and i_decl.ignore == False @@ -55,7 +55,7 @@ duplicated = self.__select_duplicate_aliases( decls ) for decl in decls: self.__report_duplicate_aliases_impl( decl, duplicated ) - + def __is_std_decl( self, decl ): #Every class under std should be exported by Boost.Python and\\or Py++ #Also this is not the case right now, I prefer to hide the warnings @@ -80,7 +80,7 @@ dependencies = filter( lambda d: d.access_type != declarations.ACCESS_TYPES.PRIVATE , dependencies ) return dependencies - + def __find_out_used_but_not_exported( self ): used_not_exported = [] exported_ids = set( map( lambda d: id( d ), self.__exported_decls ) ) @@ -97,10 +97,13 @@ if isinstance( depend_on_decl, declarations.class_types ): if depend_on_decl.opaque: continue + if isinstance( decl, declarations.variable_t ): + if not decl.expose_value: + continue if id( depend_on_decl ) not in exported_ids: report = messages.filter_disabled_msgs([messages.W1040], depend_on_decl.disabled_messaged ) if report: - used_not_exported.append( dependency ) + used_not_exported.append( dependency ) return used_not_exported def __group_by_unexposed( self, dependencies ): @@ -118,7 +121,7 @@ for dependency in dependencies: decls.append( os.linesep + ' ' + str( dependency.declaration ) ) return "%s;%s" % ( depend_on_decl, messages.W1040 % ''.join( decls ) ) - + def inform_user( self ): used_not_exported_decls = self.__find_out_used_but_not_exported() groups = self.__group_by_unexposed( used_not_exported_decls ) Added: pyplusplus_dev/unittests/data/unions_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/unions_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/unions_to_be_exported.hpp 2008-08-08 12:18:18 UTC (rev 1386) @@ -0,0 +1,35 @@ +namespace unions{ + +struct data_t{ + union actual_data_t{ + int i; + double d; + }; + actual_data_t data; + + double get_d() const{ return data.d; } + int get_i() const{ return data.i; } + + void set_d( double d ){ data.d = d; } + void set_i( int i ){ data.i = i; } +}; + +} + +namespace anonymous_unions{ + +struct data2_t{ + union{ + int i; + double d; + }; + + double get_d() const{ return d; } + int get_i() const{ return i; } + + void set_d( double _d ){ d = _d; } + void set_i( int _i ){ i = _i; } + +}; + +} Modified: pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp 2008-08-08 12:18:18 UTC (rev 1386) @@ -6,21 +6,21 @@ #ifndef __unnamed_enums_to_be_exported_hpp__ #define __unnamed_enums_to_be_exported_hpp__ -namespace unnamed_enums{ - -class color{ - union{ - struct { - float r,g,b,a; - }; - float val[4]; - }; -}; - -struct{ - int x; -} unnamed_struct_with_mem_var_x; +namespace unnamed_enums{ +struct color{ + union{ + struct { + float r,g,b,a; + }; + float val[4]; + }; +}; + +struct{ + int x; +} unnamed_struct_with_mem_var_x; + } #endif//__unnamed_enums_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/module_body_tester.py =================================================================== --- pyplusplus_dev/unittests/module_body_tester.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/unittests/module_body_tester.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -10,14 +10,14 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'module_body' - + 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 , *args ) - def customize(self, mb): + def customize(self, mb): item = mb.class_( 'item_t' ) item.include() item.add_declaration_code( "int get11( const mb::item_t& item ){ return 11;}" ) @@ -31,12 +31,14 @@ mb.build_code_creator( self.EXTENSION_NAME ) - def run_tests(self, module): + mb.add_constants( version='"0.0.0"') + + def run_tests(self, module): self.failUnless( 1 == module.get1() ) self.failUnless( 11 == module.item_t().get11() ) - + self.failUnless( "0.0.0" == module.version ) def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -44,4 +46,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() Added: pyplusplus_dev/unittests/unions_tester.py =================================================================== --- pyplusplus_dev/unittests/unions_tester.py (rev 0) +++ pyplusplus_dev/unittests/unions_tester.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -0,0 +1,53 @@ +# Copyright 2004 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 ctypes +import unittest +import fundamental_tester_base + +class actual_data_t( ctypes.Union ): + _fields_ = [( "i", ctypes.c_int ), ( 'd', ctypes.c_double )] + +#this is compilation test +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'unions' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def run_tests(self, module): + obj = module.data_t() + actual_data = actual_data_t.from_address( obj.data ) + obj.set_d( 4.0 ) + self.failUnless( actual_data.d == 4.0 ) + obj.set_i( 1977 ) + self.failUnless( actual_data.i == 1977 ) + actual_data.i = 18 + self.failUnless( obj.get_i() == 18 ) + actual_data.d = 12.12 + self.failUnless( obj.get_d() == 12.12 ) + + obj2 = module.data2_t() + obj2.set_d( 4.0 ) + self.failUnless( obj2.d == 4.0 ) + obj2.set_i( 1977 ) + self.failUnless( obj2.i == 1977 ) + + +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/unnamed_classes_tester.py =================================================================== --- pyplusplus_dev/unittests/unnamed_classes_tester.py 2008-08-08 10:51:47 UTC (rev 1385) +++ pyplusplus_dev/unittests/unnamed_classes_tester.py 2008-08-08 12:18:18 UTC (rev 1386) @@ -7,22 +7,24 @@ import sys import unittest import fundamental_tester_base -from pyplusplus import code_creators +from pygccxml import declarations +from pyplusplus import code_creators class unnamed_enums_tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'unnamed_classes' - + def __init__( self, *args ): - fundamental_tester_base.fundamental_tester_base_t.__init__( + fundamental_tester_base.fundamental_tester_base_t.__init__( self , unnamed_enums_tester_t.EXTENSION_NAME , *args ) - def run_tests(self, module): - pass - + def run_tests(self, module): + color = module.color() + r,g,b,a = color.r, color.g, color.b, color.a + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(unnamed_enums_tester_t)) return suite @@ -30,4 +32,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-08-08 14:32:00
|
Revision: 1387 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1387&view=rev Author: roman_yakovenko Date: 2008-08-08 14:32:06 +0000 (Fri, 08 Aug 2008) Log Message: ----------- adding new call policy, return_addressof, for better integration with ctypes Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_repository/call_policies.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py pyplusplus_dev/pyplusplus/module_builder/call_policies.py pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/pyplusplus/code_repository/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/call_policies.py 2008-08-08 12:18:18 UTC (rev 1386) +++ pyplusplus_dev/pyplusplus/code_repository/call_policies.py 2008-08-08 14:32:06 UTC (rev 1387) @@ -23,10 +23,13 @@ #define call_policies_pyplusplus_hpp__ #include "boost/python.hpp" +#include "boost/cstdint.hpp" #include "boost/mpl/int.hpp" #include "boost/function.hpp" +#include "boost/utility/addressof.hpp" +#include "boost/type_traits/is_same.hpp" #include "boost/python/object/class_detail.hpp" -#include "boost/type_traits/is_same.hpp" + namespace pyplusplus{ namespace call_policies{ namespace bpl = boost::python; @@ -37,19 +40,19 @@ template< typename T> static void deallocate_array(T*){} }; - + struct delete_{ template< typename T> static void deallocate_array(T* arr){ delete[] arr; } - }; - + }; + }/*memory_managers*/ namespace detail{ - + struct make_value_holder{ template <class T> @@ -62,7 +65,6 @@ return bpl::incref( p_value.ptr() ); } } - }; template <class R> @@ -72,25 +74,66 @@ # endif ; +struct make_addressof_holder{ + + template <class T> + static PyObject* execute(T* p){ + if (p == 0){ + return bpl::detail::none(); + } + else{ + boost::uint32_t addressof_p = reinterpret_cast< boost::uint32_t >( p ); + bpl::object p_address( addressof_p ); + return bpl::incref( p_address.ptr() ); + } + } + +}; + +template <class R> +struct return_addressof_value_requires_a_pointer_return_type +# if defined(__GNUC__) && __GNUC__ >= 3 || defined(__EDG__) +{} +# endif +; + + } //detail struct return_pointee_value{ template <class T> struct apply{ - + BOOST_STATIC_CONSTANT( bool, ok = boost::is_pointer<T>::value ); - + typedef typename boost::mpl::if_c< ok , bpl::to_python_indirect<T, detail::make_value_holder> , detail::return_pointee_value_requires_a_pointer_return_type<T> >::type type; - + }; }; +struct return_addressof{ + + template <class T> + struct apply{ + + BOOST_STATIC_CONSTANT( bool, ok = boost::is_pointer<T>::value ); + + typedef typename boost::mpl::if_c< + ok + , bpl::to_python_indirect<T, detail::make_addressof_holder> + , detail::return_addressof_value_requires_a_pointer_return_type<T> + >::type type; + + }; + +}; + template< typename CallPolicies, class T > bpl::object make_object( T x ){ //constructs object using CallPolicies result_converter @@ -131,7 +174,7 @@ BOOST_STATIC_CONSTANT( bool, ok = boost::is_pointer<T>::value ); typedef details::as_tuple_impl<size, MemoryManager, MakeObjectCallPolicies> type; }; - + }; } /*arrays*/ Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2008-08-08 12:18:18 UTC (rev 1386) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2008-08-08 14:32:06 UTC (rev 1387) @@ -60,6 +60,7 @@ from call_policies import return_opaque_pointer from call_policies import return_value_policy from call_policies import return_pointee_value +from call_policies import return_addressof from call_policies import is_return_opaque_pointer_policy from call_policies import custom_call_policies_t from call_policies import custom_call_policies Modified: pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2008-08-08 12:18:18 UTC (rev 1386) +++ pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2008-08-08 14:32:06 UTC (rev 1387) @@ -195,7 +195,7 @@ return [ str( self.custodian ), str( self.ward ) ] def with_custodian_and_ward( custodian, ward, base=None): - """create boost::python::with_custodian_and_ward call policies code generator""" + """create boost::python::with_custodian_and_ward call policies code generator""" return with_custodian_and_ward_t( custodian, ward, base ) class with_custodian_and_ward_postcall_t( with_custodian_and_ward_t ): @@ -207,11 +207,11 @@ return '::boost::python::with_custodian_and_ward_postcall' def with_custodian_and_ward_postcall( custodian, ward, base=None): - """create boost::python::with_custodian_and_ward_postcall call policies code generator""" + """create boost::python::with_custodian_and_ward_postcall call policies code generator""" return with_custodian_and_ward_postcall_t( custodian, ward, base ) class return_value_policy_t( compound_policy_t ): - """implements code generation for boost::python::return_value_policy call policies""" + """implements code generation for boost::python::return_value_policy call policies""" def __init__( self, result_converter_generator, base=None): compound_policy_t.__init__( self, base ) self._result_converter_generator = result_converter_generator @@ -235,12 +235,13 @@ def is_predefined( self ): """Returns True if call policy is defined in Boost.Python library, False otherwise""" + global return_addressof global return_pointee_value - if self.result_converter_generator == return_pointee_value: + if self.result_converter_generator in (return_pointee_value, return_addressof ): return False else: return True - + @property def header_file(self): """Return name of the header file to be included""" @@ -257,9 +258,10 @@ return_by_value = '::boost::python::return_by_value' return_opaque_pointer = '::boost::python::return_opaque_pointer' return_pointee_value = '::pyplusplus::call_policies::return_pointee_value' +return_addressof = '::pyplusplus::call_policies::return_addressof' def return_value_policy( result_converter_generator, base=None): - """create boost::python::return_value_policy call policies code generator""" + """create boost::python::return_value_policy call policies code generator""" return return_value_policy_t( result_converter_generator, base ) def is_return_opaque_pointer_policy( policy ): @@ -293,13 +295,13 @@ class memory_managers: """implements code generation for Py++ defined memory managers - - For complete documentation and usage example see http://language-binding.net/pyplusplus/documentation/functions/call_policies.html + + For complete documentation and usage example see http://language-binding.net/pyplusplus/documentation/functions/call_policies.html """ none = 'none' delete_ = 'delete_' all = [ none, delete_ ] - + @staticmethod def create( manager, function_creator=None): mem_manager = 'pyplusplus::call_policies::memory_managers::' + manager @@ -309,7 +311,7 @@ class convert_array_to_tuple_t( compound_policy_t ): """implements code generation for Py++ defined "as_tuple" value policy - + For complete documentation and usage example see http://language-binding.net/pyplusplus/documentation/functions/call_policies.html """ def __init__( self, array_size, memory_manager, make_object_call_policies=None, base=None): @@ -317,7 +319,7 @@ self._array_size = array_size self._memory_manager = memory_manager self._make_objec_call_policies = make_object_call_policies - + def is_predefined( self ): """Returns True if call policy is defined in Boost.Python library, False otherwise""" return False @@ -359,14 +361,14 @@ if function_creator: as_tuple = algorithm.create_identifier( function_creator, as_tuple ) return [ declarations.templates.join( as_tuple, as_tuple_args ) ] - + def convert_array_to_tuple( array_size, memory_manager, make_object_call_policies=None, base=None ): - """create boost::python::return_value_policy< py++::as_tuple > call policies code generator""" + """create boost::python::return_value_policy< py++::as_tuple > call policies code generator""" return convert_array_to_tuple_t( array_size, memory_manager, make_object_call_policies, base ) class return_range_t( call_policy_t ): """implements code generation for Py++ defined "return_range" call policies - + For complete documentation and usage example see http://language-binding.net/pyplusplus/documentation/functions/call_policies.html """ HEADER_FILE = "__return_range.pypp.hpp" @@ -409,14 +411,14 @@ if not self.value_policies.is_default(): args.append( self.value_policies.create_type() ) return declarations.templates.join( name, args ) - + def return_range( function, get_size_class, value_policies=None ): - """create Py++ defined return_range call policies code generator""" + """create Py++ defined return_range call policies code generator""" r_type = function.return_type if not declarations.is_pointer( r_type ): raise TypeError( 'Function "%s" return type should be pointer, got "%s"' % r_type.decl_string ) - + value_type = declarations.remove_pointer( r_type ) if None is value_policies: if python_traits.is_immutable( value_type ): @@ -424,4 +426,4 @@ else: raise RuntimeError( "return_range call policies requieres specification of value_policies" ) return return_range_t( get_size_class, value_type, value_policies ) - + Modified: pyplusplus_dev/pyplusplus/module_builder/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/call_policies.py 2008-08-08 12:18:18 UTC (rev 1386) +++ pyplusplus_dev/pyplusplus/module_builder/call_policies.py 2008-08-08 14:32:06 UTC (rev 1387) @@ -18,6 +18,7 @@ from pyplusplus.decl_wrappers import return_opaque_pointer from pyplusplus.decl_wrappers import return_value_policy from pyplusplus.decl_wrappers import return_pointee_value +from pyplusplus.decl_wrappers import return_addressof from pyplusplus.decl_wrappers import custom_call_policies from pyplusplus.decl_wrappers import convert_array_to_tuple from pyplusplus.decl_wrappers import memory_managers Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2008-08-08 12:18:18 UTC (rev 1386) +++ pyplusplus_dev/unittests/test_all.py 2008-08-08 14:32:06 UTC (rev 1387) @@ -105,6 +105,8 @@ import inner_tmpl_class_tester import bug_covariant_returns_tester import embeded_tester +import unions_tester +import cp_return_addressof_tester #import ogre_generate_tester testers = [ @@ -198,6 +200,8 @@ , inner_tmpl_class_tester , bug_covariant_returns_tester , embeded_tester + , unions_tester + , cp_return_addressof_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. |
From: <rom...@us...> - 2008-08-08 17:44:24
|
Revision: 1388 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1388&view=rev Author: roman_yakovenko Date: 2008-08-08 17:44:27 +0000 (Fri, 08 Aug 2008) Log Message: ----------- adding sizeof and some documentation Modified Paths: -------------- pyplusplus_dev/docs/documentation/functions/call_policies.rest pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/classes_tester.py pyplusplus_dev/unittests/data/classes_to_be_exported.hpp Added Paths: ----------- pyplusplus_dev/docs/documentation/ctypes/ctypes_integration.rest pyplusplus_dev/docs/documentation/ctypes/this_and_sizeof.rest pyplusplus_dev/docs/documentation/ctypes/unions.rest pyplusplus_dev/docs/documentation/ctypes/variables.rest pyplusplus_dev/docs/documentation/ctypes/www_configuration.py Added: pyplusplus_dev/docs/documentation/ctypes/ctypes_integration.rest =================================================================== --- pyplusplus_dev/docs/documentation/ctypes/ctypes_integration.rest (rev 0) +++ pyplusplus_dev/docs/documentation/ctypes/ctypes_integration.rest 2008-08-08 17:44:27 UTC (rev 1388) @@ -0,0 +1,94 @@ +================== +ctypes integration +================== + +.. contents:: Table of contents + +------------ +Introduction +------------ + +`Boost.Python`_ is really a very powerful library, but if you are working +with code written in plain "C" - you've got a problem. You have to create +wrappers for almost every function or variable. + +In general, if you want to work with plain "C" code from `Python`_ +you don't have to create any wrapper - you can use `ctypes`_ package. + +About ctypes +------------ +`ctypes`_ is a foreign function library for Python. It provides C +compatible data types, and allows to call functions in dlls/shared +libraries. It can be used to wrap these libraries in pure Python. + + +-------- +The idea +-------- + +The idea behind "ctypes integration" functionality is really simple: you +configure `Py++`_ to expose address of the variable\\return value, and than you +you use `ctypes`_ `from_address`_ functionality to access and modify the data. + +Obviously, this approach has pros and cons: + +* cons - it could be very dangerous - you can corrupt your application memory + +* cons - managing memory is not something a typical `Python`_ user get used to. + It is too "low level". + +* pros - you don't need to create wrapper in C++ + +* pros - a Python user has access to the data + +* pros - compilation time is smaller + +* pros - you still can create wrapper, but using `Python`_ + + +In my opinion, the better way to go is to "mix": + +1. expose your native code using `Boost.Python`_ and "ctypes integration" + functionality - it is easy and cheap + +2. use `ctypes`_ module to access your data + +3. create high level API in Python: the wrappers, which will ensure the + constraints and will provide more "natural" interface + +------------------------- +Implemented functionality +------------------------- + +`Py++`_ is able to + +* expose global and member variable address + +* expose "this" pointer value + +* expose a class "sizeof" + +* expose variable, which has a union type + +* return address of return value as integer - `new call policy was created`_ + +----------------- +Future directions +----------------- + +The functionality is going to be developed father and I intend to add +next features: + +* to port this functionality to 64bit systems + +* to add ability to expose "C" functions without using `Boost.Python`_. + +.. _`new call policy was created` : ./../../documentation/functions/call_policies.html#return-addressof +.. _`ctypes` : http://docs.python.org/lib/module-ctypes.html +.. _`from_address` : http://docs.python.org/lib/ctypes-data-types.html +.. _`Py++` : ./../../pyplusplus.html +.. _`pygccxml` : ./../../../pygccxml/pygccxml.html +.. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html +.. _`Python`: http://www.python.org +.. _`GCC-XML`: http://www.gccxml.org + Added: pyplusplus_dev/docs/documentation/ctypes/this_and_sizeof.rest =================================================================== --- pyplusplus_dev/docs/documentation/ctypes/this_and_sizeof.rest (rev 0) +++ pyplusplus_dev/docs/documentation/ctypes/this_and_sizeof.rest 2008-08-08 17:44:27 UTC (rev 1388) @@ -0,0 +1,47 @@ +============= +this & sizeof +============= + +.. contents:: Table of contents + +----------- +The purpose +----------- + +`Py++`_ can expose a class ``sizeof`` and ``this`` pointer value to `Python`_. +I created this functionality without special purpose in mind. + +------- +Example +------- + + .. code-block:: Python + + mb = module_builder_t( ... ) + cls = mb.class_( <your class> ) + cls.expose_this = True + cls.expose_sizeof = True + +The `Python`_ class will contain two properties ``this`` and ``sizeof``. The usage +is pretty simple: + + .. code-block:: Python + + import ctypes + import <your module> import <your class> as data_t + + d = data_t() + print d.this + print d.sizeof + + +Warning: I hope you know what you are doing, otherwise don't blame me :-) + +.. _`ctypes` : http://docs.python.org/lib/module-ctypes.html +.. _`from_address` : http://docs.python.org/lib/ctypes-data-types.html +.. _`Py++` : ./../../pyplusplus.html +.. _`pygccxml` : ./../../../pygccxml/pygccxml.html +.. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html +.. _`Python`: http://www.python.org +.. _`GCC-XML`: http://www.gccxml.org + Added: pyplusplus_dev/docs/documentation/ctypes/unions.rest =================================================================== --- pyplusplus_dev/docs/documentation/ctypes/unions.rest (rev 0) +++ pyplusplus_dev/docs/documentation/ctypes/unions.rest 2008-08-08 17:44:27 UTC (rev 1388) @@ -0,0 +1,75 @@ +========= +C++ union +========= + +.. contents:: Table of contents + +------------ +Introduction +------------ + +`Boost.Python`_ does not help you to expose a variable, which has a union type. +In this document, I am going to show you a complete example how to get access +to the data, stored in the variable. + +`Py++`_ will not expose a union - it is impossible using `Boost.Python`_, +instead it will expose the address of the variable and the rest is done from the +`Python`_ using `ctypes`_ package. + +-------- +Example +-------- + +For this example I am going to use next code: + + .. code-block:: C++ + + struct data_t{ + union actual_data_t{ + int i; + double d; + }; + actual_data_t data; + }; + +As in many other cases, `Py++`_ does the job automatically: + + .. code-block:: Python + + mb = module_builder_t( ... ) + mb.class_( 'data_t' ).include() + +no special code, to achieve the desired result, was written. + +The generated code is boring, so I will skip it and will continue to the usage +example: + + .. code-block:: Python + + import ctypes + import <your module> import data_t + + #lets define our union + class actual_data_t( ctypes.Union ): + _fields_ = [( "i", ctypes.c_int ), ( 'd', ctypes.c_double )] + + obj = data_t() + actual_data = actual_data_t.from_address( obj.data ) + #you can set\get data + actual_data.i = 18 + prit actual_data.i + actual_data.d = 12.12 + print actual_data.d + +That's all. Everything should work fine. You can add few getters and setters to +class ``data_t``, so you could verify the results. I did this for a tester, that +checks this functionality. + +.. _`ctypes` : http://docs.python.org/lib/module-ctypes.html +.. _`from_address` : http://docs.python.org/lib/ctypes-data-types.html +.. _`Py++` : ./../../pyplusplus.html +.. _`pygccxml` : ./../../../pygccxml/pygccxml.html +.. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html +.. _`Python`: http://www.python.org +.. _`GCC-XML`: http://www.gccxml.org + Added: pyplusplus_dev/docs/documentation/ctypes/variables.rest =================================================================== --- pyplusplus_dev/docs/documentation/ctypes/variables.rest (rev 0) +++ pyplusplus_dev/docs/documentation/ctypes/variables.rest 2008-08-08 17:44:27 UTC (rev 1388) @@ -0,0 +1,78 @@ +========= +Variables +========= + +.. contents:: Table of contents + +-------------- +expose_address +-------------- + +``variable_t`` declarations have got new property ``expose_address``. If you set +it value to ``True``, `Py++`_ will register new property with the same name, but +the type of it will be ``unsigned int`` and the value is address of the variable. + +`Py++`_ will take care and generate the right code for global, static and member +variables. + +---------------- +Show me the code +---------------- + +Lets say you have the following C++ code: + + .. code-block:: C++ + + struct bytes_t{ + bytes_t(){ + data = new int[5]; + for(int i=0; i<5; i++){ + data[i] = i; + } + } + ... + int* data; + static int* x; + }; + + //somewhere in a cpp file + int* bytes_t::x = new int( 1997 ); + +In order to get access to the ``bytes_t::data`` and ``bytes_t::x`` you +have to turn on ``expose_address`` property to ``True``: + + .. code-block:: Python + + mb = module_builder_t( ... ) + bytes = mb.class_( 'bytes_t' ) + bytes.vars().expose_address = True + +`Py++`_ will generate code, which will expose the address of the variables. + +and now it is a time to show some `ctypes`_ magic: + + .. code-block:: Python + + import ctypes + import your_module as m + + bytes = m.bytes_t() + + data_type = ctypes.POINTER( ctypes.c_int ) + data = data_type.from_address( bytes.data ) + for j in range(5): + print '%d : %d' % ( j, data[j] ) + + data_type = ctypes.POINTER( ctypes.c_int ) + data = data_type.from_address( m.bytes_t.x ) + print x.contents.value + + +.. _`ctypes` : http://docs.python.org/lib/module-ctypes.html +.. _`from_address` : http://docs.python.org/lib/ctypes-data-types.html +.. _`Py++` : ./../../pyplusplus.html +.. _`pygccxml` : ./../../../pygccxml/pygccxml.html +.. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html +.. _`Python`: http://www.python.org +.. _`GCC-XML`: http://www.gccxml.org + Added: pyplusplus_dev/docs/documentation/ctypes/www_configuration.py =================================================================== --- pyplusplus_dev/docs/documentation/ctypes/www_configuration.py (rev 0) +++ pyplusplus_dev/docs/documentation/ctypes/www_configuration.py 2008-08-08 17:44:27 UTC (rev 1388) @@ -0,0 +1,6 @@ +name = 'ctypes integration' +main_html_file = 'ctypes_integration.html' + +names = { 'ctypes_integration' : 'ctypes integration' + , 'this_and_sizeof' : 'this & sizeof'} + Modified: pyplusplus_dev/docs/documentation/functions/call_policies.rest =================================================================== --- pyplusplus_dev/docs/documentation/functions/call_policies.rest 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/docs/documentation/functions/call_policies.rest 2008-08-08 17:44:27 UTC (rev 1388) @@ -209,6 +209,57 @@ mb.free_function( ... ).call_policies \ = call_policies.custom_call_policies( your call policies code, "xyz.hpp" ) +return_addressof +---------------- + +Class ``return_addressof`` is a model of `ResultConverterGenerator`_ which +can be used to wrap C++ functions returning any pointer, such that the pointer +value is converted to ``unsigned int`` and it is copied into a new Python object. + +This call policy was created to be used with ``ctypes`` package and provide access +to some raw\\low level data, without creating wrappers. + +Pay attention: you have to manage the memory by your own. + +Example +~~~~~~~ + +.. code-block:: C++ + + int* get_value(){ + static int buffer[] = { 0,1,2,3,4 }; + return buffer; + } + + namespace bpl = boost::python; + BOOST_PYTHON_MODULE(my_module){ + def( "get_value" + , bpl::return_value_policy< pyplusplus::call_policies::return_addressof<> >() ); + } + +The `Py++`_ code is not that different from what you already know: + +.. code-block:: Python + + from pyplusplus import module_builder + from pyplusplus.module_builder import call_policies + + mb = module_builder.module_builder_t( ... ) + mb.free_function( return_type='float *' ).call_policies \ + = call_policies.return_value_policy( call_policies.return_addressof ) + +Python code: + +.. code-block:: Python + + import ctypes + import my_module + + buffer_type = ctypes.c_int * 5 + buffer = buffer_type.from_address( my_module.get_value() ) + assert [0,1,2,3,4] == list( buffer ) + + return_pointee_value -------------------- Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-08-08 17:44:27 UTC (rev 1388) @@ -137,3 +137,4 @@ from properties import property_t from ctypes_integration_creators import expose_this_t +from ctypes_integration_creators import expose_sizeof_t Modified: pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_integration_creators.py 2008-08-08 17:44:27 UTC (rev 1388) @@ -37,3 +37,19 @@ def _get_system_headers_impl( self ): return [code_repository.ctypes_integration.file_name] + +class expose_sizeof_t( registration_based.registration_based_t + , declaration_based.declaration_based_t ): + """ + creates code that expose address of the object to Python + """ + + def __init__(self, class_ ): + registration_based.registration_based_t.__init__( self ) + declaration_based.declaration_based_t.__init__( self, declaration=class_) + + def _create_impl(self): + return 'def( pyplus_conv::register_sizeof( boost::type< %s >() ) )' % self.decl_identifier + + def _get_system_headers_impl( self ): + return [code_repository.ctypes_integration.file_name] Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-08-08 17:44:27 UTC (rev 1388) @@ -26,6 +26,7 @@ #include "boost/mpl/vector.hpp" #include "boost/function.hpp" #include "boost/cstdint.hpp" +#include "boost/type.hpp" #include "boost/bind.hpp" @@ -94,6 +95,29 @@ const char* m_name; }; + +class register_sizeof : public boost::python::def_visitor<register_sizeof> +{ + friend class boost::python::def_visitor_access; + +public: + + template< typename TType > + register_sizeof( boost::type< TType > ) + : m_sizeof( sizeof( TType ) ) + {} + + template <class classT> + void visit(classT& c) const{ + boost::python::scope cls_scope( c ); + cls_scope.attr("sizeof") = m_sizeof; + } + +private: + size_t m_sizeof; +}; + + } /*pyplusplus*/ } /*convenience*/ namespace pyplus_conv = pyplusplus::convenience; Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-08 17:44:27 UTC (rev 1388) @@ -191,6 +191,7 @@ self._require_self_reference = False self._exposed_class_type = self.EXPOSED_CLASS_TYPE.DECLARED self._expose_this = None + self._expose_sizeof = None def _get_redefine_operators( self ): return self._redefine_operators @@ -636,6 +637,13 @@ expose_this = property( _get_expose_this, _set_expose_this , doc="boolean, if True an object address( this pointer ) will be exposed to Python as integer.") + def _get_expose_sizeof( self ): + return self._expose_sizeof + def _set_expose_sizeof( self, new_value ): + self._expose_sizeof = new_value + expose_sizeof = property( _get_expose_sizeof, _set_expose_sizeof + , doc="boolean, if True the sizeof(obj) will be exposed to Python as integer.") + @property def introduces_new_scope(self): """returns True, if during exposing this class, new scope will be created Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-08 17:44:27 UTC (rev 1388) @@ -592,6 +592,9 @@ if cls_decl.expose_this: cls_cc.adopt_creator( code_creators.expose_this_t( cls_decl ) ) + if cls_decl.expose_sizeof: + cls_cc.adopt_creator( code_creators.expose_sizeof_t( cls_decl ) ) + for decl in exportable_members: if decl in exposed: continue Modified: pyplusplus_dev/unittests/classes_tester.py =================================================================== --- pyplusplus_dev/unittests/classes_tester.py 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/unittests/classes_tester.py 2008-08-08 17:44:27 UTC (rev 1388) @@ -19,6 +19,7 @@ def customize(self, mb ): mb.classes().expose_this = True + mb.classes().expose_sizeof = True mb.class_( 'fundamental2' ).alias = 'FUNDAMENTAL2' apple = mb.class_( 'apple' ) self.failUnless( apple.alias == 'the_tastest_fruit' ) @@ -53,6 +54,7 @@ self.failUnless( -24 == module.protected_static_t().invert_sign(24) ) self.failUnless( 67 == module.protected_static_t().invert_sign(-67) ) self.failUnless( module.protected_static_t().this ) + self.failUnless( module.protected_static_t().sizeof ) def create_suite(): suite = unittest.TestSuite() Modified: pyplusplus_dev/unittests/data/classes_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/classes_to_be_exported.hpp 2008-08-08 14:32:06 UTC (rev 1387) +++ pyplusplus_dev/unittests/data/classes_to_be_exported.hpp 2008-08-08 17:44:27 UTC (rev 1388) @@ -38,7 +38,7 @@ namespace abstracts{ class abstract{ -public: +public: abstract(){} abstract(int){} abstract(int, double, const abstract&){} @@ -48,13 +48,13 @@ virtual bool overloaded_virtual(){ return true;} virtual bool overloaded_virtual(int){ return true;} - + virtual int overloaded_pure_virtual(int) const = 0; virtual void overloaded_pure_virtual(double) const = 0; - + virtual int some_virtual(){ return 1; } -}; - +}; + } namespace constructors{ @@ -64,11 +64,11 @@ constructor1( const constructor1& ){} constructor1(int x, int y){} constructor1(int y, const constructor1& x ){} - + constructor1( const double ){} struct internal_data{}; constructor1( const internal_data ){} -}; +}; } @@ -76,15 +76,17 @@ struct scope_based_exposer{ enum EColor{ red, green, blue }; scope_based_exposer(EColor c=blue){} -}; +}; } namespace protected_static{ class protected_static_t{ protected: static int identity(int x){ return x; } - + int invert_sign(int x){ return -1*x; } +private: + int i; }; }; @@ -104,15 +106,15 @@ }; }; -}//classes +}//classes namespace pyplusplus{ namespace aliases{ - + typedef classes::hierarchical::apple the_tastest_fruit; - + typedef classes::protected_static::protected_static_t PROTECTED_STATIC_T_1; typedef classes::protected_static::protected_static_t PROTECTED_STATIC_T_2; - + }} #endif//__classes_to_be_exported_hpp__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-08-13 19:45:24
|
Revision: 1392 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1392&view=rev Author: roman_yakovenko Date: 2008-08-13 19:45:24 +0000 (Wed, 13 Aug 2008) Log Message: ----------- adding make_constructor functionality Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/cp_return_addressof_tester.py pyplusplus_dev/unittests/data/cp_return_addressof_to_be_exported.hpp pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp pyplusplus_dev/unittests/make_constructor_tester.py Property Changed: ---------------- pyplusplus_dev/unittests/data/ Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-08-12 04:30:53 UTC (rev 1391) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-08-13 19:45:24 UTC (rev 1392) @@ -44,6 +44,7 @@ from calldef import free_function_t from calldef import mem_fun_t +from calldef import make_constructor_t from calldef import mem_fun_pv_t from calldef import mem_fun_pv_wrapper_t Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2008-08-12 04:30:53 UTC (rev 1391) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2008-08-13 19:45:24 UTC (rev 1392) @@ -51,10 +51,12 @@ arg_utils = calldef_utils.argument_utils_t( self.declaration, algorithm.make_id_creator( self ) ) return arg_utils.keywords_args() - def create_call_policies( self ): - if self.declaration.call_policies.is_default(): + def create_call_policies( self, default_generates_code_too=False ): + if False == default_generates_code_too \ + and self.declaration.call_policies.is_default(): return '' - return self.declaration.call_policies.create( self ) + else: + return self.declaration.call_policies.create( self ) def create_def_code( self ): if not self.works_on_instance: @@ -221,6 +223,81 @@ else: return '&%s' % fname +class make_constructor_t( calldef_t ): + def __init__( self, function ): + calldef_t.__init__( self, function=function ) + + def make_cnstr_identifier( self ): + return algorithm.create_identifier( self, '::boost::python::make_constructor' ) + + def create_function_type_alias_code( self, exported_class_alias=None ): + ftype = self.declaration.function_type() + return 'typedef %s;' % ftype.create_typedef( self.function_type_alias, exported_class_alias, with_defaults=False ) + + def create_function_ref_code(self, use_function_alias=False): + fname = declarations.full_name( self.declaration, with_defaults=False ) + if use_function_alias: + return '%s( &%s )' % ( self.function_type_alias, fname ) + elif self.declaration.create_with_signature: + return '(%s)( &%s )' % ( self.declaration.function_type().partial_decl_string, fname ) + else: + return '&%s' % fname + + def _create_impl( self ): + if self.declaration.already_exposed: + return '' + + result = [] + + if not self.works_on_instance: + result.append( self.create_function_type_alias_code() ) + result.append( os.linesep * 2 ) + + result.append( self.create_def_code() + '( ' ) + result.append( os.linesep + self.indent( '"__init__"' ) ) + + result.append( self.param_sep() ) + result.append( self.make_cnstr_identifier() + '( ') + result.append( self.create_function_ref_code( not self.works_on_instance ) ) + + keywd_args = None + if self.declaration.use_keywords: + keywd_args = self.create_keywords_args() + + if self.declaration.call_policies: + default_generates_code_too = bool( keywd_args ) + c_p_code = self.create_call_policies( default_generates_code_too ) + if c_p_code: + result.append( self.indent( self.param_sep(), 3 ) ) + result.append( c_p_code ) + + if keywd_args: + result.append( self.indent( self.param_sep(), 3 ) ) + result.append( keywd_args ) + + result.append( ' )' ) #make_constructor + + doc = self.create_doc() + if doc: + result.append( self.param_sep() ) + result.append( doc ) + + result.append( ' )' ) + if not self.works_on_instance: + result.append( ';' ) + + if not self.works_on_instance: + #indenting and adding scope + code = ''.join( result ) + result = [ '{ //%s' % declarations.full_name( self.declaration, with_defaults=False ) ] + result.append( os.linesep * 2 ) + result.append( self.indent( code ) ) + result.append( os.linesep * 2 ) + result.append( '}' ) + + return ''.join( result ) + + class mem_fun_pv_t( calldef_t ): def __init__( self, function, wrapper ): calldef_t.__init__( self, function=function, wrapper=wrapper ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-12 04:30:53 UTC (rev 1391) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-13 19:45:24 UTC (rev 1392) @@ -192,6 +192,23 @@ self._exposed_class_type = self.EXPOSED_CLASS_TYPE.DECLARED self._expose_this = None self._expose_sizeof = None + self._fake_constructors = [] + + @property + def fake_constructors(self): + """list of fake constructors""" + return self._fake_constructors + + def add_fake_constructors( self, f ): + """f - reference to a calldef_t object or list of them + + boost::python::make_constructor allows to register a C++ function, as a + class constructor. + """ + if isinstance( f, declarations.calldef_t ): + self._fake_constructors.add( f ) + else: + self._fake_constructors.extend( f ) def _get_redefine_operators( self ): return self._redefine_operators Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-12 04:30:53 UTC (rev 1391) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-13 19:45:24 UTC (rev 1392) @@ -78,8 +78,9 @@ self.__types_db = types_db if not self.__types_db: self.__types_db = types_database.types_database_t() - - self.__extmodule = code_creators.module_t( declarations.get_global_namespace(decls) ) + + global_ns = declarations.get_global_namespace(decls) + self.__extmodule = code_creators.module_t( global_ns ) if boost_python_ns_name: bp_ns_alias = code_creators.namespace_alias_t( alias=boost_python_ns_name , full_namespace_name='::boost::python' ) @@ -100,8 +101,10 @@ self.__array_1_registered = set() #(type.decl_string,size) self.__free_operators = [] self.__exposed_free_fun_overloads = set() + self.__fake_constructors = set() + for cls in global_ns.classes(recursive=True, allow_empty=True): + self.__fake_constructors.update( cls.fake_constructors ) - def __print_readme( self, decl ): readme = decl.readme() if not readme: @@ -347,9 +350,13 @@ return self.__extmodule def visit_member_function( self ): - fwrapper = None self.__types_db.update( self.curr_decl ) self.__dependencies_manager.add_exported( self.curr_decl ) + + if self.curr_decl in self.__fake_constructors: + return + + fwrapper = None if None is self.curr_decl.call_policies: self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) @@ -453,6 +460,12 @@ def visit_free_function( self ): if self.curr_decl in self.__exposed_free_fun_overloads: return + + if self.curr_decl in self.__fake_constructors: + self.__types_db.update( self.curr_decl ) + self.__dependencies_manager.add_exported( self.curr_decl ) + return + elif self.curr_decl.use_overload_macro: parent_decl = self.curr_decl.parent names = set( map( lambda decl: decl.name @@ -595,6 +608,9 @@ if cls_decl.expose_sizeof: cls_cc.adopt_creator( code_creators.expose_sizeof_t( cls_decl ) ) + for fc in cls_decl.fake_constructors: + cls_cc.adopt_creator( code_creators.make_constructor_t( fc ) ) + for decl in exportable_members: if decl in exposed: continue Added: pyplusplus_dev/unittests/cp_return_addressof_tester.py =================================================================== --- pyplusplus_dev/unittests/cp_return_addressof_tester.py (rev 0) +++ pyplusplus_dev/unittests/cp_return_addressof_tester.py 2008-08-13 19:45:24 UTC (rev 1392) @@ -0,0 +1,42 @@ +# Copyright 2004 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 ctypes +import unittest +import fundamental_tester_base +from pyplusplus.module_builder import call_policies + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'cp_return_addressof' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb ): + mb.classes().always_expose_using_scope = True + mb.calldef( 'get_buffer' ).call_policies \ + = call_policies.return_value_policy( call_policies.return_addressof ) + + def run_tests(self, module): + image = module.image_t() + buffer_type = ctypes.c_int * 5 + buffer = buffer_type.from_address( image.get_buffer() ) + self.failUnless( [0,1,2,3,4] == list( buffer ) ) + +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() Property changes on: pyplusplus_dev/unittests/data ___________________________________________________________________ Modified: svn:ignore - *.obj call_policies_to_be_exported.os global_variables_to_be_exported.os member_functions_to_be_exported.os + *.obj call_policies_to_be_exported.os global_variables_to_be_exported.os member_functions_to_be_exported.os cache duplicate_aliases_to_be_exported.os factory_to_be_exported.os member_variables_to_be_exported.os non_overridable_to_be_exported.os particleuniverse.xml smart_pointers_to_be_exported.os split_module_bug_to_be_exported.os statics_to_be_exported.os throw_to_be_exported.os vector3_to_be_exported.os vector_with_shared_data_to_be_exported.os Added: pyplusplus_dev/unittests/data/cp_return_addressof_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/cp_return_addressof_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/cp_return_addressof_to_be_exported.hpp 2008-08-13 19:45:24 UTC (rev 1392) @@ -0,0 +1,28 @@ +// Copyright 2004 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 __cp_return_addressof_to_be_exported_hpp__ +#define __cp_return_addressof_to_be_exported_hpp__ + +#include <string> + +struct image_t{ + image_t() + : buffer( new int[5] ) + { + for( int i = 0; i < 5; ++i ){ + buffer[i] = i; + } + } + + ~image_t(){ delete[] buffer; } + + int* get_buffer() const { return buffer; } + +private: + int* buffer; +}; + +#endif//__cp_return_addressof_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp 2008-08-13 19:45:24 UTC (rev 1392) @@ -0,0 +1,40 @@ +// Copyright 2004 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 __make_constructor_to_be_exported_hpp__ +#define __make_constructor_to_be_exported_hpp__ + +#include <memory> + +namespace mc{ + +struct numbers_t{ + numbers_t() + : x( 0 ) + , y( 0 ) + {} + ~numbers_t(){} + + static std::auto_ptr<numbers_t> create( int i, int j, int k, int m ){ + std::auto_ptr<numbers_t> n( new numbers_t() ); + n->x = i + j; + n->y = k + m; + return n; + } + + int x; + int y; +}; + +inline std::auto_ptr<numbers_t> create( int i, int j){ + std::auto_ptr<numbers_t> n( new numbers_t() ); + n->x = i; + n->y = j; + return n; +} + +} + +#endif//__make_constructor_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/make_constructor_tester.py =================================================================== --- pyplusplus_dev/unittests/make_constructor_tester.py (rev 0) +++ pyplusplus_dev/unittests/make_constructor_tester.py 2008-08-13 19:45:24 UTC (rev 1392) @@ -0,0 +1,41 @@ +# Copyright 2004 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 unittest +import fundamental_tester_base + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'make_constructor' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb ): + mc = mb.namespace( 'mc' ) + numbers = mc.class_( 'numbers_t' ) + numbers.add_fake_constructors( mc.calldefs( 'create' ) ) + + + def run_tests(self, module): + n = module.numbers_t( 1,2,3,4) + self.failUnless( n.x == 1+2 and n.y == 3+4) + n = module.numbers_t( 10, 18) + self.failUnless( n.x == 10 and n.y == 18) + +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 2008-08-12 04:30:53 UTC (rev 1391) +++ pyplusplus_dev/unittests/test_all.py 2008-08-13 19:45:24 UTC (rev 1392) @@ -107,6 +107,7 @@ import embeded_tester import unions_tester import cp_return_addressof_tester +import make_constructor_tester #import ogre_generate_tester testers = [ @@ -202,6 +203,7 @@ , embeded_tester , unions_tester , cp_return_addressof_tester + , make_constructor_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. |
From: <rom...@us...> - 2008-08-18 18:58:54
|
Revision: 1397 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1397&view=rev Author: roman_yakovenko Date: 2008-08-18 18:58:51 +0000 (Mon, 18 Aug 2008) Log Message: ----------- improving "make_constructor" functionality Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/messages/warnings_.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/free_functions_to_be_exported.hpp pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp pyplusplus_dev/unittests/make_constructor_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/module_creator/fake_constructors_manager.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-14 18:49:06 UTC (rev 1396) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-08-18 18:58:51 UTC (rev 1397) @@ -169,6 +169,9 @@ WRAPPER = 'wrapper' ALL = ( DECLARED, WRAPPER ) + FAKE_CONSTRUCTOR_TYPES = ( declarations.member_function_t, declarations.free_function_t ) + FAKE_CONSTRUCTOR_TYPE_NAMES = 'member and free functions' + def __init__(self, *arguments, **keywords): class_common_details_t.__init__( self ) declarations.class_t.__init__(self, *arguments, **keywords ) @@ -193,17 +196,17 @@ self._expose_this = None self._expose_sizeof = None self._fake_constructors = [] - + @property def fake_constructors(self): """list of fake constructors""" return self._fake_constructors - + def add_fake_constructors( self, f ): """f - reference to a calldef_t object or list of them - + boost::python::make_constructor allows to register a C++ function, as a - class constructor. + class constructor. """ if isinstance( f, declarations.calldef_t ): self._fake_constructors.add( f ) @@ -624,7 +627,16 @@ return explanation def _readme_impl( self ): - return self.is_wrapper_needed() + explanation = self.is_wrapper_needed() + for fc in self.fake_constructors: + if fc.ignore: + explanation.append( messages.W1062 % ( str( self ), str( fc ) ) ) + if not fc.exportable: + explanation.append( messages.W1063 % ( str( self ), str( fc ) ) ) + if not isinstance( fc, self.FAKE_CONSTRUCTOR_TYPES ): + explanation.append( messages.W1064 + % ( str( fc ), str( self ), self.FAKE_CONSTRUCTOR_TYPE_NAMES ) ) + return explanation def guess_always_expose_using_scope_value( self ): def is_assign( oper ): Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-08-14 18:49:06 UTC (rev 1396) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-08-18 18:58:51 UTC (rev 1397) @@ -237,6 +237,15 @@ W1061 = compilation_error( 'Py++ can not expose "%s" - its type is "%s".' ' This could be changed in future.') +W1062 = compilation_error( '"%s" contains "fake constructor" "%s", that was excluded.' + ' Py++ will not generate "__init__" method, based on that function.') + +W1063 = compilation_error( '"%s" contains "fake constructor" "%s", that is exportable.' + ' Py++ will not generate "__init__" method, based on that function.') + +W1064 = compilation_error( 'Py++ can not expose "%s" as "fake constructor" of "%s".' + ' Only the following function types supported: %s' ) + warnings = globals() all_warning_msgs = [] Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-14 18:49:06 UTC (rev 1396) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-18 18:58:51 UTC (rev 1397) @@ -9,6 +9,7 @@ import dependencies_manager import opaque_types_manager import call_policies_resolver +import fake_constructors_manager from pygccxml import declarations from pyplusplus import decl_wrappers @@ -78,7 +79,7 @@ self.__types_db = types_db if not self.__types_db: self.__types_db = types_database.types_database_t() - + global_ns = declarations.get_global_namespace(decls) self.__extmodule = code_creators.module_t( global_ns ) if boost_python_ns_name: @@ -101,9 +102,7 @@ self.__array_1_registered = set() #(type.decl_string,size) self.__free_operators = [] self.__exposed_free_fun_overloads = set() - self.__fake_constructors = set() - for cls in global_ns.classes(recursive=True, allow_empty=True): - self.__fake_constructors.update( cls.fake_constructors ) + self.__fc_manager = fake_constructors_manager.manager_t( global_ns ) def __print_readme( self, decl ): readme = decl.readme() @@ -353,9 +352,9 @@ self.__types_db.update( self.curr_decl ) self.__dependencies_manager.add_exported( self.curr_decl ) - if self.curr_decl in self.__fake_constructors: + if self.__fc_manager.is_fake_constructor( self.curr_decl ): return - + fwrapper = None if None is self.curr_decl.call_policies: self.curr_decl.call_policies = self.__call_policies_resolver( self.curr_decl ) @@ -460,12 +459,12 @@ def visit_free_function( self ): if self.curr_decl in self.__exposed_free_fun_overloads: return - - if self.curr_decl in self.__fake_constructors: + + if self.__fc_manager.is_fake_constructor( self.curr_decl ): self.__types_db.update( self.curr_decl ) self.__dependencies_manager.add_exported( self.curr_decl ) return - + elif self.curr_decl.use_overload_macro: parent_decl = self.curr_decl.parent names = set( map( lambda decl: decl.name @@ -608,9 +607,6 @@ if cls_decl.expose_sizeof: cls_cc.adopt_creator( code_creators.expose_sizeof_t( cls_decl ) ) - for fc in cls_decl.fake_constructors: - cls_cc.adopt_creator( code_creators.make_constructor_t( fc ) ) - for decl in exportable_members: if decl in exposed: continue @@ -646,6 +642,10 @@ destructor = code_creators.destructor_wrapper_t( class_=cls_decl ) wrapper.adopt_creator( destructor ) + for fc in cls_decl.fake_constructors: + if self.__fc_manager.should_generate_code( fc ): + cls_cc.adopt_creator( code_creators.make_constructor_t( fc ) ) + self.curr_decl = cls_decl self.curr_code_creator = cls_parent_cc Added: pyplusplus_dev/pyplusplus/module_creator/fake_constructors_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/fake_constructors_manager.py (rev 0) +++ pyplusplus_dev/pyplusplus/module_creator/fake_constructors_manager.py 2008-08-18 18:58:51 UTC (rev 1397) @@ -0,0 +1,29 @@ +# Copyright 2004 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) + +"""defines class, which manages "fake constructors" """ + +class manager_t( object ): + def __init__( self, global_ns ): + self.__global_ns = global_ns + self.__fc_all = set() + self.__fc_exposed = set() + + for cls in global_ns.classes(recursive=True, allow_empty=True): + for fc in cls.fake_constructors: + self.__fc_all.add( fc ) + if fc.ignore: + continue + if not fc.exportable: + continue + if not isinstance( fc, cls.FAKE_CONSTRUCTOR_TYPES ): + continue + self.__fc_exposed.add( fc ) + + def is_fake_constructor( self, fc ): + return fc in self.__fc_all + + def should_generate_code( self, fc ): + return fc in self.__fc_exposed Modified: pyplusplus_dev/unittests/data/free_functions_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/free_functions_to_be_exported.hpp 2008-08-14 18:49:06 UTC (rev 1396) +++ pyplusplus_dev/unittests/data/free_functions_to_be_exported.hpp 2008-08-18 18:58:51 UTC (rev 1397) @@ -6,6 +6,8 @@ #ifndef __free_functions_to_be_exported_hpp__ #define __free_functions_to_be_exported_hpp__ +#include <stddef.h> + namespace free_functions{ inline int one(){ @@ -16,7 +18,10 @@ return a+b; } +inline void do_smth( size_t , int ){ } +} + #endif//__free_functions_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp 2008-08-14 18:49:06 UTC (rev 1396) +++ pyplusplus_dev/unittests/data/make_constructor_to_be_exported.hpp 2008-08-18 18:58:51 UTC (rev 1397) @@ -9,21 +9,21 @@ #include <memory> namespace mc{ - + struct numbers_t{ numbers_t() : x( 0 ) , y( 0 ) {} ~numbers_t(){} - + static std::auto_ptr<numbers_t> create( int i, int j, int k, int m ){ std::auto_ptr<numbers_t> n( new numbers_t() ); n->x = i + j; n->y = k + m; return n; } - + int x; int y; }; @@ -35,6 +35,11 @@ return n; } +inline std::auto_ptr<numbers_t> create( double, double, double, double, double){ + return std::auto_ptr<numbers_t>(); } + +} + #endif//__make_constructor_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/make_constructor_tester.py =================================================================== --- pyplusplus_dev/unittests/make_constructor_tester.py 2008-08-14 18:49:06 UTC (rev 1396) +++ pyplusplus_dev/unittests/make_constructor_tester.py 2008-08-18 18:58:51 UTC (rev 1397) @@ -10,27 +10,28 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'make_constructor' - + 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 , *args ) - + def customize(self, mb ): mc = mb.namespace( 'mc' ) numbers = mc.class_( 'numbers_t' ) numbers.add_fake_constructors( mc.calldefs( 'create' ) ) - - - def run_tests(self, module): + numbers.add_fake_constructors( mc.calldefs(lambda d: d.name.startswith('~') ) ) + mc.calldef( 'create', arg_types=[None]*5 ).exclude() + + def run_tests(self, module): n = module.numbers_t( 1,2,3,4) self.failUnless( n.x == 1+2 and n.y == 3+4) n = module.numbers_t( 10, 18) self.failUnless( n.x == 10 and n.y == 18) - + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-08-20 06:20:38
|
Revision: 1398 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1398&view=rev Author: roman_yakovenko Date: 2008-08-20 06:20:45 +0000 (Wed, 20 Aug 2008) Log Message: ----------- improve dependencies_manager.py class algorithm add new test Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/properties.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py pyplusplus_dev/pyplusplus/module_creator/types_database.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/return_auto_ptr_to_be_exported.hpp pyplusplus_dev/unittests/return_auto_ptr_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2008-08-18 18:58:51 UTC (rev 1397) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2008-08-20 06:20:45 UTC (rev 1398) @@ -185,10 +185,11 @@ return messages.filter_disabled_msgs( msgs, self.__msgs_to_ignore ) @property - def disabled_messaged( self ): + def disabled_messages( self ): """list of messages to ignore""" return self.__msgs_to_ignore - + disabled_messaged = disabled_messages + def disable_messages( self, *args ): """set messages, which should not be reported to you Modified: pyplusplus_dev/pyplusplus/decl_wrappers/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2008-08-18 18:58:51 UTC (rev 1397) +++ pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2008-08-20 06:20:45 UTC (rev 1398) @@ -262,7 +262,7 @@ def __report_illegal_property( self, property_ ): logger = _logging_.loggers.declarations - if not messages.filter_disabled_msgs([messages.W1041], property_.fget.parent.disabled_messaged ): + if not messages.filter_disabled_msgs([messages.W1041], property_.fget.parent.disabled_messages ): return #user disabled property warning logger.warn( "%s;%s" % ( property_.fget.parent, messages.W1041 % property_ ) ) Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2008-08-18 18:58:51 UTC (rev 1397) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2008-08-20 06:20:45 UTC (rev 1398) @@ -155,7 +155,7 @@ return self.create_value_traits_header_name( value_class ) except RuntimeError, error: decls_logger = _logging_.loggers.declarations - if not messages.filter_disabled_msgs([messages.W1042], code_creator.declaration.disabled_messaged ): + if not messages.filter_disabled_msgs([messages.W1042], code_creator.declaration.disabled_messages ): return #user disabled property warning decls_logger.warn( "%s;%s" % ( code_creator.declaration, messages.W1042 ) ) Modified: pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2008-08-18 18:58:51 UTC (rev 1397) +++ pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2008-08-20 06:20:45 UTC (rev 1398) @@ -81,29 +81,44 @@ , dependencies ) return dependencies + def __has_unexposed_dependency( self, exported_ids, depend_on_decl ): + sptr_traits = declarations.smart_pointer_traits + + if None is depend_on_decl: + return + + if self.__is_std_decl( depend_on_decl ): + return + + if sptr_traits.is_smart_pointer( depend_on_decl ): + try: + value_type = sptr_traits.value_type( depend_on_decl ) + return self.__has_unexposed_dependency( exported_ids, value_type ) + except RuntimeError: + pass + + if isinstance( depend_on_decl, decl_wrappers.decl_wrapper_t ): + if depend_on_decl.already_exposed: + return + if isinstance( depend_on_decl, declarations.class_types ): + if depend_on_decl.opaque: + return + if isinstance( depend_on_decl, declarations.variable_t ): + if not decl.expose_value: + return + + return id( depend_on_decl ) not in exported_ids + def __find_out_used_but_not_exported( self ): used_not_exported = [] exported_ids = set( map( lambda d: id( d ), self.__exported_decls ) ) for decl in self.__exported_decls: - for dependency in self.__build_dependencies( decl ): - depend_on_decl = dependency.find_out_depend_on_declaration() - if None is depend_on_decl: - continue - if self.__is_std_decl( depend_on_decl ): - continue - if isinstance( depend_on_decl, decl_wrappers.decl_wrapper_t ): - if depend_on_decl.already_exposed: - continue - if isinstance( depend_on_decl, declarations.class_types ): - if depend_on_decl.opaque: - continue - if isinstance( decl, declarations.variable_t ): - if not decl.expose_value: - continue - if id( depend_on_decl ) not in exported_ids: - report = messages.filter_disabled_msgs([messages.W1040], depend_on_decl.disabled_messaged ) - if report: - used_not_exported.append( dependency ) + for dependency in self.__build_dependencies( decl ): + depend_on_decl = dependency.find_out_depend_on_declaration() + if self.__has_unexposed_dependency( exported_ids, depend_on_decl ): + if messages.filter_disabled_msgs([messages.W1040], depend_on_decl.disabled_messages ): + #need to report dependency errors + used_not_exported.append(dependency) return used_not_exported def __group_by_unexposed( self, dependencies ): Modified: pyplusplus_dev/pyplusplus/module_creator/types_database.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/types_database.py 2008-08-18 18:58:51 UTC (rev 1397) +++ pyplusplus_dev/pyplusplus/module_creator/types_database.py 2008-08-20 06:20:45 UTC (rev 1398) @@ -75,7 +75,7 @@ container_cls.indexing_suite.element_type except RuntimeError: decls_logger = _logging_.loggers.declarations - if not messages.filter_disabled_msgs([messages.W1042], container_cls.disabled_messaged ): + if not messages.filter_disabled_msgs([messages.W1042], container_cls.disabled_messages ): return #user disabled property warning decls_logger.warn( "%s;%s" % ( container_cls, messages.W1042 ) ) self.__containers.add( container_cls ) Added: pyplusplus_dev/unittests/data/return_auto_ptr_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/return_auto_ptr_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/return_auto_ptr_to_be_exported.hpp 2008-08-20 06:20:45 UTC (rev 1398) @@ -0,0 +1,52 @@ +// Copyright 2004 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 __return_auto_ptr_to_be_exported_hpp__ +#define __return_auto_ptr_to_be_exported_hpp__ +#include "boost/shared_ptr.hpp" +#include <memory> + + +namespace smart_pointers{ + +struct r_input_t{ + r_input_t(unsigned int rows, unsigned int cols) + : m_rows(rows) + , m_cols(cols) + {} + + unsigned int rows() const {return m_rows;} + unsigned int cols() const {return m_cols;} + +private: + unsigned int m_rows; + unsigned int m_cols; +}; + + +class generic_input_t +{ +public: + // Pure virtual function to convert to the required type + virtual std::auto_ptr<r_input_t> create_r_input() = 0; + + virtual boost::shared_ptr<r_input_t> create_r_input_shared() = 0; +}; + + +// Function which converts generic_input_t to r_input_t +std::auto_ptr<r_input_t> process_input(generic_input_t& input) +{ + return input.create_r_input(); +} + +boost::shared_ptr<r_input_t> process_input_shared(generic_input_t& input) +{ + return input.create_r_input_shared(); +} + +} + +#endif//__return_auto_ptr_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/return_auto_ptr_tester.py =================================================================== --- pyplusplus_dev/unittests/return_auto_ptr_tester.py (rev 0) +++ pyplusplus_dev/unittests/return_auto_ptr_tester.py 2008-08-20 06:20:45 UTC (rev 1398) @@ -0,0 +1,66 @@ +# Copyright 2004 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 unittest +import fundamental_tester_base +from pyplusplus import code_creators +from pyplusplus import messages + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'return_auto_ptr' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + pass + #~ r_input = mb.class_( 'r_input_t' ) + #~ r_input.held_type = 'std::auto_ptr< %s >' % r_input.decl_string + + def create_py_input( self, module, rows, cols ): + class py_input_t( module.generic_input_t ): + def __init__( self, rows, cols ): + module.generic_input_t.__init__( self ) + self.rows = rows + self.cols = cols + + def create_r_input( self ): + return module.r_input_t( self.rows, self.cols ) + + def create_r_input_shared( self ): + return module.r_input_t( self.rows, self.cols ) + + return py_input_t(rows, cols) + + def run_tests( self, module): + a = self.create_py_input( module, 3, 7 ) + c = a.create_r_input() + self.failUnless( c.rows() == 3 and c.cols() == 7 ) + try: + b = module.process_input(a) + self.failUnless( b.rows() == 3 and b.cols() == 7 ) + except TypeError, err: + print err + + c = a.create_r_input_shared() + self.failUnless( c.rows() == 3 and c.cols() == 7 ) + b = module.process_input_shared(a) + self.failUnless( b.rows() == 3 and b.cols() == 7 ) + +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 2008-08-18 18:58:51 UTC (rev 1397) +++ pyplusplus_dev/unittests/test_all.py 2008-08-20 06:20:45 UTC (rev 1398) @@ -108,6 +108,7 @@ import unions_tester import cp_return_addressof_tester import make_constructor_tester +import return_auto_ptr_tester #import ogre_generate_tester testers = [ @@ -204,6 +205,7 @@ , unions_tester , cp_return_addressof_tester , make_constructor_tester + , return_auto_ptr_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. |
From: <rom...@us...> - 2008-08-20 20:06:53
|
Revision: 1401 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1401&view=rev Author: roman_yakovenko Date: 2008-08-20 20:07:03 +0000 (Wed, 20 Aug 2008) Log Message: ----------- fix code generation for pure virtual function, which returns auto_ptr<...> and invoked from C++ Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/unittests/return_auto_ptr_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2008-08-20 20:02:25 UTC (rev 1400) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2008-08-20 20:07:03 UTC (rev 1401) @@ -274,11 +274,11 @@ if keywd_args: result.append( self.indent( self.param_sep(), 3 ) ) result.append( keywd_args ) - + result.append( ' )' ) #make_constructor - + doc = self.create_doc() - if doc: + if doc: result.append( self.param_sep() ) result.append( doc ) @@ -341,6 +341,7 @@ } def create_body( self ): + auto_ptr_traits = declarations.auto_ptr_traits if not self.declaration.overridable: return self.unoverriden_function_body() template = [] @@ -348,18 +349,28 @@ if precall_code: template.append( os.linesep.join( precall_code ) ) template.append( '%(override)s func_%(alias)s = this->get_override( "%(alias)s" );' ) - template.append( '%(return_)sfunc_%(alias)s( %(args)s );') + if self.declaration.return_type \ + and auto_ptr_traits.is_smart_pointer( self.declaration.return_type ): + template.append( 'boost::python::object %(alias)s_result = func_%(alias)s( %(args)s );' ) + template.append( 'return boost::python::extract< %(return_type)s >( %(alias)s_result );' ) + else: + template.append( '%(return_)sfunc_%(alias)s( %(args)s );') template = os.linesep.join( template ) return_ = '' if not declarations.is_void( self.declaration.return_type ): return_ = 'return ' + return_type = '' + if self.declaration.return_type: + return_type = self.declaration.return_type.decl_string + return template % { 'override' : self.override_identifier() , 'alias' : self.declaration.alias , 'return_' : return_ , 'args' : self.function_call_args() + , 'return_type' : return_type } def _create_impl(self): Modified: pyplusplus_dev/unittests/return_auto_ptr_tester.py =================================================================== --- pyplusplus_dev/unittests/return_auto_ptr_tester.py 2008-08-20 20:02:25 UTC (rev 1400) +++ pyplusplus_dev/unittests/return_auto_ptr_tester.py 2008-08-20 20:07:03 UTC (rev 1401) @@ -20,9 +20,8 @@ , *args ) def customize( self, mb ): - pass - #~ r_input = mb.class_( 'r_input_t' ) - #~ r_input.held_type = 'std::auto_ptr< %s >' % r_input.decl_string + r_input = mb.class_( 'r_input_t' ) + r_input.held_type = 'std::auto_ptr< %s >' % r_input.decl_string def create_py_input( self, module, rows, cols ): class py_input_t( module.generic_input_t ): @@ -43,12 +42,8 @@ a = self.create_py_input( module, 3, 7 ) c = a.create_r_input() self.failUnless( c.rows() == 3 and c.cols() == 7 ) - try: - b = module.process_input(a) - self.failUnless( b.rows() == 3 and b.cols() == 7 ) - except TypeError, err: - print err - + b = module.process_input(a) + self.failUnless( b.rows() == 3 and b.cols() == 7 ) c = a.create_r_input_shared() self.failUnless( c.rows() == 3 and c.cols() == 7 ) b = module.process_input_shared(a) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-08-21 09:19:50
|
Revision: 1402 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1402&view=rev Author: roman_yakovenko Date: 2008-08-21 09:19:58 +0000 (Thu, 21 Aug 2008) Log Message: ----------- improve "already_exposed" functionality Modified Paths: -------------- pygccxml_dev/unittests/vector_traits_tester.py pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/file_writers/single_file.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/pyplusplus/utils/__init__.py pyplusplus_dev/unittests/already_exposed_tester.py pyplusplus_dev/unittests/balanced_files_tester.py pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp pyplusplus_dev/unittests/exposed_decls_db_tester.py pyplusplus_dev/unittests/fundamental_tester_base.py pyplusplus_dev/unittests/split_module_tester.py pyplusplus_dev/unittests/unions_tester.py Added Paths: ----------- pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp Modified: pygccxml_dev/unittests/vector_traits_tester.py =================================================================== --- pygccxml_dev/unittests/vector_traits_tester.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pygccxml_dev/unittests/vector_traits_tester.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -55,6 +55,11 @@ continue self.failUnless( not traits.is_my_case( struct.typedef( 'container' ) ) ) + def test_declaration( self ): + cnt = 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >@::std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >' + traits = declarations.find_container_traits( cnt ) + self.failUnless( declarations.vector_traits is traits) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) @@ -64,4 +69,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -23,20 +23,19 @@ if name == None: name = self.declaration.name return algorithm.create_valid_name( name ) - - def _get_declaration(self): + + @property + def declaration(self): + """The declaration this code creator is based on. + @type: L{decl_wrapper_t<decl_wrappers.decl_wrapper_t>} + """ return self._decl - declaration = property( _get_declaration, - doc="""The declaration this code creator is based on. - @type: L{decl_wrapper_t<decl_wrappers.decl_wrapper_t>} - """) def _get_alias_impl( self ): return self.declaration.alias - def _get_alias(self): - return self._get_alias_impl() - + def _get_alias(self): + return self._get_alias_impl() def _set_alias(self, alias): self.declaration.alias = alias alias = property( _get_alias, _set_alias ) Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -11,7 +11,9 @@ import compound import algorithm import module_body +import declaration_based import include_directories +from pygccxml import utils class module_t(compound.compound_t): """This class represents the source code for the entire extension module. @@ -179,3 +181,19 @@ def add_declaration_code( self, code, position ): self.adopt_declaration_creator( custom.custom_text_t( code ) ) + + @utils.cached + def specially_exposed_decls(self): + """list of exposed declarations, which were not ``included``, but still + were exposed. For example, std containers. + """ + decls = set() + #select all declaration based code creators + ccs = filter( lambda cc: isinstance( cc, declaration_based.declaration_based_t ) + , algorithm.make_flatten_list( self ) ) + #leave only "ignored" + ccs = filter( lambda cc: cc.declaration.ignore == True, ccs ) + + decls = map( lambda cc: cc.declaration, ccs ) + + return set( decls ) Modified: pyplusplus_dev/pyplusplus/file_writers/single_file.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/single_file.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/pyplusplus/file_writers/single_file.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -23,9 +23,11 @@ target_dir = os.path.dirname( self.file_name ) if not target_dir: target_dir = os.getcwd() + if not os.path.exists( target_dir ): + os.makedirs( target_dir ) headers = self.get_user_headers( [self.extmodule] ) map( lambda header: self.extmodule.add_include( header ) , headers ) self.write_code_repository( target_dir ) self.write_file( self.file_name, self.extmodule.create(), encoding=self.encoding ) - self.save_exposed_decls_db( target_dir ) \ No newline at end of file + self.save_exposed_decls_db( target_dir ) Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -32,7 +32,8 @@ if None is files_sum_repository: self.__files_sum_repository = md5sum_repository.dummy_repository_t() self.__exposed_decls_db = utils.exposed_decls_db_t() - self.__exposed_decls_db.register_decls( extmodule.global_ns ) + self.__exposed_decls_db.register_decls( extmodule.global_ns + , extmodule.specially_exposed_decls ) @property def encoding( self ): Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -253,6 +253,21 @@ self.__extmodule.adopt_creators( uc_creators, insert_pos ) cls_creator.associated_decl_creators.extend( uc_creators ) + def __get_exposed_containers(self): + """list of exposed declarations, which were not ``included``, but still + were exposed. For example, std containers + + std containers exposed by Py++, even if the user didn't ``include`` them. + """ + cmp_by_name = lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string ) + used_containers = list( self.__types_db.used_containers ) + used_containers = filter( lambda cls: cls.indexing_suite.include_files + , used_containers ) + used_containers.sort( cmp_by_name ) + used_containers = filter( lambda cnt: cnt.already_exposed == False + , used_containers ) + return used_containers + def _treat_indexing_suite( self ): def create_explanation(cls): msg = '//WARNING: the next line of code will not compile, because "%s" does not have operator== !' @@ -271,17 +286,9 @@ creators = [] created_value_traits = set() - cmp_by_name = lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string ) - used_containers = list( self.__types_db.used_containers ) - used_containers = filter( lambda cls: cls.indexing_suite.include_files - , used_containers ) - used_containers.sort( cmp_by_name ) - for cls in used_containers: + for cls in self.__get_exposed_containers(): self.__print_readme( cls ) - if cls.already_exposed: - continue - cls_creator = create_cls_cc( cls ) self.__dependencies_manager.add_exported( cls ) creators.append( cls_creator ) Modified: pyplusplus_dev/pyplusplus/utils/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/utils/__init__.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/pyplusplus/utils/__init__.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -85,13 +85,17 @@ self.exposed_sign, self.key, self.normalized_name, self.signature \ = row.split( self.FIELD_DELIMITER ) + def update_key( self, cls ): + self.key = cls.__name__ + def __init_from_decl( self, decl ): if decl.ignore: self.exposed_sign = self.UNEXPOSED_DECL_SIGN else: self.exposed_sign = self.EXPOSED_DECL_SIGN - self.key = decl.__class__.__name__ - self.signature = decl.decl_string + self.update_key( decl.__class__ ) + + self.signature = decl.create_decl_string( with_defaults=False ) if isinstance( decl, declarations.calldef_t ): self.signature = self.signature + decl.function_type().decl_string self.normalized_name = self.find_out_normalized_name( decl ) @@ -137,9 +141,8 @@ self.__registry[ row.key ][row.normalized_name] = [row] else: self.__registry[ row.key ][row.normalized_name].append(row) - - def __find_in_registry( self, decl ): - row = self.row_t( decl ) + + def __find_row_in_registry( self, row ): try: decls = filter( lambda rrow: rrow.does_refer_same_decl( row ) , self.__registry[ row.key ][ row.normalized_name ] ) @@ -149,7 +152,24 @@ return None except KeyError: return None - + + def __find_in_registry( self, decl ): + row = self.row_t( decl ) + found = self.__find_row_in_registry( row ) + if found: + return found + if isinstance( decl, declarations.class_t ): + row.update_key( declarations.class_declaration_t ) + found = self.__find_row_in_registry( row ) + if found: + return found + if isinstance( decl, declarations.class_declaration_t ): + row.update_key( declarations.class_t ) + found = self.__find_row_in_registry( row ) + if found: + return found + return None + def is_exposed( self, decl ): row = self.__find_in_registry( decl) return row and self.row_t.EXPOSED_DECL_SIGN == row.exposed_sign @@ -166,6 +186,15 @@ decl.ignore = True decl.already_exposed = False - def register_decls( self, global_ns ): + def register_decls( self, global_ns, special_decls ): + """register decls in the database + + global_ns - reference to the global namespace object + special_decls - set of declarations, which were exposed, even so they + were not ``included``. For example std containers. + """ for decl in global_ns.decls(): - self.__update_registry( self.row_t( decl ) ) + row = self.row_t( decl ) + if decl in special_decls: + row.exposed_sign = row.EXPOSED_DECL_SIGN + self.__update_registry( row ) Modified: pyplusplus_dev/unittests/already_exposed_tester.py =================================================================== --- pyplusplus_dev/unittests/already_exposed_tester.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/unittests/already_exposed_tester.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -12,24 +12,36 @@ import fundamental_tester_base class tester_t( unittest.TestCase ): - def test(self): - exposed_db = utils.exposed_decls_db_t() - + def test(self): fpath = os.path.join( autoconfig.data_directory, 'already_exposed_to_be_exported.hpp' ) mb = module_builder.module_builder_t( [module_builder.create_source_fc( fpath )] , gccxml_path=autoconfig.gccxml.executable ) mb.global_ns.exclude() mb.namespace( 'already_exposed' ).include() - exposed_db.register_decls( mb.global_ns ) - exposed_db.save( autoconfig.build_dir ) - mb.register_module_dependency( autoconfig.build_dir ) - mb.class_( 'ae_derived' ).include() + mb.build_code_creator( 'already_exposed' ) + + already_exposed_dir = os.path.join( autoconfig.build_directory, 'already_exposed' ) + mb.write_module( os.path.join( already_exposed_dir, 'already_exposed.cpp' ) ) + + #----------------------------------------------------------------------- + + fpath = os.path.join( autoconfig.data_directory, 'already_exposed_2to_be_exported.hpp' ) + mb = module_builder.module_builder_t( [module_builder.create_source_fc( fpath )] + , gccxml_path=autoconfig.gccxml.executable ) + + mb.global_ns.exclude() + mb.namespace( 'to_be_exposed' ).include() + mb.build_code_creator( 'to_be_exposed' ) + + mb.register_module_dependency( already_exposed_dir ) - mb.build_code_creator( 'xxx' ) + mb.build_code_creator( 'to_be_exposed' ) + to_be_exposed_dir = os.path.join( autoconfig.build_directory, 'to_be_exposed' ) + mb.write_module( os.path.join( to_be_exposed_dir, 'to_be_exposed.cpp' ) ) body = mb.code_creator.body - self.failUnless( 1 == len( body.creators ) ) + self.failUnless( 2 == len( body.creators ) ) ae_derived_code = body.creators[0].create() self.failUnless( mb.class_( 'ae_base' ).decl_string in ae_derived_code ) Modified: pyplusplus_dev/unittests/balanced_files_tester.py =================================================================== --- pyplusplus_dev/unittests/balanced_files_tester.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/unittests/balanced_files_tester.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -32,7 +32,7 @@ exposed_db = utils.exposed_decls_db_t() - exposed_db.register_decls( mb.global_ns ) + exposed_db.register_decls( mb.global_ns, [] ) exposed_db.save( autoconfig.build_dir ) mb.register_module_dependency( autoconfig.build_dir ) Added: pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/already_exposed_2to_be_exported.hpp 2008-08-21 09:19:58 UTC (rev 1402) @@ -0,0 +1,24 @@ +// Copyright 2004 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 __already_exposed_2to_be_exported_hpp__ +#define __already_exposed_2to_be_exported_hpp__ + +#include "already_exposed_to_be_exported.hpp" +#include <vector> +#include <string> + +namespace to_be_exposed{ + +struct ae_derived : public already_exposed::ae_base +{}; + +inline std::vector< std::string > do_nothing(){ + return std::vector< std::string >(); +} + +} + +#endif//__already_exposed_2to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/unittests/data/already_exposed_to_be_exported.hpp 2008-08-21 09:19:58 UTC (rev 1402) @@ -6,6 +6,9 @@ #ifndef __already_exposed_to_be_exported_hpp__ #define __already_exposed_to_be_exported_hpp__ +#include <vector> +#include <string> + namespace already_exposed{ struct ae_t{}; @@ -14,9 +17,8 @@ struct ae_base{}; +void do_smth( const std::vector< std::string >& ); + } - -struct ae_derived : public already_exposed::ae_base -{}; - + #endif//__already_exposed_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/exposed_decls_db_tester.py =================================================================== --- pyplusplus_dev/unittests/exposed_decls_db_tester.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/unittests/exposed_decls_db_tester.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -69,7 +69,7 @@ global_ns.exclude() ns.include() - db.register_decls( global_ns ) + db.register_decls( global_ns, [] ) for x in ns.decls(recursive=True): self.failUnless( db.is_exposed( x ) == True ) Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -54,14 +54,17 @@ irrelevant_decl_types = ( declarations.typedef_t , declarations.namespace_t , declarations.free_operator_t ) + specially_exposed_decls = mb.code_creator.specially_exposed_decls for d in mb.decls(): if not d.exportable: continue elif isinstance( d, declarations.free_operator_t ): continue elif d.ignore: + if d in specially_exposed_decls: + continue if exposed_db.is_exposed( d ): - i = 0 + i = 0 self.failUnless( not exposed_db.is_exposed( d ) , '''Declaration "%s" is NOT exposed, but for some reason it is marked as such.''' % str( d ) ) Modified: pyplusplus_dev/unittests/split_module_tester.py =================================================================== --- pyplusplus_dev/unittests/split_module_tester.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/unittests/split_module_tester.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -32,7 +32,7 @@ exposed_db = utils.exposed_decls_db_t() - exposed_db.register_decls( mb.global_ns ) + exposed_db.register_decls( mb.global_ns, [] ) exposed_db.save( autoconfig.build_dir ) mb.register_module_dependency( autoconfig.build_dir ) Modified: pyplusplus_dev/unittests/unions_tester.py =================================================================== --- pyplusplus_dev/unittests/unions_tester.py 2008-08-20 20:07:03 UTC (rev 1401) +++ pyplusplus_dev/unittests/unions_tester.py 2008-08-21 09:19:58 UTC (rev 1402) @@ -44,8 +44,9 @@ obj2.set_i( 1977 ) self.failUnless( obj2.i == 1977 ) - mdll = ctypes.cdll.LoadLibrary( module.__file__ ) - self.failUnless( 4 == mdll.mmm( 1, 3 ) ) + if 'win' not in sys.platform: + mdll = ctypes.cdll.LoadLibrary( module.__file__ ) + self.failUnless( 4 == mdll.mmm( 1, 3 ) ) def create_suite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-09-03 12:01:08
|
Revision: 1410 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1410&view=rev Author: roman_yakovenko Date: 2008-09-03 12:01:18 +0000 (Wed, 03 Sep 2008) Log Message: ----------- fix spelling mistakes found by Bernd Fritzke Modified Paths: -------------- pyplusplus_dev/docs/documentation/how_to/file_name_too_long.rest pyplusplus_dev/docs/peps/dsl_challenge.rest pyplusplus_dev/pyplusplus/decl_wrappers/algorithm.py pyplusplus_dev/pyplusplus/module_builder/builder.py Modified: pyplusplus_dev/docs/documentation/how_to/file_name_too_long.rest =================================================================== --- pyplusplus_dev/docs/documentation/how_to/file_name_too_long.rest 2008-08-26 19:01:31 UTC (rev 1409) +++ pyplusplus_dev/docs/documentation/how_to/file_name_too_long.rest 2008-09-03 12:01:18 UTC (rev 1410) @@ -20,7 +20,7 @@ As you know, a class name in `Python`_ has few `constraints`_ and `Py++`_ is aware of them. "holder< int >" is illegal class name, so `Py++`_ will generate another -one - "holder_less_int_grate\_". Pretty ugly and even long, but at least it is +one - "holder_less_int_greater\_". Pretty ugly and even long, but at least it is legal one. .. _`constraints` : http://www.python.org/doc/current/ref/identifiers.html Modified: pyplusplus_dev/docs/peps/dsl_challenge.rest =================================================================== --- pyplusplus_dev/docs/peps/dsl_challenge.rest 2008-08-26 19:01:31 UTC (rev 1409) +++ pyplusplus_dev/docs/peps/dsl_challenge.rest 2008-09-03 12:01:18 UTC (rev 1410) @@ -117,7 +117,7 @@ PointTmpl = mb.module.template('Point') Point = PointTmpl( 'int' ) - This is a trivial example, which is why it looks grate. Consider the following class: + This is a trivial example, which is why it looks great. Consider the following class: .. code-block:: C++ Modified: pyplusplus_dev/pyplusplus/decl_wrappers/algorithm.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/algorithm.py 2008-08-26 19:01:31 UTC (rev 1409) +++ pyplusplus_dev/pyplusplus/decl_wrappers/algorithm.py 2008-09-03 12:01:18 UTC (rev 1410) @@ -62,7 +62,7 @@ return name replace_table = { '<' : '_less_' - , '>' : '_grate_' + , '>' : '_greater_' , '::' : '_scope_' , ',' : '_comma_' , ' ' : '_' Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2008-08-26 19:01:31 UTC (rev 1409) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2008-09-03 12:01:18 UTC (rev 1410) @@ -522,7 +522,6 @@ """Please see L{decl_wrappers.scopedef_t} class documentation""" return self.global_ns.operator( name=name , symbol=symbol - , function=function , decl_type=decl_type , return_type=return_type , arg_types=arg_types @@ -534,7 +533,6 @@ """Please see L{decl_wrappers.scopedef_t} class documentation""" return self.global_ns.operators( name=name , symbol=symbol - , function=function , decl_type=decl_type , return_type=return_type , arg_types=arg_types This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-09-11 18:59:32
|
Revision: 1413 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1413&view=rev Author: roman_yakovenko Date: 2008-09-11 18:59:42 +0000 (Thu, 11 Sep 2008) Log Message: ----------- fix few bugs related to default\copy constructors Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2008-09-05 19:41:29 UTC (rev 1412) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2008-09-11 18:59:42 UTC (rev 1413) @@ -1010,18 +1010,22 @@ """ Creates wrapper class constructor from wrapped class instance. """ - def __init__( self, class_ ): + def __init__( self, constructor ): code_creator.code_creator_t.__init__( self ) - declaration_based.declaration_based_t.__init__( self, declaration=class_ ) + declaration_based.declaration_based_t.__init__( self, declaration=constructor ) + + @property + def parent_class( self ): + return self.declaration.parent def _create_declaration(self): result = [] - result.append( self.declaration.wrapper_alias ) + result.append( self.parent_class.wrapper_alias ) result.append( '(' ) if not self.target_configuration.boost_python_has_wrapper_held_type \ - or self.declaration.require_self_reference: + or self.parent_class.require_self_reference: result.append( 'PyObject* self, ' ) - declarated = declarations.declarated_t( self.declaration ) + declarated = declarations.declarated_t( self.parent_class ) const_decl = declarations.const_t( declarated ) const_ref_decl = declarations.reference_t( const_decl ) identifier = algorithm.create_identifier( self, const_ref_decl.decl_string ) @@ -1030,7 +1034,7 @@ return ''.join( result ) def _create_constructor_call( self ): - answer = [ algorithm.create_identifier( self, self.declaration.decl_string ) ] + answer = [ algorithm.create_identifier( self, self.parent_class.decl_string ) ] answer.append( '( arg )' ) return ''.join( answer ) @@ -1039,7 +1043,7 @@ answer.append( ': ' + self._create_constructor_call() ) answer.append( ' , ' + self.parent.boost_wrapper_identifier + '(){' ) answer.append( self.indent( '// copy constructor' ) ) - answer.append( self.indent( self.declaration.copy_constructor_body ) ) + answer.append( self.indent( self.declaration.body ) ) answer.append( '}' ) return os.linesep.join( answer ) @@ -1051,23 +1055,27 @@ """ Creates wrapper for compiler generated null constructor. """ - def __init__( self, class_ ): + def __init__( self, constructor ): code_creator.code_creator_t.__init__( self ) - declaration_based.declaration_based_t.__init__( self, declaration=class_ ) - + declaration_based.declaration_based_t.__init__( self, declaration=constructor ) + + @property + def parent_class( self ): + return self.declaration.parent + def _create_constructor_call( self ): - return algorithm.create_identifier( self, self.declaration.decl_string ) + '()' + return algorithm.create_identifier( self, self.parent_class.decl_string ) + '()' def _create_impl(self): - answer = [ self.declaration.wrapper_alias + '(' ] + answer = [ self.parent_class.wrapper_alias + '(' ] if not self.target_configuration.boost_python_has_wrapper_held_type \ - or self.declaration.require_self_reference: + or self.parent_class.require_self_reference: answer[0] = answer[0] + 'PyObject* self' answer[0] = answer[0] + ')' answer.append( ': ' + self._create_constructor_call() ) answer.append( ' , ' + self.parent.boost_wrapper_identifier + '(){' ) answer.append( self.indent( '// null constructor' ) ) - answer.append( self.indent( self.declaration.null_constructor_body ) ) + answer.append( self.indent( self.declaration.body ) ) answer.append( '}' ) return os.linesep.join( answer ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-09-05 19:41:29 UTC (rev 1412) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2008-09-11 18:59:42 UTC (rev 1413) @@ -185,8 +185,6 @@ self._registration_code_tail = [] self._declaration_code = [] self._wrapper_code = [] - self._null_constructor_body = '' - self._copy_constructor_body = '' self._destructor_code = [] self._exception_translation_code = None self._properties = [] @@ -298,16 +296,29 @@ return self._wrapper_code def _get_null_constructor_body(self): - return self._null_constructor_body + c = self.find_trivial_constructor() + if c: + return c.body + else: + return '' def _set_null_constructor_body(self, body): - self._null_constructor_body = body + c = self.find_trivial_constructor() + if c: + c.body = body null_constructor_body = property( _get_null_constructor_body, _set_null_constructor_body - , doc="null constructor code, that will be added as is to the null constructor of class-wrapper") + , doc="null constructor code, that will be added as is to the null constructor of class-wrapper" ) def _get_copy_constructor_body(self): - return self._copy_constructor_body + c = self.find_copy_constructor() + if c: + return c.body + else: + return '' + def _set_copy_constructor_body(self, body): - self._copy_constructor_body = body + c = self.find_copy_constructor() + if c: + c.body = body copy_constructor_body = property( _get_copy_constructor_body, _set_copy_constructor_body , doc="copy constructor code, that will be added as is to the copy constructor of class-wrapper") Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-09-05 19:41:29 UTC (rev 1412) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-09-11 18:59:42 UTC (rev 1413) @@ -594,12 +594,12 @@ copy_constr = self.curr_decl.find_copy_constructor() if not self.curr_decl.noncopyable and copy_constr and copy_constr.is_artificial: - cccc = code_creators.copy_constructor_wrapper_t( class_=self.curr_decl) + cccc = code_creators.copy_constructor_wrapper_t( constructor=copy_constr) wrapper.adopt_creator( cccc ) trivial_constr = self.curr_decl.find_trivial_constructor() if trivial_constr and trivial_constr.is_artificial and not noncopyable_vars: - tcons = code_creators.null_constructor_wrapper_t( class_=self.curr_decl ) + tcons = code_creators.null_constructor_wrapper_t( constructor=trivial_constr ) wrapper.adopt_creator( tcons ) exposed = self.expose_overloaded_mem_fun_using_macro( cls_decl, cls_cc ) Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2008-09-05 19:41:29 UTC (rev 1412) +++ pyplusplus_dev/unittests/algorithms_tester.py 2008-09-11 18:59:42 UTC (rev 1413) @@ -268,7 +268,41 @@ self.failUnless( do_smth.exportable == False ) print do_smth.why_not_exportable() + +class constructors_code_tester_t( unittest.TestCase ): + def test(self): + code = """ + namespace xyz{ + struct Y; + + struct X{ + X(); + X( const X& ); + X( Y* ); + }; + } + """ + + mb = module_builder.module_builder_t( + [ module_builder.create_text_fc( code ) ] + , gccxml_path=autoconfig.gccxml.executable ) + + x = mb.class_( 'X' ) + x.include() + x.constructors().body = ' //all constructors body' + x.null_constructor_body = ' //null constructor body' + x.copy_constructor_body = ' //copy constructor body' + + mb.build_code_creator( 'XXX' ) + code = mb.code_creator.create() + tmp = code.split( x.null_constructor_body ) + self.failUnless( len( tmp ) == 2 ) + tmp = code.split( x.copy_constructor_body ) + self.failUnless( len( tmp ) == 2 ) + tmp = code.split( ' //all constructors body' ) + self.failUnless( len( tmp ) == 2 ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(doc_extractor_tester_t)) @@ -283,6 +317,7 @@ suite.addTest( unittest.makeSuite(exclude_erronious_tester_t)) suite.addTest( unittest.makeSuite(use_function_signature_bug_tester_t)) suite.addTest( unittest.makeSuite(exclude_ellipsis_tester_t)) + suite.addTest( unittest.makeSuite(constructors_code_tester_t)) return suite def run_suite(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-10-02 06:22:01
|
Revision: 1416 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1416&view=rev Author: roman_yakovenko Date: 2008-10-02 06:21:50 +0000 (Thu, 02 Oct 2008) Log Message: ----------- small bug fix in "inout" function transformation Modified Paths: -------------- pyplusplus_dev/pyplusplus/function_transformers/transformers.py pyplusplus_dev/unittests/data/ft_inout_bugs_to_be_exported.hpp pyplusplus_dev/unittests/ft_inout_tester.py Modified: pyplusplus_dev/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2008-09-14 12:43:42 UTC (rev 1415) +++ pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2008-10-02 06:21:50 UTC (rev 1416) @@ -243,7 +243,7 @@ tmpl = string.Template( '$name = boost::python::extract< $type >( pyplus_conv::get_out_argument( $py_result, "$name" ) );' ) store_py_result_in_arg = tmpl.substitute( name=self.arg.name - , type=self.arg.type.decl_string + , type=remove_ref_or_ptr( self.arg.type ).decl_string , py_result=controller.py_result_variable.name ) controller.add_py_post_call_code( store_py_result_in_arg ) Modified: pyplusplus_dev/unittests/data/ft_inout_bugs_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/ft_inout_bugs_to_be_exported.hpp 2008-09-14 12:43:42 UTC (rev 1415) +++ pyplusplus_dev/unittests/data/ft_inout_bugs_to_be_exported.hpp 2008-10-02 06:21:50 UTC (rev 1416) @@ -17,4 +17,8 @@ } }; +inline void call_set_flag( base& x, bool value, bool& flag ){ + x.set_flag( value, flag ); } + +} Modified: pyplusplus_dev/unittests/ft_inout_tester.py =================================================================== --- pyplusplus_dev/unittests/ft_inout_tester.py 2008-09-14 12:43:42 UTC (rev 1415) +++ pyplusplus_dev/unittests/ft_inout_tester.py 2008-10-02 06:21:50 UTC (rev 1416) @@ -28,6 +28,19 @@ set_flag = mb.calldefs( 'set_flag' ) set_flag.add_transformation( ft.inout(1) ) + call_set_flag = mb.calldefs( 'call_set_flag' ) + call_set_flag.add_transformation( ft.inout(2) ) + + def create_py_inventor( self, module ): + class pyinventor( module.base ): + def __init__( self ): + module.base.__init__( self ) + + def set_flag( self, value, flag ): + flag = not value + return flag + return pyinventor() + def run_tests(self, module): x = False self.failUnless( True == module.set_flag( True, x ) ) @@ -35,11 +48,25 @@ b = module.base() self.failUnless( True == b.set_flag( True, x ) ) self.failUnless( False == b.set_flag( False, x ) ) + + self.failUnless( True == module.call_set_flag( b, True, x ) ) + self.failUnless( False == module.call_set_flag( b, False, x ) ) + inventor = module.inventor() self.failUnless( False == inventor.set_flag( True, x ) ) self.failUnless( True == inventor.set_flag( False, x ) ) + self.failUnless( False == module.call_set_flag( inventor, True, x ) ) + self.failUnless( True == module.call_set_flag( inventor, False, x ) ) + inventor = self.create_py_inventor( module ) + self.failUnless( False == inventor.set_flag( True, x ) ) + self.failUnless( True == inventor.set_flag( False, x ) ) + + self.failUnless( False == module.call_set_flag( inventor, True, x ) ) + self.failUnless( True == module.call_set_flag( inventor, False, x ) ) + + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-10-05 20:26:49
|
Revision: 1425 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1425&view=rev Author: roman_yakovenko Date: 2008-10-05 20:26:38 +0000 (Sun, 05 Oct 2008) Log Message: ----------- adding new warning Modified Paths: -------------- pyplusplus_dev/pyplusplus/messages/warnings_.py pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py pyplusplus_dev/unittests/duplicate_aliases_tester.py Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-10-05 20:21:17 UTC (rev 1424) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2008-10-05 20:26:38 UTC (rev 1425) @@ -32,6 +32,10 @@ class execution_error( message_type ): prefix = 'execution error' +class code_generation_error( message_type ): + prefix = 'code generation error' + + W0000 = warning( '%s' ) #general message, usefull in few cases W1000 = compilation_error( @@ -246,6 +250,16 @@ W1064 = compilation_error( 'Py++ can not expose "%s" as "fake constructor" of "%s".' ' Only the following function types supported: %s' ) +W1065 = code_generation_error( + 'There are two or more classes that use same class wrapper alias("%s"). ' + 'Duplicated class wrapper aliases causes few problems, but the main one is that during ' + 'files generation Py++ uses class wrapper aliases for the file names. ' + 'Py++ will rewrite the file content and at best will introduce compile time error. ' + 'The worst case scenario: you will discover the problem during run-time.' + 'Use `wrapper_alias` property to change class wrapper alias value' + 'Other classes : %s' ) + + warnings = globals() all_warning_msgs = [] Modified: pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2008-10-05 20:21:17 UTC (rev 1424) +++ pyplusplus_dev/pyplusplus/module_creator/dependencies_manager.py 2008-10-05 20:26:38 UTC (rev 1425) @@ -11,7 +11,46 @@ from pygccxml import declarations from pyplusplus import decl_wrappers +class duplicated_names_reporter_t(object): + def __init__( self, decls, value_getter, msg ): + self.decls = decls + self.get_value = value_getter + self.msg = msg + def __select( self ): + duplicated = {} + for decl in self.decls: + value = self.get_value( decl ) + if not duplicated.has_key( value ): + duplicated[ value ] = set() + duplicated[ value ].add( decl ) + result = duplicated.copy() + for value, buggy_decls in duplicated.items(): + if 1 == len( buggy_decls ): + del result[ value ] + return result + + def __report_single( self, control_decl, duplicated, logger ): + value = self.get_value( control_decl ) + if value not in duplicated: + return + buggy_decls = duplicated[value].copy() + buggy_decls.remove( control_decl ) + warning = self.msg % ( value, os.linesep.join( map( str, buggy_decls ) ) ) + logger.warn( "%s;%s" % ( str( control_decl ), warning ) ) + + def report( self, logger ): + duplicated = self.__select() + for decl in self.decls: + self.__report_single( decl, duplicated, logger ) + +duplicated_aliases_reporter \ + = lambda decls: duplicated_names_reporter_t( decls, lambda d: d.alias, messages.W1047 ) + +duplicated_wrapper_aliases_reporter \ + = lambda decls: duplicated_names_reporter_t( decls, lambda d: d.wrapper_alias, messages.W1065 ) + + class manager_t( object ): def __init__( self, logger ): object.__init__( self ) @@ -21,41 +60,6 @@ def add_exported( self, decl ): self.__exported_decls.append( decl ) - def __select_duplicate_aliases( self, decls ): - duplicated = {} - for decl in decls: - if not duplicated.has_key( decl.alias ): - duplicated[ decl.alias ] = set() - duplicated[ decl.alias ].add( decl ) - for alias, buggy_decls in duplicated.items(): - if 1 == len( buggy_decls ): - del duplicated[ alias ] - return duplicated - - def __report_duplicate_aliases_impl( self, control_decl, duplicated ): - if control_decl.alias in duplicated: - buggy_decls = duplicated[control_decl.alias].copy() - buggy_decls.remove( control_decl ) - warning = messages.W1047 % ( control_decl.alias - , os.linesep.join( map( str, buggy_decls ) ) ) - self.__logger.warn( "%s;%s" % ( control_decl, warning ) ) - - if isinstance( control_decl, declarations.class_t ): - query = lambda i_decl: isinstance( i_decl, declarations.class_types ) \ - and i_decl.ignore == False - i_decls = control_decl.classes( query, recursive=False, allow_empty=True ) - i_duplicated = self.__select_duplicate_aliases( i_decls ) - for i_decl in i_decls: - self.__report_duplicate_aliases_impl( i_decl, i_duplicated ) - - def __report_duplicate_aliases( self ): - decls = filter( lambda decl: isinstance( decl, declarations.class_types ) \ - and isinstance( decl.parent, declarations.namespace_t ) - , self.__exported_decls ) - duplicated = self.__select_duplicate_aliases( decls ) - for decl in decls: - self.__report_duplicate_aliases_impl( decl, duplicated ) - def __is_std_decl( self, decl ): #Every class under std should be exported by Boost.Python and\\or Py++ #Also this is not the case right now, I prefer to hide the warnings @@ -76,46 +80,46 @@ if decl.already_exposed: return [] dependencies = decl.i_depend_on_them(recursive=False) - + if isinstance( decl, declarations.class_t ): dependencies = filter( lambda d: d.access_type != declarations.ACCESS_TYPES.PRIVATE - , dependencies ) - + , dependencies ) + return dependencies - def __has_unexposed_dependency( self, exported_ids, depend_on_decl, dependency ): + def __has_unexposed_dependency( self, exported_ids, depend_on_decl, dependency ): sptr_traits = declarations.smart_pointer_traits - + if None is depend_on_decl: return - + if self.__is_std_decl( depend_on_decl ): - return - + return + if sptr_traits.is_smart_pointer( depend_on_decl ): try: value_type = sptr_traits.value_type( depend_on_decl ) return self.__has_unexposed_dependency( exported_ids, value_type, dependency ) except RuntimeError: - pass - + pass + if isinstance( depend_on_decl, decl_wrappers.decl_wrapper_t ): if depend_on_decl.already_exposed: - return + return if isinstance( depend_on_decl, declarations.class_types ): if depend_on_decl.opaque: - return + return if dependency.hint == "base class": return #base class for some class don't have to be exported if isinstance( depend_on_decl, declarations.variable_t ): if not decl.expose_value: - return - + return + if isinstance( dependency.decl, declarations.variable_t ): #the only dependency of the variable is its type if not dependency.decl.expose_value: - return - + return + if dependency.hint == "return type": #in this case we don't check, the return type but the function if isinstance( dependency.decl, declarations.calldef_t ): @@ -124,13 +128,13 @@ return return id( depend_on_decl ) not in exported_ids - + def __find_out_used_but_not_exported( self ): used_not_exported = [] exported_ids = set( map( lambda d: id( d ), self.__exported_decls ) ) for decl in self.__exported_decls: - for dependency in self.__build_dependencies( decl ): - depend_on_decl = dependency.find_out_depend_on_declaration() + for dependency in self.__build_dependencies( decl ): + depend_on_decl = dependency.find_out_depend_on_declaration() if self.__has_unexposed_dependency( exported_ids, depend_on_decl, dependency ): if messages.filter_disabled_msgs([messages.W1040], depend_on_decl.disabled_messages ): #need to report dependency errors @@ -153,9 +157,43 @@ decls.append( os.linesep + ' ' + str( dependency.declaration ) ) return "%s;%s" % ( depend_on_decl, messages.W1040 % ''.join( decls ) ) + def __report_duplicated_aliases( self ): + decls = filter( lambda decl: isinstance( decl, declarations.class_types ) \ + and isinstance( decl.parent, declarations.namespace_t ) + , self.__exported_decls ) + + dar = duplicated_aliases_reporter( decls ) + dar.report( self.__logger ) + + classes = filter( lambda c: isinstance( c, declarations.class_t ), decls ) + query = lambda decl: isinstance( decl, declarations.class_types ) \ + and decl.ignore == False \ + and decl._already_exposed == False + + for cls in classes: + internal_decls = cls.decls( query, recursive=False, allow_empty=True) + dar = duplicated_aliases_reporter( internal_decls ) + dar.report( self.__logger ) + + def __report_duplicated_wrapper_aliases( self ): + decls = filter( lambda decl: isinstance( decl, declarations.class_t ) \ + and isinstance( decl.parent, declarations.namespace_t ) + , self.__exported_decls ) + + dwar = duplicated_wrapper_aliases_reporter( decls ) + dwar.report( self.__logger ) + + query = lambda decl: decl.ignore == False and decl._already_exposed == False + + for cls in decls: + internal_decls = cls.classes( query, recursive=False, allow_empty=True) + dwar = duplicated_wrapper_aliases_reporter( internal_decls ) + dwar.report( self.__logger ) + def inform_user( self ): used_not_exported_decls = self.__find_out_used_but_not_exported() groups = self.__group_by_unexposed( used_not_exported_decls ) for group in groups.itervalues(): self.__logger.warn( self.__create_dependencies_msg( group ) ) - self.__report_duplicate_aliases() + self.__report_duplicated_aliases() + self.__report_duplicated_wrapper_aliases() Modified: pyplusplus_dev/unittests/duplicate_aliases_tester.py =================================================================== --- pyplusplus_dev/unittests/duplicate_aliases_tester.py 2008-10-05 20:21:17 UTC (rev 1424) +++ pyplusplus_dev/unittests/duplicate_aliases_tester.py 2008-10-05 20:26:38 UTC (rev 1425) @@ -21,6 +21,7 @@ def customize(self, mb): classes = mb.classes( lambda decl: 'duplicate_aliases' in decl.name ) classes.alias = 'duplicate_aliases' + classes.wrapper_alias = 'wrapper_duplicate_aliases' def run_tests( self, module): #check compilation This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-10-12 10:27:16
|
Revision: 1431 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1431&view=rev Author: roman_yakovenko Date: 2008-10-12 10:22:11 +0000 (Sun, 12 Oct 2008) Log Message: ----------- update docs Modified Paths: -------------- developer_scripts/check_links.bat pygccxml_dev/announcement.txt pygccxml_dev/docs/history/history.rest pyplusplus_dev/announcement.txt pyplusplus_dev/contrib/doc_extractors/doxygen.py pyplusplus_dev/docs/history/history.rest Modified: developer_scripts/check_links.bat =================================================================== --- developer_scripts/check_links.bat 2008-10-12 08:14:32 UTC (rev 1430) +++ developer_scripts/check_links.bat 2008-10-12 10:22:11 UTC (rev 1431) @@ -1,3 +1,3 @@ cd D:\dev\language-binding\production\www\ -E:\Python25\Scripts\linkchecker.bat --config=D:\dev\language-binding\sources\developer_scripts\linkcheckerrc index.html +E:\Python25\Scripts\linkchecker.bat --no-warnings index.html Modified: pygccxml_dev/announcement.txt =================================================================== --- pygccxml_dev/announcement.txt 2008-10-12 08:14:32 UTC (rev 1430) +++ pygccxml_dev/announcement.txt 2008-10-12 10:22:11 UTC (rev 1431) @@ -1,6 +1,6 @@ Hello! -I'm pleased to announce the 0.9.0 release of pygccxml. +I'm pleased to announce the 1.0 release of pygccxml. What is pygccxml? ================= @@ -23,34 +23,21 @@ What's new? =========== -Performance ------------ +Features +--------- -Performance was improved. pygccxml is now 30-50% faster. The improvement was -achieved by using "cElementTree" package, "iterparse" functionality, instead of -standard XML SAX API. +* Support for ellipsis was added. +* New expiremental back-end, based on ``.pdb`` (progam database file), was added. -Small features --------------- +* New high-level API wrapper for ``.bsc`` (browse source code file) was added. -* Class calldef_t has new property - "does_throw". It describes whether the - function throws any exception or not. -* "is_base_and_derived" function arguments were changed. The second argument could be - a tuple, which contains classes. The function returns ``True`` if at least one - class derives from the base one. - - Bug fixes --------- -* C++ does not define implicit conversion between an integral type and ``void*``. - "declarations.is_convertible" type traits was fixed. +* Search algorithm, for template instantiated classes, was improved. -* Small bug was fixed in functionality that corrects GCC-XML reported function - default arguments. Reference to "enum" declaration extracted properly. - For a more complete list, please see the news: http://language-binding.net/pygccxml/history/history.html Modified: pygccxml_dev/docs/history/history.rest =================================================================== --- pygccxml_dev/docs/history/history.rest 2008-10-12 08:14:32 UTC (rev 1430) +++ pygccxml_dev/docs/history/history.rest 2008-10-12 10:22:11 UTC (rev 1431) @@ -22,6 +22,7 @@ * Miguel Lobo * Jeremy Sanders * Ben Schleimer +* Gustavo Carneiro ----------- @@ -65,6 +66,8 @@ 7. Search algorithm was improved for template instantiated classes. From now, a spaces within the class name doesn't matter. +8. pygccxml unit tests functionality was improved. Many thanks to Gustavo Carneiro. + ------------- Version 0.9.5 ------------- Modified: pyplusplus_dev/announcement.txt =================================================================== --- pyplusplus_dev/announcement.txt 2008-10-12 08:14:32 UTC (rev 1430) +++ pyplusplus_dev/announcement.txt 2008-10-12 10:22:11 UTC (rev 1431) @@ -1,6 +1,6 @@ Hello! -I'm pleased to announce the 0.9.0 release of Py++. +I'm pleased to announce the 1.0 release of Py++. What is Py++? ============= @@ -21,35 +21,25 @@ Features -------- -* Added exposing of copy constructor, ``operator=`` and ``operator<<``. - * ``operator=`` is exposed under "assign" name - * ``operator<<`` is exposed under "__str__" name +* Algorightm, which defines what virtual functions should be redefined was improved. -* Added new call policies: - * as_tuple - * custom_call_policies - * return_range +* Exposing "C" code became easier - Py++ is able to generate ``ctypes`` friendly code. -* Added an initial support for multi-module development. Now you can mark your - declarations as ``already_exposed`` and `Py++`_ will do the rest. +* Support for ``boost::python::make_constructor`` functionality was added. -* `input_c_buffer`_ - new functions transformation, which allows to pass a Python - sequence to C++ function, instead of pair of arguments: pointer to buffer and size. +* Support for unions and unnamed classes was added. -* Added ability to control generated "include" directives. Now you can ask Py++ - to include a header file, when it generates code for some declaration. +Bug fixes +--------- -* Code generation improvements: system header files (Boost.Python or Py++ defined) - will be included from the generated files only in case the generated code - depends on them. +* Indexing Suite V2 - few bugs were fixed. + + +Contributors: -* Performance: Py++ runs 1.5 - 2 times faster. +* Julian Scheid +* Oliver Schweitzer -* Py++ will generate documentation for automatically constructed properties. -* Added iteration functionality to Boost.Python Indexing Suite V2 ``std::map`` - and ``std::multimap`` containers. - - For a more complete list, with links to documentation, please see the news: http://language-binding.net/pyplusplus/history/history.html Modified: pyplusplus_dev/contrib/doc_extractors/doxygen.py =================================================================== --- pyplusplus_dev/contrib/doc_extractors/doxygen.py 2008-10-12 08:14:32 UTC (rev 1430) +++ pyplusplus_dev/contrib/doc_extractors/doxygen.py 2008-10-12 10:22:11 UTC (rev 1431) @@ -1,112 +1,113 @@ """ -extracting from C++ doxygen documented file -Author G.D. +Fixed and improved version based on "extracting from C++ doxygen documented file Author G.D." and py++ code. + +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) """ -class doc_extractor: - """ - extracts doxigen styled documentation from source - or generates from description - """ - def __init__(self): - #for caching source - self.file_name = None - self.source = None - - def __call__(self, declaration): - try: - if self.file_name != declaration.location.file_name: - self.file_name = declaration.location.file_name - self.source = open(declaration.location.file_name).readlines() - - find_block_end = False - doc_lines = [] - for lcount in xrange(declaration.location.line - 1, -1, -1): - line = source[lcount] - if not find_block_end: - try: - if line.rstrip()[-2:] == "*/": - find_block_end = True - except: - pass - if find_block_end: - try: - if line.lstrip()[:2] == "/*": - find_block_end = False - except: - pass - final_str = clear_str(line) - if not find_block_end and code(line): - break - if final_str: - doc_lines.insert(0, final_str) - - if doc_lines: - doc_lines.insert(0, self.get_generic_doc()) - return ''.join(doc_lines) - - except: - pass - - return self.get_generic_doc(declaration) - - def get_generic_doc(self, declaration): - """ - generate call information about function or method - """ - try: - return "Help on %s\n" % str(declaration) - except: - pass - - return '' - +class doxygen_doc_extractor: + """ + Extracts Doxigen styled documentation from source + or generates from description. + """ + def __init__(self): + #for caching source + self.file_name = None + self.source = None + #__init__ -def clear_str(str): - """ - replace */! by Space and \breaf, \fn, \param, ... - """ - clean = lambda str, sym, change2 = '': str.replace(sym, change2) + def __call__(self, declaration): + try: + if self.file_name != declaration.location.file_name: + self.file_name = declaration.location.file_name + self.source = open(declaration.location.file_name).readlines() - str = reduce(clean, [str, '/', '*', '!', "\brief", "\fn",\ - "@brief", "@fn", "@ref", "\ref"]) - - str = clean(str, "@param", "Param: ") - str = clean(str, "\param", "Param: ") - str = clean(str, "@ingroup", "Group") - str = clean(str, "\ingroup", "Group") - str = clean(str, "@return", "It return") - str = clean(str, "\return", "It return") - return " " + str.lstrip() + find_block_end = False + doc_lines = [] + for lcount in xrange(declaration.location.line-2, -1, -1): + line = self.source[lcount] + if not find_block_end: + try: + print line.rstrip()[-2:] + if line.rstrip()[-2:] == "*/": + find_block_end = True + except: + pass + if find_block_end: + try: + if line.lstrip()[:2] == "/*": + find_block_end = False + except: + pass + final_str = self.clear_str(line) + if not find_block_end and self.is_code(line): + break + if final_str: + doc_lines.insert(0, final_str) + except: + pass + finally: + if doc_lines: + final_doc_lines = [ line.replace("\n","\\n") for line in doc_lines[:-1] ] + final_doc_lines.append(doc_lines[-1].replace("\n","")) + #final_doc_lines.insert(0, self.get_generic_doc(declaration)) + return '\"' + ''.join(final_doc_lines) + '\"' + else: + return '\"\"' + #return '\"'+self.get_generic_doc(declaration)+'\"' + #__call__() - -def code(str): - """ - detect str is code? - """ - try: - beg = str.lstrip()[:2] - return beg != "//" and beg != "/*" - except: - pass - return False + #def get_generic_doc(self, declaration): + #""" + #Generate call information about function or method + #""" + #try: + #return "Help on %s" % str(declaration) + #except: + #pass + #return '' + ##get_generic_doc() -if __name__ == '__main__': - class loc: - def __init__(self, f, l): - self.file_name = f - self.line = l - - class x_decl: - def __init__(self, str, file_name, line): - self.str = str - self.location = loc(file_name, line) - - def __str__(self): - return self.str - - print doc_extractor()(x_decl("myfunc(int x, int y)","core.h",45)) - print doc_extractor()(x_decl("","core.h",209)) - + def clear_str(self, tmp_str): + """ + Replace */! by Space and \breaf, \fn, \param, ... + """ + clean = lambda tmp_str, sym, change2 = '': tmp_str.replace(sym, change2) + + tmp_str = reduce(clean, [tmp_str, '/', '*', '!', "\\brief", "\\fn",\ + "@brief", "@fn", "@ref", "\\ref", "\"", "\'", "\\c"]) + + tmp_str = clean(tmp_str, "@param", "Param:") + tmp_str = clean(tmp_str, "@see", "See:") + tmp_str = clean(tmp_str, "@pre", "Pre-condition:") + tmp_str = clean(tmp_str, "@throws", "Throws:") + tmp_str = clean(tmp_str, "@throw", "Throw:") + tmp_str = clean(tmp_str, "@todo", "TODO:") + tmp_str = clean(tmp_str, "\param", "Param:") + tmp_str = clean(tmp_str, "@ingroup", "Group") + tmp_str = clean(tmp_str, "\ingroup", "Group") + tmp_str = clean(tmp_str, "@return", "It return") + tmp_str = clean(tmp_str, "\\return", "It return") + tmp_str = clean(tmp_str, "\\warning", "Warning:") + tmp_str = clean(tmp_str, "\\WARNING", "Warning:") + tmp_str = clean(tmp_str, "@dot", "[Dot]") + tmp_str = clean(tmp_str, "@enddot", "[/Dot]") + tmp_str = clean(tmp_str, "@code", "[Code]") + tmp_str = clean(tmp_str, "@endcode", "[/Code]") + return tmp_str.lstrip() + #clean_str() + + def is_code(self, tmp_str): + """ + Detect if tmp_str is code + """ + try: + beg = tmp_str.lstrip()[:2] + return beg != "//" and beg != "/*" + except: + pass + return False + #is_code() - +#class doxygen_doc_extractor Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2008-10-12 08:14:32 UTC (rev 1430) +++ pyplusplus_dev/docs/history/history.rest 2008-10-12 10:22:11 UTC (rev 1431) @@ -1,4 +1,4 @@ -======================== +======================== Py++ development history ======================== @@ -22,6 +22,8 @@ * Meghana Haridev * Julian Scheid * Oliver Schweitzer +* Hernán Ordiales +* Bernd Fritzke ----------- Version 1.0 @@ -148,6 +150,12 @@ .. _`boost::python::make_constructor` : ../documentation/functions/make_constructor.html +5. Support for unions and unnamed classes was added. + +6. Doxygen documentation extractor was improved. Many thanks to Hernán Ordiales. + +7. Py++ documentation was improved. Many thanks to Bernd Fritzke. + ------------- Version 0.9.5 ------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-11-22 22:55:26
|
Revision: 1450 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1450&view=rev Author: roman_yakovenko Date: 2008-11-22 21:36:02 +0000 (Sat, 22 Nov 2008) Log Message: ----------- small refactoring, which moves "free operators" target class logic out of creator_t class Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/operators_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites2_tester.py pyplusplus_dev/unittests/operators_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2008-11-01 19:04:11 UTC (rev 1449) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2008-11-22 21:36:02 UTC (rev 1450) @@ -400,9 +400,35 @@ included = filter( lambda decl: decl.ignore == False, oper.class_types ) if not included: return messages.W1052 % str(oper) - return '' + @staticmethod + def target_class( oper ): + """this functions returns reference to class/class declaration + in scope of which, the operator should be exposed.""" + if isinstance( oper.parent, declarations.class_t ): + return oper.parent + #now we deal with free operators + def find_class( type_ ): + type_ = declarations.remove_reference( type_ ) + if declarations.is_class( type_ ): + return declarations.class_traits.get_declaration( type_ ) + elif declarations.is_class_declaration( type_ ): + return declarations.class_declaration_traits.get_declaration( type_ ) + else: + return None + + arg_1_class = find_class( oper.arguments[0].type ) + arg_2_class = None + if 2 == len( oper.arguments ): + arg_2_class = find_class( oper.arguments[1].type ) + + if arg_1_class: + return arg_1_class + else: + return arg_2_class + + class member_operator_t( declarations.member_operator_t, calldef_t ): """defines a set of properties, that will instruct Py++ how to expose the member operator""" def __init__(self, *arguments, **keywords): @@ -446,6 +472,9 @@ return messages.W1015 return operators_helper.exportable( self ) + @property + def target_class( self ): + return self.parent class casting_operator_t( declarations.casting_operator_t, calldef_t ): """defines a set of properties, that will instruct Py++ how to expose the casting operator""" @@ -557,6 +586,22 @@ def __init__(self, *arguments, **keywords): declarations.free_operator_t.__init__( self, *arguments, **keywords ) calldef_t.__init__( self ) + self._target_class = None def _exportable_impl_derived( self ): return operators_helper.exportable( self ) + + def get_target_class( self ): + if self._target_class is None: + self._target_class = operators_helper.target_class( self ) + return self._target_class + + def set_target_class( self, class_ ): + self._target_class = class_ + + _target_class_doc_ = "reference to class_t or class_declaration_t object." \ + + " There are use cases, where Py++ doesn't guess right, in what scope" \ + + " free operator should be registered( exposed ). If this is your use case " \ + + " than setting the class will allow you to quickly fix the situation. " + + target_class = property( get_target_class, set_target_class, doc=_target_class_doc_ ) Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-11-01 19:04:11 UTC (rev 1449) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-11-22 21:36:02 UTC (rev 1450) @@ -174,7 +174,14 @@ pass else: assert not "Found %d class code creators" % len(creator) + find = code_creators.creator_finder.find_by_declaration + if operator.target_class and operator.target_class.ignore == False: + found = find( lambda decl: operator.target_class is decl + , self.__extmodule.body.creators ) + adopt_operator_impl( operator, found ) + """ + find = code_creators.creator_finder.find_by_declaration if isinstance( operator.parent, declarations.class_t ): found = find( lambda decl: operator.parent is decl , self.__extmodule.body.creators ) @@ -190,7 +197,7 @@ found = find( lambda decl: included[0] is decl, self.__extmodule.body.creators ) adopt_operator_impl( operator, found ) - + """ def _is_registered_smart_pointer_creator( self, creator, db ): for registered in db: if not isinstance( creator, registered.__class__ ): @@ -254,20 +261,20 @@ cls_creator.associated_decl_creators.extend( uc_creators ) def __get_exposed_containers(self): - """list of exposed declarations, which were not ``included``, but still + """list of exposed declarations, which were not ``included``, but still were exposed. For example, std containers - + std containers exposed by Py++, even if the user didn't ``include`` them. """ cmp_by_name = lambda cls1, cls2: cmp( cls1.decl_string, cls2.decl_string ) used_containers = list( self.__types_db.used_containers ) used_containers = filter( lambda cls: cls.indexing_suite.include_files , used_containers ) - used_containers.sort( cmp_by_name ) + used_containers.sort( cmp_by_name ) used_containers = filter( lambda cnt: cnt.already_exposed == False , used_containers ) return used_containers - + def _treat_indexing_suite( self ): def create_explanation(cls): msg = '//WARNING: the next line of code will not compile, because "%s" does not have operator== !' Modified: pyplusplus_dev/unittests/data/operators_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/operators_to_be_exported.hpp 2008-11-01 19:04:11 UTC (rev 1449) +++ pyplusplus_dev/unittests/data/operators_to_be_exported.hpp 2008-11-22 21:36:02 UTC (rev 1450) @@ -8,21 +8,22 @@ #include "boost/rational.hpp" #include <iostream> +#include <vector> namespace pyplusplus{ namespace rational{ typedef boost::rational< long int > pyrational; struct helper{ - + void instantiate(){ sizeof( pyrational ); boost::gcd<long int>( 1, 1); boost::lcm<long int>( 1, 1); - std::cout << pyrational( 1,1); + std::cout << pyrational( 1,1); pyrational x(1,1); x = pyrational( 2, 3 ); - + } }; @@ -36,14 +37,46 @@ //Boost.Python does not support member operator<< struct YYY{ - std::ostream& operator<<(std::ostream& s) const{ + std::ostream& operator<<(std::ostream& s) const{ return s; //return s << "<YYY instance at " << reinterpret_cast<unsigned long>( this )<< ">"; } }; +typedef std::vector< pyrational > rationals_t; +inline rationals_t& +operator+=( rationals_t& v, const pyrational& n ){ + for( rationals_t::iterator i = v.begin(); i != v.end(); ++i ){ + *i += n; + } + return v; +} + +inline rationals_t create_randome_rationals(){ + return rationals_t(); +} + + } } - + +namespace Geometry{ + + namespace PointsUtils{ + struct VecOfInts{}; + //typedef std::vector<int> VecOfInts; + } + + class Class2 { + int i; + }; + + extern PointsUtils::VecOfInts& + operator += ( PointsUtils::VecOfInts &vec, const Class2&){ + return vec; + } +} + + #endif//__operators_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py 2008-11-01 19:04:11 UTC (rev 1449) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2008-11-22 21:36:02 UTC (rev 1450) @@ -25,6 +25,11 @@ items = generator.global_ns.typedef( 'items_t' ) items = declarations.remove_declarated( items.type ) items.alias = "items_t" + + strings = generator.global_ns.typedef( 'strings_t' ) + strings = declarations.remove_declarated( strings.type ) + strings.include() + fvector = generator.global_ns.typedef( 'fvector' ) fvector = declarations.remove_declarated( fvector.type ) fvector.indexing_suite.disable_method( 'extend' ) Modified: pyplusplus_dev/unittests/operators_tester.py =================================================================== --- pyplusplus_dev/unittests/operators_tester.py 2008-11-01 19:04:11 UTC (rev 1449) +++ pyplusplus_dev/unittests/operators_tester.py 2008-11-22 21:36:02 UTC (rev 1450) @@ -22,6 +22,8 @@ def customize( self, mb ): mb.global_ns.exclude() + mb.free_function( 'create_randome_rationals' ).include() + xxx = mb.class_( 'XXX' ) xxx.include() xxx_ref = declarations.reference_t( declarations.const_t( declarations.declarated_t( xxx ) ) ) @@ -61,6 +63,8 @@ bad_rational = mb.class_('bad_rational' ) bad_rational.include() + mb.namespace( 'Geometry' ).include() + mb.namespace( 'Geometry' ).class_( 'VecOfInts' ).exclude() def run_tests(self, module): pyrational = module.pyrational This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-11-23 20:53:25
|
Revision: 1451 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1451&view=rev Author: roman_yakovenko Date: 2008-11-23 20:53:20 +0000 (Sun, 23 Nov 2008) Log Message: ----------- fix for few bugs related to free operators Modified Paths: -------------- pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/operators_to_be_exported.hpp pyplusplus_dev/unittests/operators_tester.py pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-11-22 21:36:02 UTC (rev 1450) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2008-11-23 20:53:20 UTC (rev 1451) @@ -101,6 +101,7 @@ self.curr_decl = None self.__array_1_registered = set() #(type.decl_string,size) self.__free_operators = [] + self.__std_containers_free_operators = {} self.__exposed_free_fun_overloads = set() self.__fc_manager = fake_constructors_manager.manager_t( global_ns ) @@ -174,30 +175,13 @@ pass else: assert not "Found %d class code creators" % len(creator) - + find = code_creators.creator_finder.find_by_declaration if operator.target_class and operator.target_class.ignore == False: found = find( lambda decl: operator.target_class is decl , self.__extmodule.body.creators ) adopt_operator_impl( operator, found ) - """ - find = code_creators.creator_finder.find_by_declaration - if isinstance( operator.parent, declarations.class_t ): - found = find( lambda decl: operator.parent is decl - , self.__extmodule.body.creators ) - adopt_operator_impl( operator, found ) - else: - #select all to be exposed declarations - included = filter( lambda decl: decl.ignore == False, operator.class_types ) - if not included: - msg = 'Py++ bug found!' \ - ' For some reason Py++ decided to expose free operator "%s", when all class types related to the operator definition are excluded.' \ - ' Please report this bug. Thanks! ' - raise RuntimeError( msg % str( operator ) ) - found = find( lambda decl: included[0] is decl, self.__extmodule.body.creators ) - adopt_operator_impl( operator, found ) - """ def _is_registered_smart_pointer_creator( self, creator, db ): for registered in db: if not isinstance( creator, registered.__class__ ): @@ -292,7 +276,6 @@ creators = [] created_value_traits = set() - for cls in self.__get_exposed_containers(): self.__print_readme( cls ) @@ -322,6 +305,12 @@ self.__extmodule.adopt_declaration_creator( element_type_cc ) cls_creator.adopt_creator( code_creators.indexing_suite2_t(cls) ) + scfo = self.__std_containers_free_operators + if cls in scfo: + for operator in scfo[cls]: + self.__dependencies_manager.add_exported( operator ) + cls_creator.adopt_creator( code_creators.operator_t( operator=operator ) ) + creators.reverse() self.__module_body.adopt_creators( creators, 0 ) @@ -535,8 +524,18 @@ def visit_free_operator( self ): self.__types_db.update( self.curr_decl ) - self.__free_operators.append( self.curr_decl ) + operator = self.curr_decl + target_class = operator.target_class + scfo = self.__std_containers_free_operators + if target_class and target_class.indexing_suite: + if target_class not in scfo: + scfo[ target_class ] = [ operator ] + else: + scfo[ target_class ].append( operator ) + else: + self.__free_operators.append( self.curr_decl ) + def visit_class_declaration(self ): pass Modified: pyplusplus_dev/unittests/data/operators_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/operators_to_be_exported.hpp 2008-11-22 21:36:02 UTC (rev 1450) +++ pyplusplus_dev/unittests/data/operators_to_be_exported.hpp 2008-11-23 20:53:20 UTC (rev 1451) @@ -65,18 +65,33 @@ namespace PointsUtils{ struct VecOfInts{}; - //typedef std::vector<int> VecOfInts; } - class Class2 { + class Class { int i; }; + //this one should not be generated extern PointsUtils::VecOfInts& - operator += ( PointsUtils::VecOfInts &vec, const Class2&){ + operator += ( PointsUtils::VecOfInts &vec, const Class&){ return vec; } } +namespace Geometry2{ + namespace PointsUtils2{ + typedef std::vector<int> VecOfInts2; + } + + class Class2 { + int i; + }; + + extern PointsUtils2::VecOfInts2& + operator += ( PointsUtils2::VecOfInts2 &vec, const Class2&){ + return vec; + } +} + #endif//__operators_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/operators_tester.py =================================================================== --- pyplusplus_dev/unittests/operators_tester.py 2008-11-22 21:36:02 UTC (rev 1450) +++ pyplusplus_dev/unittests/operators_tester.py 2008-11-23 20:53:20 UTC (rev 1451) @@ -66,6 +66,8 @@ mb.namespace( 'Geometry' ).include() mb.namespace( 'Geometry' ).class_( 'VecOfInts' ).exclude() + mb.namespace( 'Geometry2' ).include() + def run_tests(self, module): pyrational = module.pyrational self.failUnless( pyrational( 28, 7) == 4 ) @@ -100,6 +102,15 @@ y = module.YYY() print str( y ) + vec = module.vector_less__int__greater_() + ins_cls_2 = module.Class2() + vec += ins_cls_2 + + ins_cls_1 = module.Class() + def tmp(): + vec += ins_cls_1 + self.failIfNotRaisesAny( tmp ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2008-11-22 21:36:02 UTC (rev 1450) +++ pyplusplus_dev/unittests/test_all.py 2008-11-23 20:53:20 UTC (rev 1451) @@ -312,6 +312,7 @@ if __name__ == "__main__": + os.nice( 20 ) runner = process_tester_runner_t( testers ) runner() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-09 20:30:13
|
Revision: 1464 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1464&view=rev Author: roman_yakovenko Date: 2008-12-09 20:30:09 +0000 (Tue, 09 Dec 2008) Log Message: ----------- making indexing suite v2 to be header only library Modified Paths: -------------- pyplusplus_dev/environment.py pyplusplus_dev/indexing_suite_v2/indexing_suite/algorithms.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/container_proxy.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/container_suite.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/container_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/deque.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/int_slice_helper.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_range.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/list.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/map.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/methods.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/multimap.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/pair.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/proxy_iterator.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/python_iterator.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/set.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/shared_proxy_impl.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/slice.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/suite_utils.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/value_traits.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/vector.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/visitor.hpp pyplusplus_dev/indexing_suite_v2/indexing_suite/workaround.hpp pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/code_repository/return_range.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/unittests/autoconfig.py Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/environment.py 2008-12-09 20:30:09 UTC (rev 1464) @@ -4,6 +4,9 @@ this_module_dir_path = os.path.abspath ( os.path.dirname( sys.modules[__name__].__file__) ) +class indexing_suite: + include = os.path.join( this_module_dir_path, 'indexing_suite_v2' ) + class boost: libs = '' include = '' Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/algorithms.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/algorithms.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/algorithms.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -13,6 +13,7 @@ // 2003/ 9/11 rmg File creation from suite_utils.hpp // 2003/10/28 rmg Split container-specific versions into separate headers // 2006/10/25 Roman Adding keys function to assoc_algorithms class +// 2008/12/08 Roman Change indexing suite layout // // $Id: algorithms.hpp,v 1.1.2.15 2004/02/08 18:57:42 raoulgough Exp $ // @@ -20,12 +21,12 @@ #ifndef BOOST_PYTHON_INDEXING_ALGORITHMS_HPP #define BOOST_PYTHON_INDEXING_ALGORITHMS_HPP -#include <boost/python/suite/indexing/suite_utils.hpp> +#include <indexing_suite/suite_utils.hpp> #include <boost/type_traits.hpp> #include <boost/python/errors.hpp> -#include <boost/python/suite/indexing/int_slice_helper.hpp> -#include <boost/python/suite/indexing/slice.hpp> +#include <indexing_suite/int_slice_helper.hpp> +#include <indexing_suite/slice.hpp> #include <boost/mpl/if.hpp> #include <boost/limits.hpp> #include <algorithm> @@ -158,7 +159,7 @@ ContainerTraits::visit_container_class (pyClass, policy); } - + protected: static iterator find_or_throw (container &, index_param); }; @@ -214,7 +215,7 @@ { throw std::out_of_range (msg); } - + result = bound + ix; } Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/container_proxy.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/container_proxy.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/container_proxy.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -21,6 +21,7 @@ // ======= // 2003/ 8/26 rmg File creation // 2003/10/23 rmg Change pointer container from map to sequence +// 2008/12/08 Roman Change indexing suite layout // // $Id: container_proxy.hpp,v 1.1.2.28 2004/02/08 18:57:42 raoulgough Exp $ // @@ -28,21 +29,21 @@ #ifndef BOOST_PYTHON_INDEXING_CONTAINER_PROXY_HPP #define BOOST_PYTHON_INDEXING_CONTAINER_PROXY_HPP -#include <boost/python/suite/indexing/proxy_iterator.hpp> -#include <boost/python/suite/indexing/shared_proxy_impl.hpp> -#include <boost/python/suite/indexing/element_proxy.hpp> -#include <boost/python/suite/indexing/element_proxy_traits.hpp> -#include <boost/python/suite/indexing/workaround.hpp> -#include <boost/python/suite/indexing/methods.hpp> +#include <indexing_suite/proxy_iterator.hpp> +#include <indexing_suite/shared_proxy_impl.hpp> +#include <indexing_suite/element_proxy.hpp> +#include <indexing_suite/element_proxy_traits.hpp> +#include <indexing_suite/workaround.hpp> +#include <indexing_suite/methods.hpp> #include <vector> #include <cassert> #include <boost/shared_ptr.hpp> #include <boost/mpl/apply.hpp> #include <boost/iterator/iterator_traits.hpp> -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> namespace boost { namespace python { namespace indexing { Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/container_suite.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/container_suite.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/container_suite.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -12,6 +12,7 @@ // ======= // 2003/ 8/23 rmg File creation // 2003/ 9/ 8 rmg Extracted trait facilities into container_traits.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: container_suite.hpp,v 1.1.2.7 2004/02/08 18:57:42 raoulgough Exp $ // @@ -19,9 +20,9 @@ #ifndef BOOST_PYTHON_INDEXING_CONTAINER_SUITE_HPP #define BOOST_PYTHON_INDEXING_CONTAINER_SUITE_HPP -#include <boost/python/suite/indexing/methods.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> -#include <boost/python/suite/indexing/visitor.hpp> +#include <indexing_suite/methods.hpp> +#include <indexing_suite/algorithms.hpp> +#include <indexing_suite/visitor.hpp> #include <boost/python/return_by_value.hpp> #include <boost/python/return_value_policy.hpp> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/container_traits.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/container_traits.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/container_traits.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -15,6 +15,7 @@ // 2003/ 9/ 8 rmg Renamed container_traits.hpp // 2003/10/28 rmg Split container-specific versions into separate headers // 2004/ 1/28 rmg Convert to bitset-based feature selection +// 2008/12/08 Roman Change indexing suite layout // // $Id: container_traits.hpp,v 1.1.2.15 2004/02/08 18:57:42 raoulgough Exp $ // @@ -22,9 +23,9 @@ #ifndef BOOST_PYTHON_INDEXING_CONTAINER_TRAITS_HPP #define BOOST_PYTHON_INDEXING_CONTAINER_TRAITS_HPP -#include <boost/python/suite/indexing/suite_utils.hpp> -#include <boost/python/suite/indexing/methods.hpp> -#include <boost/python/suite/indexing/value_traits.hpp> +#include <indexing_suite/suite_utils.hpp> +#include <indexing_suite/methods.hpp> +#include <indexing_suite/value_traits.hpp> #include <boost/type_traits.hpp> #include <boost/call_traits.hpp> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/deque.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/deque.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/deque.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/10/28 rmg File creation from algo_selector.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: deque.hpp,v 1.1.2.6 2004/02/08 18:57:42 raoulgough Exp $ // @@ -18,9 +19,9 @@ #ifndef BOOST_PYTHON_INDEXING_DEQUE_HPP #define BOOST_PYTHON_INDEXING_DEQUE_HPP -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> #include <deque> namespace boost { namespace python { namespace indexing { Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -12,6 +12,7 @@ // History // ======= // 2003/ 9/15 rmg File creation from container_proxy.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: element_proxy.hpp,v 1.1.2.10 2003/12/03 12:18:51 raoulgough Exp $ // @@ -19,7 +20,7 @@ #ifndef BOOST_PYTHON_INDEXING_ELEMENT_PROXY_HPP #define BOOST_PYTHON_INDEXING_ELEMENT_PROXY_HPP -#include <boost/python/suite/indexing/shared_proxy_impl.hpp> +#include <indexing_suite/shared_proxy_impl.hpp> #include <boost/shared_ptr.hpp> #include <boost/get_pointer.hpp> #include <boost/utility/addressof.hpp> @@ -168,7 +169,7 @@ #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP }} // namespace python::indexing -#endif +#endif template<typename ContainerProxy> typename ContainerProxy::raw_value_type * @@ -181,7 +182,7 @@ // Don't hide these other get_pointer overloads using boost::get_pointer; }} // namespace python::indexing -#endif +#endif } #endif // BOOST_PYTHON_INDEXING_ELEMENT_PROXY_HPP Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy_traits.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy_traits.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/element_proxy_traits.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -17,6 +17,7 @@ // History // ======= // 2003/10/23 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: element_proxy_traits.hpp,v 1.1.2.5 2003/12/05 17:36:14 raoulgough Exp $ // @@ -24,8 +25,8 @@ #ifndef BOOST_PYTHON_INDEXING_ELEMENT_PROXY_TRAITS_HPP #define BOOST_PYTHON_INDEXING_ELEMENT_PROXY_TRAITS_HPP -#include <boost/python/suite/indexing/element_proxy.hpp> -#include <boost/python/suite/indexing/value_traits.hpp> +#include <indexing_suite/element_proxy.hpp> +#include <indexing_suite/value_traits.hpp> #include <boost/python/register_ptr_to_python.hpp> #include <boost/python/implicit.hpp> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/int_slice_helper.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/int_slice_helper.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/int_slice_helper.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -9,6 +9,7 @@ // History // ======= // 2003/10/13 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: int_slice_helper.hpp,v 1.1.2.10 2004/02/08 18:57:42 raoulgough Exp $ // @@ -17,7 +18,7 @@ #define BOOST_PYTHON_INDEXING_INT_SLICE_HELPER_HPP # include <boost/python/errors.hpp> -# include <boost/python/suite/indexing/workaround.hpp> +# include <indexing_suite/workaround.hpp> namespace boost { namespace python { namespace indexing { template<typename Algorithms, typename SliceType> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_range.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_range.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_range.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -13,6 +13,7 @@ // ======= // 2003/ 9/ 9 rmg File creation as iterator_pair.hpp // 2003/10/27 rmg Renamed iterator_range.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: iterator_range.hpp,v 1.1.2.7 2004/02/08 18:57:42 raoulgough Exp $ // @@ -27,10 +28,10 @@ #include <boost/type_traits/ice.hpp> #include <boost/detail/workaround.hpp> #include <boost/iterator/iterator_traits.hpp> -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> -#include <boost/python/suite/indexing/iterator_traits.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> +#include <indexing_suite/iterator_traits.hpp> namespace boost { namespace python { namespace indexing { template<typename Iterator> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_traits.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_traits.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/iterator_traits.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -15,6 +15,7 @@ // ======= // 2003/ 8/23 rmg File creation as iterator_suite.hpp // 2003/ 9/12 rmg Renamed iterator_traits.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: iterator_traits.hpp,v 1.1.2.14 2004/02/08 18:57:42 raoulgough Exp $ // @@ -22,9 +23,9 @@ #ifndef BOOST_PYTHON_INDEXING_ITERATOR_TRAITS_HPP #define BOOST_PYTHON_INDEXING_ITERATOR_TRAITS_HPP -#include <boost/python/suite/indexing/suite_utils.hpp> -#include <boost/python/suite/indexing/methods.hpp> -//#include <boost/python/suite/indexing/workaround.hpp> +#include <indexing_suite/suite_utils.hpp> +#include <indexing_suite/methods.hpp> +//#include <indexing_suite/workaround.hpp> //#include <boost/call_traits.hpp> //#include <boost/type_traits.hpp> @@ -154,7 +155,7 @@ forward_iter_sizer &sizer (std::forward_iterator_tag *); bidirectional_iter_sizer &sizer (std::bidirectional_iterator_tag *); random_access_iter_sizer &sizer (std::random_access_iterator_tag *); - + template<size_t Size> struct traits_by_size { // Default implementation gives only the most basic support template<typename Iterator> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/list.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/list.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/list.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/10/28 rmg File creation from algo_selector.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: list.hpp,v 1.1.2.7 2004/02/08 18:57:42 raoulgough Exp $ // @@ -18,9 +19,9 @@ #ifndef BOOST_PYTHON_INDEXING_LIST_HPP #define BOOST_PYTHON_INDEXING_LIST_HPP -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> #include <list> #if BOOST_WORKAROUND (BOOST_MSVC, == 1200) Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/map.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/map.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/map.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/10/28 rmg File creation from algo_selector.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: map.hpp,v 1.1.2.6 2004/02/08 18:57:42 raoulgough Exp $ // @@ -18,12 +19,12 @@ #ifndef BOOST_PYTHON_INDEXING_MAP_HPP #define BOOST_PYTHON_INDEXING_MAP_HPP -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> #include <boost/detail/workaround.hpp> #include <map> -#include <boost/python/suite/indexing/pair.hpp> +#include <indexing_suite/pair.hpp> namespace boost { namespace python { namespace indexing { ///////////////////////////////////////////////////////////////////////// @@ -98,22 +99,22 @@ // Version to return only the mapped type static boost::python::list keys( container & ); - + static void assign (container &, index_param, value_param); static void insert (container &, index_param, value_param); - + template<typename PythonClass, typename Policy> static void visit_container_class( PythonClass &pyClass, Policy const &policy) { ContainerTraits::visit_container_class (pyClass, policy); - pyClass.def( "keys", &self_type::keys ); - + pyClass.def( "keys", &self_type::keys ); + typedef BOOST_DEDUCED_TYPENAME most_derived::container::value_type value_type; mapping::register_value_type< PythonClass, value_type, Policy >( pyClass ); //now we can expose iterators functionality pyClass.def( "__iter__", python::iterator< BOOST_DEDUCED_TYPENAME most_derived::container >() ); - } - + } + }; #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) @@ -175,7 +176,7 @@ return most_derived::find_or_throw (c, ix)->second; } - + template<typename ContainerTraits, typename Ovr> boost::python::list map_algorithms<ContainerTraits, Ovr>::keys( container &c ) @@ -192,10 +193,10 @@ } //} } - + return _keys; } - + ///////////////////////////////////////////////////////////////////////// // Assign a value at a particular index (map version) ///////////////////////////////////////////////////////////////////////// Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/methods.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/methods.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/methods.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2004/ 1/11 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: methods.hpp,v 1.1.2.1 2004/02/08 18:57:42 raoulgough Exp $ // Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/multimap.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/multimap.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/multimap.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -9,18 +9,19 @@ // History // ======= // 2006/10/27 Roman File creation from map.hpp +// 2008/12/08 Roman Change indexing suite layout // #ifndef BOOST_PYTHON_INDEXING_MULTIMAP_HPP #define BOOST_PYTHON_INDEXING_MULTIMAP_HPP -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> #include <boost/detail/workaround.hpp> #include <functional> #include <map> -#include <boost/python/suite/indexing/pair.hpp> +#include <indexing_suite/pair.hpp> namespace boost { namespace python { namespace indexing { ///////////////////////////////////////////////////////////////////////// @@ -95,23 +96,23 @@ // Version to return only the mapped type static boost::python::list keys( container & ); - + static void assign (container &, index_param, value_param); static void insert (container &, index_param, value_param); - + template<typename PythonClass, typename Policy> static void visit_container_class( PythonClass &pyClass, Policy const &policy) { ContainerTraits::visit_container_class (pyClass, policy); - pyClass.def( "keys", &self_type::keys ); + pyClass.def( "keys", &self_type::keys ); typedef BOOST_DEDUCED_TYPENAME most_derived::container::value_type value_type; mapping::register_value_type< PythonClass, value_type, Policy >( pyClass ); //now we can expose iterators functionality pyClass.def( "__iter__", python::iterator< BOOST_DEDUCED_TYPENAME most_derived::container >() ); - - } + } + }; template< @@ -157,11 +158,11 @@ } //} } - + return _keys; } - - + + ///////////////////////////////////////////////////////////////////////// // Assign a value at a particular index (map version) ///////////////////////////////////////////////////////////////////////// Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/pair.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/pair.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/pair.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -2,7 +2,7 @@ // // Exposes std::pair< key, value > class // -// Copyright (c) 2007 Roman Yakovenko +// Copyright (c) 2007 Roman Yakovenko // // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy @@ -11,29 +11,30 @@ // History // ======= // 2007/2/11 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // #ifndef BOOST_PYTHON_STD_PAIR_KEY_VALUE_11_02_2007_HPP #define BOOST_PYTHON_STD_PAIR_KEY_VALUE_11_02_2007_HPP #include <boost/config.hpp> -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> #include <boost/detail/workaround.hpp> namespace boost { namespace python { namespace indexing { namespace mapping{ namespace details{ - + template< typename TValueType, typename TValueCallPolicies > struct pair_exposer_t{ - typedef TValueType pair_type; + typedef TValueType pair_type; typedef BOOST_DEDUCED_TYPENAME pair_type::first_type key_type; typedef BOOST_DEDUCED_TYPENAME pair_type::second_type mapped_type; typedef pair_exposer_t< TValueType, TValueCallPolicies > exposer_type; - + pair_exposer_t(const std::string& name){ class_< pair_type >( name.c_str() ) .def( "__len__", &exposer_type::len ) @@ -41,7 +42,7 @@ .add_property( "key", &exposer_type::get_key ) .add_property( "value", &exposer_type::get_mapped ); } - + private: static size_t len( const pair_type& ){ @@ -67,32 +68,32 @@ } } } - + static object get_key( const pair_type& p ){ return object( p.first ); } - + static object get_mapped( pair_type& p ){ typedef BOOST_DEDUCED_TYPENAME TValueCallPolicies::result_converter rc_type; typedef BOOST_DEDUCED_TYPENAME rc_type:: template apply< mapped_type >::type converter_type; converter_type converter; return object( handle<>( converter( p.second ) ) ); } - + }; } //details - + template< typename TPythonClass, typename TValueType, typename TValueCallPolicies > -inline void register_value_type(TPythonClass &pyClass){ +inline void register_value_type(TPythonClass &pyClass){ typedef details::pair_exposer_t< TValueType, TValueCallPolicies > exposer_type; - + object class_name(pyClass.attr("__name__")); extract<std::string> class_name_extractor(class_name); std::string pair_name = class_name_extractor() + "_entry"; - + exposer_type expose( pair_name ); } - + } } } } #endif // BOOST_PYTHON_STD_PAIR_KEY_VALUE_11_02_2007_HPP Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/proxy_iterator.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/proxy_iterator.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/proxy_iterator.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -10,6 +10,7 @@ // History // ======= // 2003/10/ 8 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: proxy_iterator.hpp,v 1.1.2.8 2003/12/05 17:36:14 raoulgough Exp $ // @@ -63,7 +64,7 @@ : ptr (p), index (i) { } - + proxy_iterator (container_proxy_type *p, raw_iterator iter) : ptr (p), index (iter - p->raw_container().begin()) { Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/python_iterator.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/python_iterator.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/python_iterator.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -13,6 +13,7 @@ // History // ======= // 2003/ 9/10 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: python_iterator.hpp,v 1.1.2.5 2003/11/24 16:35:09 raoulgough Exp $ // Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/set.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/set.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/set.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/10/28 rmg File creation from algo_selector.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: set.hpp,v 1.1.2.6 2004/02/08 18:57:42 raoulgough Exp $ // @@ -18,9 +19,9 @@ #ifndef BOOST_PYTHON_INDEXING_SET_HPP #define BOOST_PYTHON_INDEXING_SET_HPP -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> #include <boost/type_traits/is_const.hpp> #include <set> @@ -85,13 +86,13 @@ typedef typename Parent::index_param index_param; static void insert (container &, index_param); - + template<typename PythonClass, typename Policy> static void visit_container_class( PythonClass &pyClass, Policy const &policy) { ContainerTraits::visit_container_class (pyClass, policy); - pyClass.def( "add", &self_type::insert ); - } + pyClass.def( "add", &self_type::insert ); + } }; Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/shared_proxy_impl.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/shared_proxy_impl.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/shared_proxy_impl.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -16,6 +16,7 @@ // History // ======= // 2003/ 8/29 rmg File creation from container_proxy.hh +// 2008/12/08 Roman Change indexing suite layout // // $Id: shared_proxy_impl.hpp,v 1.1.2.8 2003/11/24 14:28:31 raoulgough Exp $ // @@ -24,7 +25,7 @@ #define BOOST_PYTHON_INDEXING_SHARED_PROXY_IMPL_HPP #include <memory> -#include <boost/python/suite/indexing/workaround.hpp> +#include <indexing_suite/workaround.hpp> namespace boost { namespace python { namespace indexing { template<class ContainerProxy> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/slice.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/slice.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/slice.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -9,6 +9,7 @@ // History // ======= // 2003/ 9/10 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: slice.hpp,v 1.1.2.10 2003/11/24 14:28:31 raoulgough Exp $ // Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/ 9/ 9 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: slice_handler.hpp,v 1.1.2.10 2003/11/24 16:35:52 raoulgough Exp $ // @@ -26,8 +27,8 @@ #include <boost/mpl/apply.hpp> #include <algorithm> -#include <boost/python/suite/indexing/slice.hpp> -#include <boost/python/suite/indexing/python_iterator.hpp> +#include <indexing_suite/slice.hpp> +#include <indexing_suite/python_iterator.hpp> namespace boost { namespace python { namespace indexing { template<class Algorithms, class Policy> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/suite_utils.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/suite_utils.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/suite_utils.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/ 8/23 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: suite_utils.hpp,v 1.1.2.7 2003/11/24 14:28:31 raoulgough Exp $ // Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/value_traits.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/value_traits.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/value_traits.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -12,6 +12,7 @@ // History // ======= // 2003/ 9/12 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: value_traits.hpp,v 1.1.2.6 2003/12/05 17:36:12 raoulgough Exp $ // Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/vector.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/vector.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/vector.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/10/28 rmg File creation from algo_selector.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: vector.hpp,v 1.1.2.6 2004/02/08 18:57:42 raoulgough Exp $ // @@ -18,9 +19,9 @@ #ifndef BOOST_PYTHON_INDEXING_VECTOR_HPP #define BOOST_PYTHON_INDEXING_VECTOR_HPP -#include <boost/python/suite/indexing/container_traits.hpp> -#include <boost/python/suite/indexing/container_suite.hpp> -#include <boost/python/suite/indexing/algorithms.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> #include <vector> namespace boost { namespace python { namespace indexing { Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/visitor.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/visitor.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/visitor.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -12,6 +12,7 @@ // History // ======= // 2003/ 9/11 rmg File creation from container_suite.hpp +// 2008/12/08 Roman Change indexing suite layout // // $Id: visitor.hpp,v 1.1.2.16 2004/02/08 18:57:42 raoulgough Exp $ // @@ -19,8 +20,8 @@ #ifndef BOOST_PYTHON_INDEXING_VISITOR_HPP #define BOOST_PYTHON_INDEXING_VISITOR_HPP -#include <boost/python/suite/indexing/slice_handler.hpp> -#include <boost/python/suite/indexing/suite_utils.hpp> // Get index_style_t +#include <indexing_suite/slice_handler.hpp> +#include <indexing_suite/suite_utils.hpp> // Get index_style_t #include <boost/python/def_visitor.hpp> #include <boost/python/iterator.hpp> Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/workaround.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/workaround.hpp 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/workaround.hpp 2008-12-09 20:30:09 UTC (rev 1464) @@ -11,6 +11,7 @@ // History // ======= // 2003/10/21 rmg File creation +// 2008/12/08 Roman Change indexing suite layout // // $Id: workaround.hpp,v 1.1.2.3 2003/11/17 19:27:13 raoulgough Exp $ // Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2008-12-09 20:30:09 UTC (rev 1464) @@ -18,7 +18,7 @@ declaration_based.declaration_based_t.__init__( self, declaration=container ) @property - def configuration( self ): + def configuration( self ): return self.declaration.indexing_suite @property @@ -46,12 +46,12 @@ args.append( no_proxy) return declarations.templates.join( suite_identifier, args ) - def _create_impl(self): + def _create_impl(self): return "def( %s() )" % self._create_suite_declaration() def _get_system_headers_impl( self ): return self.configuration.include_files - + class indexing_suite2_t( registration_based.registration_based_t , declaration_based.declaration_based_t ): def __init__(self, container ): @@ -87,7 +87,7 @@ def _create_impl( self ): if self.declaration.already_exposed: return '' - + answer = [] if self.does_user_disable_methods(): answer.append( self.generate_algorithm_mask() ) @@ -172,10 +172,9 @@ #if self.declaration.already_exposed: # return '' #This is the error to skip generation in case the class is already exposed, - #because we still expose container, so it needs to know how to work with + #because we still expose container, so it needs to know how to work with #the value_type return self.generate_value_traits() def _get_system_headers_impl( self ): - return ['boost/python/suite/indexing/value_traits.hpp'] - \ No newline at end of file + return ['indexing_suite/value_traits.hpp'] Modified: pyplusplus_dev/pyplusplus/code_repository/return_range.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/return_range.py 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/pyplusplus/code_repository/return_range.py 2008-12-09 20:30:09 UTC (rev 1464) @@ -25,28 +25,28 @@ #include "boost/python.hpp" #include "boost/mpl/int.hpp" #include "boost/function.hpp" -#include "boost/python/suite/indexing/iterator_range.hpp" +#include "indexing_suite/iterator_range.hpp" #include "boost/python/object/class_detail.hpp" #include "boost/type_traits/is_same.hpp" namespace pyplusplus{ namespace call_policies{ namespace bpl = boost::python; -namespace detail{ +namespace detail{ struct return_raw_data_ref{ - - template <class T> + + template <class T> struct apply{ BOOST_STATIC_ASSERT( boost::is_pointer<T>::value ); - + struct type{ static bool convertible() { return true; } - PyObject* - operator()( T return_value) const{ + PyObject* + operator()( T return_value) const{ if( !return_value ){ return bpl::detail::none(); } @@ -54,7 +54,7 @@ typedef typename boost::remove_pointer< T >::type value_type; typedef typename boost::remove_const< value_type >::type non_const_value_type; non_const_value_type* data = const_cast<non_const_value_type*>( return_value ); - return PyCObject_FromVoidPtr( data, NULL ); + return PyCObject_FromVoidPtr( data, NULL ); } } }; @@ -64,8 +64,8 @@ }; } //detail - -template < typename TGetSize, typename TValueType, typename TValuePolicies=bpl::default_call_policies > + +template < typename TGetSize, typename TValueType, typename TValuePolicies=bpl::default_call_policies > struct return_range : bpl::default_call_policies{ typedef return_range< TGetSize, TValueType, TValuePolicies > this_type; @@ -73,11 +73,11 @@ public: typedef typename detail::return_raw_data_ref result_converter; - + typedef TValueType value_type; typedef TGetSize get_size_type; typedef TValuePolicies value_policies_type; - + typedef bpl::indexing::iterator_range<value_type*> range_type; template <class ArgumentPackage> @@ -90,16 +90,16 @@ } value_type* raw_data = reinterpret_cast<value_type*>( PyCObject_AsVoidPtr( result ) ); Py_DECREF(result);//we don't need result anymore - + bpl::tuple args_w( bpl::handle<>( bpl::borrowed( args ) ) ); register_range_class_on_demand(); - + get_size_type get_size; range_type the_range( raw_data, raw_data + get_size( args_w ) ); - + bpl::object range_obj( the_range ); - + return bpl::incref( range_obj.ptr() ); } private: @@ -109,11 +109,11 @@ bpl::class_<range_type>( "_impl_details_range_iterator_", bpl::init<value_type*, value_type*>() ) .def(bpl::indexing::container_suite<range_type>() ); } - + static void register_range_class( boost::mpl::false_ ){ //register range class with non default call policies - unsigned long const methods_mask - = bpl::indexing::all_methods + unsigned long const methods_mask + = bpl::indexing::all_methods & ~( bpl::indexing::reorder_methods | bpl::indexing::search_methods ) ; typedef bpl::indexing::iterator_range_suite< range_type, methods_mask > suite_type; @@ -125,7 +125,7 @@ //Check the registry. If the class doesn't exist, register it. bpl::handle<> class_obj( bpl::objects::registered_class_object(bpl::type_id<range_type>())); - + if( class_obj.get() == 0 ){ register_range_class( boost::is_same< bpl::default_call_policies, value_policies_type>() ); } Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2008-12-09 20:30:09 UTC (rev 1464) @@ -34,14 +34,14 @@ containers = { - 'vector' : "boost/python/suite/indexing/vector.hpp" - , 'deque' : "boost/python/suite/indexing/deque.hpp" - , 'list' : "boost/python/suite/indexing/list.hpp" - , 'map' : "boost/python/suite/indexing/map.hpp" - , 'multimap' : "boost/python/suite/indexing/multimap.hpp" - , 'hash_map' : "boost/python/suite/indexing/map.hpp" - , 'set' : "boost/python/suite/indexing/set.hpp" - , 'hash_set' : "boost/python/suite/indexing/set.hpp" + 'vector' : "indexing_suite/vector.hpp" + , 'deque' : "indexing_suite/deque.hpp" + , 'list' : "indexing_suite/list.hpp" + , 'map' : "indexing_suite/map.hpp" + , 'multimap' : "indexing_suite/multimap.hpp" + , 'hash_map' : "indexing_suite/map.hpp" + , 'set' : "indexing_suite/set.hpp" + , 'hash_set' : "indexing_suite/set.hpp" #TODO: queue, priority, stack, hash_multimap, multiset, hash_multiset } @@ -91,7 +91,7 @@ def element_type(self): """reference to container value_type( mapped_type ) type""" return self.container_traits.element_type( self.container_class ) - + @property def container_traits( self ): "reference to container traits. See pygccxml documentation for more information." @@ -174,6 +174,6 @@ self.__include_files = [] #not supported else: #impl details: the order of header files is IMPORTANT - self.__include_files = [ "boost/python/suite/indexing/container_suite.hpp" + self.__include_files = [ "indexing_suite/container_suite.hpp" , containers[ name ] ] return self.__include_files Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2008-12-08 21:36:39 UTC (rev 1463) +++ pyplusplus_dev/unittests/autoconfig.py 2008-12-09 20:30:09 UTC (rev 1464) @@ -15,16 +15,16 @@ data_directory = os.path.join( this_module_dir_path, 'data' ) build_directory = os.path.join( this_module_dir_path, 'temp' ) -build_dir = build_directory +build_dir = build_directory sys.path.append( os.path.dirname( this_module_dir_path ) ) -from environment import scons, boost, python, gccxml +from environment import scons, boost, python, gccxml, indexing_suite class scons_config: libs = ['boost_python'] libpath = [ python.libs ] + boost.libs - cpppath = [ boost.include, python.include ] + cpppath = [ boost.include, python.include, indexing_suite.include ] include_dirs = cpppath + [data_directory] @staticmethod @@ -40,7 +40,7 @@ , " , SHLIBPREFIX=''" , " , SHLIBSUFFIX='%s'" % scons.suffix #explicit better then implicit , ")" - , "env.AddPostAction('%(target)s', 'mt.exe -nologo -manifest %(target)s.pyd.manifest -outputresource:%(target)s.pyd;2' )" ] + , "env.AddPostAction('%(target)s', 'mt.exe -nologo -manifest %(target)s.pyd.manifest -outputresource:%(target)s.pyd;2' )" ] return os.linesep.join( code ) #I need this in order to allow Python to load just compiled modules This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-15 20:53:53
|
Revision: 1467 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1467&view=rev Author: roman_yakovenko Date: 2008-12-15 20:53:49 +0000 (Mon, 15 Dec 2008) Log Message: ----------- adding ability to create "function transformation" for pure virtual functions Modified Paths: -------------- pyplusplus_dev/pyplusplus/function_transformers/controllers.py pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py pyplusplus_dev/pyplusplus/function_transformers/templates.py pyplusplus_dev/pyplusplus/module_creator/creators_wizard.py pyplusplus_dev/unittests/autoconfig.py pyplusplus_dev/unittests/bool_by_ref_tester.py pyplusplus_dev/unittests/data/bool_by_ref_to_be_exported.hpp pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp Modified: pyplusplus_dev/pyplusplus/function_transformers/controllers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/controllers.py 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/pyplusplus/function_transformers/controllers.py 2008-12-15 20:53:49 UTC (rev 1467) @@ -337,7 +337,26 @@ def default_controller( self ): return self.__default_cntrl +class pure_virtual_mem_fun_controller_t( virtual_mem_fun_controller_t ): + def __init__( self, function ): + virtual_mem_fun_controller_t.__init__(self, function) + + class override_fun_controller_t( virtual_mem_fun_controller_t.override_fun_controller_t ): + def __init__( self, function ): + virtual_mem_fun_controller_t.override_fun_controller_t.__init__(self, function) + + @property + def template( self ): + return templates.pure_virtual_mem_fun.override + class default_fun_controller_t( virtual_mem_fun_controller_t.default_fun_controller_t ): + def __init__( self, function ): + virtual_mem_fun_controller_t.default_fun_controller_t.__init__(self,function) + + @property + def template( self ): + return templates.pure_virtual_mem_fun.default + #TODO: FT for constructor #~ class constructor_controller_t( controller_base_t ): Modified: pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/pyplusplus/function_transformers/function_transformation.py 2008-12-15 20:53:49 UTC (rev 1467) @@ -18,6 +18,8 @@ if isinstance( function.parent, declarations.class_t ): if declarations.VIRTUALITY_TYPES.NOT_VIRTUAL == function.virtuality: self.__controller = controllers.mem_fun_controller_t( function ) + elif declarations.VIRTUALITY_TYPES.PURE_VIRTUAL == function.virtuality: + self.__controller = controllers.pure_virtual_mem_fun_controller_t( function ) else: self.__controller = controllers.virtual_mem_fun_controller_t( function ) else: Modified: pyplusplus_dev/pyplusplus/function_transformers/templates.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/templates.py 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/pyplusplus/function_transformers/templates.py 2008-12-15 20:53:49 UTC (rev 1467) @@ -55,6 +55,40 @@ , '}' ])) +class pure_virtual_mem_fun: + override = Template( os.linesep.join([ + 'virtual $return_type $function_name( $arg_declarations )$constness $throw{' + , ' namespace bpl = boost::python;' + , ' if( bpl::override $py_function_var = this->get_override( "$function_alias" ) ){' + , ' $declare_py_variables' + , ' $py_pre_call' + , ' ${save_py_result}bpl::call<bpl::object>( $py_function_var.ptr()$py_arg_expressions );' + , ' $py_post_call' + , ' $py_return' + , ' }' + , ' else{' + , ' PyErr_SetString(PyExc_NotImplementedError, "Attempted calling Pure Virtual function that is not implemented :$function_name");' + , ' boost::python::throw_error_already_set();' + , ' }' + , '}' + ])) + + default = Template( os.linesep.join([ + 'static $return_type $unique_function_name( $arg_declarations ){' + , ' $declare_variables' + , ' $pre_call' + , ' if( dynamic_cast< $wrapper_class $wrapped_inst_constness* >( boost::addressof( $wrapped_inst ) ) ){' + , ' PyErr_SetString(PyExc_NotImplementedError, "Attempted calling Pure Virtual function that is not implemented :$function_name");' + , ' boost::python::throw_error_already_set();' + , ' }' + , ' else{' + , ' $save_result$wrapped_inst.$function_name($arg_expressions);' + , ' }' + , ' $post_call' + , ' $return' + , '}' + ])) + #TODO: FT for constructor #~ class constructor: #~ #User cannot apply transformation on constructor of abstract class Modified: pyplusplus_dev/pyplusplus/module_creator/creators_wizard.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creators_wizard.py 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/pyplusplus/module_creator/creators_wizard.py 2008-12-15 20:53:49 UTC (rev 1467) @@ -30,8 +30,12 @@ else: maker_cls = code_creators.mem_fun_t elif decl.virtuality == VIRTUALITY_TYPES.PURE_VIRTUAL: - fwrapper_cls = code_creators.mem_fun_pv_wrapper_t - maker_cls = code_creators.mem_fun_pv_t + if decl.transformations: + maker_cls = code_creators.mem_fun_v_transformed_t + fwrapper_cls = code_creators.mem_fun_v_transformed_wrapper_t + else: + fwrapper_cls = code_creators.mem_fun_pv_wrapper_t + maker_cls = code_creators.mem_fun_pv_t else: if decl.transformations: fwrapper_cls = code_creators.mem_fun_v_transformed_wrapper_t Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/unittests/autoconfig.py 2008-12-15 20:53:49 UTC (rev 1467) @@ -30,8 +30,9 @@ @staticmethod def create_sconstruct(): code = [ - "env = Environment()" - , "env.SharedLibrary( target=r'%(target)s'" + "import sys" + , "env = Environment()" + , "t = env.SharedLibrary( target=r'%(target)s'" , " , source=[ %(sources)s ]" , " , LIBS=[ %s ]" % ','.join( [ 'r"%s"' % lib for lib in scons_config.libs ] ) , " , LIBPATH=[ %s ]" % ','.join( [ 'r"%s"' % path for path in scons_config.libpath ] ) @@ -39,8 +40,9 @@ , " , CCFLAGS=[ %s ]" % ','.join( [ 'r"%s"' % flag for flag in scons.ccflags ] ) , " , SHLIBPREFIX=''" , " , SHLIBSUFFIX='%s'" % scons.suffix #explicit better then implicit - , ")" - , "env.AddPostAction('%(target)s', 'mt.exe -nologo -manifest %(target)s.pyd.manifest -outputresource:%(target)s.pyd;2' )" ] + , ")" + , "if 'linux' not in sys.platform:" + , " env.AddPostAction(t, 'mt.exe -nologo -manifest %(target)s.pyd.manifest -outputresource:%(target)s.pyd;2' )" ] return os.linesep.join( code ) #I need this in order to allow Python to load just compiled modules Modified: pyplusplus_dev/unittests/bool_by_ref_tester.py =================================================================== --- pyplusplus_dev/unittests/bool_by_ref_tester.py 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/unittests/bool_by_ref_tester.py 2008-12-15 20:53:49 UTC (rev 1467) @@ -26,6 +26,8 @@ set_flag = mb.mem_fun( '::tests::listener::listen' ) set_flag.add_transformation( ft.inout(2) ) + set_flag = mb.mem_fun( '::tests::listener::listenPV' ) + set_flag.add_transformation( ft.inout(2) ) def run_tests(self, module): class list1 ( module.listener ): @@ -33,11 +35,16 @@ module.listener.__init__(self) def listen( self, id, name, skip): print "Python: listen called with", id, name, skip - return 11## Test always returns True... - + return skip + 1 ## Test always returns True... + def listenPV( self, id, name, skip): + print "Python: listenPV called with", id, name, skip + return skip + 1 ## Test always returns True... + c = list1() ret = module.callListener( c ) print ret + ret = module.callListenerPV ( c ) + print ret def create_suite(): suite = unittest.TestSuite() Modified: pyplusplus_dev/unittests/data/bool_by_ref_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/bool_by_ref_to_be_exported.hpp 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/unittests/data/bool_by_ref_to_be_exported.hpp 2008-12-15 20:53:49 UTC (rev 1467) @@ -7,15 +7,34 @@ public: virtual void listen(int id, const std::string& name, int& skip) { throw std::runtime_error ( std::string ("Virtual function listener::listen called!") ); - } + } + virtual void listenPV(int id, const std::string& name, int& skip) = 0; }; bool callListener ( listener* myListener) { int skip = 10; std::cout << "C++: Calling myListener->listen\n"; myListener->listen(100, "test", skip); - std::cout << "C++: Called OK " << skip <<"\n"; + if (skip == 10) + throw std::runtime_error( "PROBLEM in C++: Called Returned with same value " ); + else + std::cout << "C++: Called OK " << skip <<"\n"; + return skip; } + +bool callListenerPV ( listener* myListener) { + int skip = 10; + std::cout << "C++: Calling myListener->listen\n"; + myListener->listenPV(100, "test", skip); + if (skip == 10){ + throw std::runtime_error( "PROBLEM in C++: Called Returned with same value " ); + } + else + std::cout << "C++: Called OK " << skip <<"\n"; + return skip; } + + +} Modified: pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2008-12-13 21:24:18 UTC (rev 1466) +++ pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2008-12-15 20:53:49 UTC (rev 1467) @@ -249,7 +249,7 @@ virtual void render_queue_ended( int group_id , const std::string& invocation - , bool& repeat_this_invocation ){}; + , bool& repeat_this_invocation ) = 0; }; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-16 23:22:37
|
Revision: 1471 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1471&view=rev Author: roman_yakovenko Date: 2008-12-16 22:16:38 +0000 (Tue, 16 Dec 2008) Log Message: ----------- adding ability to assign variable an address Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py pyplusplus_dev/unittests/member_variables_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-12-16 13:16:38 UTC (rev 1470) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2008-12-16 22:16:38 UTC (rev 1471) @@ -656,15 +656,26 @@ def __init__(self, variable, wrapper=None ): member_variable_base_t.__init__( self, variable=variable, wrapper=wrapper ) + def has_setter( self ) : + return declarations.is_pointer( self.declaration.type ) \ + and not declarations.is_const( self.declaration.type ) + def _create_m_var( self ): + param_sep = self.PARAM_SEPARATOR + if self.has_setter() or self.documentation: + param_sep = os.linesep + self.indent( self.PARAM_SEPARATOR, 3 ) answer = [ 'add_property' ] answer.append( '( ' ) answer.append('"%s"' % self.alias) - answer.append( self.PARAM_SEPARATOR ) + answer.append( param_sep ) answer.append( 'pyplus_conv::make_addressof_getter(&%s)' % self.decl_identifier ) + if self.has_setter(): + answer.append( param_sep ) + answer.append( 'pyplus_conv::make_address_setter(&%s)' + % self.decl_identifier ) if self.documentation: - answer.append( self.PARAM_SEPARATOR ) + answer.append( param_sep ) answer.append( self.documentation ) answer.append( ' ) ' ) return ''.join( answer ) Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-12-16 13:16:38 UTC (rev 1470) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_integration.py 2008-12-16 22:16:38 UTC (rev 1471) @@ -41,6 +41,16 @@ return size_t( boost::addressof( inst.*offset ) ); } +template< typename TType, typename TMemVarType> +void +assign_address( TType* inst_ptr, TMemVarType TType::* offset, size_t address ){ + if( !inst_ptr ){ + throw std::runtime_error( "unable to dereference null pointer" ); + } + TType& inst = *inst_ptr; + inst.*offset = reinterpret_cast< TMemVarType >( address ); +} + template< typename TType > size_t addressof_inst( const TType* inst_ptr){ @@ -61,6 +71,17 @@ , boost::mpl::vector< size_t, const TType* >() ); } +template< typename TType, typename TMemVarType > +boost::python::object +make_address_setter( TMemVarType TType::* offset ){ + namespace bpl = boost::python; + namespace pyppc = pyplusplus::convenience; + return bpl::make_function( boost::bind( &pyppc::assign_address< TType, TMemVarType >, _1, offset, _2 ) + , bpl::default_call_policies() + , boost::mpl::vector< void, TType*, size_t >() ); +} + + template< typename TType > boost::python::object make_addressof_inst_getter(){ Modified: pyplusplus_dev/unittests/member_variables_tester.py =================================================================== --- pyplusplus_dev/unittests/member_variables_tester.py 2008-12-16 13:16:38 UTC (rev 1470) +++ pyplusplus_dev/unittests/member_variables_tester.py 2008-12-16 22:16:38 UTC (rev 1471) @@ -97,6 +97,15 @@ 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 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-17 18:39:28
|
Revision: 1473 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1473&view=rev Author: roman_yakovenko Date: 2008-12-17 18:39:23 +0000 (Wed, 17 Dec 2008) Log Message: ----------- update testers to the boost svn Modified Paths: -------------- pyplusplus_dev/environment.py pyplusplus_dev/unittests/algorithms_tester.py pyplusplus_dev/unittests/already_exposed_tester.py pyplusplus_dev/unittests/autoconfig.py pyplusplus_dev/unittests/dwrapper_printer_tester.py pyplusplus_dev/unittests/fundamental_tester_base.py pyplusplus_dev/unittests/gui_wizard_tester.py pyplusplus_dev/unittests/mdecl_wrapper_tester.py pyplusplus_dev/unittests/ogre_generate_tester.py pyplusplus_dev/unittests/particle_universe_generate_tester.py pyplusplus_dev/unittests/unicode_bug.py Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/environment.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -37,7 +37,7 @@ if sys.platform == 'win32': scons.suffix = '.pyd' scons.ccflags = ['/MD', '/EHsc', '/GR', '/Zc:wchar_t', '/Zc:forScope', '-DBOOST_PYTHON_NO_PY_SIGNATURES' ] - boost.libs = [ 'd:/dev/boost_svn/bin.v2/libs/python/build/msvc-7.1/release' ] + boost.libs = [ 'd:/dev/boost_svn/bin.v2/libs/python/build/msvc-7.1/release/threading-multi' ] boost.include = 'd:/dev/boost_svn' python.libs = 'e:/python25/libs' python.include = 'e:/python25/include' Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/algorithms_tester.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -7,6 +7,7 @@ import sys import unittest import autoconfig +import pygccxml from pygccxml import parser from pygccxml import declarations from pyplusplus import code_creators @@ -24,7 +25,8 @@ def test(self): mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace enums{ enum { OK=1 }; }' ) ] - , gccxml_path=autoconfig.gccxml.executable ) + , gccxml_path=autoconfig.gccxml.executable + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) mb.namespace( name='::enums' ).include() mb.build_code_creator('dummy') flatten = code_creators.make_flatten(mb.code_creator.creators) @@ -34,7 +36,7 @@ def test_find_by_declaration(self): mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace enums{ enum color{ red = 1}; }' )] - , gccxml_path=autoconfig.gccxml.executable ) + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) mb.namespace( name='::enums' ).include() enum_matcher = declarations.match_declaration_t( name='color' ) mb.build_code_creator( 'dummy' ) @@ -46,7 +48,7 @@ def test_find_by_class_instance(self): mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace enums{ enum color{ red = 1}; }' )] - , gccxml_path=autoconfig.gccxml.executable ) + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) mb.namespace( name='::enums' ).include() mb.build_code_creator('dummy') enum_found = code_creators.creator_finder.find_by_class_instance( @@ -67,7 +69,7 @@ return answer def test(self): - config = parser.config_t( gccxml_path=autoconfig.gccxml.executable ) + config = parser.config_t( gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) code = [] code.append('struct a{};') code.append('struct b{};') @@ -95,7 +97,7 @@ def test(self): mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'namespace arr{ struct x{ x( int arr[3][3], int ){} x( const x arr[3][3], int ){} }; }' )] - , gccxml_path=autoconfig.gccxml.executable ) + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) arr = mb.namespace( name='arr' ) mem_funs = arr.calldefs( 'x', arg_types=[None,None] ) for x in mem_funs: @@ -115,7 +117,7 @@ def test(self): mb = module_builder.module_builder_t( [ module_builder.create_text_fc( self.CODE )] - , gccxml_path=autoconfig.gccxml.executable ) + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) xxx = mb.namespace( name='xxx' ) fun = xxx.calldef( 'do_smth' ) self.failUnless( fun.readme() == [] ) @@ -133,12 +135,12 @@ struct derived : public base { void f(int i); using base::f; - }; + }; """ def test(self): mb = module_builder.module_builder_t( [ module_builder.create_text_fc( self.CODE )] - , gccxml_path=autoconfig.gccxml.executable ) + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) d = mb.class_( 'derived' ) f = d.mem_fun( 'f' ) self.failUnless( f.create_with_signature == True ) @@ -172,11 +174,11 @@ int m_dummy; struct x_nested{}; - + float* get_rate(){ return 0; } - + virtual void get_size( int& i, int& j ){ i = 0; j = 0; @@ -187,7 +189,7 @@ def test(self): mb = module_builder.module_builder_t( [ module_builder.create_text_fc( self.CLASS_DEF ) ] - , gccxml_path=autoconfig.gccxml.executable ) + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) mb.namespace( name='::tester' ).include() x = mb.class_( 'x' ) x.add_registration_code( '//hello world reg' ) @@ -223,77 +225,77 @@ escaped_doc = module_builder.doc_extractor_i.escape_doc('Hello "Py++"') self.failUnless( escaped_doc == '"Hello \\"Py++\\""' ) -class exclude_erronious_tester_t( unittest.TestCase ): +class exclude_erronious_tester_t( unittest.TestCase ): def test(self): - + code = """ namespace xyz{ - + struct good{}; - + typedef void (*ff1)( int, int ); - + void f_bad( ff1 ); - + } """ - - mb = module_builder.module_builder_t( + + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( code ) ] - , gccxml_path=autoconfig.gccxml.executable ) - + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) + xyz = mb.namespace( name='xyz' ) xyz.include() - + xyz.exclude(compilation_errors=True) - + self.failUnless( xyz.ignore == False ) self.failUnless( xyz.class_( 'good' ).ignore == False ) self.failUnless( xyz.free_fun( 'f_bad' ).ignore == True ) -class exclude_ellipsis_tester_t( unittest.TestCase ): +class exclude_ellipsis_tester_t( unittest.TestCase ): def test(self): - + code = """ namespace xyz{ void do_smth( int, ... ); } """ - - mb = module_builder.module_builder_t( + + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( code ) ] - , gccxml_path=autoconfig.gccxml.executable ) - + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) + do_smth = mb.free_fun( 'do_smth' ) - + self.failUnless( do_smth.exportable == False ) print do_smth.why_not_exportable() -class constructors_code_tester_t( unittest.TestCase ): +class constructors_code_tester_t( unittest.TestCase ): def test(self): - + code = """ namespace xyz{ struct Y; - + struct X{ X(); - X( const X& ); + X( const X& ); X( Y* ); }; } """ - - mb = module_builder.module_builder_t( + + mb = module_builder.module_builder_t( [ module_builder.create_text_fc( code ) ] - , gccxml_path=autoconfig.gccxml.executable ) - + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) + x = mb.class_( 'X' ) x.include() x.constructors().body = ' //all constructors body' x.null_constructor_body = ' //null constructor body' x.copy_constructor_body = ' //copy constructor body' - + mb.build_code_creator( 'XXX' ) code = mb.code_creator.create() tmp = code.split( x.null_constructor_body ) Modified: pyplusplus_dev/unittests/already_exposed_tester.py =================================================================== --- pyplusplus_dev/unittests/already_exposed_tester.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/already_exposed_tester.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -7,46 +7,48 @@ import sys import unittest import autoconfig +import pygccxml from pyplusplus import utils from pyplusplus import module_builder import fundamental_tester_base -class tester_t( unittest.TestCase ): - def test(self): +class tester_t( unittest.TestCase ): + def test(self): fpath = os.path.join( autoconfig.data_directory, 'already_exposed_to_be_exported.hpp' ) mb = module_builder.module_builder_t( [module_builder.create_source_fc( fpath )] - , gccxml_path=autoconfig.gccxml.executable ) - + , gccxml_path=autoconfig.gccxml.executable, compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) + mb.global_ns.exclude() mb.namespace( 'already_exposed' ).include() mb.build_code_creator( 'already_exposed' ) - + already_exposed_dir = os.path.join( autoconfig.build_directory, 'already_exposed' ) mb.write_module( os.path.join( already_exposed_dir, 'already_exposed.cpp' ) ) - + #----------------------------------------------------------------------- - + fpath = os.path.join( autoconfig.data_directory, 'already_exposed_2to_be_exported.hpp' ) mb = module_builder.module_builder_t( [module_builder.create_source_fc( fpath )] - , gccxml_path=autoconfig.gccxml.executable ) - + , gccxml_path=autoconfig.gccxml.executable + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) + mb.global_ns.exclude() mb.namespace( 'to_be_exposed' ).include() mb.build_code_creator( 'to_be_exposed' ) - + mb.register_module_dependency( already_exposed_dir ) mb.build_code_creator( 'to_be_exposed' ) to_be_exposed_dir = os.path.join( autoconfig.build_directory, 'to_be_exposed' ) mb.write_module( os.path.join( to_be_exposed_dir, 'to_be_exposed.cpp' ) ) - + body = mb.code_creator.body self.failUnless( 2 == len( body.creators ) ) ae_derived_code = body.creators[0].create() self.failUnless( mb.class_( 'ae_base' ).decl_string in ae_derived_code ) - + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/autoconfig.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -21,8 +21,10 @@ from environment import scons, boost, python, gccxml, indexing_suite +import pygccxml + class scons_config: - libs = ['boost_python'] + libs = []#['boost_python'] libpath = [ python.libs ] + boost.libs cpppath = [ boost.include, python.include, indexing_suite.include ] include_dirs = cpppath + [data_directory] @@ -32,6 +34,10 @@ code = [ "import sys" , "env = Environment()" + , "if 'linux' not in sys.platform:" + , " env['MSVS'] = {'VERSION': '%s'}" % str( pygccxml.utils.native_compiler.get_version()[1] ) + , " env['MSVS_VERSION'] = '%s'" % str( pygccxml.utils.native_compiler.get_version()[1] ) + , " Tool('msvc')(env)" , "t = env.SharedLibrary( target=r'%(target)s'" , " , source=[ %(sources)s ]" , " , LIBS=[ %s ]" % ','.join( [ 'r"%s"' % lib for lib in scons_config.libs ] ) @@ -40,9 +46,9 @@ , " , CCFLAGS=[ %s ]" % ','.join( [ 'r"%s"' % flag for flag in scons.ccflags ] ) , " , SHLIBPREFIX=''" , " , SHLIBSUFFIX='%s'" % scons.suffix #explicit better then implicit - , ")" - , "if 'linux' not in sys.platform:" - , " env.AddPostAction(t, 'mt.exe -nologo -manifest %(target)s.pyd.manifest -outputresource:%(target)s.pyd;2' )" ] + , ")" ] + #~ , "if 'linux' not in sys.platform:" + #~ , " env.AddPostAction(t, 'mt.exe -nologo -manifest %(target)s.pyd.manifest -outputresource:%(target)s.pyd;2' )" ] return os.linesep.join( code ) #I need this in order to allow Python to load just compiled modules Modified: pyplusplus_dev/unittests/dwrapper_printer_tester.py =================================================================== --- pyplusplus_dev/unittests/dwrapper_printer_tester.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/dwrapper_printer_tester.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -21,17 +21,18 @@ ] return map( lambda f: os.path.join( autoconfig.data_directory, f ) , files ) - + def test(self): mb = module_builder.module_builder_t( self._get_files() , gccxml_path=autoconfig.gccxml.executable , include_paths=[autoconfig.boost.include] - , undefine_symbols=['__MINGW32__']) + , undefine_symbols=['__MINGW32__'] + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler()) writer = lambda decl: None module_builder.print_declarations( mb.global_ns, writer=writer ) - + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -39,4 +40,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -7,6 +7,7 @@ import sys import unittest import autoconfig +import pygccxml from pygccxml import parser from pyplusplus import utils from pygccxml import declarations @@ -54,8 +55,8 @@ irrelevant_decl_types = ( declarations.typedef_t , declarations.namespace_t , declarations.free_operator_t ) - specially_exposed_decls = mb.code_creator.specially_exposed_decls - for d in mb.decls(): + specially_exposed_decls = mb.code_creator.specially_exposed_decls + for d in mb.decls(): if not d.exportable: continue elif isinstance( d, declarations.free_operator_t ): @@ -64,13 +65,13 @@ if d in specially_exposed_decls: continue if exposed_db.is_exposed( d ): - i = 0 + i = 0 self.failUnless( not exposed_db.is_exposed( d ) , '''Declaration "%s" is NOT exposed, but for some reason it is marked as such.''' % str( d ) ) #if d.ignore or not d.exportable or isinstance( d, irrelevant_decl_types ): #continue - #if d.parent and not d.parent.name: + #if d.parent and not d.parent.name: #continue #unnamed classes else: self.failUnless( exposed_db.is_exposed( d ) @@ -95,17 +96,13 @@ def _create_extension_source_file(self): global LICENSE - - #xml_file = os.path.split( self.__to_be_exported_header )[1] - #xml_file = os.path.join( autoconfig.build_dir, xml_file + '.xml' ) - #xml_cached_fc = parser.create_cached_source_fc( self.__to_be_exported_header, xml_file ) - #mb = module_builder.module_builder_t( [xml_cached_fc] mb = module_builder.module_builder_t( [self.__to_be_exported_header] , gccxml_path=autoconfig.gccxml.executable , include_paths=[autoconfig.boost.include] , undefine_symbols=['__MINGW32__'] - , indexing_suite_version=self.__indexing_suite_version) + , indexing_suite_version=self.__indexing_suite_version + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler()) for decl in mb.decls(): decl.documentation = '"documentation"' self.customize( mb ) Modified: pyplusplus_dev/unittests/gui_wizard_tester.py =================================================================== --- pyplusplus_dev/unittests/gui_wizard_tester.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/gui_wizard_tester.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -11,12 +11,13 @@ #Configurating GCC-XML parser #Basically you should copy here your makefile configuration -parser_configuration = parser.config_t( +parser_configuration = parser.config_t( #path to GCC-XML binary gccxml_path=r"c:/tools/gccxml/bin/gccxml.exe" , working_directory=r"D:\pygccxml_sources\source\pyplusplus\unittests\data" , include_paths=['D:/pygccxml_sources/source/pyplusplus/gui'] - , define_symbols=[] ) + , define_symbols=[] + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) #Creating an instance of class that will help you to expose your declarations mb = module_builder.module_builder_t( [r"D:\pygccxml_sources\source\pyplusplus\unittests\data\call_policies_to_be_exported.hpp"], parser_configuration ) @@ -28,4 +29,4 @@ mb.build_code_creator( module_name='pyplusplus' ) #Writing code to file. -mb.write_module( './bindings.cpp' ) \ No newline at end of file +mb.write_module( './bindings.cpp' ) Modified: pyplusplus_dev/unittests/mdecl_wrapper_tester.py =================================================================== --- pyplusplus_dev/unittests/mdecl_wrapper_tester.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/mdecl_wrapper_tester.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -27,56 +27,58 @@ mb = module_builder.module_builder_t( self._get_files() , gccxml_path=autoconfig.gccxml.executable , include_paths=[autoconfig.boost.include] - , undefine_symbols=['__MINGW32__'] ) + , undefine_symbols=['__MINGW32__'] + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler()) classes = filter( lambda d: isinstance( d, module_builder.class_t ) , declarations.make_flatten( mb.global_ns ) ) - + mdw = module_builder.mdecl_wrapper_t( classes ) #check set to property functionality for d in mdw: d.always_expose_using_scope = False - + mdw.always_expose_using_scope = True - + all_true = True for d in mdw: all_true &= d.always_expose_using_scope - + self.failUnless( all_true ) - - #check call method functionality + + #check call method functionality for d in mdw: d.ignore = True - + mdw.include() - + all_false = False for d in mdw: all_true |= d.ignore - + self.failUnless( not all_false ) - + #check for exception: try: mdw.call_policies = None self.fail( "Runtime error has not been raised." ) except RuntimeError, err: pass - + def test__getitem__( self ): mb = module_builder.module_builder_t( self._get_files() , gccxml_path=autoconfig.gccxml.executable , include_paths=[autoconfig.boost.include] - , undefine_symbols=['__MINGW32__'] ) - + , undefine_symbols=['__MINGW32__'] + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler() ) + public_bases = mb.classes( 'public_base_t' ) self.failUnless( 1 == len( public_bases ) ) public_bases.include() self.failUnless( public_bases[0].ignore == False ) - + mb.global_ns[ 'public_base_t' ].exclude() - + self.failUnless( public_bases[0].ignore == True ) #def test__getitem__2( self ): @@ -84,7 +86,7 @@ #, gccxml_path=autoconfig.gccxml.executable #, include_paths=[autoconfig.boost.include] #, undefine_symbols=['__MINGW32__'] ) - + #mem_funs = mb.classes( 'public_base_t' ).member_functions('regular') #print len(mem_funs) ##self.failUnless( 1 == len( public_bases ) ) @@ -92,15 +94,15 @@ #mem_funs.include() #for mf in mem_funs: #self.failUnless( mf.ignore == False ) - + #mb.global_ns[ 'public_base_t' ]['regular'].exclude() - + #for mf in mem_funs: #self.failUnless( mf.ignore == False ) def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite Modified: pyplusplus_dev/unittests/ogre_generate_tester.py =================================================================== --- pyplusplus_dev/unittests/ogre_generate_tester.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/ogre_generate_tester.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -18,41 +18,42 @@ from pyplusplus import utils as pypp_utils from pyplusplus import function_transformers as ft -class ogre_generate_tester_t(unittest.TestCase): +class ogre_generate_tester_t(unittest.TestCase): def test(self): module_builder.set_logger_level( logging.CRITICAL ) messages.disable( *messages.all_warning_msgs ) - + ogre_file = autoconfig.data_directory.replace( 'pyplusplus_dev', 'pygccxml_dev' ) ogre_file = parser.create_gccxml_fc( os.path.join( ogre_file, 'ogre.1.7.xml' ) ) mb = module_builder.module_builder_t( [ ogre_file ] - , gccxml_path=autoconfig.gccxml.executable - , indexing_suite_version=2) - + , gccxml_path=autoconfig.gccxml.executable + , indexing_suite_version=2 + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler()) + mb.global_ns.exclude() mb.namespace('Ogre').include() - + x = mb.global_ns.decls( lambda d: 'Animation*' in d.name and 'MapIterator' in d.name ) for y in x: print y.name print y.partial_name print declarations.full_name( y, with_defaults=False ) - + target_dir = os.path.join( autoconfig.build_directory, 'ogre' ) #~ if os.path.exists( target_dir ): #~ shutil.rmtree( target_dir ) #~ os.mkdir( target_dir ) - + mb.build_code_creator( 'Ogre3d' ) - mb.split_module( target_dir ) + mb.split_module( target_dir ) def create_suite(): suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(ogre_generate_tester_t)) + suite.addTest( unittest.makeSuite(ogre_generate_tester_t)) return suite def run_suite(): Modified: pyplusplus_dev/unittests/particle_universe_generate_tester.py =================================================================== --- pyplusplus_dev/unittests/particle_universe_generate_tester.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/particle_universe_generate_tester.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -18,18 +18,19 @@ from pyplusplus import utils as pypp_utils from pyplusplus import function_transformers as ft -class ogre_generate_tester_t(unittest.TestCase): +class ogre_generate_tester_t(unittest.TestCase): def test(self): module_builder.set_logger_level( logging.CRITICAL ) messages.disable( *messages.all_warning_msgs ) - + xml_file = parser.create_gccxml_fc( os.path.join( autoconfig.data_directory, 'particleuniverse.xml' ) ) mb = module_builder.module_builder_t( [ xml_file ] - , gccxml_path=autoconfig.gccxml.executable - , indexing_suite_version=2) - + , gccxml_path=autoconfig.gccxml.executable + , indexing_suite_version=2 + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler()) + mb.global_ns.exclude() mb.namespace('ParticleUniverse').include() mb.namespace('Ogre').include() @@ -42,13 +43,13 @@ psp = mb.class_( '::ParticleUniverse::ParticleScriptParser' ) declarations.print_declarations( psp ) mb.build_code_creator( 'PU' ) - mb.split_module( target_dir ) + mb.split_module( target_dir ) def create_suite(): suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(ogre_generate_tester_t)) + suite.addTest( unittest.makeSuite(ogre_generate_tester_t)) return suite def run_suite(): Modified: pyplusplus_dev/unittests/unicode_bug.py =================================================================== --- pyplusplus_dev/unittests/unicode_bug.py 2008-12-17 09:05:44 UTC (rev 1472) +++ pyplusplus_dev/unittests/unicode_bug.py 2008-12-17 18:39:23 UTC (rev 1473) @@ -3,6 +3,7 @@ import os import unittest import autoconfig +import pygccxml from pygccxml import parser from pygccxml import declarations from pyplusplus import code_creators @@ -12,10 +13,11 @@ from pyplusplus import function_transformers as ft -mb = module_builder.module_builder_t( +mb = module_builder.module_builder_t( [ module_builder.create_text_fc( 'struct x{};' ) ] - , gccxml_path=autoconfig.gccxml.executable - , encoding='UTF-8') + , gccxml_path=autoconfig.gccxml.executable + , encoding='UTF-8' + , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler()) mb.build_code_creator( module_name='unicode_bug' ) mb.code_creator.license = "//абвгдеёжзийклмнопрстуфхцчшщъыьэюя" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-24 20:47:12
|
Revision: 1494 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1494&view=rev Author: roman_yakovenko Date: 2008-12-24 20:47:08 +0000 (Wed, 24 Dec 2008) Log Message: ----------- few changes to allow introduction of new module builder class Modified Paths: -------------- pyplusplus_dev/environment.py pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj pyplusplus_dev/pyplusplus/cpptypes/mydll/release/mydll.dll pyplusplus_dev/pyplusplus/module_builder/__init__.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/pyplusplus/module_builder/extension_builder.py pyplusplus_dev/unittests/autoconfig.py Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/environment.py 2008-12-24 20:47:08 UTC (rev 1494) @@ -49,7 +49,19 @@ boost.libs = ['/home/roman/include/libs' ] boost.include = '/home/roman/boost_svn' python.include = '/usr/include/python2.5' +elif 'root' == getpass.getuser(): + scons.cmd_build = 'scons --file=%s' + scons.cmd_clean = 'scons --clean --file=%s' + + if sys.platform == 'win32': + scons.suffix = '.pyd' + scons.ccflags = ['/MD', '/EHsc', '/GR', '/Zc:wchar_t', '/Zc:forScope', '-DBOOST_PYTHON_NO_PY_SIGNATURES' ] + boost.libs = [ 'd:/dev/boost_svn/bin.v2/libs/python/build/msvc-7.1/release/threading-multi' ] + boost.include = 'd:/dev/boost_svn' + python.libs = 'e:/python25/libs' + python.include = 'e:/python25/include' + _my_path = None try: import environment_path_helper Modified: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.cpp 2008-12-24 20:47:08 UTC (rev 1494) @@ -38,6 +38,9 @@ return std::auto_ptr<number_t>( new number_t( *this ) ); } +void do_smth( number_aptr_t& ){ +} + BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved Modified: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.h 2008-12-24 20:47:08 UTC (rev 1494) @@ -9,6 +9,7 @@ virtual ~number_t(); void print_it() const; int get_value() const; + int get_value(){ return m_value; } void set_value(int x); number_t clone() const; @@ -18,3 +19,7 @@ }; template class __declspec(dllexport) std::auto_ptr< number_t >; + +typedef std::auto_ptr< number_t > number_aptr_t; + +void __declspec(dllexport) do_smth( number_aptr_t& ); \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/pyplusplus/cpptypes/mydll/mydll.vcproj 2008-12-24 20:47:08 UTC (rev 1494) @@ -118,6 +118,7 @@ RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" + BrowseInformation="1" WarningLevel="3" DebugInformationFormat="3" /> @@ -134,6 +135,8 @@ Name="VCLinkerTool" LinkIncremental="1" GenerateDebugInformation="true" + GenerateMapFile="true" + MapExports="true" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" Modified: pyplusplus_dev/pyplusplus/cpptypes/mydll/release/mydll.dll =================================================================== (Binary files differ) Modified: pyplusplus_dev/pyplusplus/module_builder/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/__init__.py 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/pyplusplus/module_builder/__init__.py 2008-12-24 20:47:08 UTC (rev 1494) @@ -13,6 +13,7 @@ """ from extension_builder import extension_module_builder_t as module_builder_t +from ctypes_builder import ctypes_module_builder_t #aliases for functionality located in pygccxml.parser module from pygccxml.parser import COMPILATION_MODE Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2008-12-24 20:47:08 UTC (rev 1494) @@ -13,10 +13,7 @@ """ """ - def __init__( self - , global_ns=None - , encoding='ascii' - , working_directory='.' ): + def __init__( self, global_ns=None, encoding='ascii' ): """ """ object.__init__( self ) @@ -25,8 +22,9 @@ self.__global_ns = global_ns def __get_global_ns( self ): + if not self.__global_ns: + raise RuntimeError( "Reference to global namespace declaration was not set." ) return self.__global_ns - def __set_global_ns( self, global_ns ): self.__global_ns = global_ns Modified: pyplusplus_dev/pyplusplus/module_builder/extension_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/extension_builder.py 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/pyplusplus/module_builder/extension_builder.py 2008-12-24 20:47:08 UTC (rev 1494) @@ -63,10 +63,7 @@ @param cflags: Raw string to be added to gccxml command line. """ - builder.base_builder_t.__init__( self - , global_ns=None - , encoding=encoding - , working_directory=working_directory ) + builder.base_builder_t.__init__( self, global_ns=None, encoding=encoding ) gccxml_config = parser.config_t( gccxml_path=gccxml_path , working_directory=working_directory @@ -78,10 +75,7 @@ , cflags=cflags , compiler=compiler) - #may be in future I will add those directories to user_defined_directories - #to self.__code_creator. - self.__working_dir = os.path.abspath( working_directory ) - + #may be in future I will add those directories to user_defined_directories to self.__code_creator. self.__parsed_files = map( decls_package.filtering.normalize_path , parser.project_reader_t.get_os_file_names( files ) ) tmp = map( lambda file_: os.path.split( file_ )[0], self.__parsed_files ) @@ -250,11 +244,6 @@ , doc_extractor) self.__code_creator = creator.create() self.__code_creator.replace_included_headers(self.__parsed_files) - #I think I should ask users, what they expect - #self.__code_creator.user_defined_directories.append( self.__working_dir ) - #map( self.__code_creator.user_defined_directories.append - # , self.__parsed_dirs ) - return self.__code_creator @property Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2008-12-24 20:44:03 UTC (rev 1493) +++ pyplusplus_dev/unittests/autoconfig.py 2008-12-24 20:47:08 UTC (rev 1494) @@ -23,6 +23,24 @@ import pygccxml +compiler = pygccxml.utils.native_compiler.get_gccxml_compiler() +print 'GCCXML configured to simulate compiler ', compiler +gccxml_version = '__GCCXML_09__' +class cxx_parsers_cfg: + keywd = { 'working_directory' : data_directory + , 'define_symbols' : [ gccxml_version ] + , 'compiler' : compiler + , 'gccxml_path': gccxml.executable } + + if 'win' in sys.platform: + keywd['define_symbols'].append( '__PYGCCXML_%s__' % compiler.upper() ) + if 'msvc9' == compiler: + keywd['define_symbols'].append( '_HAS_TR1=0' ) + + gccxml = pygccxml.parser.gccxml_configuration_t( **keywd ) + + + class scons_config: libs = []#['boost_python'] libpath = [ python.libs ] + boost.libs This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |