[pygccxml-commit] SF.net SVN: pygccxml: [591] pyplusplus_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-09-26 10:51:22
|
Revision: 591 http://svn.sourceforge.net/pygccxml/?rev=591&view=rev Author: roman_yakovenko Date: 2006-09-26 03:51:08 -0700 (Tue, 26 Sep 2006) Log Message: ----------- adding few missing files and more unit tests Modified Paths: -------------- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp pyplusplus_dev/unittests/properties_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/properties.py pyplusplus_dev/pyplusplus/decl_wrappers/properties.py Added: pyplusplus_dev/pyplusplus/code_creators/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/properties.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/properties.py 2006-09-26 10:51:08 UTC (rev 591) @@ -0,0 +1,125 @@ +# 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) + +import os +import algorithm +import registration_based +from pygccxml import declarations + +#I am sure in future I will have to treat template classes +class property_t( registration_based.registration_based_t ): + def __init__(self, property_def, wrapper=None ): + registration_based.registration_based_t.__init__( self ) + self._property_def = property_def + self.works_on_instance = False + self._make_function = None + + @property + def property_def( self ): + return self._property_def + + @property + def make_function_identifier( self ): + if not self._make_function: + self._make_function = algorithm.create_identifier( self, '::boost::python::make_function' ) + return self._make_function + + def create_function_type_alias_code( self, f, ftype_alias, exported_class_alias=None ): + return 'typedef ' + f.function_type().create_typedef( ftype_alias, exported_class_alias ) + ';' + + def create_accessor_code( self, f, ftype_alias ): + f_ref_code = '%s( %s )' % ( ftype_alias, declarations.full_name( f ) ) + if f.call_policies and f.call_policies.is_default(): + return f_ref_code + result = [ self.make_function_identifier ] + result.append( '( ' ) + result.append( os.linesep ) + result.append( self.indent( ' ', 2 ) ) + result.append( f_ref_code ) + if f.call_policies: + result.append( os.linesep ) + result.append( self.indent( ', ', 2 ) ) + result.append( f.call_policies.create( self ) ) + else: + result.append( os.linesep ) + result.append( self.indent( ' ', 2 ) ) + result.append( '/* undefined call policies */' ) + result.append( ' ) ' ) + return ''.join( result ) + + def has_long_line( self ): + pd = self.property_def + if pd.fget.call_policies and not pd.fget.call_policies.is_default(): + return True + elif pd.fset or pd.fset.call_policies or not pd.fset.call_policies.is_default(): + return True + elif pd.doc: + return True + else: + return True + + def create_property_code( self ): + result = [] + param_sep = ', ' + if self.has_long_line(): + param_sep = os.linesep + self.indent( param_sep ) + + result.append( self.create_function_type_alias_code( self.property_def.fget, 'fget' ) ) + if self.property_def.fset: + result.append( os.linesep ) + result.append( self.create_function_type_alias_code( self.property_def.fset, 'fset' ) ) + + result.append( 2 * os.linesep ) + + add_property = None + if self.property_def.is_static: + add_property = 'add_static_property' + else: + add_property = 'add_property' + + class_var_name = self.parent.class_var_name + if self.has_long_line(): + result.append( '%s.%s( ' % ( class_var_name, add_property ) ) + result.append( os.linesep + self.indent( '"%s"' % self.property_def.name ) ) + else: + result.append( '%s.%s( "%s"' % ( class_var_name, add_property, self.property_def.name ) ) + result.append( param_sep + self.create_accessor_code( self.property_def.fget, 'fget' ) ) + if self.property_def.fset: + result.append( param_sep + self.create_accessor_code( self.property_def.fset, 'fset' )) + if self.property_def.doc: + result.append( param_sep + self.property_def.doc) + result.append( ' );') + return ''.join( result ) + + def _create_impl( self ): + result = [] + result.append( '{ //%s' % self.property_def ) + result.append( '' ) + result.append( self.indent( self.create_property_code() ) ) + result.append( '' ) + result.append( '}' ) + return os.linesep.join( result ) + + + + + + + + + + + + + + + + + + + + + + Added: pyplusplus_dev/pyplusplus/decl_wrappers/properties.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/properties.py (rev 0) +++ pyplusplus_dev/pyplusplus/decl_wrappers/properties.py 2006-09-26 10:51:08 UTC (rev 591) @@ -0,0 +1,57 @@ +# 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 property_t helper class" + +from pygccxml import declarations + +class property_t( object ): + def __init__( self, name, fget, fset=None, doc='', is_static=False ): + self._name = name + self._fget = fget + self._fset = fset + self._doc = doc + self._is_static = is_static + + @property + def name( self ): + return self._name + + @property + def fget( self ): + return self._fget + + @property + def fset( self ): + return self._fset + + @property + def doc( self ): + return self._doc + + @property + def is_static( self ): + return self._is_static + + def __str__( self ): + desc = [] + desc.append( 'fget=%s' % declarations.full_name( self.fget ) ) + if self.fset: + desc.append( ', ' ) + desc.append( 'fset=%s' % declarations.full_name( self.fset ) ) + return "property [%s]"% ''.join( desc ) + +def find_properties( cls ): + """this function should return a list of possible properties for the class""" + #get* set* + #get_* set_* + #*, set* + #*, set_* + #get defined on [derived|base], set defined on [base|derived] + + raise NotImplemented() + + + Modified: pyplusplus_dev/unittests/data/properties_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-09-26 09:06:43 UTC (rev 590) +++ pyplusplus_dev/unittests/data/properties_to_be_exported.hpp 2006-09-26 10:51:08 UTC (rev 591) @@ -9,6 +9,11 @@ namespace properties{ struct properties_tester_t{ + + struct nested{ + int n; + }; + properties_tester_t() : m_count( 0 ) {} @@ -19,7 +24,14 @@ void set_count( int x ) { m_count = x; } + nested& get_nested() + { return m_nested; } + + void set_nested( nested x ) + { m_nested = x; } + int m_count; + nested m_nested; }; } Modified: pyplusplus_dev/unittests/properties_tester.py =================================================================== --- pyplusplus_dev/unittests/properties_tester.py 2006-09-26 09:06:43 UTC (rev 590) +++ pyplusplus_dev/unittests/properties_tester.py 2006-09-26 10:51:08 UTC (rev 591) @@ -7,6 +7,7 @@ import sys import unittest import fundamental_tester_base +from pyplusplus.module_builder import call_policies class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'properties' @@ -25,9 +26,20 @@ set_count.exclude() cls.add_property( "count", count, set_count ) + get_nested = cls.member_function( 'get_nested' ) + get_nested.call_policies = call_policies.return_internal_reference() + set_nested = cls.member_function( 'set_nested' ) + cls.add_property( "nested_", get_nested, set_nested ) + + cls.add_property( "nested_ro", get_nested ) + def run_tests(self, module): - pass + pt = module.properties_tester_t() + self.failUnless( pt.count == 0 ) + pt.count = 21 + self.failUnless( pt.m_count == 21 ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |