[pygccxml-commit] SF.net SVN: pygccxml: [258] pyplusplus_dev/unittests
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-06-28 09:49:26
|
Revision: 258 Author: roman_yakovenko Date: 2006-06-28 01:45:46 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=258&view=rev Log Message: ----------- one more step towards indexing suite 2 Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-28 08:45:46 UTC (rev 258) @@ -106,3 +106,4 @@ from array_1_registrator import array_1_registrator_t from indexing_suites import indexing_suite1_t +from indexing_suites import indexing_suite2_t Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 08:45:46 UTC (rev 258) @@ -13,6 +13,7 @@ import declaration_based import array_1_registrator import member_variable +import indexing_suites from pygccxml import declarations class class_declaration_t( scoped.scoped_t ): @@ -64,9 +65,9 @@ code = os.linesep.join( result ) - result = [ 'if( true ){' ] + result = [ '{ //scope begin' ] result.append( self.indent( code ) ) - result.append( '}' ) + result.append( '} //scope end' ) return os.linesep.join( result ) @@ -239,6 +240,8 @@ return ''.join( result ) def _should_creator_be_exported_under_scope(self, inst ): + if isinstance( inst, ( indexing_suites.indexing_suite1_t, indexing_suites.indexing_suite2_t ) ): + return False if isinstance( inst, declaration_based.declaration_based_t ) \ and isinstance( inst.declaration , ( declarations.enumeration_t, declarations.class_t ) ): @@ -290,9 +293,9 @@ code = os.linesep.join( result ) - result = [ 'if( true ){' ] + result = [ '{ //scope begin' ] result.append( self.indent( code ) ) - result.append( '}' ) + result.append( '} //scope end' ) return os.linesep.join( result ) Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 08:45:46 UTC (rev 258) @@ -10,16 +10,16 @@ import declaration_based from pygccxml import declarations -class indexing_suite1_t( code_creator.code_creator_t ): - def __init__(self, parent=None ): - code_creator.code_creator_t.__init__( self, parent=parent ) +class indexing_suite1_t( declaration_based.declaration_based_t ): + def __init__(self, container, parent=None ): + declaration_based.declaration_based_t.__init__( self, declaration=container, parent=parent ) def _get_configuration( self ): - return self.parent.declaration.indexing_suite + return self.declaration.indexing_suite configuration = property( _get_configuration ) def _get_container( self ): - return self.parent.declaration + return self.declaration container = property( _get_container ) def guess_suite_name( self ): @@ -46,20 +46,14 @@ return "def( %s() )" % self._create_suite_declaration() -#class indexing_suite2_t( code_creator.code_creator_t ): - #class value_traits_t( declaration_based_t ): - #def __init__( self, container_class, parent=None ): - #declaration_based_t.__init__( declaration=container_class, parent=parent ) +class indexing_suite2_t( declaration_based.declaration_based_t ): + def __init__(self, container, parent=None ): + declaration_based.declaration_based_t.__init__( self, declaration=container, parent=parent ) + + def _get_configuration( self ): + return self.declaration.indexing_suite + configuration = property( _get_configuration ) - #def _create_impl( self - - #def __init__(self, parent=None ): - #code_creator.code_creator_t.__init__( self, parent=parent ) - - #def _get_configuration( self ): - #return self.parent.declaration.indexing_suite - #configuration = property( _get_configuration ) - - #def _get_container( self ): - #return self.parent.declaration - #container = property( _get_container ) + def _create_impl( self ): + container_suite = algorithm.create_identifier(self, "::boost::python::indexing::container_suite" ) + return "def( %s< %s >() )" % ( container_suite, self.decl_identifier ) \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-28 08:45:46 UTC (rev 258) @@ -7,7 +7,7 @@ import decl_wrapper import scopedef_wrapper from pygccxml import declarations -import indexing_suite as isuite1 +import indexing_suite1 as isuite1 import indexing_suite2 as isuite2 class class_common_impl_details_t( object ): @@ -27,7 +27,11 @@ indexing_suite_version = property( _get_indexing_suite_version, _set_indexing_suite_version ) def _get_always_expose_using_scope( self ): - return self._always_expose_using_scope + #I am almost sure this logic should be moved to code_creators + if isinstance( self.indexing_suite, isuite2.indexing_suite2_t ) \ + and ( self.indexing_suite.disable_methods or self.indexing_suite.disabled_methods_groups ): + return True + return self._always_expose_using_scope def _set_always_expose_using_scope( self, value ): self._always_expose_using_scope = value always_expose_using_scope = property( _get_always_expose_using_scope, _set_always_expose_using_scope ) @@ -91,12 +95,6 @@ self._null_constructor_body = '' self._copy_constructor_body = '' - def _get_always_expose_using_scope( self ): - return self._always_expose_using_scope - def _set_always_expose_using_scope( self, value ): - self._always_expose_using_scope = value - always_expose_using_scope = property( _get_always_expose_using_scope, _set_always_expose_using_scope ) - def _get_redefine_operators( self ): return self._redefine_operators def _set_redefine_operators( self, new_value ): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 08:45:46 UTC (rev 258) @@ -4,30 +4,53 @@ # http://www.boost.org/LICENSE_1_0.txt) from pygccxml import declarations -#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 +""" +method_len +method_iter +method_getitem +method_getitem_slice +method_index +method_contains +method_count +method_has_key +method_setitem +method_setitem_slice +method_delitem +method_delitem_slice +method_reverse +method_append +method_insert +method_extend +method_sort +slice_methods = method_getitem_slice | method_setitem_slice | method_delitem_slice +search_methods = method_index | method_contains | method_count | method_has_key +reorder_methods = method_sort | method_reverse +insert_methods = method_append | method_insert | method_extend +""" + + class indexing_suite2_t( object ): + METHODS = ( 'len', 'iter', 'getitem', 'getitem_slice', 'index', 'contains' + , 'count', 'has_key', 'setitem', 'setitem_slice', 'delitem' + , 'delitem_slice', 'reverse', 'append', 'insert', 'extend', 'sort' ) + + METHOD_GROUPS = { + 'slice_methods' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) + , 'search_methods' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) + , 'reorder_methods' : ( 'method_sort', 'method_reverse' ) + , 'insert_methods' : ( 'method_append', 'method_insert', 'method_extend' ) + } + def __init__( self, container_class, container_traits ): object.__init__( self ) self.__call_policies = None self.__container_class = container_class self.__container_traits = container_traits - self.__disable_len = None - self.__disable_slices = None - self.__disable_search = None - self.__disable_reorder = None - self.__disable_extend = None - self.__disable_insert = None - + self._disabled_methods = set() + self._disabled_groups = set() + self._default_applied = False + def _get_container_class( self ): return self.__container_class container_class = property( _get_container_class ) @@ -43,46 +66,42 @@ self.__call_policies = call_policies call_policies = property( _get_call_policies, _set_call_policies ) - def _get_disable_len( self ): - return self.__disable_len - def _set_disable_len( self, value ): - self.__disable_len = value - disable_len = property( _get_disable_len, _set_disable_len ) + def __apply_defaults_if_needed( self ): + if self._default_applied: + return + self._default_applied = True + #find out what operators are supported by value_type and + #then configure the _disable_[methods|groups] + pass + + def disable_method( self, method_name ): + assert method_name in self.METHODS + self.__apply_defaults_if_needed() + self._disabled_methods.add( method_name ) + + def enable_method( self, method_name ): + assert method_name in self.METHODS + self.__apply_defaults_if_needed() + if method_name in self._disabled_methods: + self._disabled_methods.remove( method_name ) - def _get_disable_slices( self ): - return self.__disable_slices - def _set_disable_slices( self, value ): - self.__disable_slices = value - disable_slices = property( _get_disable_slices, _set_disable_slices ) + def _get_disabled_methods( self ): + self.__apply_defaults_if_needed() + return self._disabled_methods + disable_methods = property( _get_disabled_methods ) + + def disable_methods_group( self, group_name ): + assert group_name in self.METHOD_GROUPS + self.__apply_defaults_if_needed() + self._disabled_groups.add( group_name ) + + def enable_methods_group( self, group_name ): + assert group_name in self.METHOD_GROUPS + self.__apply_defaults_if_needed() + if group_name in self._disabled_groups: + self._disabled_groups.remove( group_name ) - def _get_disable_search( self ): #need operator== - if None is self.__disable_search: - value_type = self.container_traits.value_type( self.container_class ) - if not declarations.has_public_equal( value_type ): - self.__disable_search = True - return self.__disable_search - def _set_disable_search( self, value ): - self.__disable_search = value - disable_search = property( _get_disable_search, _set_disable_search ) - - def _get_disable_reorder( self ): #need operator< - if None is self.__disable_reorder: - value_type = self.container_traits.value_type( self.container_class ) - if not declarations.has_public_less( value_type ): - self.__disable_reorder = True - return self.__disable_reorder - def _set_disable_reorder( self, value ): - self.__disable_reorder = value - disable_reorder = property( _get_disable_reorder, _set_disable_reorder ) - - def _get_disable_extend( self ): - return self.__disable_extend - def _set_disable_extend( self, value ): - self.__disable_extend = value - disable_extend = property( _get_disable_extend, _set_disable_extend ) - - def _get_disable_insert( self ): - return self.__disable_insert - def _set_disable_insert( self, value ): - self.__disable_insert = value - disable_insert = property( _get_disable_insert, _set_disable_insert ) + def _get_disabled_methods_groups( self ): + self.__apply_defaults_if_needed() + return self._disabled_groups + disabled_methods_groups = property( _get_disabled_methods_groups ) \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 08:45:46 UTC (rev 258) @@ -370,28 +370,49 @@ return #supported container : [ header file, is already used ] + isuite1 = { 'vector<' : [ "boost/python/suite/indexing/vector_indexing_suite.hpp", False ] , 'map<' : [ "boost/python/suite/indexing/map_indexing_suite.hpp", False ] } + #include <boost/python/suite/indexing/vector.hpp> + + container_suite_header_was_used = False + container_suite_header = "boost/python/suite/indexing/container_suite.hpp" + isuite2 = { + 'vector<' : [ "boost/python/suite/indexing/vector.hpp", False ] + } + for cls in self.__types_db.used_containers: container_name = cls.name.split( '<' )[0] + '<' + + if isinstance( cls.indexing_suite, decl_wrappers.indexing_suite1_t ): + isuite = isuite1 + else: + isuite = isuite2 + if not isuite1.has_key( container_name ): continue #not supported - if not cls.name.startswith( 'vector<') and not cls.name.startswith( 'map<'): - continue - if not isuite1[ container_name ][1]: + if isuite is isuite2 and not container_suite_header_was_used: + container_suite_header_was_used = True + self.__extmodule.add_system_header( container_suite_header ) + self.__extmodule.add_include( container_suite_header ) + + if not isuite[ container_name ][1]: isuite1[ container_name ][1] = True - self.__extmodule.add_system_header( isuite1[ container_name ][0] ) - self.__extmodule.add_include( header=isuite1[ container_name ][0] ) + self.__extmodule.add_system_header( isuite[ container_name ][0] ) + self.__extmodule.add_include( header=isuite[ container_name ][0] ) cls_creator = create_cls_cc( cls ) - value_type = cls.indexing_suite.value_type() - if declarations.is_class( value_type ) and not declarations.has_public_equal( value_type ): - cls_creator.adopt_creator( create_explanation( cls ) ) - cls_creator.adopt_creator( code_creators.indexing_suite1_t() ) + if isuite is isuite1: + value_type = cls.indexing_suite.value_type() + if declarations.is_class( value_type ) and not declarations.has_public_equal( value_type ): + cls_creator.adopt_creator( create_explanation( cls ) ) + cls_creator.adopt_creator( code_creators.indexing_suite1_t(cls) ) + else: + cls_creator.adopt_creator( code_creators.indexing_suite2_t(cls) ) self.__module_body.adopt_creator( cls_creator ) def create(self, decl_headers=None): Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/unittests/test_all.py 2006-06-28 08:45:46 UTC (rev 258) @@ -4,7 +4,9 @@ # http://www.boost.org/LICENSE_1_0.txt) import sys import unittest - + +import classes_tester +import abstract_classes_tester import algorithms_tester import module_body_tester import enums_tester @@ -105,6 +107,8 @@ , hierarchy3_tester , vector3_tester , default_args_tester + , abstract_classes_tester + , classes_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |