[pygccxml-commit] SF.net SVN: pygccxml: [536] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-09-13 07:32:32
|
Revision: 536 http://svn.sourceforge.net/pygccxml/?rev=536&view=rev Author: roman_yakovenko Date: 2006-09-13 00:32:06 -0700 (Wed, 13 Sep 2006) Log Message: ----------- fixing "immutable" bug argument that have immutable type, should not be passed by value and not by reference Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp pyplusplus_dev/unittests/member_functions_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py Modified: pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-09-13 07:32:06 UTC (rev 536) @@ -9,6 +9,7 @@ import code_creator from pyplusplus import code_repository from pyplusplus.decl_wrappers import call_policies +from pyplusplus.decl_wrappers import python_traits from pygccxml import declarations class array_1_registrator_t( code_creator.code_creator_t ): @@ -41,7 +42,7 @@ def _guess_call_policies(self): item_type = declarations.array_item_type( self.array_type ) - if declarations.is_fundamental( item_type ) or declarations.is_enum( item_type ): + if python_traits.is_immutable( item_type ): return call_policies.default_call_policies() else: return call_policies.return_internal_reference() Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-09-13 07:32:06 UTC (rev 536) @@ -9,6 +9,7 @@ import declaration_based import class_declaration from pygccxml import declarations +from pyplusplus.decl_wrappers import python_traits import pyplusplus.function_transformers as function_transformers #virtual functions that returns const reference to something @@ -174,17 +175,19 @@ params = [] for index in range( len( self.declaration.arguments ) ): arg_type = declarations.remove_alias( self.declaration.arguments[index].type ) - arg_base_type = declarations.base_type( arg_type ) - if declarations.is_fundamental( arg_base_type ): + if python_traits.is_immutable( arg_type ): params.append( self.argument_name( index ) ) - elif declarations.is_reference( arg_type ) \ - and not declarations.is_const( arg_type ) \ - and not declarations.is_enum( arg_base_type ): - params.append( 'boost::ref(%s)' % self.argument_name( index ) ) + elif declarations.is_reference( arg_type ): + no_ref = declarations.remove_reference( arg_type ) + if python_traits.is_immutable( no_ref ): + #pass by value + params.append( self.argument_name( index ) ) + else: + #pass by ref + params.append( 'boost::ref(%s)' % self.argument_name( index ) ) elif declarations.is_pointer( arg_type ) \ and not declarations.is_pointer( arg_type.base ) \ - and not declarations.is_fundamental( arg_type.base ) \ - and not declarations.is_enum( arg_base_type ): + and not python_traits.is_immutable( arg_type.base ): params.append( 'boost::python::ptr(%s)' % self.argument_name( index ) ) else: params.append( self.argument_name( index ) ) @@ -443,7 +446,7 @@ class mem_fun_v_transformed_t( calldef_t ): """Creates code for (public) virtual member functions. """ - + def __init__( self, function, wrapper=None ): calldef_t.__init__( self, function=function, wrapper=wrapper ) self.default_function_type_alias = 'default_' + self.function_type_alias @@ -504,7 +507,7 @@ @type function: calldef_t """ calldef_wrapper_t.__init__( self, function=function ) - + # Stores the name of the variable that holds the override self._override_var = None @@ -593,11 +596,11 @@ if( %(override_var)s ) { $PRE_CALL - + ${RESULT_VAR_ASSIGNMENT}boost::python::call<$RESULT_TYPE>($INPUT_PARAMS); - + $POST_CALL - + $RETURN_STMT } else @@ -636,7 +639,7 @@ cls_wrapper = self._subst_manager.wrapper_func.declare_local("cls_wrapper", cls_wrapper_type); # The name of the 'self' variable (i.e. first argument) selfname = self._subst_manager.wrapper_func.arg_list[0].name - + body = """$DECLARATIONS $PRE_CALL @@ -668,7 +671,7 @@ "cls_wrapper" : cls_wrapper, "self" : selfname, "base_name" : self.base_name() } - + # function_call = declarations.call_invocation.join( self.declaration.name # , [ self.function_call_args() ] ) # body = self.wrapped_class_identifier() + '::' + function_call + ';' @@ -693,20 +696,20 @@ header = 'static $RET_TYPE %s( $ARG_LIST_DEF ) {'%self.default_name() header = self._subst_manager.subst_wrapper(header) - + answer = [ header ] answer.append( self.indent( self.create_default_body() ) ) answer.append( '}' ) return os.linesep.join( answer ) - + def _create_impl(self): # Create the substitution manager decl = self.declaration sm = function_transformers.substitution_manager_t(decl, transformers=decl.function_transformers) self._override_var = sm.virtual_func.declare_local(decl.alias+"_callable", "boost::python::override", default='this->get_override( "%s" )'%decl.alias) self._subst_manager = sm - + answer = [ self.create_function() ] answer.append( os.linesep ) answer.append( self.create_base_function() ) Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-09-13 07:32:06 UTC (rev 536) @@ -8,6 +8,7 @@ import declaration_based from pyplusplus import code_repository from pyplusplus.decl_wrappers import call_policies +from pyplusplus.decl_wrappers import python_traits from pygccxml import declarations class member_variable_base_t( declaration_based.declaration_based_t ): @@ -508,7 +509,7 @@ def _get_exported_var_type( self ): type_ = declarations.remove_reference( self.declaration.type ) type_ = declarations.remove_const( type_ ) - if declarations.is_fundamental( type_ ) or declarations.is_enum( type_ ): + if python_traits.is_immutable( type_ ): return type_ else: return self.declaration.type @@ -533,10 +534,8 @@ def _get_has_setter( self ): if declarations.is_const( declarations.remove_reference( self.declaration.type ) ): return False - elif declarations.is_fundamental( self._get_exported_var_type() ): + elif python_traits.is_immutable( self._get_exported_var_type() ): return True - elif declarations.is_enum( self._get_exported_var_type() ): - return True else: pass Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-09-13 07:32:06 UTC (rev 536) @@ -91,6 +91,8 @@ from doc_extractor import doc_extractor_i +import python_traits + class dwfactory_t( declarations.decl_factory_t ): """ declarations factory class Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite1.py 2006-09-13 07:32:06 UTC (rev 536) @@ -6,17 +6,11 @@ """defines interface for exposing STD containers, using current version of indexing suite""" from pygccxml import declarations - +import python_traits #NoProxy #By default indexed elements have Python reference semantics and are returned by #proxy. This can be disabled by supplying true in the NoProxy template parameter. -#When we want to disable is: -#1. We deal with immutable objects: -# 1. fundamental types -# 2. enum type -# 3. std::[w]string -# 4. std::complex -# 5. shared_ptr +#We want to disable NoProxy when we deal with immutable objects. class indexing_suite1_t( object ): """ @@ -43,15 +37,7 @@ def _get_no_proxy( self ): if self.__no_proxy is None: - element_type = self.element_type - if declarations.is_fundamental( element_type ) \ - or declarations.is_enum( element_type ) \ - or declarations.is_std_string( element_type ) \ - or declarations.is_std_wstring( element_type ) \ - or declarations.smart_pointer_traits.is_smart_pointer( element_type ): - self.__no_proxy = True - else: - self.__no_proxy = False + self.__no_proxy = python_traits.is_immutable( self.element_type ) return self.__no_proxy def _set_no_proxy( self, no_proxy ): Added: pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py (rev 0) +++ pyplusplus_dev/pyplusplus/decl_wrappers/python_traits.py 2006-09-13 07:32:06 UTC (rev 536) @@ -0,0 +1,19 @@ +# 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 few "type traits" functions related to C++ Python bindings""" + +from pygccxml import declarations + +def is_immutable( type_ ): + """returns True, if type_ represents Python immutable type""" + return declarations.is_fundamental( type_ ) \ + or declarations.is_enum( type_ ) \ + or declarations.is_std_string( type_ ) \ + or declarations.is_std_wstring( type_ ) \ + or declarations.smart_pointer_traits.is_smart_pointer( type_ ) + #todo is_complex, ... + + Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-09-13 07:32:06 UTC (rev 536) @@ -5,8 +5,9 @@ """defines class that configure global and member variable exposing""" +import decl_wrapper from pygccxml import declarations -import decl_wrapper +from pyplusplus.decl_wrappers import python_traits class variable_t(decl_wrapper.decl_wrapper_t, declarations.variable_t): """defines a set of properties, that will instruct Py++ how to expose the variable""" @@ -50,8 +51,8 @@ if declarations.is_pointer( type_ ): if self.type_qualifiers.has_static: return "Py++ can not expose static pointer member variables. This could be changed in future." - if declarations.is_fundamental( type_.base ): - return "Py++ can not expose pointer to fundamental member variables. This could be changed in future." + if python_traits.is_immutable( type_.base ): + return "Py++ can not expose pointer to Python immutable member variables. This could be changed in future." units = declarations.decompose_type( type_ ) ptr2functions = filter( lambda unit: isinstance( unit, declarations.calldef_type_t ) Modified: pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-09-13 07:32:06 UTC (rev 536) @@ -6,6 +6,7 @@ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators +from pyplusplus.decl_wrappers import python_traits class resolver_t( object ): def __init__( self ): @@ -100,7 +101,7 @@ return_type = declarations.remove_cv( calldef.return_type ) if declarations.is_reference( return_type ): return_type = declarations.remove_reference( return_type ) - if declarations.is_fundamental( return_type ) or declarations.is_enum( return_type ): + if python_traits.is_immutable( return_type ): if declarations.is_const( calldef.return_type ): return decl_wrappers.return_value_policy( decl_wrappers.copy_const_reference ) else: @@ -123,7 +124,7 @@ no_ref = declarations.remove_reference( variable.type ) base_type = declarations.remove_const( no_ref ) - if declarations.is_fundamental( base_type ) or declarations.is_enum( base_type ): + if python_traits.is_immutable( base_type ): #the relevant code creator will generate code, that will return this member variable #by value return decl_wrappers.default_call_policies() Modified: pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/unittests/data/member_functions_to_be_exported.hpp 2006-09-13 07:32:06 UTC (rev 536) @@ -1,161 +1,172 @@ -// 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 __member_functions_to_be_exported_hpp__ -#define __member_functions_to_be_exported_hpp__ - -namespace member_functions{ - -struct protected_mf_t{ -protected: - static int x(){ return 1;} -}; - -struct protected_base_t{ -protected: - int regular( int x ){ return x; } - int regular_overloaded( int x ){ return x * x; } - int regular_overloaded( int x, int y ){ return x * y; } - - int regular_const( int x ) const { return x; } - int regular_const_overloaded( int x ) const { return x * x; } - int regular_const_overloaded( int x, int y) const { return x * y; } - -//virtual - - virtual int virtual_( int x ){ return x; } - virtual int virtual_overloaded( int x ){ return x * x; } - virtual int virtual_overloaded( int x, int y ){ return x * y; } - - virtual int virtual_const( int x ) const { return x; } - virtual int virtual_const_overloaded( int x ) const { return x * x; } - virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } - -//pure virtual - virtual int pure_virtual( int x ) = 0; - virtual int pure_virtual_overloaded( int x ) = 0; - virtual int pure_virtual_overloaded( int x, int y ) = 0; - - virtual int pure_virtual_const( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; -}; - -struct protected_public_derived_t : public protected_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; - -struct protected_protected_derived_t : public protected_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; - - -struct public_base_t{ -public: - int regular( int x ){ return x; } - int regular_overloaded( int x ){ return x * x; } - int regular_overloaded( int x, int y ){ return x * y; } - - int regular_const( int x ) const { return x; } - int regular_const_overloaded( int x ) const { return x * x; } - int regular_const_overloaded( int x, int y) const { return x * y; } - -//virtual - - virtual int virtual_( int x ){ return x; } - virtual int virtual_overloaded( int x ){ return x * x; } - virtual int virtual_overloaded( int x, int y ){ return x * y; } - - virtual int virtual_const( int x ) const { return x; } - virtual int virtual_const_overloaded( int x ) const { return x * x; } - virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } - -//pure virtual - virtual int pure_virtual( int x ) = 0; - virtual int pure_virtual_overloaded( int x ) = 0; - virtual int pure_virtual_overloaded( int x, int y ) = 0; - - virtual int pure_virtual_const( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; -}; - -struct public_derived_t : public public_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; - - -struct private_base_t{ - void remove_gcc_warning(){} -private: - int regular( int x ){ return x; } - int regular_overloaded( int x ){ return x * x; } - int regular_overloaded( int x, int y ){ return x * y; } - - int regular_const( int x ) const { return x; } - int regular_const_overloaded( int x ) const { return x * x; } - int regular_const_overloaded( int x, int y) const { return x * y; } - -//virtual - - virtual int virtual_( int x ){ return x; } - virtual int virtual_overloaded( int x ){ return x * x; } - virtual int virtual_overloaded( int x, int y ){ return x * y; } - - virtual int virtual_const( int x ) const { return x; } - virtual int virtual_const_overloaded( int x ) const { return x * x; } - virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } - -//pure virtual - virtual int pure_virtual( int x ) = 0; - virtual int pure_virtual_overloaded( int x ) = 0; - virtual int pure_virtual_overloaded( int x, int y ) = 0; - - virtual int pure_virtual_const( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x ) const = 0; - virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; -}; - -struct private_derived_t : public private_base_t{ - - virtual int pure_virtual( int x ) { return x;} - virtual int pure_virtual_overloaded( int x ) { return x * x; } - virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } - - virtual int pure_virtual_const( int x ) const { return x; } - virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } - virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } -}; +// 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 __member_functions_to_be_exported_hpp__ +#define __member_functions_to_be_exported_hpp__ + +#include <string> + +namespace member_functions{ + +struct protected_mf_t{ +protected: + static int x(){ return 1;} +}; + +struct protected_base_t{ +protected: + int regular( int x ){ return x; } + int regular_overloaded( int x ){ return x * x; } + int regular_overloaded( int x, int y ){ return x * y; } + + int regular_const( int x ) const { return x; } + int regular_const_overloaded( int x ) const { return x * x; } + int regular_const_overloaded( int x, int y) const { return x * y; } + +//virtual + + virtual int virtual_( int x ){ return x; } + virtual int virtual_overloaded( int x ){ return x * x; } + virtual int virtual_overloaded( int x, int y ){ return x * y; } + + virtual int virtual_const( int x ) const { return x; } + virtual int virtual_const_overloaded( int x ) const { return x * x; } + virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } + +//pure virtual + virtual int pure_virtual( int x ) = 0; + virtual int pure_virtual_overloaded( int x ) = 0; + virtual int pure_virtual_overloaded( int x, int y ) = 0; + + virtual int pure_virtual_const( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; +}; + +struct protected_public_derived_t : public protected_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + +struct protected_protected_derived_t : public protected_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + + +struct public_base_t{ +public: + int regular( int x ){ return x; } + int regular_overloaded( int x ){ return x * x; } + int regular_overloaded( int x, int y ){ return x * y; } + + int regular_const( int x ) const { return x; } + int regular_const_overloaded( int x ) const { return x * x; } + int regular_const_overloaded( int x, int y) const { return x * y; } + +//virtual + + virtual int virtual_( int x ){ return x; } + virtual int virtual_overloaded( int x ){ return x * x; } + virtual int virtual_overloaded( int x, int y ){ return x * y; } + + virtual int virtual_const( int x ) const { return x; } + virtual int virtual_const_overloaded( int x ) const { return x * x; } + virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } + +//pure virtual + virtual int pure_virtual( int x ) = 0; + virtual int pure_virtual_overloaded( int x ) = 0; + virtual int pure_virtual_overloaded( int x, int y ) = 0; + + virtual int pure_virtual_const( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; +}; + +struct public_derived_t : public public_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + + +struct private_base_t{ + void remove_gcc_warning(){} +private: + int regular( int x ){ return x; } + int regular_overloaded( int x ){ return x * x; } + int regular_overloaded( int x, int y ){ return x * y; } + + int regular_const( int x ) const { return x; } + int regular_const_overloaded( int x ) const { return x * x; } + int regular_const_overloaded( int x, int y) const { return x * y; } + +//virtual + + virtual int virtual_( int x ){ return x; } + virtual int virtual_overloaded( int x ){ return x * x; } + virtual int virtual_overloaded( int x, int y ){ return x * y; } + + virtual int virtual_const( int x ) const { return x; } + virtual int virtual_const_overloaded( int x ) const { return x * x; } + virtual int virtual_const_overloaded( int x, int y ) const { return x * y; } + +//pure virtual + virtual int pure_virtual( int x ) = 0; + virtual int pure_virtual_overloaded( int x ) = 0; + virtual int pure_virtual_overloaded( int x, int y ) = 0; + + virtual int pure_virtual_const( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x ) const = 0; + virtual int pure_virtual_const_overloaded( int x, int y ) const = 0; +}; + +struct private_derived_t : public private_base_t{ + + virtual int pure_virtual( int x ) { return x;} + virtual int pure_virtual_overloaded( int x ) { return x * x; } + virtual int pure_virtual_overloaded( int x, int y ){ return x * y; } + + virtual int pure_virtual_const( int x ) const { return x; } + virtual int pure_virtual_const_overloaded( int x ) const { return x * x; } + virtual int pure_virtual_const_overloaded( int x, int y ) const { return x * y; } +}; + struct callable_t{ int operator()( int i, int j ) const { return i + j; } int operator()( int i, int j, int k ) const { return i + j + k; } -}; - -} - -#endif//__member_functions_to_be_exported_hpp__ - +}; + +struct immutable_by_ref_t{ + virtual std::string identity( std::string const & x ) = 0; + + static std::string + call_identity( immutable_by_ref_t& imm, std::string const & x ){ + return imm.identity( x ); + } +}; + +} + +#endif//__member_functions_to_be_exported_hpp__ + Modified: pyplusplus_dev/unittests/member_functions_tester.py =================================================================== --- pyplusplus_dev/unittests/member_functions_tester.py 2006-09-11 19:25:08 UTC (rev 535) +++ pyplusplus_dev/unittests/member_functions_tester.py 2006-09-13 07:32:06 UTC (rev 536) @@ -11,13 +11,13 @@ class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'member_functions' - + 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 ): names = [ 'protected_protected_derived_t' @@ -33,7 +33,17 @@ #will reporoduce bug mb.class_('callable_t').always_expose_using_scope = True mb.BOOST_PYTHON_MAX_ARITY = 1 - + + def create_py_immutable_by_ref( self, module ): + class py_immutable_by_ref( module.immutable_by_ref_t ): + def __init__( self ): + module.immutable_by_ref_t.__init__( self ) + + def identity( self, x ): + return x*2 + + return py_immutable_by_ref() + def create_test_class_inst(self, class_ ): class tester_impl_t( class_ ): def __init__(self): @@ -63,39 +73,39 @@ def _test_instance( self, inst, class_defined_in_cpp): self.failUnless( 23 == inst.regular( 23 ) ) - self.failUnless( 9 == inst.regular_overloaded( 3 ) ) - self.failUnless( 15 == inst.regular_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.regular_overloaded( 3 ) ) + self.failUnless( 15 == inst.regular_overloaded( 3, 5 ) ) self.failUnless( 23 == inst.regular_const( 23 ) ) - self.failUnless( 9 == inst.regular_const_overloaded( 3 ) ) - self.failUnless( 15 == inst.regular_const_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.regular_const_overloaded( 3 ) ) + self.failUnless( 15 == inst.regular_const_overloaded( 3, 5 ) ) self.failUnless( 23 == inst.virtual_( 23 ) ) - self.failUnless( 9 == inst.virtual_overloaded( 3 ) ) - self.failUnless( 15 == inst.virtual_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.virtual_overloaded( 3 ) ) + self.failUnless( 15 == inst.virtual_overloaded( 3, 5 ) ) self.failUnless( 23 == inst.virtual_const( 23 ) ) - self.failUnless( 9 == inst.virtual_const_overloaded( 3 ) ) - self.failUnless( 15 == inst.virtual_const_overloaded( 3, 5 ) ) - + self.failUnless( 9 == inst.virtual_const_overloaded( 3 ) ) + self.failUnless( 15 == inst.virtual_const_overloaded( 3, 5 ) ) + if class_defined_in_cpp: self.failUnless( 23 == inst.pure_virtual( 23 ) ) - self.failUnless( 9 == inst.pure_virtual_overloaded( 3 ) ) - self.failUnless( 15 == inst.pure_virtual_overloaded( 3, 5 ) ) - + self.failUnless( 9 == inst.pure_virtual_overloaded( 3 ) ) + self.failUnless( 15 == inst.pure_virtual_overloaded( 3, 5 ) ) + self.failUnless( 23 == inst.pure_virtual_const( 23 ) ) - self.failUnless( 9 == inst.pure_virtual_const_overloaded( 3 ) ) - self.failUnless( 15 == inst.pure_virtual_const_overloaded( 3, 5 ) ) + self.failUnless( 9 == inst.pure_virtual_const_overloaded( 3 ) ) + self.failUnless( 15 == inst.pure_virtual_const_overloaded( 3, 5 ) ) else: self.failUnless( 46 == inst.pure_virtual( 23 ) ) - self.failUnless( 6 == inst.pure_virtual_overloaded( 3 ) ) - self.failUnless( 8 == inst.pure_virtual_overloaded( 3, 5 ) ) - + self.failUnless( 6 == inst.pure_virtual_overloaded( 3 ) ) + self.failUnless( 8 == inst.pure_virtual_overloaded( 3, 5 ) ) + self.failUnless( 46 == inst.pure_virtual_const( 23 ) ) - self.failUnless( 6 == inst.pure_virtual_const_overloaded( 3 ) ) - self.failUnless( 8 == inst.pure_virtual_const_overloaded( 3, 5 ) ) - - def run_tests(self, module): + self.failUnless( 6 == inst.pure_virtual_const_overloaded( 3 ) ) + self.failUnless( 8 == inst.pure_virtual_const_overloaded( 3, 5 ) ) + + def run_tests(self, module): derived = module.protected_public_derived_t() self._test_instance( derived, True ) derived = module.protected_protected_derived_t() @@ -106,9 +116,13 @@ self._test_instance( derived, False ) derived = self.create_test_class_inst( module.public_base_t ) self._test_instance( derived, False ) - + + x = self.create_py_immutable_by_ref(module) + self.failUnless( x.identity( '11' ) == '1111' ) + self.failUnless( module.immutable_by_ref_t.call_identity(x, '11') == '1111' ) + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -116,4 +130,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. |