Package pyplusplus :: Package function_transformers :: Module templates

Source Code for Module pyplusplus.function_transformers.templates

 1  # Copyright 2006 Roman Yakovenko. 
 2  # Distributed under the Boost Software License, Version 1.0. (See 
 3  # accompanying file LICENSE_1_0.txt or copy at 
 4  # http://www.boost.org/LICENSE_1_0.txt) 
 5   
 6  # Matthias Baas is an initial author of the templates. 
 7   
 8  """defines few templates, which will be used to create a function-wrapper 
 9  definition.""" 
10   
11  import os 
12  from string import Template 
13   
14   
15 -class sealed_fun:
16 body = Template( os.linesep.join([ 17 'static $return_type $unique_function_name( $arg_declarations ){' 18 , ' $declare_variables' 19 , ' $pre_call' 20 , ' $save_result$function_name($arg_expressions);' 21 , ' $post_call' 22 , ' $return' 23 , '}' 24 ])) 25
26 -class virtual_mem_fun:
27 override = Template( os.linesep.join([ 28 'virtual $return_type $function_name( $arg_declarations )$constness $throw{' 29 , ' namespace bpl = boost::python;' 30 , ' if( bpl::override $py_function_var = this->get_override( "$function_alias" ) ){' 31 , ' $declare_py_variables' 32 , ' $py_pre_call' 33 , ' ${save_py_result}bpl::call<bpl::object>( $py_function_var.ptr()$py_arg_expressions );' 34 , ' $py_post_call' 35 , ' $py_return' 36 , ' }' 37 , ' else{' 38 , ' $cpp_return$wrapped_class::$function_name( $cpp_arg_expressions );' 39 , ' }' 40 , '}' 41 ])) 42 43 default = Template( os.linesep.join([ 44 'static $return_type $unique_function_name( $arg_declarations ){' 45 , ' $declare_variables' 46 , ' $pre_call' 47 , ' if( dynamic_cast< $wrapper_class $wrapped_inst_constness* >( boost::addressof( $wrapped_inst ) ) ){' 48 , ' $save_result$wrapped_inst.$wrapped_class::$function_name($arg_expressions);' 49 , ' }' 50 , ' else{' 51 , ' $save_result$wrapped_inst.$function_name($arg_expressions);' 52 , ' }' 53 , ' $post_call' 54 , ' $return' 55 , '}' 56 ])) 57 58 #TODO: FT for constructor 59 #~ class constructor: 60 #~ #User cannot apply transformation on constructor of abstract class 61 #~ #It is not possible to create an instance of such class 62 #~ body = Template( os.linesep.join([ 63 #~ 'std::auto_ptr<$exposed_class> $unique_function_name( $arg_declarations ){' 64 #~ , ' $declare_variables' 65 #~ , ' $pre_call' 66 #~ , ' std::auto_ptr<$exposed_class> $result( new $exposed_class($arg_expressions) );' 67 #~ , ' $post_call' 68 #~ , ' return $result;' 69 #~ , '}' 70 #~ ])) 71 72
73 -def substitute( text, **keywd ):
74 return Template( text ).substitute( **keywd )
75