[pygccxml-commit] SF.net SVN: pygccxml: [159] pyplusplus_dev/unittests/data
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-05-23 21:11:28
|
Revision: 159 Author: roman_yakovenko Date: 2006-05-23 14:11:16 -0700 (Tue, 23 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=159&view=rev Log Message: ----------- commiting partial implementation for member variable references Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/global_variable.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-05-23 20:19:51 UTC (rev 158) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-05-23 21:11:16 UTC (rev 159) @@ -83,6 +83,8 @@ from member_variable import bit_field_wrapper_t from member_variable import array_mv_t from member_variable import array_mv_wrapper_t +from member_variable import mem_var_ref_t +from member_variable import mem_var_ref_wrapper_t from class_declaration import class_t from class_declaration import class_wrapper_t Modified: pyplusplus_dev/pyplusplus/code_creators/global_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2006-05-23 20:19:51 UTC (rev 158) +++ pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2006-05-23 21:11:16 UTC (rev 159) @@ -11,6 +11,7 @@ from pyplusplus import code_repository from pyplusplus.decl_wrappers import call_policies +#TODO: if variable is not const, then export it using boost::python::ptr class global_variable_base_t( declaration_based.declaration_based_t ): """ Base class for all global variables code creators. Mainly exists to Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-05-23 20:19:51 UTC (rev 158) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-05-23 21:11:16 UTC (rev 159) @@ -415,3 +415,108 @@ answer.append('}') return os.linesep.join( answer ) + + + + + +class mem_var_ref_t( member_variable_base_t ): + """ + Creates C++ code that creates accessor for class member variable, that has type reference. + """ + def __init__(self, variable, wrapper, parent=None ): + member_variable_base_t.__init__( self + , variable=variable + , wrapper=wrapper + , parent=parent) + + def _create_impl( self ): + if self.declaration.type_qualifiers.has_static: + add_property = 'add_static_property' + else: + add_property = 'add_property' + answer = [ add_property ] + answer.append( '( ' ) + answer.append('"%s"' % self.alias) + answer.append( self.PARAM_SEPARATOR ) + answer.append( '(%s)(&%s)' + % ( self.wrapper.getter_type.decl_string, self.wrapper.getter_full_name ) ) + + if self.wrapper.has_setter: + answer.append( self.PARAM_SEPARATOR ) + answer.append( '(%s)(&%s)' + % ( self.wrapper.setter_type.decl_string, self.wrapper.setter_full_name ) ) + answer.append( ' ) ' ) + + code = ''.join( answer ) + if len( code ) <= self.LINE_LENGTH: + return code + else: + for i in range( len( answer ) ): + if answer[i] == self.PARAM_SEPARATOR: + answer[i] = os.linesep + self.indent( self.indent( self.indent( answer[i] ) ) ) + return ''.join( answer ) + +class mem_var_ref_wrapper_t( declaration_based.declaration_based_t ): + """ + Creates C++ code that creates accessor for class member variable, that has type reference. + """ + + indent = declaration_based.declaration_based_t.indent + GET_TEMPLATE = os.linesep.join([ + 'static %(type)s get_%(name)s(%(class_type)s& inst) {' + , indent( 'return inst.%(name)s;' ) + , '}' + , '' + ]) + + SET_TEMPLATE = os.linesep.join([ + 'static void set_%(name)s( %(class_type)s& inst, %(type)s new_value ){ ' + , indent( 'inst.%(name)s = new_value;' ) + , '}' + , '' + ]) + + def __init__(self, variable, parent=None ): + declaration_based.declaration_based_t.__init__( self + , parent=parent + , declaration=variable) + + def _get_getter_full_name(self): + return self.parent.full_name + '::' + 'get_' + self.declaration.name + getter_full_name = property( _get_getter_full_name ) + + def _get_class_inst_type( self ): + return declarations.declarated_t( self.declaration.parent ) + + def _get_getter_type(self): + return declarations.free_function_type_t( + return_type=self.declaration.type + , arguments_types=[ self._get_class_inst_type() ] ) + getter_type = property( _get_getter_type ) + + def _get_setter_full_name(self): + return self.parent.full_name + '::' + 'set_' + self.declaration.name + setter_full_name = property(_get_setter_full_name) + + def _get_setter_type(self): + return declarations.free_function_type_t( + return_type=self.declaration.type + , arguments_types=[ self._get_class_inst_type(), self.declaration.type ] ) + setter_type = property( _get_setter_type ) + + def _get_has_setter( self ): + return not declarations.is_const( self.declaration.type ) + has_setter = property( _get_has_setter ) + + def _create_impl(self): + answer = [] + cls_type = algorithm.create_identifier( self, self.declaration.parent.decl_string ) + + substitutions = dict( type=self.declaration.type.decl_string + , class_type=cls_type + , name=self.declaration.name ) + answer.append( self.GET_TEMPLATE % substitutions ) + if self.has_setter: + answer.append( self.SET_TEMPLATE % substitutions ) + return os.linesep.join( answer ) Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-23 20:19:51 UTC (rev 158) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-23 21:11:16 UTC (rev 159) @@ -251,6 +251,8 @@ return True if declarations.is_pointer( member.type ): return True + #if declarations.is_reference( member.type ): + #return True if declarations.is_array( member.type ): return True if isinstance( member, declarations.class_t ): Modified: pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp 2006-05-23 20:19:51 UTC (rev 158) +++ pyplusplus_dev/unittests/data/member_variables_to_be_exported.hpp 2006-05-23 21:11:16 UTC (rev 159) @@ -105,6 +105,20 @@ } +namespace reference{ + +enum EFruit{ apple, orange }; + +struct fundamental_t{ + fundamental_t( EFruit& fruit, const int& i ) + : m_fruit( fruit ), m_i( i ) + {} + + EFruit& m_fruit; + const int& m_i; +}; + } +} #endif//__member_variables_to_be_exported_hpp__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |