[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.
|