[pygccxml-commit] SF.net SVN: pygccxml: [261] pyplusplus_dev/unittests
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-06-28 20:16:33
|
Revision: 261 Author: roman_yakovenko Date: 2006-06-28 13:16:11 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=261&view=rev Log Message: ----------- indexing suite - value traits Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/core_cache.hpp pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites2_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2006-06-28 14:32:24 UTC (rev 260) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2006-06-28 20:16:11 UTC (rev 261) @@ -105,12 +105,17 @@ from type_traits import is_enum from type_traits import enum_declaration +from type_traits import enum_traits +from type_traits import is_class +from type_traits import class_traits +from type_traits import is_class_declaration +from type_traits import class_declaration_traits + + from type_traits import is_same from type_traits import is_void from type_traits import is_void_pointer -from type_traits import is_class -from type_traits import is_class_declaration from type_traits import is_const from type_traits import base_type from type_traits import is_array Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2006-06-28 14:32:24 UTC (rev 260) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2006-06-28 20:16:11 UTC (rev 261) @@ -260,35 +260,37 @@ , cpptypes.fundamental_t , (cpptypes.const_t, cpptypes.volatile_t) ) -def is_enum(type): - """returns True if type represents C++ enum type""" - nake_type = remove_alias( type ) - nake_type = remove_cv( nake_type ) +class declaration_xxx_traits: + sequence = [ remove_alias, remove_cv, remove_declarated ] + def __init__( self, declaration_class ): + self.declaration_class = declaration_class + + def apply_sequence( self, type ): + for f in self.sequence: + type = f( type ) + return type - return isinstance( nake_type, cpptypes.declarated_t ) \ - and isinstance( nake_type.declaration, enumeration.enumeration_t ) + def is_my_case( self, type ): + return isinstance( self.apply_sequence( type ), self.declaration_class ) + + def get_declaration( self, type ): + assert self.is_my_case( type ) + return self.apply_sequence( type ) -def enum_declaration(type): - if not is_enum( type ): - raise TypeError( 'Type "%s" is not enumeration' % type.decl_string ) - nake_type = remove_alias( type ) - nake_type = remove_cv( nake_type ) - return remove_declarated( nake_type ) +enum_traits = declaration_xxx_traits( enumeration.enumeration_t ) -def is_class(type): - """returns True if type represents C++ class""" - nake_type = remove_alias( type ) - nake_type = remove_cv( nake_type ) - nake_type = remove_declarated( nake_type ) - return isinstance( nake_type, class_declaration.class_t) +is_enum = enum_traits.is_my_case +#backward computability +enum_declaration = enum_traits.get_declaration -def is_class_declaration(type): - """returns True if type represents C++ class""" - nake_type = remove_alias( type ) - nake_type = remove_cv( nake_type ) - nake_type = remove_declarated( nake_type ) - return isinstance( nake_type, class_declaration.class_declaration_t) +class_traits = declaration_xxx_traits( class_declaration.class_t ) +#backward computability +is_class = class_traits.is_my_case +class_declaration_traits = declaration_xxx_traits( class_declaration.class_declaration_t ) +#backward computability +is_class_declaration = class_declaration_traits.is_my_case + def find_trivial_constructor( type ): """returns reference to trivial constructor or None""" assert isinstance( type, class_declaration.class_t ) Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2006-06-28 14:32:24 UTC (rev 260) +++ pygccxml_dev/unittests/data/core_cache.hpp 2006-06-28 20:16:11 UTC (rev 261) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch \ No newline at end of file +//touch//touch//touch \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-28 14:32:24 UTC (rev 260) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-28 20:16:11 UTC (rev 261) @@ -107,3 +107,4 @@ from indexing_suites import indexing_suite1_t from indexing_suites import indexing_suite2_t +from indexing_suites import value_traits_t \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 14:32:24 UTC (rev 260) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 20:16:11 UTC (rev 261) @@ -103,6 +103,51 @@ answer.append( ';' ) return ''.join( answer ) +class value_traits_t( declaration_based.declaration_based_t ): + def __init__( self, value_class, parent=None ): + declaration_based.declaration_based_t.__init__( self, declaration=value_class, parent=parent ) + def generate_value_traits( self ): + tmpl = os.linesep.join([ + "namespace boost { namespace python { namespace indexing {" + , "" + , "template<>" + , "struct value_traits<%(value_class)s>{" + , "" + , self.indent( "static bool const equality_comparable = %(has_equal)s;" ) + , self.indent( "static bool const less_than_comparable = %(has_lessthan)s;" ) + , "" + , self.indent( "template<typename PythonClass, typename Policy>" ) + , self.indent( "static void visit_container_class(PythonClass &, Policy const &){" ) + , self.indent( "%(visitor_helper_body)s", 2 ) + , self.indent( "}" ) + , "" + , "};" + , "" + , "}/*indexing*/ } /*python*/ } /*boost*/" + ]) + return tmpl % { 'value_class' : self.decl_identifier + , 'has_equal' : str( bool( self.declaration.equality_comparable ) ) .lower() + , 'has_lessthan' : str( bool( self.declaration.less_than_comparable ) ).lower() + , 'visitor_helper_body' : '' } + def generate_value_class_fwd_declaration( self ): + pass # for inner class this code will generate error :-(((( + + def _create_impl( self ): + return self.generate_value_traits() + + + + + + + + + + + + + + Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-06-28 14:32:24 UTC (rev 260) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-06-28 20:16:11 UTC (rev 261) @@ -89,7 +89,6 @@ from indexing_suite1 import indexing_suite1_t from indexing_suite2 import indexing_suite2_t - class dwfactory_t( declarations.decl_factory_t ): """ declarations factory class Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-28 14:32:24 UTC (rev 260) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-28 20:16:11 UTC (rev 261) @@ -16,7 +16,7 @@ self._always_expose_using_scope = False self._indexing_suite = None self._equality_comparable = None - self._lessthan_comparable = None + self._less_than_comparable = None self._isuite_version = 1 def _get_indexing_suite_version( self ): @@ -49,6 +49,7 @@ indexing_suite = property( _get_indexing_suite ) def _get_equality_comparable( self ): + return False if None is self._equality_comparable: self._equality_comparable = declarations.has_public_equal( self ) return self._equality_comparable @@ -58,15 +59,16 @@ equality_comparable = property( _get_equality_comparable, _set_equality_comparable ) - def _get_lessthan_comparable( self ): - if None is self._lessthan_comparable: - self._lessthan_comparable = declarations.has_public_less( self ) - return self._lessthan_comparable + def _get_less_than_comparable( self ): + return False + if None is self._less_than_comparable: + self._less_than_comparable = declarations.has_public_less( self ) + return self._less_than_comparable - def _set_lessthan_comparable( self, value ): - self._lessthan_comparable = value + def _set_less_than_comparable( self, value ): + self._less_than_comparable = value - lessthan_comparable = property( _get_lessthan_comparable, _set_lessthan_comparable ) + less_than_comparable = property( _get_less_than_comparable, _set_less_than_comparable ) #this will only be exported if indexing suite is not None and only when needed Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 14:32:24 UTC (rev 260) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 20:16:11 UTC (rev 261) @@ -392,7 +392,7 @@ else: isuite = isuite2 - if not isuite1.has_key( container_name ): + if not isuite.has_key( container_name ): continue #not supported if isuite is isuite2 and not container_suite_header_was_used: @@ -401,17 +401,23 @@ self.__extmodule.add_include( container_suite_header ) if not isuite[ container_name ][1]: - isuite1[ container_name ][1] = True + isuite[ container_name ][1] = True 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 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: + class_traits = declarations.class_traits + if class_traits.is_my_case( value_type ): + value_cls = class_traits.get_declaration( value_type ) + if not ( value_cls.equality_comparable and value_cls.less_than_comparable ): + value_type_cc = code_creators.value_traits_t( value_cls ) + self.__extmodule.adopt_creator( value_type_cc, self.__extmodule.creators.index( self.__module_body ) ) cls_creator.adopt_creator( code_creators.indexing_suite2_t(cls) ) self.__module_body.adopt_creator( cls_creator ) Modified: pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp 2006-06-28 14:32:24 UTC (rev 260) +++ pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp 2006-06-28 20:16:11 UTC (rev 261) @@ -10,34 +10,34 @@ namespace indexing_suites2 { -//~ struct item_t{ - //~ item_t() : value( -1 ){} +struct item_t{ + item_t() : value( -1 ){} - //~ bool operator==(item_t const& item) const { - //~ return value == item.value; - //~ } + bool operator==(item_t const& item) const { + return value == item.value; + } - //~ bool operator!=(item_t const& item) const { - //~ return value != item.value; - //~ } + bool operator!=(item_t const& item) const { + return value != item.value; + } - //~ int value; -//~ }; + int value; +}; -//~ typedef std::vector<item_t> items_t; +typedef std::vector<item_t> items_t; -//~ inline item_t get_value( const std::vector<item_t>& vec, unsigned int index ){ - //~ return vec.at(index); -//~ } +inline item_t get_value( const std::vector<item_t>& vec, unsigned int index ){ + return vec.at(index); +} -//~ inline void set_value( std::vector<item_t>& vec, unsigned int index, item_t value ){ - //~ vec.at(index); - //~ vec[index] = value; -//~ } +inline void set_value( std::vector<item_t>& vec, unsigned int index, item_t value ){ + vec.at(index); + vec[index] = value; +} -typedef std::vector<int> ivector; -ivector empty_ivector(){ return ivector(); } +typedef std::vector<float> fvector; +fvector empty_fvector(){ return fvector(); } } Modified: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py 2006-06-28 14:32:24 UTC (rev 260) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2006-06-28 20:16:11 UTC (rev 261) @@ -31,14 +31,17 @@ #~ return False def customize(self, generator): - ivector = generator.global_ns.typedef( 'ivector' ) - ivector = declarations.remove_declarated( ivector.type ) - ivector.indexing_suite.disable_method( 'extend' ) - ivector.indexing_suite.disable_methods_group( 'reorder' ) - #ivector.indexing_suite.call_policies = module_builder.call_policies.default_call_policies() + fvector = generator.global_ns.typedef( 'fvector' ) + fvector = declarations.remove_declarated( fvector.type ) + fvector.indexing_suite.disable_method( 'extend' ) + fvector.indexing_suite.disable_methods_group( 'reorder' ) + #fvector.indexing_suite.call_policies = module_builder.call_policies.default_call_policies() def run_tests( self, module): - iv = module.ivector() + fv = module.fvector() + self.failUnless( not hasattr( fv, 'extend' ) ) + self.failUnless( not hasattr( fv, 'sort' ) ) + self.failUnless( not hasattr( fv, 'reverse' ) ) #~ items = module.items_t() #~ item = module.item_t() #~ item.value = 1977 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |