[pygccxml-commit] SF.net SVN: pygccxml: [873] pyplusplus_dev/pyplusplus
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2007-01-20 20:30:16
|
Revision: 873 http://svn.sourceforge.net/pygccxml/?rev=873&view=rev Author: roman_yakovenko Date: 2007-01-20 12:30:16 -0800 (Sat, 20 Jan 2007) Log Message: ----------- adding new call policy for arrays 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 Modified: pyplusplus_dev/pyplusplus/code_repository/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/call_policies.py 2007-01-19 19:52:24 UTC (rev 872) +++ pyplusplus_dev/pyplusplus/code_repository/call_policies.py 2007-01-20 20:30:16 UTC (rev 873) @@ -27,6 +27,23 @@ namespace bpl = boost::python; +namespace memory_managers{ + + struct none{ + template< typename T> + static void deallocate(T*){} + }; + + struct delete_{ + template< typename T> + static void deallocate(T* arr){ + delete[] arr; + } + }; + +}/*memory_managers*/ + + namespace detail{ struct make_value_holder{ @@ -78,6 +95,44 @@ return bpl::object( bpl::handle<>( rc( x ) ) ); } +namespace arrays{ + +namespace details{ + +template< unsigned int size, typename MemoryManager, typename CallPolicies> +struct as_tuple_impl{ + + template <class U> + inline PyObject* operator()(U const* arr) const{ + if( !arr ){ + return bpl::incref( bpl::tuple().ptr() ); + } + bpl::list list_; + for( unsigned int i = 0; i < size; ++i ){ + list_.append( make_object< CallPolicies>( arr[i] ) ); + } + MemoryManager::deallocate( arr ); + return bpl::incref( bpl::tuple( list_ ).ptr() ); + } +}; + +} + +template< unsigned int size, typename MemoryManager, typename MakeObjectCallPolicies=bpl::default_call_policies> +struct as_tuple{ +public: + + template <class T> + struct apply{ + BOOST_STATIC_CONSTANT( bool, ok = boost::is_pointer<T>::value ); + typedef details::as_tuple_impl<size, MemoryManager, MakeObjectCallPolicies> type; + }; + +}; + +} /*arrays*/ + + } /*pyplusplus*/ } /*call_policies*/ Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2007-01-19 19:52:24 UTC (rev 872) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2007-01-20 20:30:16 UTC (rev 873) @@ -85,6 +85,11 @@ from call_policies import return_pointee_value from call_policies import is_return_opaque_pointer_policy from call_policies import is_return_pointee_value_policy +from call_policies import custom_call_policies_t +from call_policies import custom_call_policies +from call_policies import convert_array_to_tuple_t +from call_policies import convert_array_to_tuple +from call_policies import memory_managers from decl_wrapper_printer import decl_wrapper_printer_t from decl_wrapper_printer import print_declarations Modified: pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2007-01-19 19:52:24 UTC (rev 872) +++ pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2007-01-20 20:30:16 UTC (rev 873) @@ -231,3 +231,75 @@ return isinstance( policy, return_value_policy_t ) \ and policy.result_converter_generator == return_pointee_value + +class custom_call_policies_t(call_policy_t): + """implementation for user defined call policies""" + def __init__( self, call_policies ): + call_policy_t.__init__( self ) + self.__call_policies = call_policies + + def _create_impl(self, function_creator ): + return str( self.__call_policies ) + + def __str__(self): + return 'custom call policies' + +def custom_call_policies(call_policies): + """create custom\\user defined call policies""" + return custom_call_policies_t(call_policies) + +class memory_managers: + none = 'none' + delete_ = 'delete_' + all = [ none, delete_ ] + + @staticmethod + def create( manager, function_creator=None): + mem_manager = 'pyplusplus::call_policies::memory_managers::' + manager + if function_creator: + mem_manager = algorithm.create_identifier( function_creator, mem_manager ) + return mem_manager + +class convert_array_to_tuple_t( compound_policy_t ): + def __init__( self, array_size, memory_manager, make_object_call_policies=None, base=None): + compound_policy_t.__init__( self, base ) + self._array_size = array_size + self._memory_manager = memory_manager + self._make_objec_call_policies = make_object_call_policies + + def _get_array_size( self ): + return self._array_size + def _set_array_size( self, new_array_size): + self._array_size = new_array_size + array_size = property( _get_array_size, _set_array_size ) + + def _get_memory_manager( self ): + return self._memory_manager + def _set_memory_manager( self, new_memory_manager): + self._memory_manager = new_memory_manager + memory_manager = property( _get_memory_manager, _set_memory_manager ) + + def _get_make_objec_call_policies( self ): + if None is self._make_objec_call_policies: + self._make_objec_call_policies = default_call_policies() + return self._make_objec_call_policies + def _set_make_objec_call_policies( self, new_make_objec_call_policies): + self._make_objec_call_policies = new_make_objec_call_policies + make_objec_call_policies = property( _get_make_objec_call_policies, _set_make_objec_call_policies ) + + + def _get_name(self, function_creator): + return '::boost::python::return_value_policy' + + def _get_args(self, function_creator): + as_tuple_args = [ str( self.array_size ) ] + as_tuple_args.append( memory_managers.create( self.memory_manager, function_creator ) ) + if not self.make_objec_call_policies.is_default(): + as_tuple_args.append( self.make_objec_call_policies.create_template_arg( function_creator ) ) + as_tuple = '::pyplusplus::call_policies::arrays::as_tuple' + 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 ): + return convert_array_to_tuple_t( array_size, memory_manager, make_object_call_policies, base ) \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/module_builder/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/call_policies.py 2007-01-19 19:52:24 UTC (rev 872) +++ pyplusplus_dev/pyplusplus/module_builder/call_policies.py 2007-01-20 20:30:16 UTC (rev 873) @@ -17,4 +17,7 @@ from pyplusplus.decl_wrappers import return_by_value from pyplusplus.decl_wrappers import return_opaque_pointer from pyplusplus.decl_wrappers import return_value_policy -from pyplusplus.decl_wrappers import return_pointee_value \ No newline at end of file +from pyplusplus.decl_wrappers import return_pointee_value +from pyplusplus.decl_wrappers import custom_call_policies +from pyplusplus.decl_wrappers import convert_array_to_tuple +from pyplusplus.decl_wrappers import memory_managers This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |