Thread: [pygccxml-commit] SF.net SVN: pygccxml: [12] pygccxml_dev
Brought to you by:
mbaas,
roman_yakovenko
From: <mb...@us...> - 2006-04-28 10:09:55
|
Revision: 12 Author: mbaas Date: 2006-04-28 03:09:48 -0700 (Fri, 28 Apr 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=12&view=rev Log Message: ----------- Modified the setup script so that it can be used to create source distributions. Added MANIFEST.in. Modified Paths: -------------- pygccxml_dev/setup.py Added Paths: ----------- pygccxml_dev/MANIFEST.in Added: pygccxml_dev/MANIFEST.in =================================================================== --- pygccxml_dev/MANIFEST.in (rev 0) +++ pygccxml_dev/MANIFEST.in 2006-04-28 10:09:48 UTC (rev 12) @@ -0,0 +1,11 @@ +include LICENSE_1_0.txt +include unittests/*.py +include unittests/data/* +recursive-include docs/apidocs *.css +recursive-include docs/apidocs *.html +include docs/*.rest +include docs/*.png +include docs/example/* +include docs/history/* +include docs/logos/* + Modified: pygccxml_dev/setup.py =================================================================== --- pygccxml_dev/setup.py 2006-04-28 10:07:47 UTC (rev 11) +++ pygccxml_dev/setup.py 2006-04-28 10:09:48 UTC (rev 12) @@ -1,3 +1,4 @@ +#!/usr/bin/env python # Copyright 2004 Roman Yakovenko. # Distributed under the Boost Software License, Version 1.0. (See # accompanying file LICENSE_1_0.txt or copy at @@ -3,14 +4,59 @@ # http://www.boost.org/LICENSE_1_0.txt) -import os +import sys, os, os.path from distutils import sysconfig from distutils.core import setup +from distutils.cmd import Command -setup( name="pygccxml" - , description="GCC-XML generated file reader" - , author="Roman Yakovenko" - , packages=[ 'pygccxml' - , 'pygccxml.declarations' - , 'pygccxml.parser' - , 'pygccxml.utils' ] +def generate_doc(): + """Generate the epydoc reference manual. + """ + print "Generating epydoc files..." + options = [ '--output="%s"'%os.path.join('docs', 'apidocs'), + '--docformat=epytext', + '--url=http://www.language-binding.net', + '--name=pygccxml', +# '--verbose', + 'pygccxml'] + cmd_line = "epydoc " + ' '.join( options ) + print cmd_line + os.system(cmd_line) + + +class doc_cmd(Command): + """This is a new distutils command 'doc' to build the epydoc manual. + """ + + description = 'build the API reference using epydoc' + user_options = [('no-doc', None, "don't run epydoc")] + boolean_options = ['no-doc'] + + def initialize_options (self): + self.no_doc = 0 + + def finalize_options (self): + pass + + def run(self): + if self.no_doc: + return + generate_doc() + + +# Generate the doc when a source distribution is created +if sys.argv[-1]=="sdist": + generate_doc() + + +setup( name = "pygccxml", + version = "0.7.2", + description = "GCC-XML generated file reader", + author = "Roman Yakovenko", + author_email = "rom...@gm...", + url = 'http://pygccxml.sourceforge.net', + packages = [ 'pygccxml', + 'pygccxml.declarations', + 'pygccxml.parser', + 'pygccxml.utils' ], + cmdclass = {"doc" : doc_cmd} ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-18 07:40:29
|
Revision: 136 Author: roman_yakovenko Date: 2006-05-18 00:40:05 -0700 (Thu, 18 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=136&view=rev Log Message: ----------- preparing to next release: version updated history updated Modified Paths: -------------- pygccxml_dev/docs/history/history.rest pygccxml_dev/setup.py pyplusplus_dev/docs/history/history.rest pyplusplus_dev/setup.py Modified: pygccxml_dev/docs/history/history.rest =================================================================== --- pygccxml_dev/docs/history/history.rest 2006-05-18 06:38:14 UTC (rev 135) +++ pygccxml_dev/docs/history/history.rest 2006-05-18 07:40:05 UTC (rev 136) @@ -15,6 +15,33 @@ * John Pallister <jo...@sy...> * Matthias Baas * Allen Bierbaum + +----------- +Version 0.8 +----------- + +1. `pygccxml`_ now has power "select" interface. Read more about this cool feature + in tutorials. + +2. Improved support for template instantiations. `pygccxml`_ now take into + account demangled name of declarations. Please refer to documentation for + more explanantion. + +3. ``dummy_type_t`` - new type in types hierarchy. This is a very useful class + for code generation projects. + +4. New function - ``get_global_namespace``. As you can guess, it will find and + return reference to global namespace. + +5. New functionality in ``type_traits`` - ``has_public_assign``. This function + will return True, if class has public assign operator. + +6. ``declarations.class_t`` has new property - ``aliases``. This is a list of + all class aliases. + +7. Bug fixes. + +8. Documentation. ------------- Version 0.7.1 Modified: pygccxml_dev/setup.py =================================================================== --- pygccxml_dev/setup.py 2006-05-18 06:38:14 UTC (rev 135) +++ pygccxml_dev/setup.py 2006-05-18 07:40:05 UTC (rev 136) @@ -51,7 +51,7 @@ setup( name = "pygccxml", - version = "0.7.2", + version = "0.8.0", description = "GCC-XML generated file reader", author = "Roman Yakovenko", author_email = "rom...@gm...", Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2006-05-18 06:38:14 UTC (rev 135) +++ pyplusplus_dev/docs/history/history.rest 2006-05-18 07:40:05 UTC (rev 136) @@ -4,6 +4,27 @@ .. contents:: Table of contents +------------- +Version 0.8.0 +------------- + +1. `pyplusplus`_ "user guide" functionality has been improved. Now `pyplusplus`_ + can answer few questions: + + * why this declaration could not be exported + + * why this function could not be overriden from Python + +2. `pyplusplus`_ can suggest an alias for exported classes. + +3. Small redesign has been done - now it is much easier to understand and + maintain code creators, that creates code for C++ functions. + +4. Exception specification is taken into account, when `pyplusplus`_ exports + member functions. + +5. Member variables, that are pointers exported correctly. + ------------- Version 0.7.0 ------------- Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-05-18 06:38:14 UTC (rev 135) +++ pyplusplus_dev/setup.py 2006-05-18 07:40:05 UTC (rev 136) @@ -85,7 +85,7 @@ setup( name = "pyplusplus", - version = "0.7.1", + version = "0.8.0", description="pyplusplus is a framework of components for creating C++ code generator for boost.python library", author="Roman Yakovenko", author_email="rom...@gm...", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-07 20:11:10
|
Revision: 211 Author: roman_yakovenko Date: 2006-06-05 08:16:30 -0700 (Mon, 05 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=211&view=rev Log Message: ----------- incrementing version number Modified Paths: -------------- pygccxml_dev/setup.py pyplusplus_dev/setup.py Modified: pygccxml_dev/setup.py =================================================================== --- pygccxml_dev/setup.py 2006-06-05 14:09:20 UTC (rev 210) +++ pygccxml_dev/setup.py 2006-06-05 15:16:30 UTC (rev 211) @@ -51,7 +51,7 @@ setup( name = "pygccxml", - version = "0.8.0", + version = "0.8.1", description = "GCC-XML generated file reader", author = "Roman Yakovenko", author_email = "rom...@gm...", Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-06-05 14:09:20 UTC (rev 210) +++ pyplusplus_dev/setup.py 2006-06-05 15:16:30 UTC (rev 211) @@ -85,7 +85,7 @@ setup( name = "pyplusplus", - version = "0.8.0", + version = "0.8.1", description="pyplusplus is a framework of components for creating C++ code generator for boost.python library", author="Roman Yakovenko", author_email="rom...@gm...", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-20 07:15:32
|
Revision: 329 Author: roman_yakovenko Date: 2006-07-20 00:15:20 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=329&view=rev Log Message: ----------- u[dating documentation an setup scripts Modified Paths: -------------- pygccxml_dev/setup.py pyplusplus_dev/docs/documentation/tutorials/tutorials.rest pyplusplus_dev/setup.py Modified: pygccxml_dev/setup.py =================================================================== --- pygccxml_dev/setup.py 2006-07-20 07:01:05 UTC (rev 328) +++ pygccxml_dev/setup.py 2006-07-20 07:15:20 UTC (rev 329) @@ -21,7 +21,9 @@ html_writer = HTMLWriter( docindex , prj_name='pygccxml' , prj_url='http://www.language-binding.net' - , include_sourcecode=True ) + , include_sourcecode=False #This will decrease the size of generated documentation + , show_private=False + , show_frames=False) html_writer.write( os.path.join('docs', 'apidocs') ) Modified: pyplusplus_dev/docs/documentation/tutorials/tutorials.rest =================================================================== --- pyplusplus_dev/docs/documentation/tutorials/tutorials.rest 2006-07-20 07:01:05 UTC (rev 328) +++ pyplusplus_dev/docs/documentation/tutorials/tutorials.rest 2006-07-20 07:15:20 UTC (rev 329) @@ -8,7 +8,7 @@ What is pyplusplus? ------------------- -.. include:: ./../definition.rest +.. include:: ./../../definition.rest ------------------- Graphical interface Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-07-20 07:01:05 UTC (rev 328) +++ pyplusplus_dev/setup.py 2006-07-20 07:15:20 UTC (rev 329) @@ -54,9 +54,11 @@ html_writer = HTMLWriter( docindex , prj_name='pyplusplus' , prj_url='http://www.language-binding.net' - , include_sourcecode=True ) + , include_sourcecode=False #This will decrease the size of generated documentation + , show_private=False + , show_frames=False ) - html_writer.write( os.path.join('docs', 'apidocs') ) + html_writer.write( os.path.join('docs', 'documentation', 'apidocs') ) class doc_cmd(Command): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-08-20 14:17:02
|
Revision: 424 Author: roman_yakovenko Date: 2006-08-20 07:16:39 -0700 (Sun, 20 Aug 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=424&view=rev Log Message: ----------- adding documentation strings Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/container_traits.py pygccxml_dev/pygccxml/declarations/decl_printer.py pygccxml_dev/pygccxml/declarations/matcher.py pygccxml_dev/pygccxml/declarations/matchers.py pygccxml_dev/pygccxml/declarations/typedef.py pygccxml_dev/pygccxml/declarations/variable.py pygccxml_dev/setup.py pyplusplus_dev/setup.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2006-08-20 14:16:39 UTC (rev 424) @@ -54,7 +54,7 @@ from cpptypes import member_variable_type_t from cpptypes import declarated_t from cpptypes import type_qualifiers_t -#java types +#java types from cpptypes import java_fundamental_t from cpptypes import jbyte_t from cpptypes import jshort_t @@ -160,7 +160,7 @@ from type_traits import smart_pointer_traits -from container_traits import list_traits +from container_traits import list_traits from container_traits import deque_traits from container_traits import queue_traits from container_traits import priority_queue @@ -175,8 +175,9 @@ from container_traits import multiset_traits from container_traits import hash_multiset_traits -all_container_traits = [ - list_traits +all_container_traits = \ +[ + list_traits , deque_traits , queue_traits , priority_queue @@ -189,8 +190,9 @@ , set_traits , hash_set_traits , multiset_traits - , hash_multiset_traits + , hash_multiset_traits ] +"""list, that contains all STD container traits classes""" import templates import call_invocation @@ -220,10 +222,10 @@ from decl_printer import print_declarations -#implementation details: I need this trick in order to prevent recursive imports import scopedef -scopedef.scopedef_t._impl_all_decl_types = [ +scopedef.scopedef_t._impl_all_decl_types = \ +[ scopedef.scopedef_t , enumeration_t , namespace_t @@ -241,53 +243,53 @@ , member_operator_t , casting_operator_t , free_function_t - , free_operator_t + , free_operator_t ] -impl_matchers = scopedef.scopedef_t._impl_matchers -impl_decl_types = scopedef.scopedef_t._impl_decl_types +__impl_matchers = scopedef.scopedef_t._impl_matchers +__impl_decl_types = scopedef.scopedef_t._impl_decl_types -impl_matchers[ scopedef.scopedef_t.decl ] = declaration_matcher_t +__impl_matchers[ scopedef.scopedef_t.decl ] = declaration_matcher_t -impl_matchers[ scopedef.scopedef_t.class_ ] = declaration_matcher_t -impl_decl_types[ scopedef.scopedef_t.class_ ] = class_t +__impl_matchers[ scopedef.scopedef_t.class_ ] = declaration_matcher_t +__impl_decl_types[ scopedef.scopedef_t.class_ ] = class_t -impl_matchers[ scopedef.scopedef_t.variable ] = variable_matcher_t +__impl_matchers[ scopedef.scopedef_t.variable ] = variable_matcher_t -impl_matchers[ scopedef.scopedef_t.calldef ] = calldef_matcher_t -impl_decl_types[ scopedef.scopedef_t.calldef ] = calldef_t +__impl_matchers[ scopedef.scopedef_t.calldef ] = calldef_matcher_t +__impl_decl_types[ scopedef.scopedef_t.calldef ] = calldef_t -impl_matchers[ scopedef.scopedef_t.operator ] = operator_matcher_t -impl_decl_types[ scopedef.scopedef_t.operator ] = operator_t +__impl_matchers[ scopedef.scopedef_t.operator ] = operator_matcher_t +__impl_decl_types[ scopedef.scopedef_t.operator ] = operator_t -impl_matchers[ scopedef.scopedef_t.member_function ] = calldef_matcher_t -impl_decl_types[ scopedef.scopedef_t.member_function ] = member_function_t +__impl_matchers[ scopedef.scopedef_t.member_function ] = calldef_matcher_t +__impl_decl_types[ scopedef.scopedef_t.member_function ] = member_function_t -impl_matchers[ scopedef.scopedef_t.constructor ] = calldef_matcher_t -impl_decl_types[ scopedef.scopedef_t.constructor ] = constructor_t +__impl_matchers[ scopedef.scopedef_t.constructor ] = calldef_matcher_t +__impl_decl_types[ scopedef.scopedef_t.constructor ] = constructor_t -impl_matchers[ scopedef.scopedef_t.member_operator ] = operator_matcher_t -impl_decl_types[ scopedef.scopedef_t.member_operator ] = member_operator_t +__impl_matchers[ scopedef.scopedef_t.member_operator ] = operator_matcher_t +__impl_decl_types[ scopedef.scopedef_t.member_operator ] = member_operator_t -impl_matchers[ scopedef.scopedef_t.member_operator ] = operator_matcher_t -impl_decl_types[ scopedef.scopedef_t.member_operator ] = member_operator_t +__impl_matchers[ scopedef.scopedef_t.member_operator ] = operator_matcher_t +__impl_decl_types[ scopedef.scopedef_t.member_operator ] = member_operator_t -impl_matchers[ scopedef.scopedef_t.casting_operator ] = calldef_matcher_t -impl_decl_types[ scopedef.scopedef_t.casting_operator ] = casting_operator_t +__impl_matchers[ scopedef.scopedef_t.casting_operator ] = calldef_matcher_t +__impl_decl_types[ scopedef.scopedef_t.casting_operator ] = casting_operator_t -impl_matchers[ scopedef.scopedef_t.enumeration ] = declaration_matcher_t -impl_decl_types[ scopedef.scopedef_t.enumeration ] = enumeration_t +__impl_matchers[ scopedef.scopedef_t.enumeration ] = declaration_matcher_t +__impl_decl_types[ scopedef.scopedef_t.enumeration ] = enumeration_t -impl_matchers[ scopedef.scopedef_t.typedef ] = declaration_matcher_t -impl_decl_types[ scopedef.scopedef_t.typedef ] = typedef_t +__impl_matchers[ scopedef.scopedef_t.typedef ] = declaration_matcher_t +__impl_decl_types[ scopedef.scopedef_t.typedef ] = typedef_t -impl_matchers[ namespace_t.namespace ] = namespace_matcher_t +__impl_matchers[ namespace_t.namespace ] = namespace_matcher_t -impl_matchers[ namespace_t.free_function ] = calldef_matcher_t -impl_decl_types[ namespace_t.free_function ] = free_function_t +__impl_matchers[ namespace_t.free_function ] = calldef_matcher_t +__impl_decl_types[ namespace_t.free_function ] = free_function_t -impl_matchers[ namespace_t.free_operator ] = operator_matcher_t -impl_decl_types[ namespace_t.free_operator ] = free_operator_t +__impl_matchers[ namespace_t.free_operator ] = operator_matcher_t +__impl_decl_types[ namespace_t.free_operator ] = free_operator_t Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2006-08-20 14:16:39 UTC (rev 424) @@ -9,23 +9,40 @@ import calldef import cpptypes -import namespace +import namespace import templates import class_declaration import type_traits - + class container_traits_impl_t: + """this class implements the functionality needed for convinient work with + STD container classes. + + Implemented functionality: + - find out whether a declaration is STD container or not + - find out container value( mapped ) type + + This class tries to be useful as much, as possible. For example, for class + declaration( and not definition ) it parsers the class name in order to + extract all the information. + """ def __init__( self, container_name, element_type_index, element_type_typedef ): + """ + container_name - std container name + element_type_index - position of value\\mapped type within template + arguments list + element_type_typedef - class typedef to the value\\mapped type + """ self.name = container_name self.element_type_index = element_type_index - self.element_type_typedef = element_type_typedef + self.element_type_typedef = element_type_typedef def get_container_or_none( self, type ): """returns reference to the class declaration or None""" type = type_traits.remove_alias( type ) type = type_traits.remove_cv( type ) - - cls = None + + cls = None if isinstance( type, cpptypes.declarated_t ): cls = type_traits.remove_alias( type.declaration ) elif isinstance( type, class_declaration.class_t ): @@ -34,24 +51,27 @@ cls = type else: return - + if not cls.name.startswith( self.name + '<' ): - return - + return + if not type_traits.impl_details.is_defined_in_xxx( 'std', cls ): return return cls def is_my_case( self, type ): + """checks, whether type is STD container or not""" return bool( self.get_container_or_none( type ) ) - + def class_declaration( self, type ): + """returns reference to the class declaration""" cls = self.get_container_or_none( type ) if not cls: raise TypeError( 'Type "%s" is not instantiation of std::%s' % ( type.decl_string, self.name ) ) return cls - + def element_type( self, type ): + """returns reference to the class value\\mapped type declaration""" cls = self.class_declaration( type ) if isinstance( cls, class_declaration.class_t ): value_type = cls.typedef( self.element_type_typedef, recursive=False ).type @@ -60,26 +80,34 @@ value_type_str = templates.args( cls.name )[self.element_type_index] ref = type_traits.impl_details.find_value_type( cls.top_parent, value_type_str ) if None is ref: - raise RuntimeError( "Unable to find out %s '%s' value type." + raise RuntimeError( "Unable to find out %s '%s' value type." % ( self.name, cls.decl_string ) ) return ref + def create_traits_class( container_name, element_type_index, element_type_typedef ): + """ 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 is_my_case( type ): + """returns True if type is the container class, otherwise False""" return xxx_traits.impl.is_my_case( type ) - + @staticmethod def class_declaration( type ): + """returns reference to the container class""" return xxx_traits.impl.class_declaration( type ) - + @staticmethod def element_type( type ): + """returns reference to container name value\\mapped type class""" return xxx_traits.impl.element_type( type ) - + return xxx_traits list_traits = create_traits_class( 'list', 0, 'value_type' ) Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2006-08-20 14:16:39 UTC (rev 424) @@ -3,11 +3,16 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +""" +defines class, decl_printer_t that prints declarations tree in a user friendly format +""" + import os import sys import decl_visitor -import algorithm +import algorithm + class decl_printer_t( decl_visitor.decl_visitor_t ): """Helper class for printing decl tree. @@ -19,7 +24,7 @@ """ JUSTIFY = 20 INDENT_SIZE = 4 - + def __init__( self, level=0, print_details=True, recursive=True, writer=None ): decl_visitor.decl_visitor_t.__init__(self) self.__inst = None @@ -50,7 +55,7 @@ def _set_level(self, lvl): self.__level = lvl level = property( _get_level, _set_level ) - + def _get_print_details(self): return self.__print_details def _set_print_details(self, details): @@ -68,7 +73,7 @@ def _set_inst(self, inst): self.__inst = inst instance = property( _get_inst, _set_inst ) - + def __nice_decl_name( self, inst ): name = inst.__class__.__name__ return name @@ -76,15 +81,15 @@ # name = name[:-len('_t')] #return name.replace( '_', ' ' ) - def print_decl_header(self): + def print_decl_header(self): header = self.__nice_decl_name( self.__inst ) + ": '%s'" % self.__inst.name self.writer( ' ' * self.level * self.INDENT_SIZE + header.ljust( self.JUSTIFY ) + os.linesep ) if self.__print_details: - curr_level = self.level + 1 + curr_level = self.level + 1 if self.__inst.location: location = 'location: [%s]:%s'%(self.__inst.location.file_name, self.__inst.location.line) self.writer( ' ' * curr_level * self.INDENT_SIZE + location + os.linesep ) - artificial = 'artificial: ' + "'%s'" % str(self.__inst.is_artificial) + artificial = 'artificial: ' + "'%s'" % str(self.__inst.is_artificial) self.writer( ' ' * curr_level * self.INDENT_SIZE + artificial.ljust( self.JUSTIFY ) + os.linesep ) def __get_method_signature(self, decl=None): @@ -96,23 +101,23 @@ for arg in decl.arguments: args.append(arg.type.decl_string) return [retval, args] - + def visit_member_function( self ): self.print_decl_header() - self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "Signature: " + str( self.__get_method_signature() ) + os.linesep ) def visit_constructor( self ): self.print_decl_header() def visit_destructor( self ): - self.print_decl_header() + self.print_decl_header() def visit_member_operator( self ): - self.print_decl_header() + self.print_decl_header() def visit_casting_operator( self ): - self.print_decl_header() + self.print_decl_header() def visit_free_function( self ): self.print_decl_header() @@ -126,23 +131,23 @@ def visit_class(self ): self.print_decl_header() curr_level = self.level + 1 - class_type = 'class type: ' + "'%s'" % str(self.__inst.class_type) + class_type = 'class type: ' + "'%s'" % str(self.__inst.class_type) self.writer( ' ' * curr_level * self.INDENT_SIZE + class_type.ljust( self.JUSTIFY ) + os.linesep ) - + if self.__inst.aliases: aliases = map( lambda typedef: typedef.name, self.__inst.aliases ) msg = 'aliases: ' + `aliases` self.writer( ' ' * curr_level * self.INDENT_SIZE + msg.ljust( self.JUSTIFY ) + os.linesep ) - + def print_hierarchy(hierarchy_type, classes, curr_level): self.writer( ' ' * curr_level * self.INDENT_SIZE + hierarchy_type.ljust( self.JUSTIFY ) + os.linesep ) curr_level += 1 for class_ in classes: - class_str = 'class: ' + "'%s'" % str(class_.related_class.decl_string) + class_str = 'class: ' + "'%s'" % str(class_.related_class.decl_string) self.writer( ' ' * curr_level * self.INDENT_SIZE + class_str.ljust( self.JUSTIFY ) + os.linesep ) - access = 'access: ' + "'%s'" % str(class_.access) + access = 'access: ' + "'%s'" % str(class_.access) self.writer( ' ' * (curr_level + 1)* self.INDENT_SIZE + access.ljust( self.JUSTIFY ) + os.linesep ) - + def print_members(members_type, members, curr_level): self.writer( ' ' * curr_level * self.INDENT_SIZE + members_type.ljust( self.JUSTIFY ) + os.linesep ) if self.__recursive: @@ -151,17 +156,17 @@ prn = self.clone() prn.instance = member algorithm.apply_visitor( prn, member ) - + if self.__inst.bases: print_hierarchy( 'base classes: ', self.__inst.bases, curr_level ) - + if self.__inst.derived: print_hierarchy( 'derived classes: ', self.__inst.derived, curr_level ) print_members( 'public: ', self.__inst.public_members, curr_level ) print_members( 'protected: ', self.__inst.protected_members, curr_level ) print_members( 'private: ', self.__inst.private_members, curr_level ) - + def visit_enumeration(self): self.print_decl_header() curr_level = self.level + 1 @@ -178,7 +183,7 @@ prn = self.clone() prn.instance = decl algorithm.apply_visitor( prn, decl ) - + def visit_typedef(self ): self.print_decl_header() curr_level = self.level + 1 @@ -188,7 +193,7 @@ self.print_decl_header() curr_level = self.level + 1 self.writer( ' ' * curr_level * self.INDENT_SIZE + 'type: %s value: %s'%(self.__inst.type.decl_string, self.__inst.value) + os.linesep) - + def print_declarations( decls, detailed=True, recursive=True, writer=sys.stdout.write ): """ Print decl tree rooted at each of the included nodes. decls - either a single decl or a list of decls. @@ -199,4 +204,4 @@ for d in decls: prn.level = 0 prn.instance = d - algorithm.apply_visitor(prn, d) \ No newline at end of file + algorithm.apply_visitor(prn, d) Modified: pygccxml_dev/pygccxml/declarations/matcher.py =================================================================== --- pygccxml_dev/pygccxml/declarations/matcher.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/pygccxml/declarations/matcher.py 2006-08-20 14:16:39 UTC (rev 424) @@ -3,29 +3,42 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +"""implements few "find" algorithms on declarations tree""" + import types import algorithm class matcher: - + """class-namespace, contains implementation of few "find" algorithms and + definition of related exception classes""" + class declaration_not_found_t( RuntimeError ): + """exception, that will be raised, if the declaration could not be found""" def __init__( self, matcher ): RuntimeError.__init__( self ) self.matcher = matcher - + def __str__( self ): return "Unable to find declaration. matcher: [%s]"%str(self.matcher) class multiple_declarations_found_t( RuntimeError ): + """exception, that will be raised, if more than one declaration was found""" def __init__( self, matcher ): RuntimeError.__init__( self ) self.matcher = matcher - + def __str__( self ): return "Multiple declarations has been found. matcher: [%s]"%str(self.matcher) - + @staticmethod def find( decl_matcher, decls, recursive=True ): + """returns a list of declarations that match "decl_matcher" defined criretia or None + + @param decl_matcher: Python callable object, that takes one argument - reference to declaration + @param decls: reference to declaration or list of declarations to be searched in + @param recursive: boolean, if True the method will run decl_matcher, on internal declarations too + """ + where = [] if isinstance( decls, types.ListType ): where.extend( decls ) @@ -35,18 +48,34 @@ where = algorithm.make_flatten( where ) return filter( decl_matcher, where ) - @staticmethod + @staticmethod def find_single( decl_matcher, decls, recursive=True ): + """returns a reference to declaration, that match "decl_matcher" defined + criretia, if a unique declaration could not be found the method will return + None. + + @param decl_matcher: Python callable object, that takes one argument - reference to declaration + @param decls: reference to declaration or list of declarations to be searched in + @param recursive: boolean, if True the method will run decl_matcher, on internal declarations too + """ answer = matcher.find( decl_matcher, decls, recursive ) if len(answer) == 1: return answer[0] - @staticmethod + @staticmethod def get_single( decl_matcher, decls, recursive=True ): + """returns a reference to declaration, that match "decl_matcher" defined + criretia, if a unique declaration could not be found, an appropriate + exception will be raised. + + @param decl_matcher: Python callable object, that takes one argument - reference to declaration + @param decls: reference to declaration or list of declarations to be searched in + @param recursive: boolean, if True the method will run decl_matcher, on internal declarations too + """ answer = matcher.find( decl_matcher, decls, recursive ) if len(answer) == 1: return answer[0] elif len(answer) == 0: raise matcher.declaration_not_found_t( decl_matcher ) else: - raise matcher.multiple_declarations_found_t( decl_matcher ) \ No newline at end of file + raise matcher.multiple_declarations_found_t( decl_matcher ) Modified: pygccxml_dev/pygccxml/declarations/matchers.py =================================================================== --- pygccxml_dev/pygccxml/declarations/matchers.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/pygccxml/declarations/matchers.py 2006-08-20 14:16:39 UTC (rev 424) @@ -3,13 +3,18 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +""" +defines all "built-in" classes that implement declarations compare functionality +according to some criteria +""" + import os import re import types import algorithm import variable -import namespace -import calldef +import namespace +import calldef import cpptypes import templates import class_declaration @@ -21,7 +26,7 @@ """ def __init__( self ): object.__init__( self ) - + def __call__(self, decl): raise NotImplementedError( "matcher must always implement the __call__() method." ) @@ -36,13 +41,13 @@ def __or__(self, other): """or-operator (|)""" return or_matcher_t([self, other]) - + def __str__( self ): return "base class for all matchers" class and_matcher_t(matcher_base_t): - """Combine several other matchers with "&". - + """Combine several other matchers with "&". + For example: find all private functions with name XXX C{ matcher = access_type_matcher_t( 'private' ) & calldef_matcher_t( name='XXX' ) } @@ -63,7 +68,7 @@ class or_matcher_t(matcher_base_t): """Combine several other matchers with "|". - + For example: find all functions and variables with name 'XXX' C{ matcher = variable_matcher_t( name='XXX' ) | calldef_matcher_t( name='XXX' ) } @@ -84,8 +89,8 @@ class not_matcher_t(matcher_base_t): - """Return the inverse result of matcher, using "~" - + """Return the inverse result of matcher, using "~" + For example: find all private and protected declarations C{ matcher = ~access_type_matcher_t( 'private' ) } @@ -104,7 +109,7 @@ class declaration_matcher_t( matcher_base_t ): """ Instance of this class will match declarations by next criteria: - - declaration name, also could be fully qualified name + - declaration name, also could be fully qualified name Example: wstring or ::std::wstring - declaration type Example: L{class_t}, L{namespace_t}, L{enumeration_t} @@ -114,7 +119,7 @@ """ @param decl_type: declaration type to match by. For example L{enumeration_t}. @type decl_type: any class that derives from L{declarations.declaration_t} class - + @param name: declaration name, could be full name. @type name: str @@ -125,10 +130,10 @@ @type header_file: str """ - #An other option is that pygccxml will create absolute path using - #os.path.abspath function. But I think this is just wrong, because abspath - #builds path using current working directory. This behavior is fragile - #and very difficult to find a bug. + #An other option is that pygccxml will create absolute path using + #os.path.abspath function. But I think this is just wrong, because abspath + #builds path using current working directory. This behavior is fragile + #and very difficult to find a bug. matcher_base_t.__init__( self ) self.decl_type = decl_type self.__name = None @@ -136,17 +141,17 @@ self.__opt_tmpl_name = None self.__opt_is_full_name = None self.__decl_name_only = None - + self._set_name( name ) - + self.header_dir = header_dir self.header_file = header_file - + if self.header_dir: self.header_dir = utils.normalize_path( self.header_dir ) if not os.path.isabs( self.header_dir ): raise RuntimeError( "Path to header directory should be absolute!" ) - + if self.header_file: self.header_file = utils.normalize_path( self.header_file ) if not os.path.isabs( self.header_file ): @@ -180,7 +185,7 @@ self.__opt_is_full_name = False self.__decl_name_only = self.__name - + name = property( _get_name, _set_name ) def __str__( self ): @@ -196,7 +201,7 @@ if not msg: msg.append( 'any' ) return ' and '.join( msg ) - + def __call__( self, decl ): if not None is self.decl_type: if not isinstance( decl, self.decl_type ): @@ -218,7 +223,7 @@ def check_name( self, decl ): assert not None is self.name - + if self.__opt_is_tmpl_inst: if not self.__opt_is_full_name: if self.name != decl.name: @@ -234,20 +239,20 @@ if self.name != algorithm.full_name( decl ): return False return True - + def is_full_name(self): return self.__opt_is_full_name - + def _get_decl_name_only(self): return self.__decl_name_only decl_name_only = property( _get_decl_name_only ) - + class variable_matcher_t( declaration_matcher_t ): """ Instance of this class will match variables by next criteria: - L{declaration_matcher_t} criteria - variable type. Example: L{int_t} or 'int' - """ + """ def __init__( self, name=None, type=None, header_dir=None, header_file=None ): """ @param type: variable type @@ -259,7 +264,7 @@ , header_dir=header_dir , header_file=header_file ) self.type = type - + def __call__( self, decl ): if not super( variable_matcher_t, self ).__call__( decl ): return False @@ -288,7 +293,7 @@ def __init__( self, name=None ): declaration_matcher_t.__init__( self, name=name, decl_type=namespace.namespace_t) - + def __call__( self, decl ): if self.name and decl.name == '': #unnamed namespace have same name as thier parent, we should prevent @@ -296,15 +301,15 @@ #directly. return False return super( namespace_matcher_t, self ).__call__( decl ) - + class calldef_matcher_t( declaration_matcher_t ): """ Instance of this class will match callable by next criteria: - L{declaration_matcher_t} criteria - return type. Example: L{int_t} or 'int' - argument types - """ + """ def __init__( self, name=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None): """ @@ -312,9 +317,9 @@ @type return_type: string or instance of L{type_t} derived class @param arg_types: list of function argument types. arg_types can contain. - Any item within the list could be string or instance of L{type_t} derived - class. If you don't want some argument to participate in match you can - put None. For example: + Any item within the list could be string or instance of L{type_t} derived + class. If you don't want some argument to participate in match you can + put None. For example: C{ calldef_matcher_t( arg_types=[ 'int &', None ] ) } @@ -332,7 +337,7 @@ self.return_type = return_type self.arg_types = arg_types - + def __call__( self, decl ): if not super( calldef_matcher_t, self ).__call__( decl ): return False @@ -385,7 +390,7 @@ Instance of this class will match operators by next criteria: - L{calldef_matcher_t} criteria - operator symbol: =, !=, (), [] and etc - """ + """ def __init__( self, name=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None): """ @param symbol: operator symbol @@ -401,15 +406,15 @@ , header_dir=header_dir , header_file=header_file) self.symbol = symbol - + def __call__( self, decl ): if not super( operator_matcher_t, self ).__call__( decl ): return False - if not None is self.symbol: + if not None is self.symbol: if self.symbol != decl.symbol: return False return True - + def __str__( self ): msg = [ super( operator_matcher_t, self ).__str__() ] if msg == [ 'any' ]: @@ -418,45 +423,45 @@ msg.append( '(symbol==%s)' % str(self.symbol) ) if not msg: msg.append( 'any' ) - return ' and '.join( msg ) - + return ' and '.join( msg ) + class regex_matcher_t( matcher_base_t ): """ Instance of this class will match declaration using regular expression. - User should supply a function that will extract from declaration desired - information as string. Later, this matcher will match that string using + User should supply a function that will extract from declaration desired + information as string. Later, this matcher will match that string using user regular expression. - """ + """ def __init__( self, regex, function=None ): """ @param regex: regular expression @type regex: string, an instance of this class will compile it for you - + @param function: function that will be called to get an information from declaration as string. As input this function takes 1 argument: reference to declaration. Return value should be string. If function is None, then the matcher will use declaration name. - + """ matcher_base_t.__init__(self) self.regex = re.compile( regex ) self.function = function if None is self.function: self.function = lambda decl: decl.name - + def __call__( self, decl ): text = self.function( decl ) return bool( self.regex.match( text ) ) - + def __str__( self ): return '(regex=%s)' % self.regex - + class access_type_matcher_t( matcher_base_t ): """ - Instance of this class will match declaration by its access type: public, + Instance of this class will match declaration by its access type: public, private or protected. If declarations does not have access type, for example free function, then False will be returned. - """ + """ def __init__( self, access_type ): """ @@ -466,21 +471,21 @@ """ matcher_base_t.__init__( self ) self.access_type = access_type - + def __call__( self, decl ): if not isinstance( decl.parent, class_declaration.class_t ): return False return self.access_type == decl.parent.find_out_member_access_type( decl ) - + def __str__( self ): return '(access type=%s)' % self.access_type class virtuality_type_matcher_t( matcher_base_t ): """ - Instance of this class will match declaration by its virtuality type: not virtual, + Instance of this class will match declaration by its virtuality type: not virtual, virtual or pure virtual. If declarations does not have virtuality type, for example free function, then False will be returned. - """ + """ def __init__( self, virtuality_type ): """ @@ -489,12 +494,12 @@ """ matcher_base_t.__init__( self ) self.virtuality_type = virtuality_type - + def __call__( self, decl ): if not isinstance( decl.parent, class_declaration.class_t ): return False return self.virtuality_type == decl.virtuality - + def __str__( self ): return '(virtuality type=%s)' % self.virtuality_type @@ -502,7 +507,7 @@ class custom_matcher_t( matcher_base_t ): """ Instance of this class will match declaration by user custom criteria. - """ + """ def __init__( self, function ): """ @@ -511,10 +516,9 @@ """ matcher_base_t.__init__( self ) self.function = function - + def __call__( self, decl ): return bool( self.function( decl ) ) - + def __str__( self ): return '(user criteria)' - \ No newline at end of file Modified: pygccxml_dev/pygccxml/declarations/typedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/typedef.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/pygccxml/declarations/typedef.py 2006-08-20 14:16:39 UTC (rev 424) @@ -3,16 +3,22 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +""" +defines class that describes C++ typedef declaration +""" + import declaration class typedef_t( declaration.declaration_t ): + """describes C++ typedef declaration""" + def __init__( self, name='', parent=None, type=None ): declaration.declaration_t.__init__( self, name, parent ) self._type = type def _get__cmp__items( self ): return [self.type] - + def __eq__(self, other): if not declaration.declaration_t.__eq__( self, other ): return False @@ -22,4 +28,5 @@ return self._type def _set_type(self, type): self._type = type - type = property( _get_type, _set_type ) \ No newline at end of file + type = property( _get_type, _set_type + , doc="reference to the original L{type<type_t>}" ) Modified: pygccxml_dev/pygccxml/declarations/variable.py =================================================================== --- pygccxml_dev/pygccxml/declarations/variable.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/pygccxml/declarations/variable.py 2006-08-20 14:16:39 UTC (rev 424) @@ -3,16 +3,17 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) -import declaration +""" +defines class that describes C++ global and member variable declaration +""" +import declaration + class variable_t( declaration.declaration_t ): - def __init__( self - , name='' - , parent=None - , type=None - , type_qualifiers=None - , value=None - , bits=None): + """describes C++ global and member variable declaration""" + + def __init__( self, name='', parent=None, type=None, type_qualifiers=None, value=None, bits=None): + """@undocumented:""" declaration.declaration_t.__init__( self, name, parent ) self._type = type self._type_qualifiers = type_qualifiers @@ -20,9 +21,11 @@ self._bits = bits def _get__cmp__items( self ): + """@undocumented _get__cmp__items:""" return [ self.type, self.type_qualifiers, self.value ] - + def __eq__(self, other): + """@undocumented __eq__:""" if not declaration.declaration_t.__eq__( self, other ): return False return self.type == other.type \ @@ -34,22 +37,26 @@ return self._type def _set_type(self, type): self._type = type - type = property( _get_type, _set_type ) + type = property( _get_type, _set_type + , doc="reference to the variable L{type<type_t>}" ) def _get_type_qualifiers(self): return self._type_qualifiers def _set_type_qualifiers(self, type_qualifiers): self._type_qualifiers = type_qualifiers - type_qualifiers = property( _get_type_qualifiers, _set_type_qualifiers ) + type_qualifiers = property( _get_type_qualifiers, _set_type_qualifiers + , doc="reference to the L{type_qualifiers_t} instance" ) def _get_value(self): return self._value def _set_value(self, value): self._value = value - value = property( _get_value, _set_value ) + value = property( _get_value, _set_value + , doc="string, that contains the variable value" ) def _get_bits(self): return self._bits def _set_bits(self, bits): self._bits = bits - bits = property( _get_bits, _set_bits ) \ No newline at end of file + bits = property( _get_bits, _set_bits + , doc="int, that contains information how many bit takes bit field") Modified: pygccxml_dev/setup.py =================================================================== --- pygccxml_dev/setup.py 2006-08-20 07:45:50 UTC (rev 423) +++ pygccxml_dev/setup.py 2006-08-20 14:16:39 UTC (rev 424) @@ -13,7 +13,7 @@ """Generate the epydoc reference manual. """ print "Generating epydoc files..." - + from epydoc.docbuilder import build_doc_index from epydoc.docwriter.html import HTMLWriter @@ -21,12 +21,12 @@ html_writer = HTMLWriter( docindex , prj_name='pygccxml' , prj_url='http://www.language-binding.net' - , include_sourcecode=False #This will decrease the size of generated documentation + , include_source_code=False #This will decrease the size of generated documentation , show_private=False , show_frames=False) - + html_writer.write( os.path.join('docs', 'apidocs') ) - + class doc_cmd(Command): """This is a new distutils command 'doc' to build the epydoc manual. """ @@ -37,10 +37,10 @@ def initialize_options (self): self.no_doc = 0 - + def finalize_options (self): pass - + def run(self): if self.no_doc: return @@ -63,4 +63,4 @@ 'pygccxml.parser', 'pygccxml.utils' ], cmdclass = {"doc" : doc_cmd} -) \ No newline at end of file +) Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2006-08-20 07:45:50 UTC (rev 423) +++ pyplusplus_dev/setup.py 2006-08-20 14:16:39 UTC (rev 424) @@ -34,30 +34,30 @@ + environment_var_delimiter \ + pygccxml_path print "Setting PYTHONPATH to", os.environ["PYTHONPATH"] - -def generate_doc(): + +def generate_doc(): """Generate the epydoc reference manual. """ if not pygccxml_available: print "Please install pygccxml before generating the docs." sys.exit() - + add_pygccxml_to_PYTHONPATH() from epydoc.docbuilder import build_doc_index from epydoc.docwriter.html import HTMLWriter - print "Generating epydoc files..." + print "Generating epydoc files..." docindex = build_doc_index(['Py++', 'pygccxml']) html_writer = HTMLWriter( docindex , prj_name='Py++' , prj_url='http://www.language-binding.net' - , include_sourcecode=False #This will decrease the size of generated documentation + , include_source_code=False #This will decrease the size of generated documentation , show_private=False , show_frames=False ) - + html_writer.write( os.path.join('docs', 'documentation', 'apidocs') ) @@ -71,10 +71,10 @@ def initialize_options (self): self.no_doc = 0 - + def finalize_options (self): pass - + def run(self): if self.no_doc: return @@ -105,4 +105,4 @@ 'pyplusplus.utils', 'pyplusplus._logging_'], cmdclass = {"doc" : doc_cmd} -) \ No newline at end of file +) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-08-26 08:16:53
|
Revision: 473 Author: roman_yakovenko Date: 2006-08-26 01:16:46 -0700 (Sat, 26 Aug 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=473&view=rev Log Message: ----------- adding declaration cache test data file to manifest Modified Paths: -------------- pygccxml_dev/MANIFEST.in pygccxml_dev/pygccxml/utils/__init__.py Modified: pygccxml_dev/MANIFEST.in =================================================================== --- pygccxml_dev/MANIFEST.in 2006-08-26 07:43:43 UTC (rev 472) +++ pygccxml_dev/MANIFEST.in 2006-08-26 08:16:46 UTC (rev 473) @@ -1,13 +1,13 @@ -include LICENSE_1_0.txt -include MANIFEST.in -include unittests/*.py -include unittests/data/*.hpp -include unittests/data/*.xml -recursive-include docs/apidocs *.css -recursive-include docs/apidocs *.html -include docs/*.rest -include docs/*.png -include docs/example/* -include docs/history/* -include docs/logos/* -prune docs/*/.svn +include LICENSE_1_0.txt +include MANIFEST.in +include unittests/*.py +include unittests/data/*.hpp +include unittests/data/*.xml +include unittests/data/*.txt +recursive-include docs/apidocs *.css +recursive-include docs/apidocs *.html +include docs/*.rest +include docs/*.png +include docs/example/* +include docs/history/* +prune docs/*/.svn \ No newline at end of file Modified: pygccxml_dev/pygccxml/utils/__init__.py =================================================================== --- pygccxml_dev/pygccxml/utils/__init__.py 2006-08-26 07:43:43 UTC (rev 472) +++ pygccxml_dev/pygccxml/utils/__init__.py 2006-08-26 08:16:46 UTC (rev 473) @@ -77,4 +77,12 @@ def normalize_path( some_path ): """return os.path.normpath( os.path.normcase( some_path ) )""" - return os.path.normpath( os.path.normcase( some_path ) ) \ No newline at end of file + return os.path.normpath( os.path.normcase( some_path ) ) + +def get_architecture(): + if sys.maxint == 2147483647: + return 32 + elif sys.maxint == 9223372036854775807: + return 64 + else: + raise RuntimeError( "Unknown architecture" ) \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-09-18 08:18:18
|
Revision: 548 http://svn.sourceforge.net/pygccxml/?rev=548&view=rev Author: roman_yakovenko Date: 2006-09-18 01:18:09 -0700 (Mon, 18 Sep 2006) Log Message: ----------- improving pattern_parser.py Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/pattern_parser.py pygccxml_dev/unittests/call_invocation_tester.py Modified: pygccxml_dev/pygccxml/declarations/pattern_parser.py =================================================================== --- pygccxml_dev/pygccxml/declarations/pattern_parser.py 2006-09-17 08:46:42 UTC (rev 547) +++ pygccxml_dev/pygccxml/declarations/pattern_parser.py 2006-09-18 08:18:09 UTC (rev 548) @@ -66,8 +66,9 @@ if -1 == found: args.append( args_only[ previous_found : ] ) break - elif decl_string[ found ] == self.__end: - raise RuntimeError( "unmatched '%s' token has been found." % self.__end ) + #elif decl_string[ found ] == self.__end: + # print args + # raise RuntimeError( "unmatched '%s' token has been found." % self.__end ) else: args.append( args_only[ previous_found : found ] ) previous_found = found + 1 #skip found sep Modified: pygccxml_dev/unittests/call_invocation_tester.py =================================================================== --- pygccxml_dev/unittests/call_invocation_tester.py 2006-09-17 08:46:42 UTC (rev 547) +++ pygccxml_dev/unittests/call_invocation_tester.py 2006-09-18 08:18:09 UTC (rev 548) @@ -14,11 +14,11 @@ class tester_t( unittest.TestCase ): def __init__(self, *args ): unittest.TestCase.__init__( self, *args ) - + def __test_split_impl(self, decl_string, name, args): self.failUnless( ( name, args ) == declarations.call_invocation.split( decl_string ) ) - def __test_split_recursive_impl(self, decl_string, control_seq): + def __test_split_recursive_impl(self, decl_string, control_seq): self.failUnless( control_seq == declarations.call_invocation.split_recursive( decl_string ) ) def __test_is_call_invocation_impl( self, decl_string ): @@ -26,7 +26,7 @@ def test_split_on_vector(self): self.__test_is_call_invocation_impl( "vector(int,std::allocator(int) )" ) - + self.__test_split_impl( "vector(int,std::allocator(int) )" , "vector" , [ "int", "std::allocator(int)" ] ) @@ -37,14 +37,14 @@ def test_split_on_string(self): self.__test_is_call_invocation_impl( "basic_string(char,std::char_traits(char),std::allocator(char) )" ) - + self.__test_split_impl( "basic_string(char,std::char_traits(char),std::allocator(char) )" , "basic_string" , [ "char", "std::char_traits(char)", "std::allocator(char)" ] ) - + def test_split_on_map(self): self.__test_is_call_invocation_impl( "map(long int,std::vector(int, std::allocator(int) ),std::less(long int),std::allocator(std::pair(const long int, std::vector(int, std::allocator(int) ) ) ) )" ) - + self.__test_split_impl( "map(long int,std::vector(int, std::allocator(int) ),std::less(long int),std::allocator(std::pair(const long int, std::vector(int, std::allocator(int) ) ) ) )" , "map" , [ "long int" @@ -53,7 +53,7 @@ , "std::allocator(std::pair(const long int, std::vector(int, std::allocator(int) ) ) )" ] ) def test_join_on_vector(self): - self.failUnless( "vector( int, std::allocator(int) )" + self.failUnless( "vector( int, std::allocator(int) )" == declarations.call_invocation.join("vector", ( "int", "std::allocator(int)" ) ) ) def test_find_args(self): @@ -67,9 +67,15 @@ self.failUnless( (1,9) == found ) found = declarations.call_invocation.find_args( temp, found[1]+1 ) self.failUnless( (10, 14) == found ) - + + def test_bug_unmatched_brace( self ): + src = 'AlternativeName((&string("")), (&string("")), (&string("")))' + self.__test_split_impl( src + , 'AlternativeName' + , ['(&string(""))', '(&string(""))', '(&string(""))'] ) + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -77,4 +83,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-10-04 09:53:20
|
Revision: 618 http://svn.sourceforge.net/pygccxml/?rev=618&view=rev Author: roman_yakovenko Date: 2006-10-04 02:53:10 -0700 (Wed, 04 Oct 2006) Log Message: ----------- adding access_type for variable_t class Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/variable.py pygccxml_dev/unittests/variable_matcher_tester.py Modified: pygccxml_dev/pygccxml/declarations/variable.py =================================================================== --- pygccxml_dev/pygccxml/declarations/variable.py 2006-10-03 22:14:04 UTC (rev 617) +++ pygccxml_dev/pygccxml/declarations/variable.py 2006-10-04 09:53:10 UTC (rev 618) @@ -8,6 +8,7 @@ """ import declaration +import class_declaration class variable_t( declaration.declaration_t ): """describes C++ global and member variable declaration""" @@ -60,3 +61,10 @@ self._bits = bits bits = property( _get_bits, _set_bits , doc="integer, that contains information about how many bit takes bit field") + + @property + def access_type(self): + if not isinstance( self.parent, class_declaration.class_t ): + raise RuntimeError( "access_type functionality only available on member variables and not on global variables" ) + return self.parent.find_out_member_access_type( self ) + Modified: pygccxml_dev/unittests/variable_matcher_tester.py =================================================================== --- pygccxml_dev/unittests/variable_matcher_tester.py 2006-10-03 22:14:04 UTC (rev 617) +++ pygccxml_dev/unittests/variable_matcher_tester.py 2006-10-04 09:53:10 UTC (rev 618) @@ -13,33 +13,35 @@ from pygccxml import declarations class tester_t( parser_test_case.parser_test_case_t ): - COMPILATION_MODE = parser.COMPILATION_MODE.ALL_AT_ONCE + COMPILATION_MODE = parser.COMPILATION_MODE.ALL_AT_ONCE def __init__(self, *args ): parser_test_case.parser_test_case_t.__init__( self, *args ) self.header = 'bit_fields.hpp' self.declarations = None - + def setUp(self): if not self.declarations: self.declarations = parser.parse( [self.header], self.config ) - - def test( self ): + + def test( self ): criteria = declarations.variable_matcher_t( name='x', type='unsigned int' ) x = declarations.matcher.get_single( criteria, self.declarations ) - + self.failUnless( str(criteria) == '(decl type==variable_t) and (name==x) and (value type==unsigned int)' ) - - criteria = declarations.variable_matcher_t( + + criteria = declarations.variable_matcher_t( name='::bit_fields::fields_t::x' , type=declarations.unsigned_int_t() , header_dir=os.path.dirname(x.location.file_name) , header_file=x.location.file_name) - + x = declarations.matcher.get_single( criteria, self.declarations ) self.failUnless( x, "Variable was not found." ) + self.failUnless( 'public' == x.access_type ) + def create_suite(): - suite = unittest.TestSuite() + suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) return suite @@ -47,4 +49,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-10-19 08:23:16
|
Revision: 677 http://svn.sourceforge.net/pygccxml/?rev=677&view=rev Author: roman_yakovenko Date: 2006-10-19 01:23:06 -0700 (Thu, 19 Oct 2006) Log Message: ----------- adding gccxml installer Python script Added Paths: ----------- pygccxml_dev/gccxml_installer/ pygccxml_dev/gccxml_installer/build_setup.py pygccxml_dev/gccxml_installer/config.py pygccxml_dev/gccxml_installer/setup.py Added: pygccxml_dev/gccxml_installer/build_setup.py =================================================================== --- pygccxml_dev/gccxml_installer/build_setup.py (rev 0) +++ pygccxml_dev/gccxml_installer/build_setup.py 2006-10-19 08:23:06 UTC (rev 677) @@ -0,0 +1,43 @@ +import os +import sys + +class settings: + gccxml_cvs_dir = "" + gccxml_bin_dir = "" + destination_dir = "" + gccxml_version = "0.7" + +#Deploy layout: +#root +# / bin +# - gccxml.exe +# - gccxml_cc1plus.exe +# - gccxml_vcupdate.bat +# / doc +# - Copyright.txt +# - gccxml.html +# - gccxml.txt +# / share +# / gccxml + version +# - gccxml_config # contains gccxml compiler +# / Borland +# * contains patches relevant for Borland compiler +# * "as is" copy of directory from cvs layout +# / Vc6 +# / Vc7 +# / Vc71 +# * contains patches relevant for Vc6 compiler +# * Patches created by running vcInstall + vcPatch programs from /VcInstall +# * directory +# /VcInstall +# * I am not sure whether this directory should be installed or not + +def makedirs( path ): + if not os.path.exists( path ): + os.makedirs( path ) + return path + +bin_dir_dest = makedirs( os.path.join( settings.destination_dir, 'bin' ) ) +bin_dir_source = settings.gccxml_bin_dir +if sys.platform + Added: pygccxml_dev/gccxml_installer/config.py =================================================================== --- pygccxml_dev/gccxml_installer/config.py (rev 0) +++ pygccxml_dev/gccxml_installer/config.py 2006-10-19 08:23:06 UTC (rev 677) @@ -0,0 +1,28 @@ +import sys + +#Directory path, in which you want to install GCC-XML. +#If directory does not exist, it will be created +destination_dir = None + +class vc6: + install_dir = None + +class vc7: + install_dir = None + +class vc71: + install_dir = None + +class borland55: + install_dir = None + +class gcc: + install_dir = None + + + +compilers = [] +if 'linux' in sys.platform: + compilers.append( gcc ) +else 'win' in sys.platform: + compilers.extend( [ vc6, vc7, vc71, borland55 ] ) Added: pygccxml_dev/gccxml_installer/setup.py =================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-11-30 10:34:04
|
Revision: 766 http://svn.sourceforge.net/pygccxml/?rev=766&view=rev Author: roman_yakovenko Date: 2006-11-30 02:33:59 -0800 (Thu, 30 Nov 2006) Log Message: ----------- adding new functionality: declarations will report declarations and types they depend on Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/calldef.py pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/declaration.py pygccxml_dev/pygccxml/declarations/enumeration.py pygccxml_dev/pygccxml/declarations/namespace.py pygccxml_dev/pygccxml/declarations/scopedef.py pygccxml_dev/pygccxml/declarations/typedef.py pygccxml_dev/pygccxml/declarations/variable.py pygccxml_dev/unittests/test_all.py Added Paths: ----------- pygccxml_dev/pygccxml/declarations/dependencies.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2006-11-30 10:33:59 UTC (rev 766) @@ -6,7 +6,7 @@ """ contains classes that describe different C++ declarations """ - +from dependencies import dependency_info_t from declaration import location_t from declaration import declaration_t from scopedef import scopedef_t Modified: pygccxml_dev/pygccxml/declarations/calldef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/calldef.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/calldef.py 2006-11-30 10:33:59 UTC (rev 766) @@ -21,6 +21,7 @@ import algorithm import declaration import type_traits +import dependencies import call_invocation class VIRTUALITY_TYPES: @@ -270,6 +271,17 @@ demangled_name = property( _get_demangled_name , doc="returns function demangled name. It can help you to deal with function template instantiations") + def i_depend_on_them( self ): + report_dependency = lambda x: dependencies.dependency_info_t( self, x ) + answer = [] + map( lambda arg: answer.append( report_dependency( arg.type ) ) + , self.arguments ) + if self.return_type: + answer.append( report_dependency( self.return_type ) ) + map( lambda exception: answer.append( report_dependency( exception ) ) + , self.exceptions ) + return answer + #Second level in hierarchy of calldef class member_calldef_t( calldef_t ): """base class for "callable" declarations that defined within C++ class or struct""" Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2006-11-30 10:33:59 UTC (rev 766) @@ -15,6 +15,7 @@ import scopedef import algorithm import declaration +import dependencies class ACCESS_TYPES: """class that defines "access" constants""" @@ -83,7 +84,10 @@ def _get__cmp__items(self): """implementation details""" return [] - + + def i_depend_on_them( self ): + return [] + class class_t( scopedef.scopedef_t ): """describes class definition""" @@ -330,3 +334,24 @@ else: return member.cache.access_type + def __find_out_member_dependencies( self, access_type ): + members = self.get_members( access_type ) + answer = [] + map( lambda mem: answer.extend( mem.i_depend_on_them() ), members ) + member_ids = set( map( lambda m: id( m ), members ) ) + for dependency in answer: + if id( dependency.declaration ) in member_ids: + dependency.access_type = access_type + return answer + + def i_depend_on_them( self ): + report_dependency = lambda *args: dependencies.dependency_info_t( self, *args ) + answer = [] + + map( lambda base: answer.append( report_dependency( base.related_class, base.access_type ) ) + , self.bases ) + + map( lambda access_type: answer.extend( self.__find_out_member_dependencies( access_type ) ) + , ACCESS_TYPES.ALL ) + + return answer Modified: pygccxml_dev/pygccxml/declarations/declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/declaration.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/declaration.py 2006-11-30 10:33:59 UTC (rev 766) @@ -244,3 +244,8 @@ reference to instance of L{algorithms_cache.algorithms_cache_t} class. """ return self._cache + + def i_depend_on_them( self ): + #this method should return list of all types, declarations it depends on + print self + raise NotImplementedError() Added: pygccxml_dev/pygccxml/declarations/dependencies.py =================================================================== --- pygccxml_dev/pygccxml/declarations/dependencies.py (rev 0) +++ pygccxml_dev/pygccxml/declarations/dependencies.py 2006-11-30 10:33:59 UTC (rev 766) @@ -0,0 +1,34 @@ +# 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) + +""" +""" + +class dependency_info_t( object ): + def __init__( self, declaration, depend_on_it, access_type=None ): + object.__init__( self ) + self._declaration = declaration + self._depend_on_it = depend_on_it + self._access_type = access_type + + @property + def declaration( self ): + return self._declaration + #short name + decl = declaration + + @property + def depend_on_it( self ): + return self._depend_on_it + + def _get_access_type( self ): + return self._access_type + def _set_access_type( self, access_type ): + self._access_type = access_type + access_type = property( _get_access_type, _set_access_type ) + + def __str__( self ): + return 'declaration "%s" depends( %s ) on "%s" ' \ + % ( self.declaration, self.access_type, self.depend_on_it ) Modified: pygccxml_dev/pygccxml/declarations/enumeration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/enumeration.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/enumeration.py 2006-11-30 10:33:59 UTC (rev 766) @@ -113,3 +113,6 @@ for val, num in self._values: x[val] = num return x + + def i_depend_on_them( self ): + return [] Modified: pygccxml_dev/pygccxml/declarations/namespace.py =================================================================== --- pygccxml_dev/pygccxml/declarations/namespace.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/namespace.py 2006-11-30 10:33:59 UTC (rev 766) @@ -135,3 +135,7 @@ , recursive=recursive , allow_empty=allow_empty) + def i_depend_on_them( self ): + answer = [] + map( lambda decl: answer.extend( decl.i_depend_on_them() ), self.declarations ) + return answer Modified: pygccxml_dev/pygccxml/declarations/scopedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/scopedef.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/scopedef.py 2006-11-30 10:33:59 UTC (rev 766) @@ -625,6 +625,3 @@ - - - Modified: pygccxml_dev/pygccxml/declarations/typedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/typedef.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/typedef.py 2006-11-30 10:33:59 UTC (rev 766) @@ -8,6 +8,7 @@ """ import declaration +import dependencies class typedef_t( declaration.declaration_t ): """describes C++ typedef declaration""" @@ -32,3 +33,6 @@ self._type = type type = property( _get_type, _set_type , doc="reference to the original L{type<type_t>}" ) + + def i_depend_on_them( self ): + return [ dependencies.dependency_info_t( self, self.type ) ] Modified: pygccxml_dev/pygccxml/declarations/variable.py =================================================================== --- pygccxml_dev/pygccxml/declarations/variable.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/pygccxml/declarations/variable.py 2006-11-30 10:33:59 UTC (rev 766) @@ -8,6 +8,7 @@ """ import declaration +import dependencies import class_declaration class variable_t( declaration.declaration_t ): @@ -68,3 +69,5 @@ raise RuntimeError( "access_type functionality only available on member variables and not on global variables" ) return self.parent.find_out_member_access_type( self ) + def i_depend_on_them( self ): + return [ dependencies.dependency_info_t( self, self.type ) ] Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2006-11-29 20:10:52 UTC (rev 765) +++ pygccxml_dev/unittests/test_all.py 2006-11-30 10:33:59 UTC (rev 766) @@ -39,6 +39,7 @@ import declarations_cache_tester import has_binary_operator_traits_tester import algorithms_cache_tester +import dependencies_tester def create_suite(): testers = [ @@ -77,6 +78,7 @@ , declarations_cache_tester , has_binary_operator_traits_tester , algorithms_cache_tester + , dependencies_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-11-30 13:47:14
|
Revision: 769 http://svn.sourceforge.net/pygccxml/?rev=769&view=rev Author: roman_yakovenko Date: 2006-11-30 05:47:13 -0800 (Thu, 30 Nov 2006) Log Message: ----------- adding missing dependencies tester adding find_out_depend_on_declaration functionality Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/dependencies.py Added Paths: ----------- pygccxml_dev/unittests/dependencies_tester.py Property Changed: ---------------- pygccxml_dev/unittests/ Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2006-11-30 11:22:15 UTC (rev 768) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2006-11-30 13:47:13 UTC (rev 769) @@ -19,6 +19,8 @@ from class_declaration import hierarchy_info_t from class_declaration import class_declaration_t +class_types = ( class_t, class_declaration_t ) + from typedef import typedef_t from cpptypes import type_t Modified: pygccxml_dev/pygccxml/declarations/dependencies.py =================================================================== --- pygccxml_dev/pygccxml/declarations/dependencies.py 2006-11-30 11:22:15 UTC (rev 768) +++ pygccxml_dev/pygccxml/declarations/dependencies.py 2006-11-30 13:47:13 UTC (rev 769) @@ -4,11 +4,17 @@ # http://www.boost.org/LICENSE_1_0.txt) """ +this module contains class that keeps dependency information of some declaration """ +import cpptypes + class dependency_info_t( object ): def __init__( self, declaration, depend_on_it, access_type=None ): object.__init__( self ) + #prevent recursive import + import class_declaration + assert isinstance( depend_on_it, ( class_declaration.class_t, cpptypes.type_t ) ) self._declaration = declaration self._depend_on_it = depend_on_it self._access_type = access_type @@ -32,3 +38,17 @@ def __str__( self ): return 'declaration "%s" depends( %s ) on "%s" ' \ % ( self.declaration, self.access_type, self.depend_on_it ) + + def find_out_depend_on_declaration( self ): + """if declaration depends on other declaration and not on some type + this function will return reference to it. Otherwise None will be returned + """ + #prevent recursive import + from pygccxml import declarations + + if isinstance( self.depend_on_it, declarations.declaration_t ): + return self.depend_on_it + base_type = declarations.base_type( declarations.remove_alias( self.depend_on_it ) ) + if isinstance( base_type, cpptypes.declarated_t ): + return base_type.declaration + return None Property changes on: pygccxml_dev/unittests ___________________________________________________________________ Name: svn:ignore + *.pyc Added: pygccxml_dev/unittests/dependencies_tester.py =================================================================== --- pygccxml_dev/unittests/dependencies_tester.py (rev 0) +++ pygccxml_dev/unittests/dependencies_tester.py 2006-11-30 13:47:13 UTC (rev 769) @@ -0,0 +1,95 @@ +# 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 ): + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.header = 'include_all.hpp' + self.global_ns = None + + def setUp(self): + if not self.global_ns: + decls = parser.parse( [self.header], self.config ) + self.global_ns = declarations.get_global_namespace( decls ) + self.global_ns.init_optimizer() + + def test_variable( self ): + ns_vars = self.global_ns.namespace( '::declarations::variables' ) + static_var = ns_vars.variable( 'static_var' ) + dependencies = static_var.i_depend_on_them() + self.failUnless( len(dependencies) == 1 ) + self.failUnless( dependencies[0].declaration is static_var ) + self.failUnless( dependencies[0].depend_on_it.decl_string == 'int' ) + + m_mutable = ns_vars.variable( 'm_mutable' ) + dependencies = m_mutable.i_depend_on_them() + self.failUnless( len(dependencies) == 1 ) + self.failUnless( dependencies[0].declaration is m_mutable ) + self.failUnless( dependencies[0].depend_on_it.decl_string == 'int' ) + + def test_class( self ): + ns_vars = self.global_ns.namespace( '::declarations::variables' ) + + cls = ns_vars.class_( 'struct_variables_t' ) + dependencies = cls.i_depend_on_them() + self.failUnless( len(dependencies) == 2 ) #compiler generated copy constructor + + m_mutable = ns_vars.variable( 'm_mutable' ) + dependencies = filter( lambda dependency: dependency.declaration is m_mutable + , dependencies ) + self.failUnless( len(dependencies) == 1 ) + self.failUnless( dependencies[0].depend_on_it.decl_string == 'int' ) + self.failUnless( dependencies[0].access_type == 'public' ) + + ns_dh = self.global_ns.namespace( '::core::diamand_hierarchy' ) + fd_cls = ns_dh.class_( 'final_derived_t' ) + derived1_cls = ns_dh.class_( 'derived1_t' ) + dependencies = fd_cls.i_depend_on_them() + dependencies = filter( lambda dependency: dependency.depend_on_it is derived1_cls + , dependencies ) + self.failUnless( len(dependencies) == 1 ) + self.failUnless( dependencies[0].depend_on_it is derived1_cls) + self.failUnless( dependencies[0].access_type == 'public' ) + + def test_calldefs( self ): + ns = self.global_ns.namespace( '::declarations::calldef' ) + return_default_args = ns.calldef( 'return_default_args' ) + dependencies = return_default_args.i_depend_on_them() + self.failUnless( len(dependencies) == 3 ) + used_types = map( lambda dependency: dependency.depend_on_it.decl_string + , dependencies ) + + self.failUnless( used_types == [ 'int', 'bool', 'int' ] ) + + some_exception = ns.class_( 'some_exception_t' ) + other_exception = ns.class_( 'other_exception_t' ) + calldef_with_throw = ns.calldef( 'calldef_with_throw' ) + dependencies = calldef_with_throw.i_depend_on_them() + self.failUnless( len(dependencies) == 3 ) + dependencies = filter( lambda dependency: dependency.depend_on_it in ( some_exception, other_exception ) + , dependencies ) + self.failUnless( len(dependencies) == 2 ) + + def test_coverage( self ): + self.global_ns.i_depend_on_them() + +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() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-04 11:35:11
|
Revision: 843 http://svn.sourceforge.net/pygccxml/?rev=843&view=rev Author: roman_yakovenko Date: 2007-01-04 03:35:11 -0800 (Thu, 04 Jan 2007) Log Message: ----------- extending is_base_and_derived to take a list of possible derived classes Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/type_traits_tester.py Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-01-04 06:46:32 UTC (rev 842) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-01-04 11:35:11 UTC (rev 843) @@ -390,13 +390,20 @@ def is_base_and_derived( based, derived ): """returns True, if there is "base and derived" relationship between classes, False otherwise""" assert isinstance( based, class_declaration.class_t ) - assert isinstance( derived, class_declaration.class_t ) + assert isinstance( derived, ( class_declaration.class_t, tuple ) ) - for base_desc in derived.recursive_bases: - if base_desc.related_class == based: - return True + all_derived = None + if isinstance( derived, class_declaration.class_t ): + all_derived = ( derived ) + else: #tuple + all_derived = derived + + for derived_cls in all_derived: + for base_desc in derived_cls.recursive_bases: + if base_desc.related_class == based: + return True return False - + def has_any_non_copyconstructor( type): """returns True, if class has any non "copy constructor", otherwise False""" assert isinstance( type, class_declaration.class_t ) Modified: pygccxml_dev/unittests/type_traits_tester.py =================================================================== --- pygccxml_dev/unittests/type_traits_tester.py 2007-01-04 06:46:32 UTC (rev 842) +++ pygccxml_dev/unittests/type_traits_tester.py 2007-01-04 11:35:11 UTC (rev 843) @@ -129,6 +129,7 @@ , type=declarations.class_t , name='derived' ) self.failUnless( base and derived and declarations.is_base_and_derived( base, derived ) ) + self.failUnless( base and derived and declarations.is_base_and_derived( base, ( derived, derived ) ) ) unrelated1 = declarations.find_declaration( ns.declarations , type=declarations.class_t @@ -232,4 +233,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-04 21:44:39
|
Revision: 847 http://svn.sourceforge.net/pygccxml/?rev=847&view=rev Author: roman_yakovenko Date: 2007-01-04 13:44:37 -0800 (Thu, 04 Jan 2007) Log Message: ----------- fixing bug reported by Martin Preisler Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/pygccxml/parser/patcher.py pygccxml_dev/unittests/autoconfig.py Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-01-04 21:21:25 UTC (rev 846) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-01-04 21:44:37 UTC (rev 847) @@ -394,7 +394,7 @@ all_derived = None if isinstance( derived, class_declaration.class_t ): - all_derived = ( derived ) + all_derived = ( [derived] ) else: #tuple all_derived = derived Modified: pygccxml_dev/pygccxml/parser/patcher.py =================================================================== --- pygccxml_dev/pygccxml/parser/patcher.py 2007-01-04 21:21:25 UTC (rev 846) +++ pygccxml_dev/pygccxml/parser/patcher.py 2007-01-04 21:44:37 UTC (rev 847) @@ -57,11 +57,12 @@ type_ = declarations.remove_reference( declarations.remove_cv( arg.type ) ) if not declarations.is_enum( type_ ): return False - return type_.declaration.has_value_name( arg.default_value ) + enum_type = declarations.enum_declaration( type_ ) + return enum_type.has_value_name( arg.default_value ) def __fix_unqualified_enum( self, func, arg): type_ = declarations.remove_reference( declarations.remove_cv( arg.type ) ) - enum_type = type_.declaration + enum_type = declarations.enum_declaration( type_ ) return self.__join_names( enum_type.parent.decl_string, arg.default_value ) def __is_invalid_integral(self, func, arg): Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2007-01-04 21:21:25 UTC (rev 846) +++ pygccxml_dev/unittests/autoconfig.py 2007-01-04 21:44:37 UTC (rev 847) @@ -18,7 +18,7 @@ if sys.platform == 'win32': gccxml_path = r'd:/dev/gccxml_cvs/gccxml-bin/bin/release/gccxml.exe' else: - gccxml_path = '/home/roman/gccxml-build/bin/gccxml' + gccxml_path = '/home/roman/gccxml/bin/gccxml' try: import pygccxml This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-16 10:01:38
|
Revision: 907 http://svn.sourceforge.net/pygccxml/?rev=907&view=rev Author: roman_yakovenko Date: 2007-02-16 02:01:39 -0800 (Fri, 16 Feb 2007) Log Message: ----------- fixing bug in is_convertible functionality: there is no implicit conversion between integral types and void* Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/type_traits.hpp pygccxml_dev/unittests/type_traits_tester.py Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-02-16 09:36:27 UTC (rev 906) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-02-16 10:01:39 UTC (rev 907) @@ -555,7 +555,10 @@ if is_reference( target ) and is_const( target.base ) and is_same( source, target.base.base ): return True #X => const X& if is_same( target, cpptypes.pointer_t( cpptypes.void_t() ) ): - return True #X => void* + if is_integral( source ) or is_enum( source ): + return False + else: + return True #X => void* if is_pointer( source ) and is_pointer( target ): if is_const( target.base ) and is_same( source.base, target.base.base ): return True#X* => const X* @@ -763,31 +766,31 @@ and not is_void( target ): return True # enum could be converted to any integral type - assert isinstance( source.declaration, class_declaration.class_t ) - source_inst = source.declaration - #class instance could be convertible to something else if it has operator - casting_operators = algorithm.find_all_declarations( source_inst.declarations - , type=calldef.casting_operator_t - , recursive=False ) - if casting_operators: - for operator in casting_operators: - if is_convertible( operator.return_type, target ): - return True + if isinstance( source.declaration, class_declaration.class_t ): + source_inst = source.declaration + #class instance could be convertible to something else if it has operator + casting_operators = algorithm.find_all_declarations( source_inst.declarations + , type=calldef.casting_operator_t + , recursive=False ) + if casting_operators: + for operator in casting_operators: + if is_convertible( operator.return_type, target ): + return True #may be target is class too, so in this case we should check whether is #has constructor from source if isinstance( target, cpptypes.declarated_t ): - assert isinstance( target.declaration, class_declaration.class_t ) - constructors = algorithm.find_all_declarations( target.declaration.declarations - , type=calldef.constructor_t - , recursive=False ) - if constructors: - for constructor in constructors: - if 1 != len( constructor.arguments ): - continue - #TODO: add test to check explicitness - if is_convertible( source, constructor.arguments[0].type ): - return True + if isinstance( target.declaration, class_declaration.class_t ): + constructors = algorithm.find_all_declarations( target.declaration.declarations + , type=calldef.constructor_t + , recursive=False ) + if constructors: + for constructor in constructors: + if 1 != len( constructor.arguments ): + continue + #TODO: add test to check explicitness + if is_convertible( source, constructor.arguments[0].type ): + return True return False Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-02-16 09:36:27 UTC (rev 906) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-02-16 10:01:39 UTC (rev 907) @@ -592,8 +592,8 @@ struct x70 : public tester_t< float, int&, false >{}; struct x71 : public tester_t< float, const int&, true >{}; struct x72 : public tester_t< other, void*, true >{}; -struct x73 : public tester_t< int, void*, true >{}; -struct x74 : public tester_t< fruit, void*, true >{}; +struct x73 : public tester_t< int, void*, false >{}; +struct x74 : public tester_t< fruit, void*, false >{}; struct x75 : public tester_t< other, int*, false >{}; struct x76 : public tester_t< other*, int*, false >{}; struct x77 : public tester_t< fruit, int, true >{}; Modified: pygccxml_dev/unittests/type_traits_tester.py =================================================================== --- pygccxml_dev/unittests/type_traits_tester.py 2007-02-16 09:36:27 UTC (rev 906) +++ pygccxml_dev/unittests/type_traits_tester.py 2007-02-16 10:01:39 UTC (rev 907) @@ -203,8 +203,6 @@ self.failUnless( declarations.is_binary_operator( operator_pe ), 'operator+= should be idenitified as binray operator' ) def __is_convertible_impl( self, decl ): - if decl.name == 'x81': - i = 0 defs = decl.bases[0].related_class.declarations source_type = declarations.find_declaration( defs, name='source_type' ) target_type = declarations.find_declaration( defs, name='target_type' ) @@ -212,8 +210,8 @@ , name='expected' , type=declarations.enumeration_t ) expected_value = bool( expected_type.get_name2value_dict()['value'] ) - if expected_value != declarations.is_convertible( source_type, target_type ): - print decl.name + self.failUnless( expected_value == declarations.is_convertible( source_type, target_type ) + , 'Check conversion failed for ' + decl.name ) def test_is_convertible( self ): ns_is_convertible = declarations.find_declaration( self.declarations This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-22 19:04:07
|
Revision: 920 http://svn.sourceforge.net/pygccxml/?rev=920&view=rev Author: roman_yakovenko Date: 2007-02-22 11:04:04 -0800 (Thu, 22 Feb 2007) Log Message: ----------- adding new unittest - is_noncopyable Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/type_traits.hpp pygccxml_dev/unittests/type_traits_tester.py Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-02-22 12:19:27 UTC (rev 919) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-02-22 19:04:04 UTC (rev 920) @@ -823,6 +823,8 @@ def is_noncopyable( class_ ): """returns True, if class is noncopyable, False otherwise""" + class_ = class_traits.get_declaration( class_ ) + if class_.class_type == class_declaration.CLASS_TYPES.UNION: return False for base_desc in class_.recursive_bases: Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-02-22 12:19:27 UTC (rev 919) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-02-22 19:04:04 UTC (rev 920) @@ -6,6 +6,8 @@ //Almost all test cases have been taken //from boost.type_traits (http://www.boost.org) library. +#include <string> + #define TYPE_PERMUTATION( BASE, NAME ) \ typedef BASE NAME##_t; \ typedef BASE const NAME##_const_t; \ @@ -33,6 +35,24 @@ typedef void (some_struct_t::*member_function_t)(); } } +namespace is_noncopyable{ + +namespace detail{ + struct x{ + private: + x( const x& ); + x& operator=(const x& ); + }; +} + +namespace yes{ + typedef detail::x x; +} +namespace no{ + typedef std::string string_type; +} +} + namespace is_integral{ namespace yes{ Modified: pygccxml_dev/unittests/type_traits_tester.py =================================================================== --- pygccxml_dev/unittests/type_traits_tester.py 2007-02-22 12:19:27 UTC (rev 919) +++ pygccxml_dev/unittests/type_traits_tester.py 2007-02-22 19:04:04 UTC (rev 920) @@ -101,7 +101,10 @@ def test_is_fundamental(self): self.__test_type_category( 'is_fundamental', declarations.is_fundamental ) - + + def test_is_noncopyable(self): + self.__test_type_category( 'is_noncopyable', declarations.is_noncopyable ) + def test_has_trivial_constructor(self): self.__test_type_category( 'has_trivial_constructor', declarations.has_trivial_constructor ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-26 21:28:14
|
Revision: 933 http://svn.sourceforge.net/pygccxml/?rev=933&view=rev Author: roman_yakovenko Date: 2007-02-26 13:28:13 -0800 (Mon, 26 Feb 2007) Log Message: ----------- adding 2 new type traits and unit tests is_std_[w]ostream Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/type_traits.hpp pygccxml_dev/unittests/type_traits_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2007-02-25 12:31:52 UTC (rev 932) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2007-02-26 21:28:13 UTC (rev 933) @@ -134,6 +134,8 @@ from type_traits import is_noncopyable from type_traits import is_std_string from type_traits import is_std_wstring +from type_traits import is_std_ostream +from type_traits import is_std_wostream from type_traits import is_unary_operator from type_traits import is_binary_operator Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-02-25 12:31:52 UTC (rev 932) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-02-26 21:28:13 UTC (rev 933) @@ -1008,7 +1008,30 @@ type = remove_alias( type ) return remove_cv( type ).decl_string in decl_strings +def is_std_ostream( type ): + """returns True, if type represents C++ std::string, False otherwise""" + decl_strings = [ + '::std::basic_ostream<char, std::char_traits<char> >' + , '::std::basic_ostream<char,std::char_traits<char> >' + , '::std::ostream' ] + if isinstance( type, types.StringTypes ): + return type in decl_strings + else: + type = remove_alias( type ) + return remove_cv( type ).decl_string in decl_strings + +def is_std_wostream( type ): + """returns True, if type represents C++ std::string, False otherwise""" + decl_strings = [ + '::std::basic_ostream<wchar_t, std::char_traits<wchar_t> >' + , '::std::basic_ostream<wchar_t,std::char_traits<wchar_t> >' + , '::std::wostream' ] + if isinstance( type, types.StringTypes ): + return type in decl_strings + else: + type = remove_alias( type ) + return remove_cv( type ).decl_string in decl_strings @@ -1017,4 +1040,3 @@ - Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-02-25 12:31:52 UTC (rev 932) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-02-26 21:28:13 UTC (rev 933) @@ -7,6 +7,7 @@ //from boost.type_traits (http://www.boost.org) library. #include <string> +#include <iostream> #define TYPE_PERMUTATION( BASE, NAME ) \ typedef BASE NAME##_t; \ @@ -18,6 +19,25 @@ int member; }; +namespace is_std_ostream{ +namespace yes{ + typedef std::ostream ostream_type; +} +namespace no{ + typedef int int__; +} +} + +namespace is_std_wostream{ +namespace yes{ + typedef std::wostream wostream_type; +} +namespace no{ + typedef int int__; +} +} + + struct incomplete_type; namespace is_void{ Modified: pygccxml_dev/unittests/type_traits_tester.py =================================================================== --- pygccxml_dev/unittests/type_traits_tester.py 2007-02-25 12:31:52 UTC (rev 932) +++ pygccxml_dev/unittests/type_traits_tester.py 2007-02-26 21:28:13 UTC (rev 933) @@ -105,6 +105,12 @@ def test_is_noncopyable(self): self.__test_type_category( 'is_noncopyable', declarations.is_noncopyable ) + def test_is_std_ostream(self): + self.__test_type_category( 'is_std_ostream', declarations.is_std_ostream ) + + def test_is_std_wostream(self): + self.__test_type_category( 'is_std_wostream', declarations.is_std_wostream ) + def test_has_trivial_constructor(self): self.__test_type_category( 'has_trivial_constructor', declarations.has_trivial_constructor ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-10 06:09:30
|
Revision: 974 http://svn.sourceforge.net/pygccxml/?rev=974&view=rev Author: roman_yakovenko Date: 2007-04-09 23:09:31 -0700 (Mon, 09 Apr 2007) Log Message: ----------- adding new test case Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/decl_printer.py pygccxml_dev/unittests/data/type_traits.hpp Modified: pygccxml_dev/pygccxml/declarations/decl_printer.py =================================================================== --- pygccxml_dev/pygccxml/declarations/decl_printer.py 2007-04-09 19:22:53 UTC (rev 973) +++ pygccxml_dev/pygccxml/declarations/decl_printer.py 2007-04-10 06:09:31 UTC (rev 974) @@ -109,7 +109,11 @@ def visit_constructor( self ): self.print_decl_header() - + if self.__print_details: + self.writer( ' ' * ( self.level + 1 ) * self.INDENT_SIZE + + 'copy constructor: ' + str(self.__inst.is_copy_constructor) + + os.linesep ) + def visit_destructor( self ): self.print_decl_header() Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-04-09 19:22:53 UTC (rev 973) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-04-10 06:09:31 UTC (rev 974) @@ -1,702 +1,714 @@ -// 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) - -//Almost all test cases have been taken -//from boost.type_traits (http://www.boost.org) library. - -#include <string> -#include <iostream> - -#define TYPE_PERMUTATION( BASE, NAME ) \ - typedef BASE NAME##_t; \ - typedef BASE const NAME##_const_t; \ - typedef BASE volatile NAME##_volatile_t; - -struct some_struct_t{ - void do_smth(); - int member; -}; - -namespace is_std_ostream{ -namespace yes{ - typedef std::ostream ostream_type; -} -namespace no{ - typedef int int__; -} -} - -namespace is_std_wostream{ -namespace yes{ - typedef std::wostream wostream_type; -} -namespace no{ - typedef int int__; -} -} - - -struct incomplete_type; - -namespace is_void{ -namespace yes{ - typedef void void_t; - typedef void const void_cont_t; - typedef void volatile void_volatile_t; -} -namespace no{ - typedef void* void_ptr_t; - typedef int int_t; - typedef some_struct_t some_struct_alias_t; - typedef incomplete_type incomplete_type_alias_t; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); -} } - -namespace is_noncopyable{ - -namespace detail{ - struct x{ - private: - x( const x& ); - x& operator=(const x& ); - }; -} - -namespace yes{ - typedef detail::x x; -} -namespace no{ - typedef std::string string_type; -} -} - -namespace is_integral{ -namespace yes{ - - TYPE_PERMUTATION( bool, bool ) - TYPE_PERMUTATION( char, char ) - TYPE_PERMUTATION( unsigned char, uchar ) - TYPE_PERMUTATION( short, short ) - TYPE_PERMUTATION( unsigned short, ushort ) - TYPE_PERMUTATION( int, int ) - TYPE_PERMUTATION( unsigned int, uint ) - TYPE_PERMUTATION( long, long ) - TYPE_PERMUTATION( unsigned long, ulong ) - TYPE_PERMUTATION( long long int, llint ) - TYPE_PERMUTATION( long long unsigned int, ulli ) -} -namespace no{ - typedef some_struct_t some_struct_alias_t; - typedef float* float_ptr_t; - typedef float& float_ref_t; - typedef const float& const_float_ref_t; - typedef incomplete_type incomplete_type_alias; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); - TYPE_PERMUTATION( void, void ) - TYPE_PERMUTATION( float, float ) - TYPE_PERMUTATION( double, double ) - TYPE_PERMUTATION( long double, ldouble ) -} } - -namespace is_floating_point{ -namespace yes{ - - TYPE_PERMUTATION( float, float ) - TYPE_PERMUTATION( double, double ) - TYPE_PERMUTATION( long double, ldouble ) -} -namespace no{ - typedef some_struct_t some_struct_alias_t; - typedef float* float_ptr_t; - typedef float& float_ref_t; - typedef const float& const_float_ref_t; - typedef incomplete_type incomplete_type_alias; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); - TYPE_PERMUTATION( void, void ) - TYPE_PERMUTATION( bool, bool ) - TYPE_PERMUTATION( char, char ) - TYPE_PERMUTATION( unsigned char, uchar ) - TYPE_PERMUTATION( short, short ) - TYPE_PERMUTATION( unsigned short, ushort ) - TYPE_PERMUTATION( int, int ) - TYPE_PERMUTATION( unsigned int, uint ) - TYPE_PERMUTATION( long, long ) - TYPE_PERMUTATION( unsigned long, ulong ) - TYPE_PERMUTATION( long long int, llint ) - TYPE_PERMUTATION( long long unsigned int, ulli ) -} } - -namespace is_fundamental{ -namespace yes{ - -#define FUNDAMENTAL_TYPE_PERMUTATION( BASE, NAME ) \ - typedef BASE NAME##_t; \ - typedef BASE const NAME##_const_t; \ - typedef BASE volatile NAME##_volatile_t; - - TYPE_PERMUTATION( void, void ) - TYPE_PERMUTATION( bool, bool ) - TYPE_PERMUTATION( char, char ) - TYPE_PERMUTATION( unsigned char, uchar ) - TYPE_PERMUTATION( short, short ) - TYPE_PERMUTATION( unsigned short, ushort ) - TYPE_PERMUTATION( int, int ) - TYPE_PERMUTATION( unsigned int, uint ) - TYPE_PERMUTATION( long, long ) - TYPE_PERMUTATION( unsigned long, ulong ) - TYPE_PERMUTATION( long long int, llint ) - TYPE_PERMUTATION( long long unsigned int, ulli ) - TYPE_PERMUTATION( float, float ) - TYPE_PERMUTATION( double, double ) - TYPE_PERMUTATION( long double, ldouble ) -} -namespace no{ - typedef some_struct_t some_struct_alias_t; - typedef float* float_ptr_t; - typedef float& float_ref_t; - typedef const float& const_float_ref_t; - typedef incomplete_type incomplete_type_alias; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); - -} } - -namespace is_pointer{ -namespace yes{ - typedef int* int_ptr_t; - typedef const int* const_int_ptr_t; - typedef volatile int* volatile_int_ptr_t; - typedef some_struct_t* some_struct_ptr_t; - typedef int* const int_const_ptr_t; - typedef int* volatile int_volatile_ptr_t; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); -} - -namespace no{ - typedef int int_t; - typedef int& int_ref_t; - typedef some_struct_t some_struct_alias_t; - typedef int*& int_ptr_ref_t; -} } - - -namespace remove_pointer{ -namespace before{ - typedef int* x1; - typedef const int* x2; - typedef volatile int* x3; - typedef some_struct_t* x4; - typedef int* const x5; - typedef int* volatile x6; - typedef void(*x7)(); - typedef void (some_struct_t::*x8)(); -} - -namespace after{ - typedef int x1; - typedef const int x2; - typedef volatile int x3; - typedef some_struct_t x4; - typedef int const x5; - typedef int volatile x6; - typedef void(*x7)(); - typedef void (some_struct_t::*x8)(); -} } - - -namespace is_reference{ -namespace yes{ - - typedef int& int_ref_t; - typedef const int& const_int_ref_t; - typedef int const& int_const_ref_t; - typedef some_struct_t& some_struct_ref_t; - typedef int*& int_ptr_ref_t; -} - -namespace no{ - typedef int* int_ptr_t; - typedef const int* const_int_ptr_t; - typedef volatile int* volatile_int_ptr_t; - typedef some_struct_t* some_struct_ptr_t; - typedef int* const int_const_ptr_t; - typedef int* volatile int_volatile_ptr_t; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); - typedef int int_t; -} } - -namespace remove_reference{ -namespace before{ - - typedef int& x1; - typedef const int& x2; - typedef some_struct_t& x3; - typedef int*& x4; - typedef void (some_struct_t::*x5)(); -} - -namespace after{ - typedef int x1; - typedef const int x2; - typedef some_struct_t x3; - typedef int* x4; - typedef void (some_struct_t::*x5)(); -} } - -namespace is_const{ -namespace yes{ - - typedef const void const_void_t; - typedef const incomplete_type const_incomplete_type_t; - typedef int* const int_const_t; - //TODO typedef const int& const_int_ref_t; -} - -namespace no{ - typedef int* int_ptr_t; - typedef const int* const_int_ptr_t; - typedef volatile int* volatile_int_ptr_t; - typedef some_struct_t* some_struct_ptr_t; - typedef int* volatile int_volatile_ptr_t; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); - typedef int int_t; -} } - -namespace remove_const{ -namespace before{ - - typedef const void x1; - typedef const incomplete_type x2; - typedef int* const x3; - typedef int* volatile x4; -} - -namespace after{ - typedef void x1; - typedef incomplete_type x2; - typedef int* x3; - typedef int* volatile x4; -} } - -namespace is_volatile{ -namespace yes{ - - typedef void * volatile vvoid_ptr_t; - typedef volatile int volatile_int_t; -} - -namespace no{ - typedef int* int_ptr_t; - typedef const int* const_int_ptr_t; - typedef int* volatile_int_ptr_t; - typedef some_struct_t* some_struct_ptr_t; - typedef int* int_volatile_ptr_t; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); - typedef int int_t; -} } - -namespace remove_volatile{ -namespace before{ - - typedef void * volatile x1; - typedef volatile int x2; - typedef int* x3; -} - -namespace after{ - typedef void * x1; - typedef int x2; - typedef int* x3; -} } - - -namespace remove_cv{ -namespace before{ - - typedef void * volatile x10; - typedef void * const volatile x11; - typedef void * const x12; - - typedef volatile int x20; - typedef const volatile int x21; - typedef const int x22; - - typedef int* volatile x30; - typedef int* const volatile x31; - typedef int* const x32; - - typedef void(*x40)(); -} - -namespace after{ - typedef void * x10; - typedef void * x11; - typedef void * x12; - - typedef int x20; - typedef int x21; - typedef int x22; - - typedef int* x30; - typedef int* x31; - typedef int* x32; - - typedef void(*x40)(); -} } - - -namespace is_enum{ - - enum color{ red, green, blue }; - -namespace yes{ - typedef color COLOR; -} - -namespace no{ - typedef int* int_ptr_t; - typedef const int* const_int_ptr_t; - typedef int* volatile_int_ptr_t; - typedef some_struct_t* some_struct_ptr_t; - typedef int* int_volatile_ptr_t; - typedef void(*function_t)(); - typedef void (some_struct_t::*member_function_t)(); - typedef int int_t; -} } - -namespace has_trivial_constructor{ -namespace yes{ - struct x{ - x(){} - }; -} - -namespace no{ - class y{ - private: - y(){} - }; -} } - -namespace has_public_constructor{ -namespace yes{ - struct x{ - x(){} - }; -} - -namespace no{ - class y{ - private: - y(){} - }; -} } - -namespace has_public_destructor{ -namespace yes{ - struct x{ - ~x(){} - }; -} - -namespace no{ - class y{ - private: - ~y(){} - }; -} } - -namespace has_trivial_copy{ -namespace yes{ - struct x{ - x(const x&){} - }; -} - -namespace no{ - class y{ - private: - y(const y&){} - }; -} } - -namespace is_base_and_derived{ -namespace yes{ - struct base{}; - struct derived : public base {}; -} - -namespace no{ - struct unrelated1{}; - struct unrelated2{}; -} } - -namespace has_any_non_copyconstructor{ -namespace yes{ - struct x{ - x(int){} - }; -} - -namespace no{ - class y{ - private: - y(){} - }; -} } - -namespace is_unary_operator{ - -struct dummy{ - bool operator!(){ return true; } - int operator++(){ return 0; } - int operator+(const dummy& ){ return 0; } -}; - -inline int operator++( dummy& ){ return 0; } -inline int operator*( const dummy&, const dummy& ){ return 0; } - -dummy& operator+=( dummy& x, const dummy& ){ - return x; -} - -} - -namespace is_array{ - -namespace yes{ - int yes1[2]; - const int yes2[2] = {0}; - const volatile int yes3[2] = {0}; - int yes4[2][3]; -} - -namespace no{ - typedef int no1; - typedef int* no2; - typedef const int* no3; - typedef const volatile int* no4; - typedef int*const no5; - typedef const int*volatile no6; - typedef const volatile int*const no7; - typedef void( * no8)( const int[2] ); -} } - -namespace is_convertible{ - -template <class T> -struct convertible_from{ - convertible_from(T); -}; - -template <class T> -struct convertible_to{ - operator T (); - -}; - -struct base{}; - -struct other{}; - -struct derived : base {}; - -struct derived_protected : protected base {}; - -struct derived_private : private base {}; - -struct base2{}; - -struct middle2 : virtual base2 {}; - -struct derived2 : middle2 {}; - -enum fruit{ apple }; - -template < typename source_type_, typename target_type_, int value_ > -struct tester_t{ - typedef source_type_ source_type; - typedef target_type_ target_type; - enum expected{ value=value_ }; -}; - -template < typename source_type_, typename target_type_, int value_ > -struct tester_source_t{ - typedef source_type_ source_type; - typedef target_type_ target_type; - enum expected{ value=value_ }; - -private: - enum { sizeof_source = sizeof( source_type ) }; -}; - -template < typename source_type_, typename target_type_, int value_ > -struct tester_target_t{ - typedef source_type_ source_type; - typedef target_type_ target_type; - enum expected{ value=value_ }; - -private: - enum { sizeof_target = sizeof( target_type ) }; -}; - -template < typename source_type_, typename target_type_, int value_ > -struct tester_both_t{ - typedef source_type_ source_type; - typedef target_type_ target_type; - enum expected{ value=value_ }; - -private: - enum { sizeof_source = sizeof( source_type ) }; - enum { sizeof_target = sizeof( target_type ) }; -}; - -struct x1 : public tester_t< const int *, int*, false >{}; -struct x2 : public tester_t< int *, const int*, true >{}; -struct x3 : public tester_t< const int&, int&, false >{}; -struct x4 : public tester_t< const int&, int, true >{}; -struct x5 : public tester_t< const int&, char, true >{}; -struct x6 : public tester_t< const int&, char&, false >{}; -struct x7 : public tester_t< const int&, char*, false >{}; -struct x8 : public tester_t< int&, const int&, true >{}; -struct x9 : public tester_t< int *, const int*, true >{}; -struct x10 : public tester_t< int&, const int&, true >{}; -struct x11 : public tester_t< float, int, true >{}; -struct x12 : public tester_t< double, int, true >{}; -struct x13 : public tester_t< double, float, true >{}; -struct x14 : public tester_t< long, int, true >{}; -struct x15 : public tester_t< int, char, true >{}; -struct x16 : public tester_t< long long, int, true >{}; -struct x17 : public tester_t< long long, char, true >{}; -struct x18 : public tester_t< long long, float, true >{}; -struct x19 : public tester_t< float, int, true >{}; -struct x20 : public tester_t< float, void, false >{}; -struct x21 : public tester_t< void, void, true >{}; -struct x22 : public tester_t< double, void*, true >{}; -struct x23 : public tester_t< double, int*, false >{}; -struct x24 : public tester_t< int, int*, false >{}; -struct x25 : public tester_t< const int, int*, false >{}; -struct x26 : public tester_t< const int&, int*, false >{}; -struct x27 : public tester_t< double*, int*, false >{}; -struct x28 : public tester_source_t< convertible_to<int>, int, true >{}; -struct x29 : public tester_target_t< int, convertible_to<int>, false >{}; -struct x30 : public tester_source_t< convertible_to<float const&>, float, true >{}; -struct x31 : public tester_target_t< float, convertible_to<float const&>, false >{}; -struct x32 : public tester_source_t< convertible_to<float&>, float, true >{}; -struct x33 : public tester_target_t< float, convertible_to<float&>, false >{}; -struct x34 : public tester_source_t< convertible_to<char>, float, true >{}; -struct x35 : public tester_target_t< float, convertible_to<char>, false >{}; -struct x36 : public tester_source_t< convertible_to<char const&>, float, true >{}; -struct x37 : public tester_target_t< float, convertible_to<char const&>, false >{}; -struct x38 : public tester_source_t< convertible_to<char&>, float, true >{}; -struct x39 : public tester_target_t< float, convertible_to<char&>, false >{}; -struct x40 : public tester_source_t< convertible_to<char>, char, true >{}; -struct x41 : public tester_source_t< convertible_to<char const&>, char, true >{}; -struct x42 : public tester_source_t< convertible_to<char&>, char, true >{}; -struct x43 : public tester_source_t< convertible_to<float>, float&, true >{}; -struct x44 : public tester_source_t< convertible_to<float>, float const&, true >{}; -struct x45 : public tester_source_t< convertible_to<float&>, float&, true >{}; -struct x46 : public tester_source_t< convertible_to<float const&>, float const&, true >{}; -struct x47 : public tester_source_t< convertible_to<float const&>, float&, false >{}; -struct x48 : public tester_target_t< float, convertible_from<float>, true >{}; -struct x49 : public tester_target_t< float, convertible_from<float const&>, true >{}; -struct x50 : public tester_target_t< float, convertible_from<float&>, true >{}; -struct x51 : public tester_target_t< float, convertible_from<char>, true >{}; -struct x52 : public tester_target_t< float, convertible_from<char const&>, true >{}; -struct x53 : public tester_target_t< float, convertible_from<char&>, false >{}; -struct x54 : public tester_target_t< char, convertible_from<char>, true >{}; -struct x55 : public tester_target_t< char, convertible_from<char const&>, true >{}; -struct x56 : public tester_target_t< char, convertible_from<char&>, true >{}; -struct x57 : public tester_target_t< float&, convertible_from<float> , true >{}; -struct x58 : public tester_target_t< float const&, convertible_from<float> , true >{}; -struct x59 : public tester_target_t< float&, convertible_from<float&> , true >{}; -struct x60 : public tester_target_t< float const&, convertible_from<float const&>, true >{}; -struct x61 : public tester_target_t< float&, convertible_from<float const&>, true >{}; -struct x62 : public tester_target_t< int, convertible_from<int>, true >{}; -struct x63 : public tester_t< const int*, int[3], false >{}; -struct x64 : public tester_t< int(&)[4], const int*, true >{}; -struct x65 : public tester_t< int(&)(int), int(*)(int), true >{}; -struct x66 : public tester_t< int[2], int*, true >{}; -struct x67 : public tester_t< int[2], const int*, true >{}; -struct x68 : public tester_t< const int[2], int*, false >{}; -struct x69 : public tester_t< int*, int[3], false >{}; -struct x70 : public tester_t< float, int&, false >{}; -struct x71 : public tester_t< float, const int&, true >{}; -struct x72 : public tester_t< other, void*, true >{}; -struct x73 : public tester_t< int, void*, false >{}; -struct x74 : public tester_t< fruit, void*, false >{}; -struct x75 : public tester_t< other, int*, false >{}; -struct x76 : public tester_t< other*, int*, false >{}; -struct x77 : public tester_t< fruit, int, true >{}; -struct x78 : public tester_t< fruit, double, true >{}; -struct x79 : public tester_t< fruit, char, true >{}; -struct x80 : public tester_t< fruit, wchar_t, true >{}; -struct x81 : public tester_t< derived, base, true >{}; -struct x82 : public tester_t< derived, derived, true >{}; -struct x83 : public tester_t< base, base, true >{}; -struct x84 : public tester_t< base, derived, false >{}; -struct x85 : public tester_t< other, base, false >{}; -struct x86 : public tester_t< middle2, base2, true >{}; -struct x87 : public tester_t< derived2, base2, true >{}; -struct x88 : public tester_t< derived*, base*, true >{}; -struct x89 : public tester_t< base*, derived*, false >{}; -struct x90 : public tester_t< derived&, base&, true >{}; -struct x91 : public tester_t< base&, derived&, false >{}; -struct x92 : public tester_t< const derived*, const base*, true >{}; -struct x93 : public tester_t< const base*, const derived*, false >{}; -struct x94 : public tester_t< const derived&, const base&, true >{}; -struct x95 : public tester_t< const base&, const derived&, false >{}; -struct x96 : public tester_t< derived_private, base, false >{}; -struct x97 : public tester_t< derived_protected, base, true >{}; -struct x98 : public tester_t< derived_protected, derived_private, false >{}; - - - -// : public tester_t< test_abc3, const test_abc1&, true >{}; -// : public tester_t< non_int_pointer, void*, true >{}; -// : public tester_t< test_abc1&, test_abc2&, false >{}; -// : public tester_t< test_abc1&, int_constructible, false >{}; -// : public tester_t< int_constructible, test_abc1&, false >{}; -// : public tester_t< test_abc1&, test_abc2, false >{}; - -//~ : public tester_t< polymorphic_derived1,polymorphic_base, true >{}; -//~ : public tester_t< polymorphic_derived2,polymorphic_base, true >{}; -//~ : public tester_t< polymorphic_base,polymorphic_derived1, false >{}; -//~ : public tester_t< polymorphic_base,polymorphic_derived2, false >{}; -//~ #ifndef BOOST_NO_IS_ABSTRACT -//~ : public tester_t< test_abc1,test_abc1, false >{}; -//~ : public tester_t< Base,test_abc1, false >{}; -//~ : public tester_t< polymorphic_derived2,test_abc1, false >{}; -//~ : public tester_t< int,test_abc1, false >{}; -//~ #endif - - -} - - - - - - - - - - - - - - - - - - - +// 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) + +//Almost all test cases have been taken +//from boost.type_traits (http://www.boost.org) library. + +#include <string> +#include <iostream> + +#define TYPE_PERMUTATION( BASE, NAME ) \ + typedef BASE NAME##_t; \ + typedef BASE const NAME##_const_t; \ + typedef BASE volatile NAME##_volatile_t; + +struct some_struct_t{ + void do_smth(); + int member; +}; + +namespace is_std_ostream{ +namespace yes{ + typedef std::ostream ostream_type; +} +namespace no{ + typedef int int__; +} +} + +namespace is_std_wostream{ +namespace yes{ + typedef std::wostream wostream_type; +} +namespace no{ + typedef int int__; +} +} + + +struct incomplete_type; + +namespace is_void{ +namespace yes{ + typedef void void_t; + typedef void const void_cont_t; + typedef void volatile void_volatile_t; +} +namespace no{ + typedef void* void_ptr_t; + typedef int int_t; + typedef some_struct_t some_struct_alias_t; + typedef incomplete_type incomplete_type_alias_t; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); +} } + +namespace is_noncopyable{ + +namespace detail{ + struct x{ + private: + x( const x& ); + x& operator=(const x& ); + }; + + struct y_type{ + union { + struct { + float x, y, z; + }; + float val[3]; + }; + + static const y_type zero; + }; +} + +namespace yes{ + typedef detail::x x; +} +namespace no{ + typedef std::string string_type; + typedef detail::y_type y_type; +} +} + +namespace is_integral{ +namespace yes{ + + TYPE_PERMUTATION( bool, bool ) + TYPE_PERMUTATION( char, char ) + TYPE_PERMUTATION( unsigned char, uchar ) + TYPE_PERMUTATION( short, short ) + TYPE_PERMUTATION( unsigned short, ushort ) + TYPE_PERMUTATION( int, int ) + TYPE_PERMUTATION( unsigned int, uint ) + TYPE_PERMUTATION( long, long ) + TYPE_PERMUTATION( unsigned long, ulong ) + TYPE_PERMUTATION( long long int, llint ) + TYPE_PERMUTATION( long long unsigned int, ulli ) +} +namespace no{ + typedef some_struct_t some_struct_alias_t; + typedef float* float_ptr_t; + typedef float& float_ref_t; + typedef const float& const_float_ref_t; + typedef incomplete_type incomplete_type_alias; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); + TYPE_PERMUTATION( void, void ) + TYPE_PERMUTATION( float, float ) + TYPE_PERMUTATION( double, double ) + TYPE_PERMUTATION( long double, ldouble ) +} } + +namespace is_floating_point{ +namespace yes{ + + TYPE_PERMUTATION( float, float ) + TYPE_PERMUTATION( double, double ) + TYPE_PERMUTATION( long double, ldouble ) +} +namespace no{ + typedef some_struct_t some_struct_alias_t; + typedef float* float_ptr_t; + typedef float& float_ref_t; + typedef const float& const_float_ref_t; + typedef incomplete_type incomplete_type_alias; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); + TYPE_PERMUTATION( void, void ) + TYPE_PERMUTATION( bool, bool ) + TYPE_PERMUTATION( char, char ) + TYPE_PERMUTATION( unsigned char, uchar ) + TYPE_PERMUTATION( short, short ) + TYPE_PERMUTATION( unsigned short, ushort ) + TYPE_PERMUTATION( int, int ) + TYPE_PERMUTATION( unsigned int, uint ) + TYPE_PERMUTATION( long, long ) + TYPE_PERMUTATION( unsigned long, ulong ) + TYPE_PERMUTATION( long long int, llint ) + TYPE_PERMUTATION( long long unsigned int, ulli ) +} } + +namespace is_fundamental{ +namespace yes{ + +#define FUNDAMENTAL_TYPE_PERMUTATION( BASE, NAME ) \ + typedef BASE NAME##_t; \ + typedef BASE const NAME##_const_t; \ + typedef BASE volatile NAME##_volatile_t; + + TYPE_PERMUTATION( void, void ) + TYPE_PERMUTATION( bool, bool ) + TYPE_PERMUTATION( char, char ) + TYPE_PERMUTATION( unsigned char, uchar ) + TYPE_PERMUTATION( short, short ) + TYPE_PERMUTATION( unsigned short, ushort ) + TYPE_PERMUTATION( int, int ) + TYPE_PERMUTATION( unsigned int, uint ) + TYPE_PERMUTATION( long, long ) + TYPE_PERMUTATION( unsigned long, ulong ) + TYPE_PERMUTATION( long long int, llint ) + TYPE_PERMUTATION( long long unsigned int, ulli ) + TYPE_PERMUTATION( float, float ) + TYPE_PERMUTATION( double, double ) + TYPE_PERMUTATION( long double, ldouble ) +} +namespace no{ + typedef some_struct_t some_struct_alias_t; + typedef float* float_ptr_t; + typedef float& float_ref_t; + typedef const float& const_float_ref_t; + typedef incomplete_type incomplete_type_alias; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); + +} } + +namespace is_pointer{ +namespace yes{ + typedef int* int_ptr_t; + typedef const int* const_int_ptr_t; + typedef volatile int* volatile_int_ptr_t; + typedef some_struct_t* some_struct_ptr_t; + typedef int* const int_const_ptr_t; + typedef int* volatile int_volatile_ptr_t; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); +} + +namespace no{ + typedef int int_t; + typedef int& int_ref_t; + typedef some_struct_t some_struct_alias_t; + typedef int*& int_ptr_ref_t; +} } + + +namespace remove_pointer{ +namespace before{ + typedef int* x1; + typedef const int* x2; + typedef volatile int* x3; + typedef some_struct_t* x4; + typedef int* const x5; + typedef int* volatile x6; + typedef void(*x7)(); + typedef void (some_struct_t::*x8)(); +} + +namespace after{ + typedef int x1; + typedef const int x2; + typedef volatile int x3; + typedef some_struct_t x4; + typedef int const x5; + typedef int volatile x6; + typedef void(*x7)(); + typedef void (some_struct_t::*x8)(); +} } + + +namespace is_reference{ +namespace yes{ + + typedef int& int_ref_t; + typedef const int& const_int_ref_t; + typedef int const& int_const_ref_t; + typedef some_struct_t& some_struct_ref_t; + typedef int*& int_ptr_ref_t; +} + +namespace no{ + typedef int* int_ptr_t; + typedef const int* const_int_ptr_t; + typedef volatile int* volatile_int_ptr_t; + typedef some_struct_t* some_struct_ptr_t; + typedef int* const int_const_ptr_t; + typedef int* volatile int_volatile_ptr_t; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); + typedef int int_t; +} } + +namespace remove_reference{ +namespace before{ + + typedef int& x1; + typedef const int& x2; + typedef some_struct_t& x3; + typedef int*& x4; + typedef void (some_struct_t::*x5)(); +} + +namespace after{ + typedef int x1; + typedef const int x2; + typedef some_struct_t x3; + typedef int* x4; + typedef void (some_struct_t::*x5)(); +} } + +namespace is_const{ +namespace yes{ + + typedef const void const_void_t; + typedef const incomplete_type const_incomplete_type_t; + typedef int* const int_const_t; + //TODO typedef const int& const_int_ref_t; +} + +namespace no{ + typedef int* int_ptr_t; + typedef const int* const_int_ptr_t; + typedef volatile int* volatile_int_ptr_t; + typedef some_struct_t* some_struct_ptr_t; + typedef int* volatile int_volatile_ptr_t; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); + typedef int int_t; +} } + +namespace remove_const{ +namespace before{ + + typedef const void x1; + typedef const incomplete_type x2; + typedef int* const x3; + typedef int* volatile x4; +} + +namespace after{ + typedef void x1; + typedef incomplete_type x2; + typedef int* x3; + typedef int* volatile x4; +} } + +namespace is_volatile{ +namespace yes{ + + typedef void * volatile vvoid_ptr_t; + typedef volatile int volatile_int_t; +} + +namespace no{ + typedef int* int_ptr_t; + typedef const int* const_int_ptr_t; + typedef int* volatile_int_ptr_t; + typedef some_struct_t* some_struct_ptr_t; + typedef int* int_volatile_ptr_t; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); + typedef int int_t; +} } + +namespace remove_volatile{ +namespace before{ + + typedef void * volatile x1; + typedef volatile int x2; + typedef int* x3; +} + +namespace after{ + typedef void * x1; + typedef int x2; + typedef int* x3; +} } + + +namespace remove_cv{ +namespace before{ + + typedef void * volatile x10; + typedef void * const volatile x11; + typedef void * const x12; + + typedef volatile int x20; + typedef const volatile int x21; + typedef const int x22; + + typedef int* volatile x30; + typedef int* const volatile x31; + typedef int* const x32; + + typedef void(*x40)(); +} + +namespace after{ + typedef void * x10; + typedef void * x11; + typedef void * x12; + + typedef int x20; + typedef int x21; + typedef int x22; + + typedef int* x30; + typedef int* x31; + typedef int* x32; + + typedef void(*x40)(); +} } + + +namespace is_enum{ + + enum color{ red, green, blue }; + +namespace yes{ + typedef color COLOR; +} + +namespace no{ + typedef int* int_ptr_t; + typedef const int* const_int_ptr_t; + typedef int* volatile_int_ptr_t; + typedef some_struct_t* some_struct_ptr_t; + typedef int* int_volatile_ptr_t; + typedef void(*function_t)(); + typedef void (some_struct_t::*member_function_t)(); + typedef int int_t; +} } + +namespace has_trivial_constructor{ +namespace yes{ + struct x{ + x(){} + }; +} + +namespace no{ + class y{ + private: + y(){} + }; +} } + +namespace has_public_constructor{ +namespace yes{ + struct x{ + x(){} + }; +} + +namespace no{ + class y{ + private: + y(){} + }; +} } + +namespace has_public_destructor{ +namespace yes{ + struct x{ + ~x(){} + }; +} + +namespace no{ + class y{ + private: + ~y(){} + }; +} } + +namespace has_trivial_copy{ +namespace yes{ + struct x{ + x(const x&){} + }; +} + +namespace no{ + class y{ + private: + y(const y&){} + }; +} } + +namespace is_base_and_derived{ +namespace yes{ + struct base{}; + struct derived : public base {}; +} + +namespace no{ + struct unrelated1{}; + struct unrelated2{}; +} } + +namespace has_any_non_copyconstructor{ +namespace yes{ + struct x{ + x(int){} + }; +} + +namespace no{ + class y{ + private: + y(){} + }; +} } + +namespace is_unary_operator{ + +struct dummy{ + bool operator!(){ return true; } + int operator++(){ return 0; } + int operator+(const dummy& ){ return 0; } +}; + +inline int operator++( dummy& ){ return 0; } +inline int operator*( const dummy&, const dummy& ){ return 0; } + +dummy& operator+=( dummy& x, const dummy& ){ + return x; +} + +} + +namespace is_array{ + +namespace yes{ + int yes1[2]; + const int yes2[2] = {0}; + const volatile int yes3[2] = {0}; + int yes4[2][3]; +} + +namespace no{ + typedef int no1; + typedef int* no2; + typedef const int* no3; + typedef const volatile int* no4; + typedef int*const no5; + typedef const int*volatile no6; + typedef const volatile int*const no7; + typedef void( * no8)( const int[2] ); +} } + +namespace is_convertible{ + +template <class T> +struct convertible_from{ + convertible_from(T); +}; + +template <class T> +struct convertible_to{ + operator T (); + +}; + +struct base{}; + +struct other{}; + +struct derived : base {}; + +struct derived_protected : protected base {}; + +struct derived_private : private base {}; + +struct base2{}; + +struct middle2 : virtual base2 {}; + +struct derived2 : middle2 {}; + +enum fruit{ apple }; + +template < typename source_type_, typename target_type_, int value_ > +struct tester_t{ + typedef source_type_ source_type; + typedef target_type_ target_type; + enum expected{ value=value_ }; +}; + +template < typename source_type_, typename target_type_, int value_ > +struct tester_source_t{ + typedef source_type_ source_type; + typedef target_type_ target_type; + enum expected{ value=value_ }; + +private: + enum { sizeof_source = sizeof( source_type ) }; +}; + +template < typename source_type_, typename target_type_, int value_ > +struct tester_target_t{ + typedef source_type_ source_type; + typedef target_type_ target_type; + enum expected{ value=value_ }; + +private: + enum { sizeof_target = sizeof( target_type ) }; +}; + +template < typename source_type_, typename target_type_, int value_ > +struct tester_both_t{ + typedef source_type_ source_type; + typedef target_type_ target_type; + enum expected{ value=value_ }; + +private: + enum { sizeof_source = sizeof( source_type ) }; + enum { sizeof_target = sizeof( target_type ) }; +}; + +struct x1 : public tester_t< const int *, int*, false >{}; +struct x2 : public tester_t< int *, const int*, true >{}; +struct x3 : public tester_t< const int&, int&, false >{}; +struct x4 : public tester_t< const int&, int, true >{}; +struct x5 : public tester_t< const int&, char, true >{}; +struct x6 : public tester_t< const int&, char&, false >{}; +struct x7 : public tester_t< const int&, char*, false >{}; +struct x8 : public tester_t< int&, const int&, true >{}; +struct x9 : public tester_t< int *, const int*, true >{}; +struct x10 : public tester_t< int&, const int&, true >{}; +struct x11 : public tester_t< float, int, true >{}; +struct x12 : public tester_t< double, int, true >{}; +struct x13 : public tester_t< double, float, true >{}; +struct x14 : public tester_t< long, int, true >{}; +struct x15 : public tester_t< int, char, true >{}; +struct x16 : public tester_t< long long, int, true >{}; +struct x17 : public tester_t< long long, char, true >{}; +struct x18 : public tester_t< long long, float, true >{}; +struct x19 : public tester_t< float, int, true >{}; +struct x20 : public tester_t< float, void, false >{}; +struct x21 : public tester_t< void, void, true >{}; +struct x22 : public tester_t< double, void*, true >{}; +struct x23 : public tester_t< double, int*, false >{}; +struct x24 : public tester_t< int, int*, false >{}; +struct x25 : public tester_t< const int, int*, false >{}; +struct x26 : public tester_t< const int&, int*, false >{}; +struct x27 : public tester_t< double*, int*, false >{}; +struct x28 : public tester_source_t< convertible_to<int>, int, true >{}; +struct x29 : public tester_target_t< int, convertible_to<int>, false >{}; +struct x30 : public tester_source_t< convertible_to<float const&>, float, true >{}; +struct x31 : public tester_target_t< float, convertible_to<float const&>, false >{}; +struct x32 : public tester_source_t< convertible_to<float&>, float, true >{}; +struct x33 : public tester_target_t< float, convertible_to<float&>, false >{}; +struct x34 : public tester_source_t< convertible_to<char>, float, true >{}; +struct x35 : public tester_target_t< float, convertible_to<char>, false >{}; +struct x36 : public tester_source_t< convertible_to<char const&>, float, true >{}; +struct x37 : public tester_target_t< float, convertible_to<char const&>, false >{}; +struct x38 : public tester_source_t< convertible_to<char&>, float, true >{}; +struct x39 : public tester_target_t< float, convertible_to<char&>, false >{}; +struct x40 : public tester_source_t< convertible_to<char>, char, true >{}; +struct x41 : public tester_source_t< convertible_to<char const&>, char, true >{}; +struct x42 : public tester_source_t< convertible_to<char&>, char, true >{}; +struct x43 : public tester_source_t< convertible_to<float>, float&, true >{}; +struct x44 : public tester_source_t< convertible_to<float>, float const&, true >{}; +struct x45 : public tester_source_t< convertible_to<float&>, float&, true >{}; +struct x46 : public tester_source_t< convertible_to<float const&>, float const&, true >{}; +struct x47 : public tester_source_t< convertible_to<float const&>, float&, false >{}; +struct x48 : public tester_target_t< float, convertible_from<float>, true >{}; +struct x49 : public tester_target_t< float, convertible_from<float const&>, true >{}; +struct x50 : public tester_target_t< float, convertible_from<float&>, true >{}; +struct x51 : public tester_target_t< float, convertible_from<char>, true >{}; +struct x52 : public tester_target_t< float, convertible_from<char const&>, true >{}; +struct x53 : public tester_target_t< float, convertible_from<char&>, false >{}; +struct x54 : public tester_target_t< char, convertible_from<char>, true >{}; +struct x55 : public tester_target_t< char, convertible_from<char const&>, true >{}; +struct x56 : public tester_target_t< char, convertible_from<char&>, true >{}; +struct x57 : public tester_target_t< float&, convertible_from<float> , true >{}; +struct x58 : public tester_target_t< float const&, convertible_from<float> , true >{}; +struct x59 : public tester_target_t< float&, convertible_from<float&> , true >{}; +struct x60 : public tester_target_t< float const&, convertible_from<float const&>, true >{}; +struct x61 : public tester_target_t< float&, convertible_from<float const&>, true >{}; +struct x62 : public tester_target_t< int, convertible_from<int>, true >{}; +struct x63 : public tester_t< const int*, int[3], false >{}; +struct x64 : public tester_t< int(&)[4], const int*, true >{}; +struct x65 : public tester_t< int(&)(int), int(*)(int), true >{}; +struct x66 : public tester_t< int[2], int*, true >{}; +struct x67 : public tester_t< int[2], const int*, true >{}; +struct x68 : public tester_t< const int[2], int*, false >{}; +struct x69 : public tester_t< int*, int[3], false >{}; +struct x70 : public tester_t< float, int&, false >{}; +struct x71 : public tester_t< float, const int&, true >{}; +struct x72 : public tester_t< other, void*, true >{}; +struct x73 : public tester_t< int, void*, false >{}; +struct x74 : public tester_t< fruit, void*, false >{}; +struct x75 : public tester_t< other, int*, false >{}; +struct x76 : public tester_t< other*, int*, false >{}; +struct x77 : public tester_t< fruit, int, true >{}; +struct x78 : public tester_t< fruit, double, true >{}; +struct x79 : public tester_t< fruit, char, true >{}; +struct x80 : public tester_t< fruit, wchar_t, true >{}; +struct x81 : public tester_t< derived, base, true >{}; +struct x82 : public tester_t< derived, derived, true >{}; +struct x83 : public tester_t< base, base, true >{}; +struct x84 : public tester_t< base, derived, false >{}; +struct x85 : public tester_t< other, base, false >{}; +struct x86 : public tester_t< middle2, base2, true >{}; +struct x87 : public tester_t< derived2, base2, true >{}; +struct x88 : public tester_t< derived*, base*, true >{}; +struct x89 : public tester_t< base*, derived*, false >{}; +struct x90 : public tester_t< derived&, base&, true >{}; +struct x91 : public tester_t< base&, derived&, false >{}; +struct x92 : public tester_t< const derived*, const base*, true >{}; +struct x93 : public tester_t< const base*, const derived*, false >{}; +struct x94 : public tester_t< const derived&, const base&, true >{}; +struct x95 : public tester_t< const base&, const derived&, false >{}; +struct x96 : public tester_t< derived_private, base, false >{}; +struct x97 : public tester_t< derived_protected, base, true >{}; +struct x98 : public tester_t< derived_protected, derived_private, false >{}; + + + +// : public tester_t< test_abc3, const test_abc1&, true >{}; +// : public tester_t< non_int_pointer, void*, true >{}; +// : public tester_t< test_abc1&, test_abc2&, false >{}; +// : public tester_t< test_abc1&, int_constructible, false >{}; +// : public tester_t< int_constructible, test_abc1&, false >{}; +// : public tester_t< test_abc1&, test_abc2, false >{}; + +//~ : public tester_t< polymorphic_derived1,polymorphic_base, true >{}; +//~ : public tester_t< polymorphic_derived2,polymorphic_base, true >{}; +//~ : public tester_t< polymorphic_base,polymorphic_derived1, false >{}; +//~ : public tester_t< polymorphic_base,polymorphic_derived2, false >{}; +//~ #ifndef BOOST_NO_IS_ABSTRACT +//~ : public tester_t< test_abc1,test_abc1, false >{}; +//~ : public tester_t< Base,test_abc1, false >{}; +//~ : public tester_t< polymorphic_derived2,test_abc1, false >{}; +//~ : public tester_t< int,test_abc1, false >{}; +//~ #endif + + +} + + + + + + + + + + + + + + + + + + + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-20 20:22:26
|
Revision: 1011 http://svn.sourceforge.net/pygccxml/?rev=1011&view=rev Author: roman_yakovenko Date: 2007-04-20 13:22:23 -0700 (Fri, 20 Apr 2007) Log Message: ----------- adding another set of performance optimizations, basically to reduce the number of "make_flatten" calls Modified Paths: -------------- pygccxml_dev/pygccxml/parser/patcher.py pygccxml_dev/pygccxml/parser/scanner.py pygccxml_dev/pygccxml/parser/source_reader.py pygccxml_dev/unittests/patcher_tester.py pygccxml_dev/unittests/test_performance.py Added Paths: ----------- pygccxml_dev/docs/links.rest pygccxml_dev/unittests/results.txt Added: pygccxml_dev/docs/links.rest =================================================================== --- pygccxml_dev/docs/links.rest (rev 0) +++ pygccxml_dev/docs/links.rest 2007-04-20 20:22:23 UTC (rev 1011) @@ -0,0 +1,31 @@ +============== +C++ Reflection +============== + +.. contents:: Table of contents + +----- +Links +----- + +* `CppReflect`_ - extracts reflection information from executables, which were + build with debug information. It works with executables that has COFF or ELF + format. + +.. _`CppReflect` : http://www.garret.ru/~knizhnik/cppreflection/docs/reflect.html + +* `XTI An Extended Type Information Library`_ - Bjarne Stroustrup talk about adding + reflection information to C++ program. + + + +.. _`XTI An Extended Type Information Library` : http://lcgapp.cern.ch/project/architecture/XTI_accu.pdf + +.. _`pygccxml`: ./pygccxml.html +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + End: Modified: pygccxml_dev/pygccxml/parser/patcher.py =================================================================== --- pygccxml_dev/pygccxml/parser/patcher.py 2007-04-20 14:58:08 UTC (rev 1010) +++ pygccxml_dev/pygccxml/parser/patcher.py 2007-04-20 20:22:23 UTC (rev 1011) @@ -8,8 +8,9 @@ class default_argument_patcher_t( object ): - def __init__( self ): + def __init__( self, enums ): object.__init__( self ) + self.__enums = enums def __call__(self, decl): for arg in decl.arguments: @@ -102,10 +103,10 @@ #this algorithm could be improved: it could take into account #1. unnamed namespaced #2. location within files - enumeration_t = declarations.enumeration_t - for decl in scope.declarations: - if isinstance( decl, enumeration_t ) and decl.has_value_name( default_value ): - return decl + + for enum in self.__enums: + if enum.parent is scope and enum.has_value_name( default_value ): + return enum return None def __is_double_call( self, func, arg ): @@ -174,14 +175,14 @@ def __call__(self, decl): decl.name = 'operator ' + decl.return_type.decl_string -_default_arg_patcher_ = default_argument_patcher_t() _casting_oper_patcher_ = casting_operator_patcher_t() -def fix_decls(decls): +def fix_decls(decls, enums): + default_arg_patcher = default_argument_patcher_t(enums) #decls should be flat list of all declarations, you want to apply patch on for decl in decls: if isinstance( decl, declarations.calldef_t ): - _default_arg_patcher_( decl ) + default_arg_patcher( decl ) if isinstance( decl, declarations.casting_operator_t): _casting_oper_patcher_( decl ) Modified: pygccxml_dev/pygccxml/parser/scanner.py =================================================================== --- pygccxml_dev/pygccxml/parser/scanner.py 2007-04-20 14:58:08 UTC (rev 1010) +++ pygccxml_dev/pygccxml/parser/scanner.py 2007-04-20 20:22:23 UTC (rev 1011) @@ -126,6 +126,10 @@ #mapping from id -> decl self.__declarations = {} + #list of all read declarations + self.__all_declarations = [] + #list of enums I need later + self.__enums = [] #mapping from id -> type self.__types = {} #mapping from id -> file @@ -153,6 +157,12 @@ def declarations(self): return self.__declarations + def all_declarations( self ): + return self.__all_declarations + + def enums(self): + return self.__enums + def types(self): return self.__types @@ -184,6 +194,7 @@ self.__read_access( attrs ) element_id = attrs.get(XML_AN_ID, None) if isinstance( obj, declaration_t ): + self.__all_declarations.append( obj ) self.__update_membership( attrs ) self.__declarations[ element_id ] = obj if not isinstance( obj, namespace_t ): @@ -211,7 +222,7 @@ self.__inst = None def __read_location(self, decl, attrs): - decl.location = location_t( file_name=attrs[XML_AN_FILE], line=int( attrs[XML_AN_LINE])) + decl.location = location_t( file_name=attrs[XML_AN_FILE], line=int(attrs[XML_AN_LINE])) def __update_membership(self, attrs): parent = attrs.get( XML_AN_CONTEXT, None ) @@ -259,7 +270,9 @@ if '$_' in enum_name or '._' in enum_name: #it means that this is unnamed enum. in c++ enum{ x }; enum_name = '' - return self.__decl_factory.create_enumeration( name=enum_name ) + decl = self.__decl_factory.create_enumeration( name=enum_name ) + self.__enums.append( decl ) + return decl def __read_enumeration_value( self, attrs ): name = attrs.get( XML_AN_NAME, '' ) Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2007-04-20 14:58:08 UTC (rev 1010) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2007-04-20 20:22:23 UTC (rev 1011) @@ -337,9 +337,9 @@ #it happens for example in next situation #template< typename X> #void ddd(){ typedef typename X::Y YY;} - decls = filter( lambda inst: isinstance(inst, declaration_t) and not inst.parent - , decls.itervalues() ) - patcher.fix_decls( make_flatten( decls ) ) - decls = filter( lambda inst: isinstance( inst, namespace_t ), decls ) + #if I will fail on this bug next time, the right way to fix it may be different + patcher.fix_decls( scanner_.all_declarations(), scanner_.enums() ) + decls = filter( lambda inst: isinstance( inst, namespace_t ) and not inst.parent + , decls.itervalues() ) return ( decls, files.values() ) Modified: pygccxml_dev/unittests/patcher_tester.py =================================================================== --- pygccxml_dev/unittests/patcher_tester.py 2007-04-20 14:58:08 UTC (rev 1010) +++ pygccxml_dev/unittests/patcher_tester.py 2007-04-20 20:22:23 UTC (rev 1011) @@ -60,8 +60,11 @@ self.failUnless( typedef__func.arguments[0].default_value == u"::typedef_::alias( )" ) if 32 == self.architecture: clone_tree = self.global_ns.free_fun( 'clone_tree' ) - default_value = 'vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >()' - self.failUnless( default_value == clone_tree.arguments[0].default_value ) + default_values = [ + 'vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >()' + , 'vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >((&allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >()))' + ] + self.failUnless( clone_tree.arguments[0].default_value in default_values) class tester_32_t( tester_impl_t ): def __init__(self, *args): Added: pygccxml_dev/unittests/results.txt =================================================================== --- pygccxml_dev/unittests/results.txt (rev 0) +++ pygccxml_dev/unittests/results.txt 2007-04-20 20:22:23 UTC (rev 1011) @@ -0,0 +1,242 @@ +>python -u "test_performance.py" +unittests will run on DEVELOPMENT version +running + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + 15815730 function calls (15569178 primitive calls) in 102.347 CPU seconds + + Ordered by: internal time, call count + List reduced from 424 to 20 due to restriction <20> + + ncalls tottime percall cumtime percall filename:lineno(function) + 1324 8.493 0.006 16.359 0.012 ../pygccxml/parser/patcher.py:115(__find_enum) + 3188314 7.700 0.000 7.700 0.000 ../pygccxml/parser/patcher.py:119(<lambda>) + 735216 7.090 0.000 7.090 0.000 posixpath.py:56(join) + 582283 6.519 0.000 6.894 0.000 posixpath.py:156(islink) + 76466 5.295 0.000 21.655 0.000 posixpath.py:410(realpath) + 271521 3.945 0.000 3.945 0.000 <string>:55(__iter__) + 135760 2.234 0.000 19.078 0.000 ../pygccxml/parser/scanner.py:174(startElement) + 141610 2.018 0.000 2.441 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/cpptypes.py:14(__init__) + 38689 1.917 0.000 4.648 0.000 ../pygccxml/parser/scanner.py:344(__read_member_function) + 1 1.784 1.784 88.092 88.092 ../pygccxml/parser/source_reader.py:315(__parse_gccxml_created_file) + 76466 1.624 0.000 25.001 0.000 ../pygccxml/parser/source_reader.py:304(__produce_full_file) + 76466 1.616 0.000 1.616 0.000 posixpath.py:373(normpath) + 1 1.594 1.594 24.988 24.988 ../pygccxml/parser/etree_scanner.py:45(read) +225592/69633 1.582 0.000 1.835 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:453(get_from_type) +141499/141100 1.510 0.000 2.789 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:10(declaration_path) + 27828/6 1.490 0.000 2.173 0.362 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:71(proceed_single) + 41683 1.463 0.000 2.122 0.000 ../pygccxml/parser/scanner.py:315(__read_argument) + 76194 1.449 0.000 1.795 0.000 ../pygccxml/parser/scanner.py:215(__read_location) + 90232 1.300 0.000 1.981 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/linker.py:24(_set_inst) + 1 1.218 1.218 4.453 4.453 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:424(_relink_declarated_types) + + +running - done +>Exit code: 0 + + + + + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + 12627416 function calls (12380864 primitive calls) in 77.817 CPU seconds + + Ordered by: internal time, call count + List reduced from 423 to 20 due to restriction <20> + + ncalls tottime percall cumtime percall filename:lineno(function) + 735216 6.205 0.000 6.205 0.000 posixpath.py:56(join) + 582283 5.645 0.000 6.005 0.000 posixpath.py:156(islink) + 76466 4.705 0.000 19.188 0.000 posixpath.py:410(realpath) + 271521 3.354 0.000 3.354 0.000 <string>:55(__iter__) + 1324 2.394 0.002 2.534 0.002 ../pygccxml/parser/patcher.py:115(__find_enum) + 135760 1.929 0.000 15.088 0.000 ../pygccxml/parser/scanner.py:174(startElement) + 1 1.704 1.704 63.984 63.984 ../pygccxml/parser/source_reader.py:315(__parse_gccxml_created_file) +225592/69633 1.590 0.000 1.846 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:453(get_from_type) +141499/141100 1.498 0.000 2.742 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:10(declaration_path) + 76466 1.486 0.000 1.486 0.000 posixpath.py:373(normpath) + 1 1.451 1.451 20.204 20.204 ../pygccxml/parser/etree_scanner.py:45(read) + 90232 1.219 0.000 1.869 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/linker.py:24(_set_inst) + 76466 1.195 0.000 21.955 0.000 ../pygccxml/parser/source_reader.py:304(__produce_full_file) + 41683 1.062 0.000 1.892 0.000 ../pygccxml/parser/scanner.py:312(__read_argument) + 76205 1.053 0.000 1.855 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:60(__init__) + 65791 1.047 0.000 3.838 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/class_declaration.py:282(adopt_declaration) + 41652 0.981 0.000 1.682 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/linker.py:61(__link_calldef) + 76466 0.957 0.000 0.957 0.000 posixpath.py:168(exists) + 27828/6 0.954 0.000 1.592 0.265 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:71(proceed_single) + 557669 0.936 0.000 0.936 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:185(_get_location) + + +running - done +>Exit code: 0 + +>python -u "test_performance.py" +unittests will run on DEVELOPMENT version +running + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + 10073090 function calls (9835812 primitive calls) in 58.827 CPU seconds + + Ordered by: internal time, call count + List reduced from 419 to 20 due to restriction <20> + + ncalls tottime percall cumtime percall filename:lineno(function) + 271521 3.735 0.000 3.735 0.000 <string>:55(__iter__) + 1324 2.521 0.002 2.667 0.002 ../pygccxml/parser/patcher.py:101(__find_enum) +225592/69633 2.357 0.000 2.613 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:453(get_from_type) + 135760 2.218 0.000 16.325 0.000 ../pygccxml/parser/scanner.py:174(startElement) + 141610 1.943 0.000 2.325 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/cpptypes.py:14(__init__) + 76194 1.807 0.000 2.137 0.000 ../pygccxml/parser/scanner.py:213(__read_location) + 1 1.531 1.531 21.903 21.903 ../pygccxml/parser/etree_scanner.py:45(read) +141499/141100 1.527 0.000 2.830 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:10(declaration_path) + 1 1.457 1.457 4.782 4.782 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:424(_relink_declarated_types) + 90232 1.205 0.000 1.866 0.000 ../pygccxml/parser/linker.py:24(_set_inst) + 41683 1.123 0.000 1.737 0.000 ../pygccxml/parser/scanner.py:313(__read_argument) + 65791 1.075 0.000 4.162 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/class_declaration.py:282(adopt_declaration) + 41652 1.012 0.000 1.727 0.000 ../pygccxml/parser/linker.py:61(__link_calldef) + 38526 0.941 0.000 2.268 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/calldef.py:371(function_type) + 76205 0.908 0.000 1.459 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:60(__init__) + 518982 0.861 0.000 0.861 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:230(cache) + 76204 0.782 0.000 2.501 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:70(reset) + 41652 0.728 0.000 2.552 0.000 ../pygccxml/parser/scanner.py:325(__read_calldef) + 516848 0.711 0.000 0.711 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:26(enabled) + 71642 0.678 0.000 2.597 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:425(<lambda>) + + +running - done +>Exit code: 0 + +>python -u "test_performance.py" +unittests will run on DEVELOPMENT version +running + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + 10583171 function calls (10350530 primitive calls) in 60.270 CPU seconds + + Ordered by: internal time, call count + List reduced from 421 to 20 due to restriction <20> + + ncalls tottime percall cumtime percall filename:lineno(function) + 271521 3.893 0.000 3.893 0.000 <string>:55(__iter__) + 135760 2.191 0.000 16.832 0.000 ../pygccxml/parser/scanner.py:179(startElement) + 141610 2.124 0.000 2.545 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/cpptypes.py:14(__init__) +225592/69633 1.774 0.000 2.064 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:453(get_from_type) + 1 1.607 1.607 22.649 22.649 ../pygccxml/parser/etree_scanner.py:45(read) +141499/141100 1.567 0.000 3.062 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:10(declaration_path) + 76194 1.555 0.000 1.908 0.000 ../pygccxml/parser/scanner.py:219(__read_location) + 1324 1.546 0.001 2.569 0.002 ../pygccxml/parser/patcher.py:102(__find_enum) + 41683 1.308 0.000 1.938 0.000 ../pygccxml/parser/scanner.py:319(__read_argument) + 90232 1.197 0.000 1.899 0.000 ../pygccxml/parser/linker.py:24(_set_inst) + 1 1.178 1.178 4.614 4.614 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:424(_relink_declarated_types) + 65791 1.113 0.000 4.126 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/class_declaration.py:282(adopt_declaration) + 76205 1.084 0.000 1.084 0.000 ../pygccxml/parser/patcher.py:182(<lambda>) + 608538 1.006 0.000 1.006 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:160(_get_parent) + 41652 1.000 0.000 1.761 0.000 ../pygccxml/parser/linker.py:61(__link_calldef) + 76205 0.975 0.000 1.488 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:60(__init__) + 518982 0.934 0.000 0.934 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:230(cache) + 516848 0.910 0.000 0.910 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:26(enabled) + 76204 0.818 0.000 2.456 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:70(reset) + 38526 0.812 0.000 2.163 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/calldef.py:371(function_type) + + +running - done +>Exit code: 0 + + +>python -u "test_performance.py" +unittests will run on DEVELOPMENT version +running + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + 31749399 function calls (31051476 primitive calls) in 188.225 CPU seconds + + Ordered by: internal time, call count + List reduced from 421 to 30 due to restriction <30> + + ncalls tottime percall cumtime percall filename:lineno(function) + 814563 12.143 0.000 12.143 0.000 <string>:55(__iter__) + 424830 7.973 0.000 9.177 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/cpptypes.py:14(__init__) + 407280 7.053 0.000 56.374 0.000 ../pygccxml/parser/scanner.py:179(startElement) +676776/208899 5.302 0.000 6.200 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:453(get_from_type) + 3 5.219 1.740 74.732 24.911 ../pygccxml/parser/etree_scanner.py:45(read) +424497/423300 5.084 0.000 9.270 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:10(declaration_path) + 125049 4.247 0.000 6.629 0.000 ../pygccxml/parser/scanner.py:319(__read_argument) + 3972 4.153 0.001 7.367 0.002 ../pygccxml/parser/patcher.py:102(__find_enum) + 228615 4.025 0.000 5.306 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:60(__init__) + 124956 4.000 0.000 6.375 0.000 ../pygccxml/parser/linker.py:61(__link_calldef) + 270696 3.940 0.000 6.193 0.000 ../pygccxml/parser/linker.py:24(_set_inst) + 197373 3.522 0.000 13.509 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/class_declaration.py:282(adopt_declaration) + 228582 3.355 0.000 4.619 0.000 ../pygccxml/parser/scanner.py:219(__read_location) + 1825614 3.128 0.000 3.128 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:160(_get_parent) + 3 3.087 1.029 14.448 4.816 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:424(_relink_declarated_types) + 228612 2.998 0.000 8.169 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:70(reset) + 1550544 2.991 0.000 2.991 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:26(enabled) + 1556946 2.905 0.000 2.905 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:230(cache) + 115578 2.626 0.000 6.350 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/calldef.py:371(function_type) + 124956 2.494 0.000 8.618 0.000 ../pygccxml/parser/scanner.py:331(__read_calldef) + 214926 2.125 0.000 8.512 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:425(<lambda>) + 6 1.954 0.326 9.310 1.552 ../pygccxml/parser/source_reader.py:27(bind_aliases) + 987228 1.940 0.000 1.940 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:185(_get_location) + 3 1.873 0.624 138.282 46.094 ../pygccxml/parser/source_reader.py:315(__parse_gccxml_created_file) + 3 1.761 0.587 15.909 5.303 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:452(__declarated_types) + 270696 1.729 0.000 29.906 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:265(apply_visitor) + 425985 1.719 0.000 2.409 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:43(_set_access_type) + 116067 1.701 0.000 10.146 0.000 ../pygccxml/parser/scanner.py:348(__read_member_function) + 13914 1.696 0.000 16.956 0.001 ../pygccxml/parser/linker.py:46(__link_members) + 41742/9 1.642 0.000 2.707 0.301 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:71(proceed_single) + + +running - done +>Exit code: 0 + +>python -u "test_performance.py" +unittests will run on DEVELOPMENT version +running + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + +INFO Parsing xml file "/home/roman/language-binding/sources/pygccxml_dev/unittests/data/big.xml" ... + 31520787 function calls (30822864 primitive calls) in 199.769 CPU seconds + + Ordered by: internal time, call count + List reduced from 421 to 30 due to restriction <30> + + ncalls tottime percall cumtime percall filename:lineno(function) + 814563 12.595 0.000 12.595 0.000 <string>:55(__iter__) + 424830 8.190 0.000 9.620 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/cpptypes.py:14(__init__) + 407280 6.869 0.000 57.260 0.000 ../pygccxml/parser/scanner.py:184(startElement) +424497/423300 5.643 0.000 10.489 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:10(declaration_path) +676776/208899 5.519 0.000 6.542 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:453(get_from_type) + 3 5.488 1.829 76.478 25.493 ../pygccxml/parser/etree_scanner.py:45(read) + 3972 4.797 0.001 8.675 0.002 ../pygccxml/parser/patcher.py:102(__find_enum) + 125049 4.328 0.000 6.655 0.000 ../pygccxml/parser/scanner.py:326(__read_argument) + 228615 4.253 0.000 5.794 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:60(__init__) + 124956 4.168 0.000 6.604 0.000 ../pygccxml/parser/linker.py:61(__link_calldef) + 270696 3.926 0.000 6.478 0.000 ../pygccxml/parser/linker.py:24(_set_inst) + 1825614 3.770 0.000 3.770 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:160(_get_parent) + 197373 3.757 0.000 13.898 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/class_declaration.py:282(adopt_declaration) + 228582 3.485 0.000 4.765 0.000 ../pygccxml/parser/scanner.py:224(__read_location) + 1556946 3.162 0.000 3.162 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:230(cache) + 3 3.091 1.030 14.798 4.933 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:424(_relink_declarated_types) + 115578 3.047 0.000 7.004 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/calldef.py:371(function_type) + 228612 2.726 0.000 8.139 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:70(reset) + 1550544 2.720 0.000 2.720 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:26(enabled) + 124956 2.413 0.000 8.018 0.000 ../pygccxml/parser/scanner.py:338(__read_calldef) + 6 2.260 0.377 10.256 1.709 ../pygccxml/parser/source_reader.py:27(bind_aliases) + 214926 2.179 0.000 8.457 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:425(<lambda>) + 987228 2.063 0.000 2.063 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/declaration.py:185(_get_location) + 3 1.956 0.652 145.544 48.515 ../pygccxml/parser/source_reader.py:315(__parse_gccxml_created_file) + 116067 1.946 0.000 10.222 0.000 ../pygccxml/parser/scanner.py:355(__read_member_function) + 3 1.928 0.643 17.163 5.721 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/parser/project_reader.py:452(__declarated_types) + 13914 1.902 0.000 17.540 0.001 ../pygccxml/parser/linker.py:46(__link_members) + 425985 1.879 0.000 2.584 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithms_cache.py:43(_set_access_type) + 270696 1.799 0.000 30.748 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/algorithm.py:265(apply_visitor) + 547467 1.679 0.000 1.679 0.000 /home/roman/language-binding/sources/pygccxml_dev/pygccxml/declarations/cpptypes.py:581(_get_declaration) + + +running - done +>Exit code: 0 Modified: pygccxml_dev/unittests/test_performance.py =================================================================== --- pygccxml_dev/unittests/test_performance.py 2007-04-20 14:58:08 UTC (rev 1010) +++ pygccxml_dev/unittests/test_performance.py 2007-04-20 20:22:23 UTC (rev 1011) @@ -6,8 +6,8 @@ import os import sys import time -import pstats -import cProfile +import hotshot +import hotshot.stats import autoconfig from pygccxml import * @@ -85,8 +85,9 @@ def parse_big_file(): reader = parser.project_reader_t( parser.config_t(gccxml_path=autoconfig.gccxml_path) ) - reader.read_files([parser.create_gccxml_fc( os.path.join( autoconfig.data_directory, 'big.xml' ) )]) + reader.read_files([parser.create_gccxml_fc( os.path.join( autoconfig.data_directory, 'big.xml' ) )]) + reader.read_files([parser.create_gccxml_fc( os.path.join( autoconfig.data_directory, 'big.xml' ) )]) if __name__ == "__main__": @@ -95,15 +96,19 @@ #~ test_source_on_include_std_dot_hpp() #~ test_project_on_include_std_dot_hpp() print 'running' - cProfile.run('parse_big_file()', 'pygccxml.profile') + prof = hotshot.Profile( 'parser.prof' ) + prof.runcall(parse_big_file ) + stats = hotshot.stats.load("parser.prof") + stats.sort_stats('time', 'calls') + stats.print_stats(30) print 'running - done' - print 'loading file' - pdata = pstats.Stats('pygccxml.profile') - print 'loading file - done' - print 'striping dirs' - pdata.strip_dirs() - print 'striping dirs - done' - print 'sorting stats' - pdata.sort_stats('cumulative', 'time').print_stats(476) - print 'sorting stats - done' + #~ print 'loading file' + #~ pdata = pstats.Stats('pygccxml.profile') + #~ print 'loading file - done' + #~ print 'striping dirs' + #~ pdata.strip_dirs() + #~ print 'striping dirs - done' + #~ print 'sorting stats' + #~ pdata.sort_stats('time').print_stats(476) + #~ print 'sorting stats - done' #pdata.print_callers('find_all_declarations') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-30 18:30:35
|
Revision: 1026 http://svn.sourceforge.net/pygccxml/?rev=1026&view=rev Author: roman_yakovenko Date: 2007-04-30 11:30:35 -0700 (Mon, 30 Apr 2007) Log Message: ----------- updating docs Modified Paths: -------------- pygccxml_dev/announcement.txt pygccxml_dev/docs/history/history.rest pygccxml_dev/unittests/data/core_cache.hpp Modified: pygccxml_dev/announcement.txt =================================================================== --- pygccxml_dev/announcement.txt 2007-04-29 19:15:15 UTC (rev 1025) +++ pygccxml_dev/announcement.txt 2007-04-30 18:30:35 UTC (rev 1026) @@ -1,16 +1,16 @@ Hello! -I'm pleased to announce the 0.8.5 release of pygccxml. +I'm pleased to announce the 0.9.0 release of pygccxml. What is pygccxml? ================= -"...The purpose of the GCC-XML extension is to generate an XML description of a +"...The purpose of the GCC-XML extension is to generate an XML description of a C++ program from GCC's internal representation. " -- Introduction to GCC-XML -The purpose of pygccxml is to read a generated file and provide a simple +The purpose of pygccxml is to read a generated file and provide a simple framework to navigate C++ declarations, using Python classes. Where is pygccxml? @@ -23,46 +23,33 @@ What's new? =========== -Features --------- +Performance +----------- -* Added new functionality: "I depend on them". Every declaration can report - types and declarations it depends on. This functionality helps code generators. - For example, Py++, the Boost.Python code generator, uses it to verify that all - relevant declarations were exposed. +Performance was improved. pygccxml is now 30-50% faster. The improvement was +achieved by using "cElementTree" package, "iterparse" functionality, instead of +standard XML SAX API. -* Declarations, read from GCC-XML generated file, could be saved in cache. Small features -------------- -* New type traits have been added: - * is_bool +* Class calldef_t has new property - "does_throw". It describes whether the + function throws any exception or not. -* Small improvement to algorithm, which extracts value_type - ( mapped_type ) from "std" containers. +* "is_base_and_derived" function arguments were changed. The second argument could be + a tuple, which contains classes. The function returns ``True`` if at least one + class derives from the base one. -* Few aliases to long method name were introduced: - ============================= ========================== - Name Alias - ============================= ========================== - scopedef_t.variable scopedef_t.var - scopedef_t.variables scopedef_t.vars - scopedef_t.member_function scopedef_t.mem_fun - scopedef_t.member_functions scopedef_t.mem_funs - scopedef_t.free_function scopedef_t.free_fun - scopedef_t.free_functions scopedef_t.free_funs - ============================= ========================== - Bug fixes --------- -* "signed char" and "char" are two different types. This bug was fixed and - now pygccxml treats them right. Many thanks to Gaetan Lehmann for reporting - the bug. +* C++ does not define implicit conversion between an integral type and ``void*``. + "declarations.is_convertible" type traits was fixed. -* Fixing bug related to array size and cache. +* Small bug was fixed in functionality that corrects GCC-XML reported function + default arguments. Reference to "enum" declaration extracted properly. For a more complete list, please see the news: Modified: pygccxml_dev/docs/history/history.rest =================================================================== --- pygccxml_dev/docs/history/history.rest 2007-04-29 19:15:15 UTC (rev 1025) +++ pygccxml_dev/docs/history/history.rest 2007-04-30 18:30:35 UTC (rev 1026) @@ -33,7 +33,7 @@ .. _`cElementTree` : http://effbot.org/zone/celementtree.htm 2. ``is_base_and_derived`` function was changed. The second argument could be - a tuple, which contains classes. Function returns ``True`` if at least one + a tuple, which contains classes. The function returns ``True`` if at least one class derives from the base one. .. line separator Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2007-04-29 19:15:15 UTC (rev 1025) +++ pygccxml_dev/unittests/data/core_cache.hpp 2007-04-30 18:30:35 UTC (rev 1026) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch//touch \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-05-27 09:18:08
|
Revision: 1039 http://svn.sourceforge.net/pygccxml/?rev=1039&view=rev Author: roman_yakovenko Date: 2007-05-27 02:18:09 -0700 (Sun, 27 May 2007) Log Message: ----------- adding is_calldef_pointer type traits Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/type_traits.py pygccxml_dev/unittests/data/type_traits.hpp pygccxml_dev/unittests/type_traits_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2007-05-24 09:57:22 UTC (rev 1038) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2007-05-27 09:18:09 UTC (rev 1039) @@ -136,6 +136,7 @@ from type_traits import is_std_wstring from type_traits import is_std_ostream from type_traits import is_std_wostream +from type_traits import is_calldef_pointer from type_traits import is_unary_operator from type_traits import is_binary_operator Modified: pygccxml_dev/pygccxml/declarations/type_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/type_traits.py 2007-05-24 09:57:22 UTC (rev 1038) +++ pygccxml_dev/pygccxml/declarations/type_traits.py 2007-05-27 09:18:09 UTC (rev 1039) @@ -154,6 +154,16 @@ , cpptypes.pointer_t , (cpptypes.const_t, cpptypes.volatile_t) ) +def is_calldef_pointer(type): + """returns True, if type represents pointer to free/member function, False otherwise""" + if not is_pointer(type): + return False + nake_type = remove_alias( type ) + nake_type = remove_const( nake_type ) + nake_type = remove_volatile( nake_type ) + return isinstance( nake_type, cpptypes.compound_t ) \ + and isinstance( nake_type.base, cpptypes.calldef_type_t ) + def remove_pointer(type): """removes pointer from the type definition Modified: pygccxml_dev/unittests/data/type_traits.hpp =================================================================== --- pygccxml_dev/unittests/data/type_traits.hpp 2007-05-24 09:57:22 UTC (rev 1038) +++ pygccxml_dev/unittests/data/type_traits.hpp 2007-05-27 09:18:09 UTC (rev 1039) @@ -10,9 +10,10 @@ #include <iostream> #define TYPE_PERMUTATION( BASE, NAME ) \ - typedef BASE NAME##_t; \ - typedef BASE const NAME##_const_t; \ - typedef BASE volatile NAME##_volatile_t; + typedef BASE NAME##_t; \ + typedef BASE const NAME##_const_t; \ + typedef BASE volatile NAME##_volatile_t; \ + typedef BASE const volatile NAME##_const_volatile_t; struct some_struct_t{ void do_smth(); @@ -85,6 +86,31 @@ } } + + +namespace is_calldef_pointer{ + +namespace details{ +struct X{ + void do_smth( int ) const; +}; + +} + +namespace yes{ + typedef void (*ff1)( int, int ); + typedef void ( details::X::*mf1)( int ) const; + + TYPE_PERMUTATION( ff1, ff1_type ); + TYPE_PERMUTATION( mf1, mf1_type ); +} + +namespace no{ + typedef int int_; +} + +} + namespace is_integral{ namespace yes{ Modified: pygccxml_dev/unittests/type_traits_tester.py =================================================================== --- pygccxml_dev/unittests/type_traits_tester.py 2007-05-24 09:57:22 UTC (rev 1038) +++ pygccxml_dev/unittests/type_traits_tester.py 2007-05-27 09:18:09 UTC (rev 1039) @@ -111,6 +111,9 @@ def test_is_std_wostream(self): self.__test_type_category( 'is_std_wostream', declarations.is_std_wostream ) + def test_is_calldef_pointer(self): + self.__test_type_category( 'is_calldef_pointer', declarations.is_calldef_pointer ) + def test_has_trivial_constructor(self): self.__test_type_category( 'has_trivial_constructor', declarations.has_trivial_constructor ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-06-03 13:29:58
|
Revision: 1050 http://svn.sourceforge.net/pygccxml/?rev=1050&view=rev Author: roman_yakovenko Date: 2007-06-03 06:29:46 -0700 (Sun, 03 Jun 2007) Log Message: ----------- adding ability to select compiler Modified Paths: -------------- pygccxml_dev/pygccxml/parser/config.py pygccxml_dev/pygccxml/parser/source_reader.py pygccxml_dev/unittests/autoconfig.py Modified: pygccxml_dev/pygccxml/parser/config.py =================================================================== --- pygccxml_dev/pygccxml/parser/config.py 2007-06-03 07:40:11 UTC (rev 1049) +++ pygccxml_dev/pygccxml/parser/config.py 2007-06-03 13:29:46 UTC (rev 1050) @@ -29,7 +29,8 @@ , include_paths=None , define_symbols=None , undefine_symbols=None - , cflags=""): + , cflags="" + , compiler=None): """Constructor. """ object.__init__( self ) @@ -49,6 +50,8 @@ self.__cflags = cflags + self.__compiler = compiler + def clone(self): raise NotImplementedError( self.__class__.__name__ ) @@ -58,23 +61,32 @@ self.__working_directory=working_dir working_directory = property( __get_working_directory, __set_working_directory ) - def __get_include_paths(self): + @property + def include_paths(self): + """list of include paths to look for header files""" return self.__include_paths - include_paths = property( __get_include_paths ) - def __get_define_symbols(self): + @property + def define_symbols(self): + """list of "define" directives """ return self.__define_symbols - define_symbols = property( __get_define_symbols ) - def __get_undefine_symbols(self): + @property + def undefine_symbols(self): + """list of "undefine" directives """ return self.__undefine_symbols - undefine_symbols = property( __get_undefine_symbols ) - + + @property + def compiler(self): + """compiler name to simulate""" + return self.__compiler + def __get_cflags(self): return self.__cflags def __set_cflags(self, val): self.__cflags = val - cflags = property( __get_cflags, __set_cflags ) + cflags = property( __get_cflags, __set_cflags + , doc="additional flags to pass to compiler" ) def __ensure_dir_exists( self, dir_path, meaning ): if os.path.isdir( dir_path ): @@ -87,6 +99,7 @@ def raise_on_wrong_settings( self ): + """validates the configuration settings and raises RuntimeError on error""" self.__ensure_dir_exists( self.working_directory, 'working directory' ) map( lambda idir: self.__ensure_dir_exists( idir, 'include directory' ) , self.include_paths ) @@ -106,7 +119,8 @@ , undefine_symbols=None , start_with_declarations=None , ignore_gccxml_output=False - , cflags=""): + , cflags="" + , compiler=None): """Constructor. """ parser_configuration_t.__init__( self @@ -114,7 +128,9 @@ , include_paths=include_paths , define_symbols=define_symbols , undefine_symbols=undefine_symbols - , cflags=cflags) + , cflags=cflags + , compiler=compiler) + self.__gccxml_path = gccxml_path if not start_with_declarations: @@ -130,17 +146,20 @@ return self.__gccxml_path def __set_gccxml_path(self, new_path ): self.__gccxml_path = new_path - gccxml_path = property( __get_gccxml_path, __set_gccxml_path ) + gccxml_path = property( __get_gccxml_path, __set_gccxml_path + , doc="gccxml binary location" ) - def __get_start_with_declarations(self): + @property + def start_with_declarations(self): + """list of declarations gccxml should start with, when it dumps declaration tree""" return self.__start_with_declarations - start_with_declarations = property( __get_start_with_declarations ) def __get_ignore_gccxml_output(self): return self.__ignore_gccxml_output def __set_ignore_gccxml_output(self, val=True): self.__ignore_gccxml_output = val - ignore_gccxml_output = property( __get_ignore_gccxml_output, __set_ignore_gccxml_output ) + ignore_gccxml_output = property( __get_ignore_gccxml_output, __set_ignore_gccxml_output + , doc="set this property to True, if you want pygccxml to ignore any error\\warning that comes from gccxml" ) def raise_on_wrong_settings( self ): @@ -182,7 +201,8 @@ , include_paths=None , define_symbols=None , undefine_symbols=None - , cflags=""): + , cflags="" + , compiler=None): """Constructor. """ parser_configuration_t.__init__( self @@ -190,7 +210,8 @@ , include_paths=include_paths , define_symbols=define_symbols , undefine_symbols=undefine_symbols - , cflags=cflags) + , cflags=cflags + , compiler=compiler) def clone(self): return copy.deepcopy( self ) Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2007-06-03 07:40:11 UTC (rev 1049) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2007-06-03 13:29:46 UTC (rev 1050) @@ -99,6 +99,7 @@ cmd.append( '"%s"' % os.path.normpath( self.__config.gccxml_path ) ) else: cmd.append( '%s' % os.path.normpath( self.__config.gccxml_path ) ) + # Add all cflags passed if self.__config.cflags != "": cmd.append(" %s "%self.__config.cflags) @@ -113,7 +114,9 @@ cmd.append( '-fxml="%s"' % xmlfile ) if self.__config.start_with_declarations: cmd.append( '-fxml-start="%s"' % ','.join( self.__config.start_with_declarations ) ) - + # Specify compiler if asked to + if self.__config.compiler: + cmd.append( " --gccxml-compiler %s" % self.__config.compiler ) cmd_line = ' '.join(cmd) if 'win32' in sys.platform : cmd_line = '"%s"' % cmd_line Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2007-06-03 07:40:11 UTC (rev 1049) +++ pygccxml_dev/unittests/autoconfig.py 2007-06-03 13:29:46 UTC (rev 1050) @@ -10,12 +10,14 @@ #__pychecker__ = 'limit=1000' #import pychecker.checker +compiler = None gccxml_path = '' data_directory = os.path.abspath( os.path.join( os.curdir, 'data' ) ) build_dir = os.path.abspath( os.path.join( os.curdir, 'temp' ) ) if 'roman' in getpass.getuser(): if sys.platform == 'win32': + compiler = 'msvc71' gccxml_path = r'd:/dev/gccxml_cvs/gccxml-bin/bin/release/gccxml.exe' else: gccxml_path = '/home/roman/gccxml/bin/gccxml' @@ -32,7 +34,8 @@ class cxx_parsers_cfg: gccxml = pygccxml.parser.gccxml_configuration_t( gccxml_path=gccxml_path - , working_directory=data_directory ) + , working_directory=data_directory + , compiler=compiler ) synopsis = pygccxml.parser.synopsis_configuration_t( working_directory=data_directory ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-06-13 05:42:41
|
Revision: 1052 http://svn.sourceforge.net/pygccxml/?rev=1052&view=rev Author: roman_yakovenko Date: 2007-06-12 22:42:40 -0700 (Tue, 12 Jun 2007) Log Message: ----------- adding new functionality to free operators - now they are able to report class types, they work on Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/calldef.py pygccxml_dev/unittests/test_all.py Added Paths: ----------- pygccxml_dev/unittests/data/free_operators.hpp pygccxml_dev/unittests/free_operators_tester.py Modified: pygccxml_dev/pygccxml/declarations/calldef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/calldef.py 2007-06-10 19:30:09 UTC (rev 1051) +++ pygccxml_dev/pygccxml/declarations/calldef.py 2007-06-13 05:42:40 UTC (rev 1052) @@ -427,10 +427,10 @@ def __init__(self): object.__init__(self) - def _get_symbol(self): + @property + def symbol(self): + "operator's symbol. For example: operator+, symbol is equal to '+'" return self.name[operator_t.OPERATOR_WORD_LEN:].strip() - symbol = property( _get_symbol, - doc="returns symbol of operator. For example: operator+, symbol is equal to '+'") #Third level in hierarchy of calldef class member_function_t( member_calldef_t ): @@ -438,7 +438,6 @@ def __init__( self, *args, **keywords ): member_calldef_t.__init__( self, *args, **keywords ) - class constructor_t( member_calldef_t ): """describes constructor declaration""" def __init__( self, *args, **keywords ): @@ -485,6 +484,7 @@ def __init__( self, *args, **keywords ): member_calldef_t.__init__( self, *args, **keywords ) operator_t.__init__( self, *args, **keywords ) + self.__class_types = None class casting_operator_t( member_calldef_t, operator_t ): """describes casting operator declaration""" @@ -502,3 +502,22 @@ def __init__( self, *args, **keywords ): free_calldef_t.__init__( self, *args, **keywords ) operator_t.__init__( self, *args, **keywords ) + self.__class_types = None + + @property + def class_types( self ): + """list of class/class declaration types, extracted from the operator arguments""" + if None is self.__class_types: + self.__class_types = [] + for type_ in self.argument_types: + decl = None + type_ = type_traits.remove_reference( type_ ) + if type_traits.is_class( type_ ): + decl = type_traits.class_traits.get_declaration( type_ ) + elif type_traits.is_class_declaration( type_ ): + decl = type_traits.class_declaration_traits.get_declaration( type_ ) + else: + pass + if decl: + self.__class_types.append( decl ) + return self.__class_types Added: pygccxml_dev/unittests/data/free_operators.hpp =================================================================== --- pygccxml_dev/unittests/data/free_operators.hpp (rev 0) +++ pygccxml_dev/unittests/data/free_operators.hpp 2007-06-13 05:42:40 UTC (rev 1052) @@ -0,0 +1,57 @@ +// 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 __free_operators_to_be_exported_hpp__ +#define __free_operators_to_be_exported_hpp__ + +namespace free_operators{ + +struct number{ + int i; + + number operator*( int ii ) const { + number n2 = { i * ii }; + return n2; + } +}; + +struct rational{ + int x, y; +}; + +number operator+( const number& x, int y ){ + number z; + z.i = x.i + y; + return z; +} + +bool operator!( const number& x ){ + return !x.i; +} + +number operator*( const number& n, double i ){ + number n2 = { n.i * i }; + return n2; +} + +number operator*( double i, const number& n ){ + number n2 = { n.i * i }; + return n2; +} + +rational operator*( int i, const rational& r ){ + rational rr = { r.x * i, r.y }; + return rr; +} + +bool operator!( const rational& x ){ + return !x.x; +} + + +} + + +#endif//__free_operators_to_be_exported_hpp__ Added: pygccxml_dev/unittests/free_operators_tester.py =================================================================== --- pygccxml_dev/unittests/free_operators_tester.py (rev 0) +++ pygccxml_dev/unittests/free_operators_tester.py 2007-06-13 05:42:40 UTC (rev 1052) @@ -0,0 +1,46 @@ +# 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 os +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 ): + def __init__(self, *args ): + parser_test_case.parser_test_case_t.__init__( self, *args ) + self.header = 'free_operators.hpp' + self.global_ns = None + + def setUp(self): + reader = parser.source_reader_t( self.config ) + decls = reader.read_file( self.header ) + self.global_ns = declarations.get_global_namespace( decls ) + + def test( self ): + fo = self.global_ns.namespace( 'free_operators' ) + number = fo.class_( 'number' ) + rational = fo.class_( 'rational' ) + for oper in fo.free_operators(): + if number.name in str( oper ): + self.failUnless( number in oper.class_types ) + if rational.name in str( oper ): + self.failUnless( rational in oper.class_types ) + + +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-10 19:30:09 UTC (rev 1051) +++ pygccxml_dev/unittests/test_all.py 2007-06-13 05:42:40 UTC (rev 1052) @@ -40,6 +40,7 @@ import has_binary_operator_traits_tester import algorithms_cache_tester import dependencies_tester +import free_operators_tester def create_suite(): testers = [ @@ -79,6 +80,7 @@ , has_binary_operator_traits_tester , algorithms_cache_tester , dependencies_tester + , free_operators_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <rom...@us...> - 2007-06-17 10:42:05
|
Revision: 1060 http://svn.sourceforge.net/pygccxml/?rev=1060&view=rev Author: roman_yakovenko Date: 2007-06-17 03:42:04 -0700 (Sun, 17 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/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-17 08:27:49 UTC (rev 1059) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2007-06-17 10:42:04 UTC (rev 1060) @@ -169,7 +169,7 @@ from container_traits import list_traits from container_traits import deque_traits from container_traits import queue_traits -from container_traits import priority_queue +from container_traits import priority_queue_traits from container_traits import vector_traits from container_traits import stack_traits from container_traits import map_traits @@ -183,31 +183,15 @@ from function_traits import is_same_function -all_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 -] -"""list, that contains all STD container traits classes""" +all_container_traits = container_traits.container_traits +"""tuple of all STD container traits classes""" sequential_container_traits = \ [ list_traits , deque_traits , queue_traits - , priority_queue + , priority_queue_traits , vector_traits , stack_traits , set_traits Modified: pygccxml_dev/pygccxml/declarations/container_traits.py =================================================================== --- pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-17 08:27:49 UTC (rev 1059) +++ pygccxml_dev/pygccxml/declarations/container_traits.py 2007-06-17 10:42:04 UTC (rev 1060) @@ -15,6 +15,9 @@ import type_traits import class_declaration +def __normalize_type( 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> >' @@ -38,7 +41,7 @@ return cls_name return 'std::' + c_traits.remove_defaults( no_std_cls_name ) -def __remove_allocator( cls_name ): +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 ) @@ -46,28 +49,61 @@ if 2 != len( c_args ): return a_name, a_args = templates.split( c_args[1] ) - if 'allocator' not in a_name: + if __normalize_type(default_allocator) != __normalize_type( a_name ): return if 1 != len( a_args ): return - if c_args[0].strip() != a_args[0]: + 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] ) -def __remove_container( cls_name, default_container_name='deque' ): +def __remove_container( cls_name, default_container_name='std::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]] ): + 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] ) + +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] ) + +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] ) + + class container_traits_impl_t: """this class implements the functionality needed for convinient work with STD container classes. @@ -192,7 +228,7 @@ queue_traits = create_traits_class( 'queue', 0, 'value_type', __remove_container ) -priority_queue = create_traits_class( 'priority_queue', 0, 'value_type' ) +priority_queue_traits = create_traits_class( 'priority_queue', 0, 'value_type', __remove_container_compare ) vector_traits = create_traits_class( 'vector', 0, 'value_type', __remove_allocator ) @@ -204,17 +240,17 @@ 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' ) +set_traits = create_traits_class( 'set', 0, 'value_type', __remove_compare_allocator ) hash_set_traits = create_traits_class( 'hash_set', 0, 'value_type' ) -multiset_traits = create_traits_class( 'multiset', 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 = ( list_traits , deque_traits , queue_traits - , priority_queue + , priority_queue_traits , vector_traits , stack_traits , map_traits @@ -225,6 +261,7 @@ , hash_set_traits , multiset_traits , hash_multiset_traits ) +"""tuple of all STD container traits classes""" def find_container_traits( cls_or_string ): if isinstance( cls_or_string, types.StringTypes ): Modified: pygccxml_dev/unittests/data/remove_template_defaults.hpp =================================================================== --- pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-06-17 08:27:49 UTC (rev 1059) +++ pygccxml_dev/unittests/data/remove_template_defaults.hpp 2007-06-17 10:42:04 UTC (rev 1060) @@ -11,6 +11,7 @@ #include <deque> #include <queue> #include <list> +#include <set> namespace rtd{ @@ -36,6 +37,24 @@ } +namespace priority_queues{ + typedef std::priority_queue< int > pq_int; + typedef std::priority_queue< std::string > pq_string; + } +namespace sets{ + typedef std::set< std::vector< int > > s_v_int; + typedef std::set< std::string > s_string; + +} + +namespace multiset_sets{ + typedef std::multiset< std::vector< int > > ms_v_int; + typedef std::multiset< std::string > ms_string; + +} + +} + #endif//__remove_template_defaults_hpp__ Modified: pygccxml_dev/unittests/remove_template_defaults_tester.py =================================================================== --- pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-17 08:27:49 UTC (rev 1059) +++ pygccxml_dev/unittests/remove_template_defaults_tester.py 2007-06-17 10:42:04 UTC (rev 1060) @@ -58,7 +58,30 @@ self.failUnless( 'queue< std::string >' == declarations.queue_traits.remove_defaults( q_string ) ) + def test_priority_queue( self ): + pq_int = self.global_ns.typedef( 'pq_int' ) + self.failUnless( 'priority_queue< int >' + == declarations.priority_queue_traits.remove_defaults( pq_int ) ) + pq_string = self.global_ns.typedef( 'pq_string' ) + self.failUnless( 'priority_queue< std::string >' + == declarations.priority_queue_traits.remove_defaults( pq_string ) ) + def test_set( self ): + s_v_int = self.global_ns.typedef( 's_v_int' ) + self.failUnless( 'set< std::vector< int > >' + == declarations.set_traits.remove_defaults( s_v_int ) ) + s_string = self.global_ns.typedef( 's_string' ) + self.failUnless( 'set< std::string >' + == declarations.set_traits.remove_defaults( s_string ) ) + + def test_multiset( self ): + ms_v_int = self.global_ns.typedef( 'ms_v_int' ) + self.failUnless( 'multiset< std::vector< int > >' + == declarations.multiset_traits.remove_defaults( ms_v_int ) ) + ms_string = self.global_ns.typedef( 'ms_string' ) + self.failUnless( 'multiset< std::string >' + == declarations.multiset_traits.remove_defaults( ms_string ) ) + 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. |
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. |