[pygccxml-commit] SF.net SVN: pygccxml: [1059] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2007-06-17 08:27:52
|
Revision: 1059 http://svn.sourceforge.net/pygccxml/?rev=1059&view=rev Author: roman_yakovenko Date: 2007-06-17 01:27:49 -0700 (Sun, 17 Jun 2007) Log Message: ----------- adding initial ability to create std container names without default values Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/unittests/test_all.py Added Paths: ----------- pygccxml_dev/unittests/data/remove_template_defaults.hpp pygccxml_dev/unittests/remove_template_defaults_tester.py Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-13 08:25:38 UTC (rev 1058) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-17 08:27:49 UTC (rev 1059) @@ -7,13 +7,67 @@ defines few algorithms, that deals with different properties of std containers """ +import types import calldef import cpptypes import namespace import templates +import type_traits import class_declaration -import type_traits +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 + +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 ) + +def __remove_allocator( cls_name ): + 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 'allocator' not in a_name: + return + if 1 != len( a_args ): + return + if c_args[0].strip() != a_args[0]: + return + value_type = __remove_defaults_recursive( c_args[0] ) + return templates.join( c_name, [value_type] ) + +def __remove_container( cls_name, default_container_name='deque' ): + 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 + dc_no_defaults = __remove_defaults_recursive( c_args[1] ) + if dc_no_defaults != templates.join( 'std::' + default_container_name, [c_args[0]] ): + return + value_type = __remove_defaults_recursive( c_args[0] ) + return templates.join( c_name, [value_type] ) + class container_traits_impl_t: """this class implements the functionality needed for convinient work with STD container classes. @@ -84,16 +138,24 @@ % ( self.name, cls.decl_string ) ) return ref + -def create_traits_class( container_name, element_type_index, element_type_typedef ): +def create_traits_class( container_name + , element_type_index + , element_type_typedef + , remove_defaults_=None ): """ creates concrete container traits class """ class xxx_traits: """extract information from the container""" impl = container_traits_impl_t( container_name, element_type_index, element_type_typedef ) - + @staticmethod + def name(): + return xxx_traits.impl.name + + @staticmethod def is_my_case( type ): """returns True if type is the container class, otherwise False""" return xxx_traits.impl.is_my_case( type ) @@ -108,19 +170,33 @@ """returns reference to container name value\\mapped type class""" return xxx_traits.impl.element_type( type ) + @staticmethod + def remove_defaults( type_or_string ): + name = None + if not isinstance( type_or_string, types.StringTypes ): + name = xxx_traits.class_declaration( type_or_string ).name + else: + name = type_or_string + if not remove_defaults_: + return name + no_defaults = remove_defaults_( name ) + if not no_defaults: + return name + else: + return no_defaults return xxx_traits -list_traits = create_traits_class( 'list', 0, 'value_type' ) +list_traits = create_traits_class( 'list', 0, 'value_type', __remove_allocator ) -deque_traits = create_traits_class( 'deque', 0, 'value_type' ) +deque_traits = create_traits_class( 'deque', 0, 'value_type', __remove_allocator ) -queue_traits = create_traits_class( 'queue', 0, 'value_type' ) +queue_traits = create_traits_class( 'queue', 0, 'value_type', __remove_container ) priority_queue = create_traits_class( 'priority_queue', 0, 'value_type' ) -vector_traits = create_traits_class( 'vector', 0, 'value_type' ) +vector_traits = create_traits_class( 'vector', 0, 'value_type', __remove_allocator ) -stack_traits = create_traits_class( 'stack', 0, 'value_type' ) +stack_traits = create_traits_class( 'stack', 0, 'value_type', __remove_container ) map_traits = create_traits_class( 'map', 1, 'mapped_type' ) multimap_traits = create_traits_class( 'multimap', 1, 'mapped_type' ) @@ -134,6 +210,33 @@ multiset_traits = create_traits_class( 'multiset', 0, 'value_type' ) hash_multiset_traits = create_traits_class( 'hash_multiset', 0, 'value_type' ) +container_traits = ( + list_traits + , deque_traits + , queue_traits + , priority_queue + , vector_traits + , stack_traits + , map_traits + , multimap_traits + , hash_map_traits + , hash_multimap_traits + , set_traits + , hash_set_traits + , multiset_traits + , hash_multiset_traits ) + +def find_container_traits( cls_or_string ): + if isinstance( cls_or_string, types.StringTypes ): + if not templates.is_instantiation( cls_or_string ): + return None + name = templates.name( cls_or_string ) + for cls_traits in container_traits: + if cls_traits.name() == name: + return cls_traits + else: + for cls_traits in container_traits: + if cls_traits.is_my_case( cls ): + return cls_traits - Added: pygccxml_dev/unittests/data/remove_template_defaults.hpp =================================================================== --- pygccxml_dev/unittests/data/remove_template_defaults.hpp (rev 0) +++ pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-06-17 08:27:49 UTC (rev 1059) @@ -0,0 +1,41 @@ +// 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) + +#ifndef __remove_template_defaults_hpp__ +#define __remove_template_defaults_hpp__ + +#include <string> +#include <vector> +#include <deque> +#include <queue> +#include <list> + +namespace rtd{ + +namespace vectors{ + typedef std::vector< int > v_int; + typedef std::vector< std::string > v_string; + typedef std::vector< v_int > v_v_int; +} + +namespace lists{ + typedef std::list< int > l_int; + typedef std::list< std::wstring > l_wstring; +} + +namespace deques{ + typedef std::deque< std::vector< int > > d_v_int; + typedef std::deque< std::list< std::string > > d_l_string; +} + +namespace queues{ + typedef std::queue< int > q_int; + typedef std::queue< std::string > q_string; + +} + +} + +#endif//__remove_template_defaults_hpp__ Added: pygccxml_dev/unittests/remove_template_defaults_tester.py =================================================================== --- pygccxml_dev/unittests/remove_template_defaults_tester.py (rev 0) +++ pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-17 08:27:49 UTC (rev 1059) @@ -0,0 +1,71 @@ +# 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 unittest +import autoconfig +import parser_test_case + +from pygccxml import utils +from pygccxml import parser +from pygccxml import declarations + +class tester_t( parser_test_case.parser_test_case_t ): + global_ns = None + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.header = 'remove_template_defaults.hpp' + + def setUp(self): + if not tester_t.global_ns: + decls = parser.parse( [self.header], self.config ) + tester_t.global_ns = declarations.get_global_namespace( decls ) + tester_t.global_ns.init_optimizer() + + def test_vector( self ): + v_int = self.global_ns.typedef( 'v_int' ) + self.failUnless( 'vector< int >' + == declarations.vector_traits.remove_defaults( v_int ) ) + 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' ) + self.failUnless( 'vector< std::vector< int > >' + == declarations.vector_traits.remove_defaults( v_v_int ) ) + + def test_list( self ): + l_int = self.global_ns.typedef( 'l_int' ) + self.failUnless( 'list< int >' + == declarations.list_traits.remove_defaults( l_int ) ) + l_wstring = self.global_ns.typedef( 'l_wstring' ) + self.failUnless( 'list< std::wstring >' + == declarations.list_traits.remove_defaults( l_wstring ) ) + + def test_deque( self ): + d_v_int = self.global_ns.typedef( 'd_v_int' ) + self.failUnless( 'deque< std::vector< int > >' + == declarations.deque_traits.remove_defaults( d_v_int ) ) + d_l_string = self.global_ns.typedef( 'd_l_string' ) + self.failUnless( 'deque< std::list< std::string > >' + == declarations.deque_traits.remove_defaults( d_l_string ) ) + + def test_queue( self ): + q_int = self.global_ns.typedef( 'q_int' ) + self.failUnless( 'queue< int >' + == declarations.queue_traits.remove_defaults( q_int ) ) + q_string = self.global_ns.typedef( 'q_string' ) + self.failUnless( 'queue< std::string >' + == declarations.queue_traits.remove_defaults( q_string ) ) + + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2007-06-13 08:25:38 UTC (rev 1058) +++ pygccxml_dev/unittests/test_all.py 2007-06-17 08:27:49 UTC (rev 1059) @@ -41,6 +41,7 @@ import algorithms_cache_tester import dependencies_tester import free_operators_tester +import remove_template_defaults_tester def create_suite(): testers = [ @@ -81,6 +82,7 @@ , algorithms_cache_tester , dependencies_tester , free_operators_tester + , remove_template_defaults_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |