[pygccxml-commit] SF.net SVN: pygccxml: [1062] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2007-06-18 07:17:18
|
Revision: 1062 http://svn.sourceforge.net/pygccxml/?rev=1062&view=rev Author: roman_yakovenko Date: 2007-06-18 00:17:19 -0700 (Mon, 18 Jun 2007) Log Message: ----------- adding another set of containers to remove_defaults functionality Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/algorithm.py pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/unittests/data/remove_template_defaults.hpp pygccxml_dev/unittests/remove_template_defaults_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2007-06-18 06:59:29 UTC (rev 1061) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2007-06-18 07:17:19 UTC (rev 1062) @@ -72,6 +72,7 @@ from variable import variable_t from algorithm import full_name +from algorithm import full_name_from_declaration_path from algorithm import make_flatten from algorithm import apply_visitor from algorithm import declaration_path Modified: pygccxml_dev/pygccxml/declarations/algorithm.py =================================================================== --- pygccxml_dev/pygccxml/declarations/algorithm.py 2007-06-18 06:59:29 UTC (rev 1061) +++ pygccxml_dev/pygccxml/declarations/algorithm.py 2007-06-18 07:17:19 UTC (rev 1062) @@ -34,6 +34,13 @@ else: return decl.cache.declaration_path +def full_name_from_declaration_path( dpath ): + ##Here I have lack of knowledge: + ##TODO: "What is the full name of declaration declared in unnamed namespace?" + result = filter( None, dpath ) + result = result[0] + '::'.join( result[1:] ) + return result + def full_name( decl ): """ returns full name of the declaration @@ -47,17 +54,9 @@ if None is decl: raise RuntimeError( "Unable to generate full name for None object!" ) if not decl.cache.full_name: - decl_path = declaration_path( decl ) - ##Here I have lack of knowledge: - ##TODO: "What is the full name of declaration declared in unnamed namespace?" - result = filter( None, decl_path ) - result = result[0] + '::'.join( result[1:] ) - decl.cache.full_name = result - return result - else: - return decl.cache.full_name + decl.cache.full_name = full_name_from_declaration_path( declaration_path( decl ) ) + return decl.cache.full_name - def make_flatten( decl_or_decls ): """ converts tree representation of declarations to flatten one. Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-18 06:59:29 UTC (rev 1061) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-18 07:17:19 UTC (rev 1062) @@ -8,6 +8,7 @@ """ import types +import string import calldef import cpptypes import namespace @@ -15,95 +16,135 @@ import type_traits import class_declaration -def __normalize_type( type_str ): - return type_str.replace( ' ', '' ) +class defaults_eraser: + @staticmethod + def normalize( type_str ): + return type_str.replace( ' ', '' ) -def __remove_basic_string( cls_name ): - strings = { - 'std::string' : ( 'std::basic_string<char,std::char_traits<char>,std::allocator<char> >' - , 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' ) - , 'std::wstring' : ( 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >' - , 'std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >' ) } - - new_name = cls_name - for short_name, long_names in strings.iteritems(): - for lname in long_names: - new_name = new_name.replace( lname, short_name ) - return new_name + @staticmethod + def replace_basic_string( cls_name ): + strings = { + 'std::string' : ( 'std::basic_string<char,std::char_traits<char>,std::allocator<char> >' + , 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >' ) + , 'std::wstring' : ( 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >' + , 'std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >' ) } + + new_name = cls_name + for short_name, long_names in strings.iteritems(): + for lname in long_names: + new_name = new_name.replace( lname, short_name ) + return new_name -def __remove_defaults_recursive( cls_name ): - global find_container_traits - if not cls_name.startswith( 'std::' ): - return cls_name - no_std_cls_name = cls_name[5:] - c_traits = find_container_traits( no_std_cls_name ) - if not c_traits: - return cls_name - return 'std::' + c_traits.remove_defaults( no_std_cls_name ) + class recursive_impl: + @staticmethod + def decorated_call( cls_name, text, doit ): + has_text = cls_name.startswith( text ) + if has_text: + cls_name = cls_name[ len( text ): ] + answer = doit( cls_name ) + if has_text: + answer = text + answer + return answer -def __remove_allocator( cls_name, default_allocator='std::allocator' ): - cls_name = __remove_basic_string( cls_name ) - # "vector<int,std::allocator<int> >" - c_name, c_args = templates.split( cls_name ) - #"vector", [ "int", "std::allocator<int>" ] - if 2 != len( c_args ): - return - a_name, a_args = templates.split( c_args[1] ) - if __normalize_type(default_allocator) != __normalize_type( a_name ): - return - if 1 != len( a_args ): - return - if __normalize_type( c_args[0] ) != __normalize_type( a_args[0] ): - return - value_type = __remove_defaults_recursive( c_args[0] ) - return templates.join( c_name, [value_type] ) + @staticmethod + def erase_call( cls_name ): + global find_container_traits + c_traits = find_container_traits( cls_name ) + if not c_traits: + return cls_name + return c_traits.remove_defaults( cls_name ) + + @staticmethod + def erase_recursive( cls_name ): + ri = defaults_eraser.recursive_impl + no_std = lambda cls_name: ri.decorated_call( cls_name, 'std::', ri.erase_call ) + no_const = lambda cls_name: ri.decorated_call( cls_name, 'const ', no_std ) + return no_const( cls_name ) -def __remove_container( cls_name, default_container_name='std::deque' ): - cls_name = __remove_basic_string( cls_name ) - c_name, c_args = templates.split( cls_name ) - if 2 != len( c_args ): - return - dc_no_defaults = __remove_defaults_recursive( c_args[1] ) - if __normalize_type( dc_no_defaults ) \ - != __normalize_type( templates.join( default_container_name, [c_args[0]] ) ): - return - value_type = __remove_defaults_recursive( c_args[0] ) - return templates.join( c_name, [value_type] ) + @staticmethod + def erase_recursive( cls_name ): + return defaults_eraser.recursive_impl.erase_recursive( cls_name ) + @staticmethod + def erase_allocator( cls_name, default_allocator='std::allocator' ): + cls_name = defaults_eraser.replace_basic_string( cls_name ) + c_name, c_args = templates.split( cls_name ) + if 2 != len( c_args ): + return + value_type = c_args[0] + tmpl = string.Template( "$container< $value_type, $allocator<$value_type> >" ) + tmpl = tmpl.substitute( container=c_name, value_type=value_type, allocator=default_allocator ) + if defaults_eraser.normalize( cls_name ) == defaults_eraser.normalize( tmpl ): + return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) -def __remove_container_compare( cls_name, default_container_name='std::vector', default_compare='std::less' ): - cls_name = __remove_basic_string( cls_name ) - c_name, c_args = templates.split( cls_name ) - if 3 != len( c_args ): - return - dc_no_defaults = __remove_defaults_recursive( c_args[1] ) - if __normalize_type( dc_no_defaults ) \ - != __normalize_type( templates.join( default_container_name, [c_args[0]] ) ): - return - dcomp_no_defaults = __remove_defaults_recursive( c_args[2] ) - if __normalize_type( dcomp_no_defaults ) \ - != __normalize_type( templates.join( default_compare, [c_args[0]] ) ): - return - value_type = __remove_defaults_recursive( c_args[0] ) - return templates.join( c_name, [value_type] ) + @staticmethod + def erase_container( cls_name, default_container_name='std::deque' ): + cls_name = defaults_eraser.replace_basic_string( cls_name ) + c_name, c_args = templates.split( cls_name ) + if 2 != len( c_args ): + return + value_type = c_args[0] + dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) + if defaults_eraser.normalize( dc_no_defaults ) \ + != defaults_eraser.normalize( templates.join( default_container_name, [value_type] ) ): + return + return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) -def __remove_compare_allocator( cls_name, default_compare='std::less', default_allocator='std::allocator' ): - cls_name = __remove_basic_string( cls_name ) - c_name, c_args = templates.split( cls_name ) - if 3 != len( c_args ): - return - dc_no_defaults = __remove_defaults_recursive( c_args[1] ) - if __normalize_type( dc_no_defaults ) \ - != __normalize_type( templates.join( default_compare, [c_args[0]] ) ): - return - da_no_defaults = __remove_defaults_recursive( c_args[2] ) - if __normalize_type( da_no_defaults ) \ - != __normalize_type( templates.join( default_allocator, [c_args[0]] ) ): - return - value_type = __remove_defaults_recursive( c_args[0] ) - return templates.join( c_name, [value_type] ) + @staticmethod + def erase_container_compare( cls_name, default_container_name='std::vector', default_compare='std::less' ): + cls_name = defaults_eraser.replace_basic_string( cls_name ) + c_name, c_args = templates.split( cls_name ) + if 3 != len( c_args ): + return + dc_no_defaults = defaults_eraser.erase_recursive( c_args[1] ) + if defaults_eraser.normalize( dc_no_defaults ) \ + != defaults_eraser.normalize( templates.join( default_container_name, [c_args[0]] ) ): + return + dcomp_no_defaults = defaults_eraser.erase_recursive( c_args[2] ) + if defaults_eraser.normalize( dcomp_no_defaults ) \ + != defaults_eraser.normalize( templates.join( default_compare, [c_args[0]] ) ): + return + value_type = defaults_eraser.erase_recursive( c_args[0] ) + return templates.join( c_name, [value_type] ) + @staticmethod + def erase_compare_allocator( cls_name, default_compare='std::less', default_allocator='std::allocator' ): + cls_name = defaults_eraser.replace_basic_string( cls_name ) + c_name, c_args = templates.split( cls_name ) + if 3 != len( c_args ): + return + value_type = c_args[0] + tmpl = string.Template( "$container< $value_type, $compare<$value_type>, $allocator<$value_type> >" ) + tmpl = tmpl.substitute( container=c_name + , value_type=value_type + , compare=default_compare + , allocator=default_allocator ) + if defaults_eraser.normalize( cls_name ) == defaults_eraser.normalize( tmpl ): + return templates.join( c_name, [defaults_eraser.erase_recursive( value_type )] ) + @staticmethod + def erase_map_compare_allocator( cls_name, default_compare='std::less', default_allocator='std::allocator' ): + cls_name = defaults_eraser.replace_basic_string( cls_name ) + c_name, c_args = templates.split( cls_name ) + if 4 != len( c_args ): + return + key_type = c_args[0] + mapped_type = c_args[1] + tmpl = string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< const $key_type, $mapped_type> > >" ) + if key_type.startswith( 'const ' ) or key_type.endswith( ' const' ): + tmpl = string.Template( "$container< $key_type, $mapped_type, $compare<$key_type>, $allocator< std::pair< $key_type, $mapped_type> > >" ) + tmpl = tmpl.substitute( container=c_name + , key_type=key_type + , mapped_type=mapped_type + , compare=default_compare + , allocator=default_allocator ) + #~ print '\noriginal: ', defaults_eraser.normalize(cls_name) + #~ print '\ntmpl : ', defaults_eraser.normalize(tmpl) + if defaults_eraser.normalize( cls_name ) == defaults_eraser.normalize( tmpl ): + return templates.join( c_name + , [ defaults_eraser.erase_recursive( key_type ) + , defaults_eraser.erase_recursive( mapped_type )] ) + class container_traits_impl_t: """this class implements the functionality needed for convinient work with STD container classes. @@ -222,28 +263,28 @@ return no_defaults return xxx_traits -list_traits = create_traits_class( 'list', 0, 'value_type', __remove_allocator ) +list_traits = create_traits_class( 'list', 0, 'value_type', defaults_eraser.erase_allocator ) -deque_traits = create_traits_class( 'deque', 0, 'value_type', __remove_allocator ) +deque_traits = create_traits_class( 'deque', 0, 'value_type', defaults_eraser.erase_allocator ) -queue_traits = create_traits_class( 'queue', 0, 'value_type', __remove_container ) +queue_traits = create_traits_class( 'queue', 0, 'value_type', defaults_eraser.erase_container ) -priority_queue_traits = create_traits_class( 'priority_queue', 0, 'value_type', __remove_container_compare ) +priority_queue_traits = create_traits_class( 'priority_queue', 0, 'value_type', defaults_eraser.erase_container_compare ) -vector_traits = create_traits_class( 'vector', 0, 'value_type', __remove_allocator ) +vector_traits = create_traits_class( 'vector', 0, 'value_type', defaults_eraser.erase_allocator ) -stack_traits = create_traits_class( 'stack', 0, 'value_type', __remove_container ) +stack_traits = create_traits_class( 'stack', 0, 'value_type', defaults_eraser.erase_container ) -map_traits = create_traits_class( 'map', 1, 'mapped_type' ) -multimap_traits = create_traits_class( 'multimap', 1, 'mapped_type' ) +map_traits = create_traits_class( 'map', 1, 'mapped_type', defaults_eraser.erase_map_compare_allocator ) +multimap_traits = create_traits_class( 'multimap', 1, 'mapped_type', defaults_eraser.erase_map_compare_allocator ) hash_map_traits = create_traits_class( 'hash_map', 1, 'mapped_type' ) hash_multimap_traits = create_traits_class( 'hash_multimap', 1, 'mapped_type' ) -set_traits = create_traits_class( 'set', 0, 'value_type', __remove_compare_allocator ) +set_traits = create_traits_class( 'set', 0, 'value_type', defaults_eraser.erase_compare_allocator) +multiset_traits = create_traits_class( 'multiset', 0, 'value_type', defaults_eraser.erase_compare_allocator ) + hash_set_traits = create_traits_class( 'hash_set', 0, 'value_type' ) - -multiset_traits = create_traits_class( 'multiset', 0, 'value_type', __remove_compare_allocator ) hash_multiset_traits = create_traits_class( 'hash_multiset', 0, 'value_type' ) container_traits = ( Modified: pygccxml_dev/unittests/data/remove_template_defaults.hpp =================================================================== --- pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-06-18 06:59:29 UTC (rev 1061) +++ pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-06-18 07:17:19 UTC (rev 1062) @@ -12,6 +12,7 @@ #include <queue> #include <list> #include <set> +#include <map> namespace rtd{ @@ -55,6 +56,19 @@ } +namespace maps{ + typedef std::map< int, double > m_i2d; + typedef std::map< std::wstring, double > m_wstr2d; + typedef std::map< const std::vector< int >, m_wstr2d > m_v_i2m_wstr2d; } +namespace multimaps{ + typedef std::multimap< int, double > mm_i2d; + typedef std::multimap< std::wstring const, double > mm_wstr2d; + typedef std::multimap< std::vector< int > const, mm_wstr2d const > mm_v_i2mm_wstr2d; +} + + +} + #endif//__remove_template_defaults_hpp__ Modified: pygccxml_dev/unittests/remove_template_defaults_tester.py =================================================================== --- pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-18 06:59:29 UTC (rev 1061) +++ pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-18 07:17:19 UTC (rev 1062) @@ -30,7 +30,7 @@ v_string = self.global_ns.typedef( 'v_string' ) self.failUnless( 'vector< std::string >' == declarations.vector_traits.remove_defaults( v_string ) ) - v_v_int = self.global_ns.typedef( 'v_v_int' ) + v_v_int = self.global_ns.typedef( 'v_v_int' ) self.failUnless( 'vector< std::vector< int > >' == declarations.vector_traits.remove_defaults( v_v_int ) ) @@ -82,6 +82,28 @@ self.failUnless( 'multiset< std::string >' == declarations.multiset_traits.remove_defaults( ms_string ) ) + def test_map( self ): + m_i2d = self.global_ns.typedef( 'm_i2d' ) + self.failUnless( 'map< int, double >' + == declarations.map_traits.remove_defaults( m_i2d ) ) + m_wstr2d = self.global_ns.typedef( 'm_wstr2d' ) + self.failUnless( 'map< std::wstring, double >' + == declarations.map_traits.remove_defaults( m_wstr2d ) ) + m_v_i2m_wstr2d = self.global_ns.typedef( 'm_v_i2m_wstr2d' ) + self.failUnless( 'map< const std::vector< int >, std::map< std::wstring, double > >' + == declarations.map_traits.remove_defaults( m_v_i2m_wstr2d ) ) + + def test_multimap( self ): + mm_i2d = self.global_ns.typedef( 'mm_i2d' ) + self.failUnless( 'multimap< int, double >' + == declarations.multimap_traits.remove_defaults( mm_i2d ) ) + mm_wstr2d = self.global_ns.typedef( 'mm_wstr2d' ) + self.failUnless( 'multimap< const std::wstring, double >' + == declarations.multimap_traits.remove_defaults( mm_wstr2d ) ) + mm_v_i2mm_wstr2d = self.global_ns.typedef( 'mm_v_i2mm_wstr2d' ) + self.failUnless( 'multimap< const std::vector< int >, const std::multimap< const std::wstring, double > >' + == declarations.multimap_traits.remove_defaults( mm_v_i2mm_wstr2d ) ) + 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. |