[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.
|