Thread: [pygccxml-commit] SF.net SVN: pygccxml:[1496] pyplusplus_dev (Page 2)
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2008-12-24 21:08:39
|
Revision: 1496 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1496&view=rev Author: roman_yakovenko Date: 2008-12-24 21:08:35 +0000 (Wed, 24 Dec 2008) Log Message: ----------- rename module_creator to creators_factory Modified Paths: -------------- pyplusplus_dev/docs/documentation/architecture.rest pyplusplus_dev/docs/documentation/functions/registration_order.rest pyplusplus_dev/pyplusplus/__init__.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py pyplusplus_dev/setup.py pyplusplus_dev/unittests/algorithms_tester.py pyplusplus_dev/unittests/declarations_order_bug_tester.py pyplusplus_dev/unittests/exposed_decls_db_tester.py pyplusplus_dev/unittests/finalizables_tester.py pyplusplus_dev/unittests/module_properties_tester.py pyplusplus_dev/unittests/ogre_generate_tester.py pyplusplus_dev/unittests/particle_universe_generate_tester.py pyplusplus_dev/unittests/unicode_bug.py Added Paths: ----------- pyplusplus_dev/pyplusplus/creators_factory/ Removed Paths: ------------- pyplusplus_dev/pyplusplus/module_creator/ Modified: pyplusplus_dev/docs/documentation/architecture.rest =================================================================== --- pyplusplus_dev/docs/documentation/architecture.rest 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/docs/documentation/architecture.rest 2008-12-24 21:08:35 UTC (rev 1496) @@ -265,8 +265,8 @@ ``Code creators tree`` construction ----------------------------------- -``pyplusplus.module_creator`` package is responsible for the tree construction. -``pyplusplus.module_creator.creator_t`` is the main class of the package. It +``pyplusplus.creators_factory`` package is responsible for the tree construction. +``pyplusplus.creators_factory.creator_t`` is the main class of the package. It creates the tree in few steps: 1. It builds set of exposed declarations. Modified: pyplusplus_dev/docs/documentation/functions/registration_order.rest =================================================================== --- pyplusplus_dev/docs/documentation/functions/registration_order.rest 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/docs/documentation/functions/registration_order.rest 2008-12-24 21:08:35 UTC (rev 1496) @@ -110,7 +110,7 @@ .. code-block:: Python - from pyplusplus.module_creator import sort_algorithms + from pyplusplus.creators_factory import sort_algorithms sort_algorithms.USE_CALLDEF_ORGANIZER = True # The functionality is available from version 0.8.3 Modified: pyplusplus_dev/pyplusplus/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/__init__.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/pyplusplus/__init__.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -25,7 +25,7 @@ import code_creators import file_writers -import module_creator +import creators_factory import code_repository import utils import decl_wrappers Modified: pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -18,7 +18,7 @@ from pyplusplus import decl_wrappers from pyplusplus import file_writers from pyplusplus import code_creators -from pyplusplus import module_creator as mcreator_package +from pyplusplus import creators_factory class builder_t(module_builder.module_builder_t): """ @@ -165,7 +165,7 @@ def __apply_decls_defaults(self, decls): flatten_decls = decls_package.make_flatten( decls ) self.__filter_by_location( flatten_decls ) - call_policies_resolver = mcreator_package.built_in_resolver_t() + call_policies_resolver = creators_factory.built_in_resolver_t() calldefs = filter( lambda decl: isinstance( decl, decls_package.calldef_t ) , flatten_decls ) map( lambda calldef: calldef.set_call_policies( call_policies_resolver( calldef ) ) @@ -234,7 +234,7 @@ self.global_ns.constructors(allow_empty=True).allow_implicit_conversion = False - creator = mcreator_package.creator_t( self.global_ns + creator = creators_factory.creator_t( self.global_ns , module_name , boost_python_ns_name , call_policies_resolver_ Modified: pyplusplus_dev/setup.py =================================================================== --- pyplusplus_dev/setup.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/setup.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -100,7 +100,7 @@ packages=[ 'pyplusplus', 'pyplusplus.file_writers', 'pyplusplus.code_creators', - 'pyplusplus.module_creator', + 'pyplusplus.creators_factory', 'pyplusplus.code_repository', 'pyplusplus.decl_wrappers', 'pyplusplus.module_builder', Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/algorithms_tester.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -11,7 +11,7 @@ from pygccxml import parser from pygccxml import declarations from pyplusplus import code_creators -from pyplusplus import module_creator +from pyplusplus import creators_factory from pyplusplus import module_builder from pyplusplus import utils as pypp_utils from pyplusplus import function_transformers as ft @@ -85,7 +85,7 @@ global_ns = parser.parse_string( os.linesep.join( code ), config ) decls = global_ns[0].declarations - dorder = module_creator.findout_desired_order( decls ) + dorder = creators_factory.findout_desired_order( decls ) self.failUnless( len( code ) == len( dorder ), 'all classes should stay within the list' ) for i in range( 1, len(dorder) ): bases = set( self._findout_base_classes( dorder[i] ) ) Modified: pyplusplus_dev/unittests/declarations_order_bug_tester.py =================================================================== --- pyplusplus_dev/unittests/declarations_order_bug_tester.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/declarations_order_bug_tester.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -8,7 +8,7 @@ import unittest import fundamental_tester_base from pyplusplus.module_builder import call_policies -from pyplusplus.module_creator import sort_algorithms +from pyplusplus.creators_factory import sort_algorithms class tester_base_t(fundamental_tester_base.fundamental_tester_base_t): def __init__( self, name, *args ): Modified: pyplusplus_dev/unittests/exposed_decls_db_tester.py =================================================================== --- pyplusplus_dev/unittests/exposed_decls_db_tester.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/exposed_decls_db_tester.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -12,7 +12,7 @@ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators -from pyplusplus import module_creator +from pyplusplus import creators_factory from pyplusplus import module_builder from pyplusplus import utils as pypp_utils from pyplusplus import function_transformers as ft Modified: pyplusplus_dev/unittests/finalizables_tester.py =================================================================== --- pyplusplus_dev/unittests/finalizables_tester.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/finalizables_tester.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -24,23 +24,23 @@ find = code_creators.creator_finder.find_by_declaration_single matcher = declarations.match_declaration_t( name='year' , type=declarations.member_function_t) - found = find( matcher, mb.module_creator.body.creators ) + found = find( matcher, mb.code_creator.body.creators ) self.failUnless( found ) self.failUnless( found.is_finalizable() ) found.finalize() #from now should be only one instances that references year function - found = find( matcher, mb.module_creator.creators ) + found = find( matcher, mb.code_creator.creators ) self.failUnless( found ) self.failUnless( not found.is_finalizable() ) matcher = declarations.match_declaration_t( name='whole_class_t' , type=declarations.class_t) - found = find( matcher, mb.module_creator.body.creators ) + found = find( matcher, mb.code_creator.body.creators ) self.failUnless( found ) self.failUnless( found.is_finalizable() ) found.finalize() #from now should be only one instances that references whole_class_t class - found = find( matcher, mb.module_creator.creators ) + found = find( matcher, mb.code_creator.creators ) self.failUnless( found ) self.failUnless( not found.is_finalizable() ) except: Modified: pyplusplus_dev/unittests/module_properties_tester.py =================================================================== --- pyplusplus_dev/unittests/module_properties_tester.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/module_properties_tester.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -8,7 +8,7 @@ import unittest import autoconfig from pyplusplus import code_creators -from pyplusplus import module_creator +from pyplusplus import creators_factory class tester_t(unittest.TestCase): def __init__(self, *args ): Modified: pyplusplus_dev/unittests/ogre_generate_tester.py =================================================================== --- pyplusplus_dev/unittests/ogre_generate_tester.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/ogre_generate_tester.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -13,7 +13,7 @@ from pygccxml import declarations from pyplusplus import messages from pyplusplus import code_creators -from pyplusplus import module_creator +from pyplusplus import creators_factory from pyplusplus import module_builder from pyplusplus import utils as pypp_utils from pyplusplus import function_transformers as ft Modified: pyplusplus_dev/unittests/particle_universe_generate_tester.py =================================================================== --- pyplusplus_dev/unittests/particle_universe_generate_tester.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/particle_universe_generate_tester.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -13,7 +13,7 @@ from pygccxml import declarations from pyplusplus import messages from pyplusplus import code_creators -from pyplusplus import module_creator +from pyplusplus import creators_factory from pyplusplus import module_builder from pyplusplus import utils as pypp_utils from pyplusplus import function_transformers as ft Modified: pyplusplus_dev/unittests/unicode_bug.py =================================================================== --- pyplusplus_dev/unittests/unicode_bug.py 2008-12-24 20:57:21 UTC (rev 1495) +++ pyplusplus_dev/unittests/unicode_bug.py 2008-12-24 21:08:35 UTC (rev 1496) @@ -7,7 +7,7 @@ from pygccxml import parser from pygccxml import declarations from pyplusplus import code_creators -from pyplusplus import module_creator +from pyplusplus import creators_factory from pyplusplus import module_builder from pyplusplus import utils as pypp_utils from pyplusplus import function_transformers as ft This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-26 09:43:51
|
Revision: 1504 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1504&view=rev Author: roman_yakovenko Date: 2008-12-26 09:43:47 +0000 (Fri, 26 Dec 2008) Log Message: ----------- first code creators classes for ctypes Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/bpmodule.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/compound.py pyplusplus_dev/pyplusplus/code_creators/import_.py pyplusplus_dev/pyplusplus/code_creators/library_reference.py pyplusplus_dev/pyplusplus/code_creators/name_mappings.py pyplusplus_dev/pyplusplus/creators_factory/__init__.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py Property Changed: ---------------- pyplusplus_dev/pyplusplus/cpptypes/mydll/ pyplusplus_dev/pyplusplus/cpptypes/mydll/release/ Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -15,6 +15,7 @@ """ from code_creator import code_creator_t +from code_creator import separator_t from compound import compound_t from algorithm import (make_flatten, make_flatten_list, make_flatten_generator) @@ -141,6 +142,8 @@ from ctypes_integration_creators import expose_sizeof_t #pure ctypes +from ctypes_module import ctypes_module_t from import_ import import_t from library_reference import library_reference_t -from name_mappings import name_mapping_t +from name_mappings import name_mappings_t + Modified: pyplusplus_dev/pyplusplus/code_creators/bpmodule.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/bpmodule.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/bpmodule.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -126,15 +126,17 @@ def _create_impl(self): self.do_include_dirs_optimization() index = 0 - includes = [] + code = [] for index in range( len( self.creators ) ): if not isinstance( self.creators[index], include.include_t ): break else: - includes.append( self.creators[index].create() ) - code = compound.compound_t.create_internal_code( self.creators[index:] ) - code = self.unindent(code) - return os.linesep.join( includes ) + 2 * os.linesep + code + os.linesep + code.append( self.creators[index].create() ) + if code: + code.append( 2* os.linesep ) + code.append( self.create_internal_code( self.creators[index:], indent_code=False )) + code.append( os.linesep ) + return os.linesep.join( code ) def add_include( self, header, user_defined=True, system=False ): creator = include.include_t( header=header, user_defined=user_defined, system=system ) Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -63,7 +63,12 @@ @type: L{target_configuration_t} """) - def _get_top_parent(self): + @property + def top_parent(self): + """top_parent - reference to top parent code creator + + @type: L{code_creator_t} + """ parent = self.parent me = self while True: @@ -72,11 +77,6 @@ else: me = parent parent = me.parent - """top_parent - reference to top parent code creator""" - top_parent = property( _get_top_parent, - doc="""Root of the code creator tree. - @type: L{code_creator_t} - """) def _create_impl(self): """ @@ -185,3 +185,16 @@ return true_ else: return false_ + + +class separator_t(code_creator_t): + """Creates Python import directive""" + def __init__( self, num=1): + code_creator_t.__init__(self) + self.__code = os.linesep * num + + def _create_impl(self): + return self.__code + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_creators/compound.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/compound.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/compound.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -13,11 +13,11 @@ @param parent: Parent code creator. @type parent: L{code_creator_t} """ - code_creator.code_creator_t.__init__( self ) + code_creator.code_creator_t.__init__( self ) self._creators = [] - + def _get_creators(self): - return self._creators + return self._creators creators = property(_get_creators, doc="""A list of children nodes. @type: list of L{code_creator_t}""") @@ -58,10 +58,10 @@ @type creator: L{code_creator_t} """ creator.parent = None - del self._creators[ self._creators.index( creator ) ] + del self._creators[ self._creators.index( creator ) ] @staticmethod - def create_internal_code( creators ): + def create_internal_code( creators, indent_code=True ): """Concatenate the code from a list of code creators. @param creators: A list with code creators @@ -70,20 +70,20 @@ """ internals = map( lambda expr: expr.create(), creators ) internals = filter(None, internals ) - internals = map( lambda code: code_creator.code_creator_t.indent( code ) - , internals ) + if indent_code: + internals = map( lambda code: code_creator.code_creator_t.indent( code ) + , internals ) for index in range( len( internals ) - 1): internals[index] = internals[index] + os.linesep return os.linesep.join( internals ) - + def get_system_headers( self, recursive=False, unique=False ): files = [ "boost/python.hpp" ] files.extend( self._get_system_headers_impl() ) if recursive: - for creator in self._creators: + for creator in self._creators: files.extend( creator.get_system_headers(recursive, unique=False) ) files = filter( None, files ) if unique: files = self.unique_headers( files ) return files - \ No newline at end of file Added: pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -0,0 +1,31 @@ +# Copyright 2004-2008 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 module +import import_ +import library_reference +from pygccxml import utils + +class ctypes_module_t(module.module_t): + """This class represents the source code for the entire extension module. + + The root of the code creator tree is always a module_t object. + """ + def __init__(self, global_ns): + """Constructor. + """ + module.module_t.__init__(self, global_ns) + + def _create_impl(self): + return self.create_internal_code( self.creators, indent_code=False ) + + @utils.cached + def library_var_name(self): + for creator in self.creators: + if isinstance( creator, library_reference.library_reference_t ): + return creator.library_var_name + else: + raise RuntimeError( "Internal Error: library_reference_t creator was not created" ) Modified: pyplusplus_dev/pyplusplus/code_creators/import_.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/import_.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/import_.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -14,7 +14,7 @@ self._module_name = module_name def _create_impl(self): - return 'import %(module)s' % dict( module=self.module_name ) + return 'import %(module)s' % dict( module=self._module_name ) def _get_system_headers_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/library_reference.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -3,25 +3,36 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import os import code_creator +from pyplusplus import decl_wrappers - class library_reference_t(code_creator.code_creator_t): """Creates reference to a library""" - def __init__( self, library_var_name, library_path, is_cpp_library ): + def __init__( self, library_path, library_var_name=None, is_cpp_library=True ): code_creator.code_creator_t.__init__(self) self._library_path = library_path self._is_cpp_library = is_cpp_library - self._library_var_name = library_var_name + self._library_var_name = self.__create_library_var_name( library_path, library_var_name ) + @property + def library_var_name(self): + return self._library_var_name + + def __create_library_var_name( self, library_path, library_var_name ): + if library_var_name: + return library_var_name + else: + basename = os.path.splitext( os.path.basename( library_path ) )[0] + return decl_wrappers.algorithm.create_valid_name( basename ) + def _create_impl(self): return '%(var)s = ctypes.%(loader)s( r"%(path)s" )' \ - % dict( var=self._library_var_name + % dict( var=self.library_var_name , loader=self.iif( self._is_cpp_library, 'CPPDLL', 'CDLL' ) , path=self._library_path ) - def _get_system_headers_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/name_mappings.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -7,14 +7,13 @@ import code_creator -class name_mapping_t(code_creator.code_creator_t): +class name_mappings_t(code_creator.code_creator_t): """creates dictionery { [un]decorated name : [un]decorated name }""" def __init__( self, exported_symbols ): code_creator.code_creator_t.__init__(self) self._exported_symbols = exported_symbols - def _create_impl(self): tmpl = '"%s" : "%s", ' items_decorated = [] @@ -24,7 +23,8 @@ items_undecorated.append( tmpl % ( undecorated, blob ) ) result = [] - result.append('%s.undecorated_names = {#mapping between decorated and undecorated names' % self._dictionary_var_name ) + result.append( '%s.undecorated_names = {#mapping between decorated and undecorated names' + % self.top_parent.library_var_name ) for s in items_undecorated: result.append( self.indent( s ) ) for s in items_decorated: @@ -32,7 +32,6 @@ result.append( '}' ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): return [] Property changes on: pyplusplus_dev/pyplusplus/cpptypes/mydll ___________________________________________________________________ Added: svn:ignore + Debug *.ncb *.suo *.user Property changes on: pyplusplus_dev/pyplusplus/cpptypes/mydll/release ___________________________________________________________________ Added: svn:ignore + *.htm Modified: pyplusplus_dev/pyplusplus/creators_factory/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/__init__.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/creators_factory/__init__.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -4,6 +4,7 @@ # http://www.boost.org/LICENSE_1_0.txt) from bpcreator import bpcreator_t +from ctypes_creator import ctypes_creator_t from sort_algorithms import sort_classes as findout_desired_order from call_policies_resolver import built_in_resolver_t Added: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py (rev 0) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -0,0 +1,134 @@ +# Copyright 2004-2008 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 dependencies_manager +from pygccxml import declarations +from pyplusplus import decl_wrappers +from pyplusplus import code_creators +from pyplusplus import code_repository +from pyplusplus import _logging_ + +ACCESS_TYPES = declarations.ACCESS_TYPES +VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES + +class ctypes_creator_t( declarations.decl_visitor_t ): + def __init__( self + , global_ns + , library_path + , exported_symbols + , doc_extractor=None ): + declarations.decl_visitor_t.__init__(self) + self.logger = _logging_.loggers.module_builder + self.decl_logger = _logging_.loggers.declarations + + self.__library_path = library_path + self.__exported_symbols = exported_symbols + + self.__extmodule = code_creators.ctypes_module_t( global_ns ) + self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) + + #~ prepared_decls = self.__prepare_decls( global_ns, doc_extractor ) + #~ self.__decls = sort_algorithms.sort( prepared_decls ) + self.curr_decl = global_ns + self.curr_code_creator = self.__extmodule + + def __print_readme( self, decl ): + readme = decl.readme() + if not readme: + return + + if not decl.exportable: + reason = readme[0] + readme = readme[1:] + self.decl_logger.warn( "%s;%s" % ( decl, reason ) ) + + for msg in readme: + self.decl_logger.warn( "%s;%s" % ( decl, msg ) ) + + #~ def __prepare_decls( self, global_ns, doc_extractor ): + #~ to_be_exposed = [] + #~ for decl in declarations.make_flatten( global_ns ): + #~ if decl.ignore: + #~ continue + + #~ if not decl.exportable: + #~ #leave only decls that user wants to export and that could be exported + #~ self.__print_readme( decl ) + #~ continue + + #~ if decl.already_exposed: + #~ #check wether this is already exposed in other module + #~ continue + + #~ if isinstance( decl.parent, declarations.namespace_t ): + #~ #leave only declarations defined under namespace, but remove namespaces + #~ to_be_exposed.append( decl ) + + #~ if doc_extractor: + #~ decl.documentation = doc_extractor( decl ) + + #~ self.__print_readme( decl ) + + #~ return to_be_exposed + + + def create(self ): + """Create and return the module for the extension. + + @returns: Returns the root of the code creators tree + @rtype: L{module_t<code_creators.module_t>} + """ + # Invoke the appropriate visit_*() method on all decls + self.__extmodule.adopt_creator( code_creators.import_t( 'ctypes' ) ) + self.__extmodule.adopt_creator( code_creators.separator_t() ) + self.__extmodule.adopt_creator( code_creators.library_reference_t( self.__library_path ) ) + self.__extmodule.adopt_creator( code_creators.name_mappings_t( self.__exported_symbols ) ) + self.__extmodule.adopt_creator( code_creators.separator_t() ) + + declarations.apply_visitor( self, self.curr_decl ) + + self.__dependencies_manager.inform_user() + + return self.__extmodule + + def visit_member_function( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_constructor( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_destructor( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_member_operator( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_casting_operator( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_free_function( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_free_operator( self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_class_declaration(self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_class(self ): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_enumeration(self): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_namespace(self): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_typedef(self): + self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_variable(self): + self.__dependencies_manager.add_exported( self.curr_decl ) Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -92,18 +92,13 @@ if isinstance( d, decls_package.class_t ): d.parent.include() - def build_code_creator( self ): - pass - #~ creator = creators_factory.creator_t( self.global_ns - #~ , module_name - #~ , boost_python_ns_name - #~ , call_policies_resolver_ - #~ , types_db - #~ , target_configuration - #~ , enable_indexing_suite - #~ , doc_extractor) - #~ self.__code_creator = creator.create() - #~ return self.__code_creator + def build_code_creator( self, library_path, doc_extractor=None ): + creator = creators_factory.ctypes_creator_t( self.global_ns + , library_path + , self.__blob2undecorated + , doc_extractor) + self.__code_creator = creator.create() + return self.__code_creator @property def code_creator( self ): Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-26 08:09:28 UTC (rev 1503) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-26 09:43:47 UTC (rev 1504) @@ -19,6 +19,8 @@ def test(self): mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) + mb.build_code_creator( self.symbols_file ) + print mb.code_creator.create() def create_suite(): suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-27 10:57:42
|
Revision: 1507 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1507&view=rev Author: roman_yakovenko Date: 2008-12-27 10:57:29 +0000 (Sat, 27 Dec 2008) Log Message: ----------- first code creators classes for ctypes Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/unittests/data/core_cache.hpp pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/code_repository/__init__.py pyplusplus_dev/pyplusplus/cpptypes/tester.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp pyplusplus_dev/unittests/data/ctypes_pof/mydll.h Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py pyplusplus_dev/pyplusplus/code_creators/fields_definition.py pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py pyplusplus_dev/pyplusplus/code_creators/methods_definition.py pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -457,7 +457,7 @@ def i_depend_on_them( self, recursive=True ): report_dependency = lambda *args: dependencies.dependency_info_t( self, *args ) - + answer = [] map( lambda base: answer.append( report_dependency( base.related_class, base.access_type, "base class" ) ) @@ -500,8 +500,8 @@ return 'wstring' else: return get_partial_name( self.name ) - - def find_noncopyable_vars( self ): + + def find_noncopyable_vars( self ): """returns list of all noncopyable variables""" import type_traits as tt#prevent cyclic dependencies logger = utils.loggers.cxx_parser @@ -524,9 +524,17 @@ cls = tt.class_traits.get_declaration( type_ ) if tt.is_noncopyable( cls ): logger.debug( "__contains_noncopyable_mem_var - %s - TRUE - containes member variable - class that is not copyable" % self.decl_string ) - noncopyable_vars.append( mvar ) + noncopyable_vars.append( mvar ) logger.debug( "__contains_noncopyable_mem_var - %s - false - doesn't contains noncopyable members" % self.decl_string ) return noncopyable_vars + @property + def has_vtable( self ): + """True, if class has virtual table, False otherwise""" + import calldef + return bool( self.calldefs( lambda f: isinstance( f, calldef.member_function_t ) \ + and f.virtuality != calldef.VIRTUALITY_TYPES.NOT_VIRTUAL + , recursive=False + , allow_empty=True ) ) class_types = ( class_t, class_declaration_t ) Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2008-12-26 23:56:12 UTC (rev 1506) +++ pygccxml_dev/unittests/data/core_cache.hpp 2008-12-27 10:57:29 UTC (rev 1507) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch \ No newline at end of file +//touch//touch//touch \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -146,4 +146,10 @@ from import_ import import_t from library_reference import library_reference_t from name_mappings import name_mappings_t - +from namespace_as_pyclass import namespace_as_pyclass_t +from class_introduction import class_introduction_t +from mem_fun_introduction import mem_fun_introduction_t +from mem_fun_introduction import vmem_fun_introduction_t +from fields_definition import fields_definition_t +from embedded_code_repository import embedded_code_repository_t +from methods_definition import methods_definition_t Added: pyplusplus_dev/pyplusplus/code_creators/class_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -0,0 +1,33 @@ +# Copyright 2004-2008 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 compound +import declaration_based +from pygccxml import declarations + +class class_introduction_t(compound.compound_t, declaration_based.declaration_based_t): + def __init__( self, class_ ): + compound.compound_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, class_ ) + + def _create_impl(self): + result = [] + result.append( "class %s(ctypes.Structure):" % self.alias ) + result.append( self.indent( '"""class %s"""' % self.decl_identifier ) ) + result.append( self.indent( '#_fields_ = [] <-- class member variables definition list' ) ) + result.append( self.indent( '#_methods_ = {} <-- class non-virtual member functions definition list' ) ) + if self.creators: + result.append( self.indent( '' ) ) + result.append( compound.compound_t.create_internal_code( self.creators ) ) + + if isinstance( self.declaration.parent, declarations.namespace_t ) \ + and self.declaration.parent is not self.declaration.top_parent: #not a global namespace + result.append( '%(ns_full_name)s = %(name)s' + % dict( ns_full_name=self.complete_py_name, name=self.alias )) + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -166,7 +166,7 @@ , os.linesep ) @staticmethod - def is_comment( line ): + def is_comment( line, language='C++' ): """ function that returns true if content of the line is comment, otherwise false. @@ -174,10 +174,19 @@ @param line: C++ source code @type line: str @rtype: bool + + @param language: the programming language, the line was written in. Possible values: C++, Python + @type line: str """ assert isinstance( line, types.StringTypes ) l = line.lstrip() - return l.startswith( '//' ) or l.startswith( '/*' ) + if language == 'C++': + return l.startswith( '//' ) or l.startswith( '/*' ) + elif language == 'Python': + return l.startswith( '#' ) + else: + raise RuntimeError( "Language %s is not supported. The possible values are: Python, C++" + % language ) @staticmethod def iif( condition, true_, false_ ): Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -5,6 +5,7 @@ import algorithm import code_creator +from pygccxml import utils class declaration_based_t: """Code creator that is based on a declaration. @@ -18,12 +19,12 @@ @type parent: code_creator_t """ self._decl = declaration - + def _generate_valid_name(self, name=None): if name == None: name = self.declaration.name return algorithm.create_valid_name( name ) - + @property def declaration(self): """The declaration this code creator is based on. @@ -33,23 +34,39 @@ def _get_alias_impl( self ): return self.declaration.alias - - def _get_alias(self): - return self._get_alias_impl() + + def _get_alias(self): + return self._get_alias_impl() def _set_alias(self, alias): self.declaration.alias = alias alias = property( _get_alias, _set_alias ) - + + @utils.cached + def undecorated_decl_name( self ): + from pygccxml import msvc #prevent import on Linux + return msvc.undecorate_decl( self.declaration ) + + @utils.cached + def complete_py_name( self ): + aliases = [] + current = self.declaration + while current: + aliases.append( current.alias ) + current = current.parent + del aliases[-1] # :: from the global namespace + aliases.reverse() + return '.'.join( aliases ) + @property def decl_identifier( self ): return algorithm.create_identifier( self, self.declaration.partial_decl_string ) - + @property def documentation( self ): if None is self.declaration.documentation: return '' return self.declaration.documentation - + def get_user_headers( self, recursive=False, unique=False ): """return list of user header files to be included from the generated file""" return self.declaration.include_files Added: pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/embedded_code_repository.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -0,0 +1,18 @@ +# Copyright 2004-2008 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 code_creator + +class embedded_code_repository_t(code_creator.code_creator_t): + """Creates Python import directive""" + def __init__( self, code_repository_module ): + code_creator.code_creator_t.__init__(self) + self.__code = code_repository_module.code + + def _create_impl(self): + return self.__code + + def _get_system_headers_impl( self ): + return [] Added: pyplusplus_dev/pyplusplus/code_creators/fields_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/fields_definition.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -0,0 +1,31 @@ +# Copyright 2004-2008 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 code_creator +import declaration_based +from pygccxml import declarations + +class fields_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, class_ ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, class_ ) + + def _create_impl(self): + result = [] + result.append( '%(complete_py_name)s._fields_ = [ #class member variables definition list' + % dict( complete_py_name=self.complete_py_name ) ) + if self.declaration.has_vtable: + result.append( self.indent( '("_vtable_", ctypes.POINTER(ctypes.c_void_p)),' ) ) + result.append( self.indent( "#TODO: don't hide public member variables" ) ) + result.append( self.indent( "#TODO: how _fields_ should be defined in a class hierarchy" ) ) + result.append( self.indent( "#TODO: fix 64bit issue with calculating vtable pointer size" ) ) + result.append( self.indent( '("__hidden__", ctypes.c_char * %d),' + % ( self.declaration.byte_size - 4*int(self.declaration.has_vtable) ) ) ) + result.append( ']' ) + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] Added: pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -0,0 +1,41 @@ +# Copyright 2004-2008 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 code_creator +import declaration_based +from pygccxml import declarations + +class mem_fun_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, mem_fun ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, mem_fun ) + + def _create_impl(self): + tmpl = ['def %(alias)s( self, *args ):'] + tmpl.append( self.indent('"""%(name)s"""') ) + tmpl.append( self.indent("return self._methods_['%(alias)s']( ctypes.byref( self ), *args )") ) + return os.linesep.join( tmpl ) \ + % dict( alias=self.declaration.alias, name=self.undecorated_decl_name ) + + def _get_system_headers_impl( self ): + return [] + +class vmem_fun_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, mem_fun ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, mem_fun ) + + def _create_impl(self): + tmpl = ['def %(alias)s( self, *args ):'] + tmpl.append( self.indent('"""%(name)s"""') ) + tmpl.append( self.indent("return self._vtable_['%(ordinal)d'].%(alias)s( ctypes.byref( self ), *args )") ) + return os.linesep.join( tmpl ) \ + % dict( alias=self.declaration.alias + , name=self.undecorated_decl_name + , ordinal=0) + + def _get_system_headers_impl( self ): + return [] Added: pyplusplus_dev/pyplusplus/code_creators/methods_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/methods_definition.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -0,0 +1,40 @@ +# Copyright 2004-2008 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 compound +import declaration_based +from pygccxml import declarations + +class methods_definition_t(compound.compound_t, declaration_based.declaration_based_t): + def __init__( self, class_ ): + compound.compound_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, class_ ) + + @property + def mem_fun_factory_var_name(self): + return "mfcreator" + + def _create_impl(self): + result = [] + scope = declarations.algorithm.declaration_path( self.declaration ) + del scope[0] #del :: from the global namespace + + + result.append( '%(mem_fun_factory_var_name)s = mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s", "%(ns)s" )' + % dict( mem_fun_factory_var_name=self.mem_fun_factory_var_name + , library_var_name=self.top_parent.library_var_name + , complete_py_name=self.complete_py_name + , class_name=self.declaration.name + , ns='::'.join(scope) ) ) + result.append( '%(complete_py_name)s._methods_ = { #class non-virtual member functions definition list' + % dict( complete_py_name=self.complete_py_name ) ) + result.append( compound.compound_t.create_internal_code( self.creators ) ) + result.append( '}' ) + result.append( 'del %s' % self.mem_fun_factory_var_name ) + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] Added: pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/namespace_as_pyclass.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -0,0 +1,25 @@ +# Copyright 2004-2008 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 compound +import declaration_based + +class namespace_as_pyclass_t(compound.compound_t, declaration_based.declaration_based_t): + def __init__( self, ns ): + compound.compound_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, ns ) + + def _create_impl(self): + result = [] + result.append( "class %s:" % self.alias ) + result.append( self.indent( '"""namespace %s"""' % self.decl_identifier ) ) + if self.creators: + result.append( self.indent( "" ) ) + result.append( compound.compound_t.create_internal_code( self.creators ) ) + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_repository/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/__init__.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/code_repository/__init__.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -19,6 +19,7 @@ import convenience import return_range import call_policies +import ctypes_cpp_utils import ctypes_integration all = [ array_1 @@ -27,6 +28,7 @@ , call_policies , named_tuple , return_range + , ctypes_cpp_utils , ctypes_integration ] headers = map( lambda f: f.file_name, all ) Added: pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -0,0 +1,92 @@ +# Copyright 2004-2008 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) + +file_name = "ctypes_cpp_utils.py" + +license = \ +"""# Copyright 2004-2008 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) +""" + + +code = \ +""" +# what is the best way to treat overloaded constructors +class mem_fun_callable( object ): + def __init__(self, dll, name, restype=None, argtypes=None ): + self.name = name + self.func = getattr( dll, dll.undecorated_names[name] ) + self.func.restype = restype + self.func.argtypes = argtypes + + def __call__(self, *args, **keywd ): + return self.func( *args, **keywd ) + +class mem_fun_factory( object ): + def __init__( self, dll, wrapper, class_name, namespace='' ): + self.dll = dll + self.namespace = namespace + self.class_name = class_name + self.this_type = ctypes.POINTER( wrapper ) + + def __call__( self, name, **keywd ): + if 'argtypes' not in keywd: + keywd['argtypes'] = [ self.this_type ] + else: + keywd['argtypes'].insert( 0, self.this_type ) + return mem_fun_callable( self.dll, name, **keywd ) + + def __get_ns_name(self): + if self.namespace: + return self.namespace + '::' + else: + return '' + + def default_constructor( self ): + return self( '%(ns)s%(class_name)s::%(class_name)s(void)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) ) + + def constructor( self, argtypes_str, **keywd ): + return self( '%(ns)s%(class_name)s::%(class_name)s(%(args)s)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name + , args=argtypes_str ) + , **keywd ) + + def copy_constructor( self ): + return self( '%(ns)s%(class_name)s::%(class_name)s(%(class_name)s const &)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) + , argtypes=[self.this_type] ) + + def destructor( self ): + return self( '%(ns)s%(class_name)s::~%(class_name)s(void)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) ) + + def operator_assign( self ): + return self( '%(ns)s%(class_name)s & %(class_name)s::operator=(%(class_name)s const &)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) + , restype=self.this_type + , argtypes=[self.this_type] ) + + def method( self, name, restype_str=None, argtypes_str=None, **keywd ): + if None is restype_str: + restype_str = 'void' + if None is argtypes_str: + argtypes_str = 'void' + + return self( '%(return_)s %(ns)s%(class_name)s::%(method_name)s(%(args)s)' + % dict( return_=restype_str + , ns=self.__get_ns_name() + , class_name=self.class_name + , method_name=name + , args=argtypes_str ) + , **keywd ) +""" Modified: pyplusplus_dev/pyplusplus/cpptypes/tester.py =================================================================== --- pyplusplus_dev/pyplusplus/cpptypes/tester.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/cpptypes/tester.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -10,13 +10,13 @@ # GCCXML reports mangled and demangled names of the function, but it is not a cross platform( compile ) solution. # It looks like I will have to cause mspdb package to work ( from where ctypes loads dlls? ctypes.windll.msvcr90 ??? -mydll.name_mapping = name_mapping.data +mydll.undecorated_names = name_mapping.data # what is the best way to treat overloaded constructors -class public( object ): +class mem_fun_callable( object ): def __init__(self, dll, name, restype=None, argtypes=None ): self.name = name - self.func = getattr( dll, dll.name_mapping[name] ) + self.func = getattr( dll, dll.undecorated_names[name] ) self.func.restype = restype self.func.argtypes = argtypes @@ -35,7 +35,7 @@ keywd['argtypes'] = [ self.this_type ] else: keywd['argtypes'].insert( 0, self.this_type ) - return public( self.dll, name, **keywd ) + return mem_fun_callable( self.dll, name, **keywd ) def __get_ns_name(self): if self.namespace: Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -3,7 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) - +import sort_algorithms import dependencies_manager from pygccxml import declarations from pyplusplus import decl_wrappers @@ -24,16 +24,18 @@ self.logger = _logging_.loggers.module_builder self.decl_logger = _logging_.loggers.declarations + self.global_ns = global_ns + self.__library_path = library_path self.__exported_symbols = exported_symbols - - self.__extmodule = code_creators.ctypes_module_t( global_ns ) + self.module = code_creators.ctypes_module_t( global_ns ) self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) #~ prepared_decls = self.__prepare_decls( global_ns, doc_extractor ) #~ self.__decls = sort_algorithms.sort( prepared_decls ) self.curr_decl = global_ns - self.curr_code_creator = self.__extmodule + self.curr_code_creator = self.module + self.__class2introduction = {} def __print_readme( self, decl ): readme = decl.readme() @@ -48,6 +50,12 @@ for msg in readme: self.decl_logger.warn( "%s;%s" % ( decl, msg ) ) + def __should_generate_code( self, decl ): + if decl.ignore or decl.already_exposed: + return False + return True + + #~ def __prepare_decls( self, global_ns, doc_extractor ): #~ to_be_exposed = [] #~ for decl in declarations.make_flatten( global_ns ): @@ -74,7 +82,28 @@ #~ return to_be_exposed + def __contains_exported( self, decl ): + return bool( decl.decls( self.__should_generate_code, recursive=True, allow_empty=True ) ) + # - implement better 0(n) algorithm + def __add_class_introductions( self, cc, class_ ): + ci_creator = code_creators.class_introduction_t( class_ ) + self.__class2introduction[ class_ ] = ci_creator + cc.adopt_creator( ci_creator ) + classes = class_.classes( recursive=False, allow_empty=True) + classes = sort_algorithms.sort_classes( classes ) + for internal_class in classes: + if self.__contains_exported( internal_class ): + self.__add_class_introductions( ci_creator, internal_class ) + + # - implement better 0(n) algorithm + def __add_namespaces( self, cc, ns ): + ns_creator = code_creators.namespace_as_pyclass_t( ns ) + cc.adopt_creator( ns_creator ) + for internal_ns in ns.namespaces( recursive=False, allow_empty=True): + if self.__contains_exported( ns ): + self.__add_namespaces( ns_creator, internal_ns ) + def create(self ): """Create and return the module for the extension. @@ -82,20 +111,43 @@ @rtype: L{module_t<code_creators.module_t>} """ # Invoke the appropriate visit_*() method on all decls - self.__extmodule.adopt_creator( code_creators.import_t( 'ctypes' ) ) - self.__extmodule.adopt_creator( code_creators.separator_t() ) - self.__extmodule.adopt_creator( code_creators.library_reference_t( self.__library_path ) ) - self.__extmodule.adopt_creator( code_creators.name_mappings_t( self.__exported_symbols ) ) - self.__extmodule.adopt_creator( code_creators.separator_t() ) + ccc = self.curr_code_creator + ccc.adopt_creator( code_creators.import_t( 'ctypes' ) ) + ccc.adopt_creator( code_creators.separator_t() ) + ccc.adopt_creator( code_creators.library_reference_t( self.__library_path ) ) + ccc.adopt_creator( code_creators.name_mappings_t( self.__exported_symbols ) ) + ccc.adopt_creator( code_creators.separator_t() ) + #adding namespaces + for ns in self.global_ns.namespaces( recursive=False, allow_empty=True): + if self.__contains_exported( ns ): + self.__add_namespaces( ccc, ns ) + #adding class introductions + f = lambda cls: self.__should_generate_code( cls ) \ + and isinstance( cls.parent, declarations.namespace_t ) + ns_classes = self.global_ns.classes( f, recursive=True, allow_empty=True) + ns_classes = sort_algorithms.sort_classes( ns_classes ) + for class_ in ns_classes: + if self.__contains_exported( ns ): + self.__add_class_introductions( ccc, class_ ) + ccc.adopt_creator( code_creators.embedded_code_repository_t( code_repository.ctypes_cpp_utils ) ) + declarations.apply_visitor( self, self.curr_decl ) self.__dependencies_manager.inform_user() - return self.__extmodule + return self.module def visit_member_function( self ): self.__dependencies_manager.add_exported( self.curr_decl ) + cls_intro_cc = self.__class2introduction[ self.curr_decl.parent ] + cls_intro_cc.adopt_creator( code_creators.mem_fun_introduction_t( self.curr_decl ) ) + #~ if self.curr_decl.virtuality == VIRTUALITY_TYPES.NOT_VIRTUAL: + #~ cls_intro_cc.adopt_creator( code_creators.mem_fun_introduction_t( self.curr_decl ) ) + #~ elif self.curr_decl.virtuality == VIRTUALITY_TYPES.VIRTUAL: + #~ cls_intro_cc.adopt_creator( code_creators.vmem_fun_introduction_t( self.curr_decl ) ) + #~ else: + #~ pass def visit_constructor( self ): self.__dependencies_manager.add_exported( self.curr_decl ) @@ -118,17 +170,33 @@ def visit_class_declaration(self ): self.__dependencies_manager.add_exported( self.curr_decl ) - def visit_class(self ): + def visit_class(self): self.__dependencies_manager.add_exported( self.curr_decl ) + #fields definition should be recursive using the visitor + self.curr_code_creator.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) + self.curr_code_creator.adopt_creator( code_creators.methods_definition_t( self.curr_decl ) ) + class_ = self.curr_decl + for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): + if self.__should_generate_code( decl ): + self.curr_decl = decl + declarations.apply_visitor( self, decl ) + self.curr_decl = class_ def visit_enumeration(self): self.__dependencies_manager.add_exported( self.curr_decl ) - def visit_namespace(self): - self.__dependencies_manager.add_exported( self.curr_decl ) - def visit_typedef(self): self.__dependencies_manager.add_exported( self.curr_decl ) def visit_variable(self): self.__dependencies_manager.add_exported( self.curr_decl ) + + def visit_namespace(self ): + ns = self.curr_decl + for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): + if isinstance( decl, declarations.namespace_t) or self.__should_generate_code( decl ): + self.curr_decl = decl + declarations.apply_visitor( self, decl ) + self.curr_decl = ns + + Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -16,14 +16,14 @@ class writer_t(object): """Base class for all module/code writers. - + All writers should have similar usage:: - + w = writer_class(module, file, ...) w.write() """ logger = _logging_.loggers.file_writer - + def __init__(self, extmodule, files_sum_repository=None, encoding='ascii'): object.__init__(self) self.__extmodule = extmodule @@ -32,14 +32,15 @@ if None is files_sum_repository: self.__files_sum_repository = md5sum_repository.dummy_repository_t() self.__exposed_decls_db = utils.exposed_decls_db_t() - self.__exposed_decls_db.register_decls( extmodule.global_ns - , extmodule.specially_exposed_decls ) + if isinstance( self.__extmodule, code_creators.bpmodule_t ): + self.__exposed_decls_db.register_decls( extmodule.global_ns + , extmodule.specially_exposed_decls ) @property def encoding( self ): """encoding name used to write generated code to files""" return self.__encoding - + @property def extmodule(self): """The root of the code creator tree ( code_creators.module_t )""" @@ -52,17 +53,17 @@ def write(self): """ Main write method. Should be overridden by derived classes. """ raise NotImplementedError() - + @staticmethod def create_backup(fpath): """creates backup of the file, by renaming it to C{fpath + ~}""" if not os.path.exists( fpath ): - return + return backup_fpath = fpath + '~' if os.path.exists( backup_fpath ): os.remove( backup_fpath ) os.rename( fpath, backup_fpath ) - + def write_code_repository(self, dir): """creates files defined in L{code_repository} package""" system_headers = self.extmodule.get_system_headers( recursive=True ) @@ -72,7 +73,7 @@ self.write_file( os.path.join( dir, cr.file_name ), cr.code ) #named_tuple.py is a special case :-( self.write_file( os.path.join( dir, code_repository.named_tuple.file_name ) - , code_repository.named_tuple.code ) + , code_repository.named_tuple.code ) @staticmethod def write_file( fpath, content, files_sum_repository=None, encoding='ascii' ): """Write a source file. @@ -99,8 +100,8 @@ fcontent_new.append( os.linesep ) #keep gcc happy fcontent_new = ''.join( fcontent_new ) if not isinstance( fcontent_new, unicode ): - fcontent_new = unicode( fcontent_new, encoding ) - + fcontent_new = unicode( fcontent_new, encoding ) + new_hash_value = None curr_hash_value = None if files_sum_repository: @@ -122,9 +123,9 @@ writer_t.logger.debug( 'file was not changed( content ) - done( %f seconds )' % ( time.clock() - start_time ) ) return - + writer_t.logger.debug( 'file changed or it does not exist' ) - + writer_t.create_backup( fpath ) f = codecs.open( fpath, 'w+b', encoding ) f.write( fcontent_new ) @@ -132,7 +133,7 @@ if new_hash_value: files_sum_repository.update_value( fname, new_hash_value ) writer_t.logger.info( 'file "%s" - updated( %f seconds )' % ( fname, time.clock() - start_time ) ) - + def get_user_headers( self, creators ): headers = [] creators = filter( lambda creator: isinstance( creator, code_creators.declaration_based_t ) @@ -143,5 +144,5 @@ def save_exposed_decls_db( self, file_path ): self.__exposed_decls_db.save( file_path ) - - + + Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -84,12 +84,12 @@ is_exported = lambda d: msvc.undecorate_decl( d ) in undecorated included_decls = set() - included_decls.update( self.global_ns.calldefs( is_exported, allow_empty=True ) ) - included_decls.update( self.global_ns.variables( is_exported, allow_empty=True ) ) + included_decls.update( self.global_ns.calldefs( is_exported, allow_empty=True, recursive=True ) ) + included_decls.update( self.global_ns.variables( is_exported, allow_empty=True, recursive=True ) ) for d in included_decls: d.include() - if isinstance( d, decls_package.class_t ): + if isinstance( d.parent, decls_package.class_t ): d.parent.include() def build_code_creator( self, library_path, doc_extractor=None ): @@ -120,7 +120,6 @@ @param file_name: file name @type file_name: string """ - self.__merge_user_code() file_writers.write_file( self.code_creator, file_name, encoding=self.encoding ) Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-27 10:57:29 UTC (rev 1507) @@ -16,12 +16,18 @@ self.project_dir = os.path.join( autoconfig.data_directory, 'ctypes_pof' ) self.header = os.path.join( self.project_dir, 'mydll.h' ) self.symbols_file = os.path.join( self.project_dir, 'release', 'mydll.dll' ) + self.module_name = 'ctypes_pof' def test(self): mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) + #~ mb.global_ns.include() mb.build_code_creator( self.symbols_file ) - print mb.code_creator.create() + mb.write_module( os.path.join( autoconfig.build_directory, self.module_name + '.py' ) ) + #mb.code_creator.create() + sys.path.append( autoconfig.build_directory ) + import ctypes_pof + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: Modified: pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-27 10:57:29 UTC (rev 1507) @@ -2,6 +2,8 @@ #include "windows.h" #include <iostream> +namespace pof{ + number_t::number_t() : m_value(0) { @@ -38,6 +40,10 @@ return std::auto_ptr<number_t>( new number_t( *this ) ); } +} + +using namespace pof; + void do_smth( number_aptr_t& ){ } Modified: pyplusplus_dev/unittests/data/ctypes_pof/mydll.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2008-12-26 23:56:12 UTC (rev 1506) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2008-12-27 10:57:29 UTC (rev 1507) @@ -2,12 +2,14 @@ #include <memory> +namespace pof{ + class __declspec(dllexport) number_t{ public: number_t(); explicit number_t(int value); virtual ~number_t(); - void print_it() const; + virtual void print_it() const; int get_value() const; int get_value(){ return m_value; } void set_value(int x); @@ -18,8 +20,9 @@ int m_value; }; -template class __declspec(dllexport) std::auto_ptr< number_t >; +} +template class __declspec(dllexport) std::auto_ptr< pof::number_t >; -typedef std::auto_ptr< number_t > number_aptr_t; +typedef std::auto_ptr< pof::number_t > number_aptr_t; -void __declspec(dllexport) do_smth( number_aptr_t& ); \ No newline at end of file +void __declspec(dllexport) do_smth( number_aptr_t& ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-28 13:17:02
|
Revision: 1511 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1511&view=rev Author: roman_yakovenko Date: 2008-12-28 13:16:57 +0000 (Sun, 28 Dec 2008) Log Message: ----------- add handling for "C" functions Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/common_utils.py pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/algorithm.py pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp pyplusplus_dev/unittests/data/ctypes_pof/mydll.h Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py pyplusplus_dev/pyplusplus/code_creators/function_definition.py Modified: pygccxml_dev/pygccxml/msvc/common_utils.py =================================================================== --- pygccxml_dev/pygccxml/msvc/common_utils.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pygccxml_dev/pygccxml/msvc/common_utils.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -262,5 +262,5 @@ % fname ) @staticmethod - def is_c_function( decl, blob, undecorated_blob ): - return decl.name == blob == undecorated_blob + def is_c_function( decl, blob ): + return decl.name == blob Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -153,3 +153,4 @@ from fields_definition import fields_definition_t from embedded_code_repository import embedded_code_repository_t from methods_definition import methods_definition_t +from function_definition import c_function_definition_t Modified: pyplusplus_dev/pyplusplus/code_creators/algorithm.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/algorithm.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/pyplusplus/code_creators/algorithm.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -11,7 +11,7 @@ from pyplusplus.decl_wrappers.algorithm import * -import types +import types import namespace def _make_flatten_list( creator_or_creators ): @@ -69,14 +69,14 @@ This class is used as container for different find algorithms. """ "creator_finder - this class used as namespace" - + @staticmethod def find_by_declaration( declaration_matcher, where, recursive=True ): - """Finds code creator by declaration. - declaration_matcher should be callable, that takes single argument + """Finds code creator by declaration. + declaration_matcher should be callable, that takes single argument declaration, and returns True or False where - code creator or list of code creators - This function returns a list of all relevant code creators + This function returns a list of all relevant code creators """ import declaration_based #prevent cyclic import search_area = where @@ -85,14 +85,14 @@ return filter( lambda inst: isinstance( inst, declaration_based.declaration_based_t ) \ and declaration_matcher( inst.declaration ) , search_area ) - + @staticmethod def find_by_declaration_single( declaration_matcher, where, recursive=True ): answer = creator_finder.find_by_declaration( declaration_matcher, where, recursive ) if len( answer ) == 1: return answer[0] return None - + @staticmethod def find_by_class_instance( what, where, recursive=True ): search_area = where @@ -101,4 +101,15 @@ return filter( lambda inst: isinstance( inst, what ), search_area ) def make_id_creator( code_creator ): - return lambda decl_string: create_identifier( code_creator, decl_string ) + return lambda decl_string: create_identifier( code_creator, decl_string ) + +def complete_py_name( decl ): + aliases = [] + current = decl + while current: + aliases.append( current.alias ) + current = current.parent + del aliases[-1] # :: from the global namespace + aliases.reverse() + return '.'.join( aliases ) + Added: pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -0,0 +1,145 @@ +# Copyright 2004-2008 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) + +""" +defines types visitor class interface +""" + +import algorithm +from pygccxml import declarations + +class type_converter_t(declarations.type_visitor_t): + """ + types visitor interface + + All functions within this class should be redefined in derived classes. + """ + def __init__(self, type_, decl_formatter): + declarations.type_visitor_t.__init__(self) + self.user_type = type_ + self.decl_formatter = decl_formatter + + def visit_void( self ): + return "None" + + def visit_char( self ): + return "ctypes.c_char" + + def visit_unsigned_char( self ): + return "ctypes.c_ubyte" + + def visit_signed_char( self ): + return "ctypes.c_byte" + + def visit_wchar( self ): + return "ctypes.c_wchar" + + def visit_short_int( self ): + return "ctypes.c_short" + + def visit_short_unsigned_int( self ): + return "ctypes.c_ushort" + + def visit_bool( self ): + return "ctypes.c_bool" + + def visit_int( self ): + return "ctypes.c_int" + + def visit_unsigned_int( self ): + return "ctypes.c_uint" + + def visit_long_int( self ): + return "ctypes.c_long" + + def visit_long_unsigned_int( self ): + return "ctypes.c_ulong" + + def visit_long_long_int( self ): + return "ctypes.c_longlong" + + def visit_long_long_unsigned_int( self ): + return "ctypes.c_ulonglong" + + def visit_float( self ): + return "ctypes.c_float" + + def visit_double( self ): + return "ctypes.c_double" + + def visit_long_double( self ): + return "ctypes.c_longdouble" + + #skip complex and jxxx types + + def visit_volatile( self ): + base_visitor = type_converter_t( self.user_type.base, self.decl_formatter ) + return declarations.apply_visitor( base_visitor, base_visitor.user_type ) + + def visit_const( self ): + base_visitor = type_converter_t( self.user_type.base, self.decl_formatter ) + return declarations.apply_visitor( base_visitor, base_visitor.user_type ) + + def visit_pointer( self ): + no_ptr = declarations.remove_const( declarations.remove_pointer( self.user_type ) ) + if declarations.is_same( declarations.char_t(), no_ptr ): + return "ctypes.c_char_p" + elif declarations.is_same( declarations.wchar_t(), no_ptr ): + return "ctypes.c_wchar_p" + elif declarations.is_same( declarations.void_t(), no_ptr ): + return "ctypes.c_void_p" + else: + base_visitor = type_converter_t( self.user_type.base, self.decl_formatter ) + internal_type_str = declarations.apply_visitor( base_visitor, base_visitor.user_type ) + return "ctypes.POINTER( %s )" % internal_type_str + + def visit_reference( self ): + no_ref = declarations.remove_const( declarations.remove_reference( self.user_type ) ) + if declarations.is_same( declarations.char_t(), no_ref ): + return "ctypes.c_char_p" + elif declarations.is_same( declarations.wchar_t(), no_ref ): + return "ctypes.c_wchar_p" + elif declarations.is_same( declarations.void_t(), no_ref ): + return "ctypes.c_void_p" + else: + base_visitor = type_converter_t( self.user_type.base, self.decl_formatter ) + internal_type_str = declarations.apply_visitor( base_visitor, base_visitor.user_type ) + return "ctypes.POINTER( %s )" % internal_type_str + + def visit_array( self ): + item_visitor = type_converter_t( declarations.array_item_type(self.user_type) + , self.decl_formatter ) + item_type = declarations.apply_visitor( item_visitor, item_visitor.user_type ) + size = declarations.array_size( self.user_type ) + if size == declarations.array_t.SIZE_UNKNOWN: + size = 0 + return "( %s * %d )" % ( item_type, size ) + + def visit_free_function_type( self ): + return_visitor = type_converter_t( self.return_type, self.decl_formatter ) + return_type = declarations.apply_visitor(return_visitor, self.return_type) + argtypes = [] + for arg in self.user_type.arguments_types: + arg_visitor = type_converter_t( arg, self.decl_formatter ) + argtypes.append( declarations.apply_visitor(arg_visitor, arg) ) + return declarations.call_invocation.join( "ctypes.CFUNCTYPE", [return_type] + argtypes ) + + #~ def visit_member_function_type( self ): + #~ raise NotImplementedError() + + #~ def visit_member_variable_type( self ): + #~ raise NotImplementedError() + + def visit_declarated( self ): + return self.decl_formatter( self.user_type.declaration ) + + def visit_restrict( self ): + base_visitor = type_converter_t( self.user_type.base, self.decl_formatter ) + return declarations.apply_visitor( base_visitor, base_visitor.user_type ) + +def as_ctype( type_, decl_formatter=algorithm.complete_py_name ): + v = type_converter_t( type_, decl_formatter ) + return declarations.apply_visitor( v, type_ ) + Property changes on: pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py ___________________________________________________________________ Added: svn:mergeinfo + Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -48,14 +48,7 @@ @utils.cached def complete_py_name( self ): - aliases = [] - current = self.declaration - while current: - aliases.append( current.alias ) - current = current.parent - del aliases[-1] # :: from the global namespace - aliases.reverse() - return '.'.join( aliases ) + return algorithm.complete_py_name( self.declaration ) @property def decl_identifier( self ): Added: pyplusplus_dev/pyplusplus/code_creators/function_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/function_definition.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -0,0 +1,60 @@ +# Copyright 2004-2008 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 code_creator +import ctypes_formatter +import declaration_based +from pygccxml import declarations + +""" +BSCGetBaseArray = _libraries['msbsc70.dll'].BSCGetBaseArray +BSCGetBaseArray.restype = BOOL +BSCGetBaseArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] + +""" + +class c_function_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, free_fun ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, free_fun ) + + @property + def ftype( self ): + return self.declaration.function_type() + + def __join_args( self, args ): + args_str = '' + arg_separator = ', ' + if 1 == len( args ): + args_str = ' ' + args[0] + ' ' + else: + args_str = ' ' + arg_separator.join( args ) + ' ' + return '[%s]' % args_str + + + def _create_impl(self): + result = [] + result.append( '#%s' % self.undecorated_decl_name ) + result.append( '%(alias)s = %(library_var_name)s.%(alias)s' + % dict( alias=self.declaration.alias + , library_var_name=self.top_parent.library_var_name ) ) + + if not declarations.is_void( self.ftype.return_type ): + result.append( '%(alias)s.restype = %(restype)s' + % dict( alias=self.declaration.alias + , restype=ctypes_formatter.as_ctype( self.ftype.return_type ) ) ) + + if self.ftype.arguments_types: + tmp = [] + tmp.append( '%(alias)s.argtypes = ' % dict( alias=self.declaration.alias ) ) + args = map( ctypes_formatter.as_ctype, self.ftype.arguments_types ) + tmp.append( self.__join_args( args ) ) + result.append( ''.join( tmp ) ) + + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -5,11 +5,12 @@ import sort_algorithms import dependencies_manager +from pygccxml import msvc +from pyplusplus import _logging_ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators from pyplusplus import code_repository -from pyplusplus import _logging_ ACCESS_TYPES = declarations.ACCESS_TYPES VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES @@ -163,6 +164,10 @@ def visit_free_function( self ): self.__dependencies_manager.add_exported( self.curr_decl ) + if self.curr_decl.name in self.__exported_symbols \ + and self.curr_decl.name == self.__exported_symbols[ self.curr_decl.name ]: + #we deal with c function + self.curr_code_creator.adopt_creator( code_creators.c_function_definition_t( self.curr_decl ) ) def visit_free_operator( self ): self.__dependencies_manager.add_exported( self.curr_decl ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -29,12 +29,12 @@ if not self.print_details: return intend_txt = ' ' * (self.level+1) * self.INDENT_SIZE - self.writer( intend_txt + "Alias: " + self.instance.alias + os.linesep ) - self.writer( intend_txt + "Ignore: " + str( self.instance.ignore ) + os.linesep ) + self.writer( intend_txt + "alias: " + self.instance.alias + os.linesep ) + self.writer( intend_txt + "ignore: " + str( self.instance.ignore ) + os.linesep ) if not self.instance.ignore: msgs = self.instance.readme() if msgs: - self.writer( intend_txt + "ReadMe: " + os.linesep ) + self.writer( intend_txt + "readme: " + os.linesep ) more_intend_txt = ' ' * (self.level+2) * self.INDENT_SIZE for msg in msgs: self.writer( more_intend_txt + msg + os.linesep ) @@ -43,13 +43,19 @@ if not self.print_details: return self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Call policies: " + str(self.instance.call_policies) + os.linesep ) + + "call policies: " + str(self.instance.call_policies) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Use keywords: " + str(self.instance.use_keywords) + os.linesep ) + + "use keywords: " + str(self.instance.use_keywords) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Use signature: " + str(self.instance.create_with_signature) + os.linesep ) + + "use signature: " + str(self.instance.create_with_signature) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Use default arguments: " + str(self.instance.use_default_arguments) + os.linesep ) + + "use default arguments: " + str(self.instance.use_default_arguments) + os.linesep ) + try: + from pygccxml import msvc + self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + + "undecorated decl: " + msvc.undecorate_decl(self.instance) + os.linesep ) + except: + pass def visit_member_function( self ): super( decl_wrapper_printer_t, self ).visit_member_function() @@ -85,22 +91,22 @@ def visit_class(self ): super( decl_wrapper_printer_t, self ).visit_class() self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Expose using scope: " + str(self.instance.always_expose_using_scope) + os.linesep ) + + "expose using scope: " + str(self.instance.always_expose_using_scope) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Redefine operators: " + str(self.instance.redefine_operators) + os.linesep ) + + "redefine operators: " + str(self.instance.redefine_operators) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Held type: " + str(self.instance.held_type) + os.linesep ) + + "held type: " + str(self.instance.held_type) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Use noncopyable: " + str(self.instance.noncopyable) + os.linesep ) + + "use noncopyable: " + str(self.instance.noncopyable) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Class wrapper alias: " + str(self.instance.wrapper_alias) + os.linesep ) + + "class wrapper alias: " + str(self.instance.wrapper_alias) + os.linesep ) def visit_enumeration(self): super( decl_wrapper_printer_t, self ).visit_enumeration() self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Enumeration value aliases: " + str(self.instance.value_aliases) + os.linesep ) + + "enumeration value aliases: " + str(self.instance.value_aliases) + os.linesep ) self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "Enumeration export values: " + str(self.instance.export_values) + os.linesep ) + + "enumeration export values: " + str(self.instance.export_values) + os.linesep ) def visit_namespace(self ): super( decl_wrapper_printer_t, self ).visit_namespace() Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -80,8 +80,10 @@ def __include_declarations( self ): self.global_ns.exclude() - undecorated = set( self.__blob2undecorated.values() ) - is_exported = lambda d: msvc.undecorate_decl( d ) in undecorated + b2u = self.__blob2undecorated + undecorated = set( b2u.values() ) + is_exported = lambda d: msvc.undecorate_decl( d ) in undecorated \ + or d.name in b2u and b2u[d.name] == d.name #treatment of C functions included_decls = set() included_decls.update( self.global_ns.calldefs( is_exported, allow_empty=True, recursive=True ) ) Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-28 13:16:57 UTC (rev 1511) @@ -20,14 +20,15 @@ def test(self): mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) - #~ mb.global_ns.include() + #~ mb.print_declarations() mb.build_code_creator( self.symbols_file ) mb.write_module( os.path.join( autoconfig.build_directory, self.module_name + '.py' ) ) #mb.code_creator.create() sys.path.append( autoconfig.build_directory ) import ctypes_pof + print ctypes_pof.identity( 23 ) + self.failUnless( ctypes_pof.identity( 23 ) == 23 ) - def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: Modified: pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-28 13:16:57 UTC (rev 1511) @@ -47,6 +47,8 @@ void do_smth( number_aptr_t& ){ } +int identity( int i){ return i;} + BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved Modified: pyplusplus_dev/unittests/data/ctypes_pof/mydll.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2008-12-28 12:12:16 UTC (rev 1510) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2008-12-28 13:16:57 UTC (rev 1511) @@ -26,3 +26,9 @@ typedef std::auto_ptr< pof::number_t > number_aptr_t; void __declspec(dllexport) do_smth( number_aptr_t& ); + +extern "C"{ + +int __declspec(dllexport) identity( int ); + +} \ 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...> - 2008-12-28 20:45:37
|
Revision: 1512 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1512&view=rev Author: roman_yakovenko Date: 2008-12-28 20:45:32 +0000 (Sun, 28 Dec 2008) Log Message: ----------- ctypes - another set of changes Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/declarations/dependencies.py pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/function_definition.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp Added Paths: ----------- pyplusplus_dev/pyplusplus/code_creators/bookmark.py Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-12-28 13:16:57 UTC (rev 1511) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -537,4 +537,17 @@ , recursive=False , allow_empty=True ) ) + @property + def top_class( self ): + """reference to a parent class, which contains this class and defined + within a namespace + + if this class is defined under a namespace, self will be returned""" + curr = self + parent = self.parent + while isinstance( parent, class_t ): + curr = parent + parent = parent.parent + return curr + class_types = ( class_t, class_declaration_t ) Modified: pygccxml_dev/pygccxml/declarations/dependencies.py =================================================================== --- pygccxml_dev/pygccxml/declarations/dependencies.py 2008-12-28 13:16:57 UTC (rev 1511) +++ pygccxml_dev/pygccxml/declarations/dependencies.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -19,21 +19,21 @@ self._depend_on_it = depend_on_it self._access_type = access_type self._hint = hint - + @property def declaration( self ): return self._declaration #short name decl = declaration - @property + @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 + self._access_type = access_type access_type = property( _get_access_type, _set_access_type ) def __str__( self ): @@ -52,10 +52,27 @@ """ #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 + + @staticmethod + def they_depend_on_us( decls ): + """returns set of declarations. every item in the returned set, depends on a + declaration from the input""" + import class_declaration #prevent cyclic imports + to_be_included = set() + for decl in decls: + for dependency_info in decl.i_depend_on_them(): + ddecl = dependency_info.find_out_depend_on_declaration() + if ddecl: + to_be_included.add( ddecl ) + + if isinstance( decl.parent, class_declaration.class_t ): + to_be_included.add( decl.parent ) + return to_be_included + Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-28 13:16:57 UTC (rev 1511) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -141,6 +141,8 @@ from ctypes_integration_creators import expose_this_t from ctypes_integration_creators import expose_sizeof_t +from bookmark import bookmark_t + #pure ctypes from ctypes_module import ctypes_module_t from import_ import import_t Added: pyplusplus_dev/pyplusplus/code_creators/bookmark.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/bookmark.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_creators/bookmark.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -0,0 +1,18 @@ +# Copyright 2004-2008 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 compound + +class bookmark_t(compound.compound_t): + def __init__( self, comment='' ): + compound.compound_t.__init__(self ) + self.comment = '' + + def _create_impl(self): + return compound.compound_t.create_internal_code( self.creators, indent_code=False ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_creators/function_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-28 13:16:57 UTC (rev 1511) +++ pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -38,6 +38,7 @@ def _create_impl(self): result = [] result.append( '#%s' % self.undecorated_decl_name ) + result.append( '#TODO - unable to call C function, if dll was loaded as CPPDLL' ) result.append( '%(alias)s = %(library_var_name)s.%(alias)s' % dict( alias=self.declaration.alias , library_var_name=self.top_parent.library_var_name ) ) Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-28 13:16:57 UTC (rev 1511) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -32,11 +32,14 @@ self.module = code_creators.ctypes_module_t( global_ns ) self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) + self.__class_ccs = code_creators.bookmark_t() + #~ prepared_decls = self.__prepare_decls( global_ns, doc_extractor ) #~ self.__decls = sort_algorithms.sort( prepared_decls ) self.curr_decl = global_ns self.curr_code_creator = self.module self.__class2introduction = {} + self.__namespace2pyclass = {} def __print_readme( self, decl ): readme = decl.readme() @@ -97,14 +100,6 @@ if self.__contains_exported( internal_class ): self.__add_class_introductions( ci_creator, internal_class ) - # - implement better 0(n) algorithm - def __add_namespaces( self, cc, ns ): - ns_creator = code_creators.namespace_as_pyclass_t( ns ) - cc.adopt_creator( ns_creator ) - for internal_ns in ns.namespaces( recursive=False, allow_empty=True): - if self.__contains_exported( ns ): - self.__add_namespaces( ns_creator, internal_ns ) - def create(self ): """Create and return the module for the extension. @@ -119,17 +114,18 @@ ccc.adopt_creator( code_creators.name_mappings_t( self.__exported_symbols ) ) ccc.adopt_creator( code_creators.separator_t() ) #adding namespaces - for ns in self.global_ns.namespaces( recursive=False, allow_empty=True): - if self.__contains_exported( ns ): - self.__add_namespaces( ccc, ns ) - #adding class introductions + global_ns_cc = code_creators.bookmark_t() + ccc.adopt_creator( global_ns_cc ) + ccc.adopt_creator( self.__class_ccs ) + self.__namespace2pyclass[ self.global_ns ] = global_ns_cc + #adding class introductions - special case because of hierarchy f = lambda cls: self.__should_generate_code( cls ) \ and isinstance( cls.parent, declarations.namespace_t ) ns_classes = self.global_ns.classes( f, recursive=True, allow_empty=True) ns_classes = sort_algorithms.sort_classes( ns_classes ) for class_ in ns_classes: - if self.__contains_exported( ns ): - self.__add_class_introductions( ccc, class_ ) + if self.__contains_exported( class_ ): + self.__add_class_introductions( self.__class_ccs, class_ ) ccc.adopt_creator( code_creators.embedded_code_repository_t( code_repository.ctypes_cpp_utils ) ) @@ -174,6 +170,8 @@ def visit_class_declaration(self ): self.__dependencies_manager.add_exported( self.curr_decl ) + ci_creator = code_creators.class_introduction_t( self.curr_decl ) + self.curr_code_creator.adopt_creator( ci_creator ) def visit_class(self): self.__dependencies_manager.add_exported( self.curr_decl ) @@ -197,6 +195,11 @@ self.__dependencies_manager.add_exported( self.curr_decl ) def visit_namespace(self ): + if self.global_ns is not self.curr_decl: + ns_creator = code_creators.namespace_as_pyclass_t( self.curr_decl ) + self.__namespace2pyclass[ self.curr_decl ] = ns_creator + self.__namespace2pyclass[ self.curr_decl.parent ].adopt_creator( ns_creator ) + ns = self.curr_decl for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): if isinstance( decl, declarations.namespace_t) or self.__should_generate_code( decl ): Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-28 13:16:57 UTC (rev 1511) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -84,15 +84,18 @@ undecorated = set( b2u.values() ) is_exported = lambda d: msvc.undecorate_decl( d ) in undecorated \ or d.name in b2u and b2u[d.name] == d.name #treatment of C functions - + #include exported declarations included_decls = set() included_decls.update( self.global_ns.calldefs( is_exported, allow_empty=True, recursive=True ) ) included_decls.update( self.global_ns.variables( is_exported, allow_empty=True, recursive=True ) ) - + #include declarations, on which exported declarations depend + they_depend_on_us = decls_package.dependency_info_t.they_depend_on_us + included_decls.update( they_depend_on_us( included_decls ) ) for d in included_decls: + print str(d) d.include() - if isinstance( d.parent, decls_package.class_t ): - d.parent.include() + if isinstance( d, decls_package.class_t ): + d.top_class.include() def build_code_creator( self, library_path, doc_extractor=None ): creator = creators_factory.ctypes_creator_t( self.global_ns Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-28 13:16:57 UTC (rev 1511) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-28 20:45:32 UTC (rev 1512) @@ -26,8 +26,8 @@ #mb.code_creator.create() sys.path.append( autoconfig.build_directory ) import ctypes_pof - print ctypes_pof.identity( 23 ) - self.failUnless( ctypes_pof.identity( 23 ) == 23 ) + #the following code fails - difference in the calling conventions + self.failUnless( ctypes_pof.identity( int(111) ) == 111 ) def create_suite(): suite = unittest.TestSuite() Modified: pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-28 13:16:57 UTC (rev 1511) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-28 20:45:32 UTC (rev 1512) @@ -47,7 +47,7 @@ void do_smth( number_aptr_t& ){ } -int identity( int i){ return i;} +int identity( int some_data){ return some_data;} BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-29 14:02:43
|
Revision: 1513 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1513&view=rev Author: roman_yakovenko Date: 2008-12-29 14:02:40 +0000 (Mon, 29 Dec 2008) Log Message: ----------- adding few basic ctypes code creators Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/class_introduction.py pyplusplus_dev/pyplusplus/code_creators/fields_definition.py pyplusplus_dev/pyplusplus/code_creators/function_definition.py pyplusplus_dev/pyplusplus/code_creators/import_.py pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py pyplusplus_dev/pyplusplus/code_creators/methods_definition.py pyplusplus_dev/pyplusplus/code_repository/__init__.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp pyplusplus_dev/unittests/data/ctypes_pof/mydll.h Added Paths: ----------- pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py pyplusplus_dev/unittests/data/ctypes_pof/mydll.80.vcproj pyplusplus_dev/unittests/data/ctypes_pof/mydll.90.vcproj Removed Paths: ------------- pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py pyplusplus_dev/unittests/data/ctypes_pof/mydll.vcproj Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -150,9 +150,14 @@ from name_mappings import name_mappings_t from namespace_as_pyclass import namespace_as_pyclass_t from class_introduction import class_introduction_t +from class_introduction import class_declaration_introduction_t from mem_fun_introduction import mem_fun_introduction_t from mem_fun_introduction import vmem_fun_introduction_t +from mem_fun_introduction import constructor_introduction_t +from mem_fun_introduction import destructor_introduction_t + + from fields_definition import fields_definition_t from embedded_code_repository import embedded_code_repository_t from methods_definition import methods_definition_t -from function_definition import c_function_definition_t +from function_definition import function_definition_t Modified: pyplusplus_dev/pyplusplus/code_creators/class_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -5,6 +5,7 @@ import os import compound +import code_creator import declaration_based from pygccxml import declarations @@ -17,8 +18,6 @@ result = [] result.append( "class %s(ctypes.Structure):" % self.alias ) result.append( self.indent( '"""class %s"""' % self.decl_identifier ) ) - result.append( self.indent( '#_fields_ = [] <-- class member variables definition list' ) ) - result.append( self.indent( '#_methods_ = {} <-- class non-virtual member functions definition list' ) ) if self.creators: result.append( self.indent( '' ) ) result.append( compound.compound_t.create_internal_code( self.creators ) ) @@ -31,3 +30,24 @@ def _get_system_headers_impl( self ): return [] + + +class class_declaration_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, class_declaration ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, class_declaration ) + + def _create_impl(self): + result = [] + result.append( "class %s(ctypes.Structure):" % self.alias ) + result.append( self.indent( '"""class declaration %s"""' % self.decl_identifier ) ) + result.append( self.indent( '_fields_ = []' ) ) + + if isinstance( self.declaration.parent, declarations.namespace_t ) \ + and self.declaration.parent is not self.declaration.top_parent: #not a global namespace + result.append( '%(ns_full_name)s = %(name)s' + % dict( ns_full_name=self.complete_py_name, name=self.alias )) + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_creators/fields_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -8,6 +8,11 @@ import declaration_based from pygccxml import declarations +#TODO: don't hide public member variables +#TODO: how _fields_ should be defined in a class hierarchy +#TODO: fix 64bit issue with calculating vtable pointer size + + class fields_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): def __init__( self, class_ ): code_creator.code_creator_t.__init__(self) @@ -15,13 +20,11 @@ def _create_impl(self): result = [] - result.append( '%(complete_py_name)s._fields_ = [ #class member variables definition list' - % dict( complete_py_name=self.complete_py_name ) ) + result.append( '%(complete_py_name)s._fields_ = [ #class %(decl_identifier)s' + % dict( complete_py_name=self.complete_py_name + , decl_identifier=self.decl_identifier) ) if self.declaration.has_vtable: result.append( self.indent( '("_vtable_", ctypes.POINTER(ctypes.c_void_p)),' ) ) - result.append( self.indent( "#TODO: don't hide public member variables" ) ) - result.append( self.indent( "#TODO: how _fields_ should be defined in a class hierarchy" ) ) - result.append( self.indent( "#TODO: fix 64bit issue with calculating vtable pointer size" ) ) result.append( self.indent( '("__hidden__", ctypes.c_char * %d),' % ( self.declaration.byte_size - 4*int(self.declaration.has_vtable) ) ) ) result.append( ']' ) Modified: pyplusplus_dev/pyplusplus/code_creators/function_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -9,14 +9,9 @@ import declaration_based from pygccxml import declarations -""" -BSCGetBaseArray = _libraries['msbsc70.dll'].BSCGetBaseArray -BSCGetBaseArray.restype = BOOL -BSCGetBaseArray.argtypes = [POINTER(Bsc), IINST, POINTER(POINTER(IINST)), POINTER(ULONG)] +#TODO - unable to call C function, if dll was loaded as CPPDLL -""" - -class c_function_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): +class function_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): def __init__( self, free_fun ): code_creator.code_creator_t.__init__(self) declaration_based.declaration_based_t.__init__( self, free_fun ) @@ -37,11 +32,10 @@ def _create_impl(self): result = [] - result.append( '#%s' % self.undecorated_decl_name ) - result.append( '#TODO - unable to call C function, if dll was loaded as CPPDLL' ) - result.append( '%(alias)s = %(library_var_name)s.%(alias)s' + result.append( '%(alias)s = getattr( %(library_var_name)s, %(library_var_name)s.undecorated_names["%(undecorated_decl_name)s"] )' % dict( alias=self.declaration.alias - , library_var_name=self.top_parent.library_var_name ) ) + , library_var_name=self.top_parent.library_var_name + , undecorated_decl_name=self.undecorated_decl_name) ) if not declarations.is_void( self.ftype.return_type ): result.append( '%(alias)s.restype = %(restype)s' Modified: pyplusplus_dev/pyplusplus/code_creators/import_.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/import_.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_creators/import_.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -3,6 +3,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import os import code_creator import include_directories @@ -14,7 +15,7 @@ self._module_name = module_name def _create_impl(self): - return 'import %(module)s' % dict( module=self._module_name ) + return 'import %(module)s' % dict( module=os.path.splitext(self._module_name)[0] ) def _get_system_headers_impl( self ): return [] Modified: pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -39,3 +39,33 @@ def _get_system_headers_impl( self ): return [] + +class constructor_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, constructor ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, constructor ) + + def _create_impl(self): + tmpl = ['def __init__( self, *args ):'] + tmpl.append( self.indent('"""%(name)s"""') ) + tmpl.append( self.indent("return self._methods_['__init__']( ctypes.byref( self ), *args )") ) + return os.linesep.join( tmpl ) \ + % dict( alias=self.declaration.alias, name=self.undecorated_decl_name ) + + def _get_system_headers_impl( self ): + return [] + +class destructor_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, constructor ): + code_creator.code_creator_t.__init__(self) + declaration_based.declaration_based_t.__init__( self, constructor ) + + def _create_impl(self): + tmpl = ['def __del__( self ):'] + tmpl.append( self.indent('"""%(name)s"""') ) + tmpl.append( self.indent("return self._methods_['__del__']( ctypes.byref( self ) )") ) + return os.linesep.join( tmpl ) \ + % dict( name=self.undecorated_decl_name ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_creators/methods_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -21,9 +21,9 @@ result = [] scope = declarations.algorithm.declaration_path( self.declaration ) del scope[0] #del :: from the global namespace + del scope[-1] #del self from the list - - result.append( '%(mem_fun_factory_var_name)s = mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s", "%(ns)s" )' + result.append( '%(mem_fun_factory_var_name)s = ctypes_utils.mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s", "%(ns)s" )' % dict( mem_fun_factory_var_name=self.mem_fun_factory_var_name , library_var_name=self.top_parent.library_var_name , complete_py_name=self.complete_py_name Modified: pyplusplus_dev/pyplusplus/code_repository/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/__init__.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_repository/__init__.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -19,7 +19,7 @@ import convenience import return_range import call_policies -import ctypes_cpp_utils +import ctypes_utils import ctypes_integration all = [ array_1 @@ -28,7 +28,7 @@ , call_policies , named_tuple , return_range - , ctypes_cpp_utils + , ctypes_utils , ctypes_integration ] headers = map( lambda f: f.file_name, all ) Deleted: pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -1,92 +0,0 @@ -# Copyright 2004-2008 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) - -file_name = "ctypes_cpp_utils.py" - -license = \ -"""# Copyright 2004-2008 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) -""" - - -code = \ -""" -# what is the best way to treat overloaded constructors -class mem_fun_callable( object ): - def __init__(self, dll, name, restype=None, argtypes=None ): - self.name = name - self.func = getattr( dll, dll.undecorated_names[name] ) - self.func.restype = restype - self.func.argtypes = argtypes - - def __call__(self, *args, **keywd ): - return self.func( *args, **keywd ) - -class mem_fun_factory( object ): - def __init__( self, dll, wrapper, class_name, namespace='' ): - self.dll = dll - self.namespace = namespace - self.class_name = class_name - self.this_type = ctypes.POINTER( wrapper ) - - def __call__( self, name, **keywd ): - if 'argtypes' not in keywd: - keywd['argtypes'] = [ self.this_type ] - else: - keywd['argtypes'].insert( 0, self.this_type ) - return mem_fun_callable( self.dll, name, **keywd ) - - def __get_ns_name(self): - if self.namespace: - return self.namespace + '::' - else: - return '' - - def default_constructor( self ): - return self( '%(ns)s%(class_name)s::%(class_name)s(void)' - % dict( ns=self.__get_ns_name() - , class_name=self.class_name ) ) - - def constructor( self, argtypes_str, **keywd ): - return self( '%(ns)s%(class_name)s::%(class_name)s(%(args)s)' - % dict( ns=self.__get_ns_name() - , class_name=self.class_name - , args=argtypes_str ) - , **keywd ) - - def copy_constructor( self ): - return self( '%(ns)s%(class_name)s::%(class_name)s(%(class_name)s const &)' - % dict( ns=self.__get_ns_name() - , class_name=self.class_name ) - , argtypes=[self.this_type] ) - - def destructor( self ): - return self( '%(ns)s%(class_name)s::~%(class_name)s(void)' - % dict( ns=self.__get_ns_name() - , class_name=self.class_name ) ) - - def operator_assign( self ): - return self( '%(ns)s%(class_name)s & %(class_name)s::operator=(%(class_name)s const &)' - % dict( ns=self.__get_ns_name() - , class_name=self.class_name ) - , restype=self.this_type - , argtypes=[self.this_type] ) - - def method( self, name, restype_str=None, argtypes_str=None, **keywd ): - if None is restype_str: - restype_str = 'void' - if None is argtypes_str: - argtypes_str = 'void' - - return self( '%(return_)s %(ns)s%(class_name)s::%(method_name)s(%(args)s)' - % dict( return_=restype_str - , ns=self.__get_ns_name() - , class_name=self.class_name - , method_name=name - , args=argtypes_str ) - , **keywd ) -""" Copied: pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py (from rev 1512, pyplusplus_dev/pyplusplus/code_repository/ctypes_cpp_utils.py) =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -0,0 +1,121 @@ +# Copyright 2004-2008 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) + +file_name = "ctypes_utils.py" + +code = \ +"""# Copyright 2004-2008 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 ctypes + +# what is the best way to treat overloaded constructors +class native_callable( object ): + def __init__(self, dll, name, restype=None, argtypes=None ): + self.name = name + self.func = getattr( dll, dll.undecorated_names[name] ) + self.func.restype = restype + self.func.argtypes = argtypes + + def __call__(self, *args, **keywd ): + return self.func( *args, **keywd ) + +class native_overloaded_callable( object ): + def __init__(self, restype=None ): + self.__functions = {} # argtypes : function + self.restype = restype + + def register( self, dll, name, argtypes=None ): + f = getattr( dll, dll.undecorated_names[name] ) + f.restype = self.restype + f.argtypes = argtypes + self.__functions[ argtypes ] = f + return self + + def register_callable( self, callable ): + #TODO: check restype + self.__functions[ tuple(callable.func.argtypes) ] = callable.func + return self + + def __call__( self, *args ): + types = None + if args: + types = tuple(arg.__class__ for arg in args) + f = self.__functions.get(types) + if f is None: + return f(*args) + else: + raise TypeError("no match") + +def multi_method( restype=None ): + return native_overloaded_callable( restype ) + +class mem_fun_factory( object ): + def __init__( self, dll, wrapper, class_name, namespace='' ): + self.dll = dll + self.namespace = namespace + self.class_name = class_name + self.this_type = ctypes.POINTER( wrapper ) + + def __call__( self, name, **keywd ): + if 'argtypes' not in keywd: + keywd['argtypes'] = [ self.this_type ] + else: + keywd['argtypes'].insert( 0, self.this_type ) + return native_callable( self.dll, name, **keywd ) + + def __get_ns_name(self): + if self.namespace: + return self.namespace + '::' + else: + return '' + + def default_constructor( self ): + return self( '%(ns)s%(class_name)s::%(class_name)s(void)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) ) + + def constructor( self, argtypes_str, **keywd ): + return self( '%(ns)s%(class_name)s::%(class_name)s(%(args)s)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name + , args=argtypes_str ) + , **keywd ) + + def copy_constructor( self ): + return self( '%(ns)s%(class_name)s::%(class_name)s(%(ns)s%(class_name)s const &)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) + , argtypes=[self.this_type] ) + + def destructor( self ): + return self( '%(ns)s%(class_name)s::~%(class_name)s(void)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) ) + + def operator_assign( self ): + return self( '%(ns)s%(class_name)s & %(class_name)s::operator=(%(class_name)s const &)' + % dict( ns=self.__get_ns_name() + , class_name=self.class_name ) + , restype=self.this_type + , argtypes=[self.this_type] ) + + def method( self, name, restype_str=None, argtypes_str=None, **keywd ): + if None is restype_str: + restype_str = 'void' + if None is argtypes_str: + argtypes_str = 'void' + + return self( '%(return_)s %(ns)s%(class_name)s::%(method_name)s(%(args)s)' + % dict( return_=restype_str + , ns=self.__get_ns_name() + , class_name=self.class_name + , method_name=name + , args=argtypes_str ) + , **keywd ) + +""" Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -32,14 +32,22 @@ self.module = code_creators.ctypes_module_t( global_ns ) self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) + #bookmark for class introductions self.__class_ccs = code_creators.bookmark_t() + #bookmark for class deinitions + self.__class_defs_ccs = code_creators.bookmark_t() #~ prepared_decls = self.__prepare_decls( global_ns, doc_extractor ) #~ self.__decls = sort_algorithms.sort( prepared_decls ) self.curr_decl = global_ns self.curr_code_creator = self.module + #mapping between class declaration and class introduction code creator self.__class2introduction = {} + #mapping between namespace and its code creator self.__namespace2pyclass = {} + #set of all included namespaces + #~ self.__included_nss = set() + #~ for decl in self.global_ns def __print_readme( self, decl ): readme = decl.readme() @@ -109,9 +117,13 @@ # Invoke the appropriate visit_*() method on all decls ccc = self.curr_code_creator ccc.adopt_creator( code_creators.import_t( 'ctypes' ) ) + ccc.adopt_creator( code_creators.import_t( code_repository.ctypes_utils.file_name ) ) + ccc.adopt_creator( code_creators.separator_t() ) + ccc.adopt_creator( code_creators.library_reference_t( self.__library_path ) ) ccc.adopt_creator( code_creators.name_mappings_t( self.__exported_symbols ) ) + ccc.adopt_creator( code_creators.separator_t() ) #adding namespaces global_ns_cc = code_creators.bookmark_t() @@ -127,7 +139,7 @@ if self.__contains_exported( class_ ): self.__add_class_introductions( self.__class_ccs, class_ ) - ccc.adopt_creator( code_creators.embedded_code_repository_t( code_repository.ctypes_cpp_utils ) ) + ccc.adopt_creator( self.__class_defs_ccs ) declarations.apply_visitor( self, self.curr_decl ) @@ -148,9 +160,16 @@ def visit_constructor( self ): self.__dependencies_manager.add_exported( self.curr_decl ) + cls_intro_cc = self.__class2introduction[ self.curr_decl.parent ] + has_constructor = filter( lambda cc: isinstance( cc, code_creators.constructor_introduction_t ) + , cls_intro_cc.creators ) + if not has_constructor: + cls_intro_cc.adopt_creator( code_creators.constructor_introduction_t( self.curr_decl ) ) def visit_destructor( self ): self.__dependencies_manager.add_exported( self.curr_decl ) + cls_intro_cc = self.__class2introduction[ self.curr_decl.parent ] + cls_intro_cc.adopt_creator( code_creators.destructor_introduction_t( self.curr_decl ) ) def visit_member_operator( self ): self.__dependencies_manager.add_exported( self.curr_decl ) @@ -162,22 +181,23 @@ self.__dependencies_manager.add_exported( self.curr_decl ) if self.curr_decl.name in self.__exported_symbols \ and self.curr_decl.name == self.__exported_symbols[ self.curr_decl.name ]: - #we deal with c function - self.curr_code_creator.adopt_creator( code_creators.c_function_definition_t( self.curr_decl ) ) + return #it is notpossible to call C function from CPPDLL + else: + self.curr_code_creator.adopt_creator( code_creators.function_definition_t( self.curr_decl ) ) def visit_free_operator( self ): self.__dependencies_manager.add_exported( self.curr_decl ) def visit_class_declaration(self ): self.__dependencies_manager.add_exported( self.curr_decl ) - ci_creator = code_creators.class_introduction_t( self.curr_decl ) - self.curr_code_creator.adopt_creator( ci_creator ) + ci_creator = code_creators.class_declaration_introduction_t( self.curr_decl ) + self.__class_ccs.adopt_creator( ci_creator ) def visit_class(self): self.__dependencies_manager.add_exported( self.curr_decl ) #fields definition should be recursive using the visitor - self.curr_code_creator.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) - self.curr_code_creator.adopt_creator( code_creators.methods_definition_t( self.curr_decl ) ) + self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) + self.__class_defs_ccs.adopt_creator( code_creators.methods_definition_t( self.curr_decl ) ) class_ = self.curr_decl for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): if self.__should_generate_code( decl ): @@ -195,6 +215,8 @@ self.__dependencies_manager.add_exported( self.curr_decl ) def visit_namespace(self ): + if not self.__contains_exported( self.curr_decl ): + return if self.global_ns is not self.curr_decl: ns_creator = code_creators.namespace_as_pyclass_t( self.curr_decl ) self.__namespace2pyclass[ self.curr_decl ] = ns_creator Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -71,9 +71,14 @@ if cr.file_name in system_headers: #check whether file from code repository is used self.write_file( os.path.join( dir, cr.file_name ), cr.code ) - #named_tuple.py is a special case :-( - self.write_file( os.path.join( dir, code_repository.named_tuple.file_name ) - , code_repository.named_tuple.code ) + #Python files are a special case + if isinstance( self.extmodule, code_creators.bpmodule_t ): + self.write_file( os.path.join( dir, code_repository.named_tuple.file_name ) + , code_repository.named_tuple.code ) + else: + self.write_file( os.path.join( dir, code_repository.ctypes_utils.file_name ) + , code_repository.ctypes_utils.code ) + @staticmethod def write_file( fpath, content, files_sum_repository=None, encoding='ascii' ): """Write a source file. Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -92,7 +92,6 @@ they_depend_on_us = decls_package.dependency_info_t.they_depend_on_us included_decls.update( they_depend_on_us( included_decls ) ) for d in included_decls: - print str(d) d.include() if isinstance( d, decls_package.class_t ): d.top_class.include() Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-29 14:02:40 UTC (rev 1513) @@ -27,8 +27,23 @@ sys.path.append( autoconfig.build_directory ) import ctypes_pof #the following code fails - difference in the calling conventions - self.failUnless( ctypes_pof.identity( int(111) ) == 111 ) + print ctypes_pof.identity_cpp( int(111) ) + self.failUnless( ctypes_pof.identity_cpp( int(111) ) == 111 ) + #~ def test_bsc( self ): + #~ root = r'E:\Documents and Settings\romany\Desktop\ToInstall\bsckit70\bscsdk' + #~ mb = ctypes_module_builder_t( [os.path.join( root, 'bsc.h' )] + #~ , os.path.join( root, 'msbsc70.dll' ), autoconfig.cxx_parsers_cfg.gccxml ) + mb.print_declarations() + #~ mb.build_code_creator( self.symbols_file ) + #~ mb.write_module( os.path.join( root, 'bsc.py' ) ) + #~ #mb.code_creator.create() + sys.path.append( autoconfig.build_directory ) + import ctypes_pof + print ctypes_pof.identity( 23 ) + self.failUnless( ctypes_pof.identity( 23 ) == 23 ) + + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: Added: pyplusplus_dev/unittests/data/ctypes_pof/mydll.80.vcproj =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.80.vcproj (rev 0) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.80.vcproj 2008-12-29 14:02:40 UTC (rev 1513) @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="windows-1255"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="8.00" + Name="mydll" + ProjectGUID="{0B9466BC-60F8-4FC2-A1A9-6A01577690E5}" + RootNamespace="mydll" + Keyword="Win32Proj" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="0" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" + RuntimeLibrary="2" + UsePrecompiledHeader="0" + BrowseInformation="1" + WarningLevel="3" + Detect64BitPortabilityProblems="true" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkIncremental="1" + GenerateDebugInformation="true" + GenerateMapFile="true" + MapFileName="$(TargetDir)$(TargetName).map" + MapExports="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCWebDeploymentTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath=".\mydll.cpp" + > + </File> + <File + RelativePath=".\mydll.h" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Copied: pyplusplus_dev/unittests/data/ctypes_pof/mydll.90.vcproj (from rev 1512, pyplusplus_dev/unittests/data/ctypes_pof/mydll.vcproj) =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.90.vcproj (rev 0) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.90.vcproj 2008-12-29 14:02:40 UTC (rev 1513) @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="Windows-1252"?> +<VisualStudioProject + ProjectType="Visual C++" + Version="9.00" + Name="mydll" + ProjectGUID="{E7A34C45-534F-43A6-AF95-3CA2428619E2}" + RootNamespace="mydll" + Keyword="Win32Proj" + TargetFrameworkVersion="196613" + > + <Platforms> + <Platform + Name="Win32" + /> + </Platforms> + <ToolFiles> + </ToolFiles> + <Configurations> + <Configuration + Name="Debug|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="0" + PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" + MinimalRebuild="true" + BasicRuntimeChecks="3" + RuntimeLibrary="3" + UsePrecompiledHeader="2" + WarningLevel="3" + DebugInformationFormat="4" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkIncremental="2" + GenerateDebugInformation="true" + SubSystem="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + <Configuration + Name="Release|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="2" + CharacterSet="1" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + Optimization="2" + EnableIntrinsicFunctions="true" + PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" + RuntimeLibrary="2" + EnableFunctionLevelLinking="true" + UsePrecompiledHeader="0" + BrowseInformation="1" + WarningLevel="3" + DebugInformationFormat="3" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkIncremental="1" + GenerateDebugInformation="true" + GenerateMapFile="true" + MapExports="true" + SubSystem="2" + OptimizeReferences="2" + EnableCOMDATFolding="2" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> + </Configurations> + <References> + </References> + <Files> + <File + RelativePath=".\mydll.cpp" + > + </File> + <File + RelativePath=".\mydll.h" + > + </File> + </Files> + <Globals> + </Globals> +</VisualStudioProject> Modified: pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2008-12-29 14:02:40 UTC (rev 1513) @@ -49,6 +49,8 @@ int identity( int some_data){ return some_data;} +int identity_cpp( int data){ return data; } + BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved Modified: pyplusplus_dev/unittests/data/ctypes_pof/mydll.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2008-12-29 14:02:40 UTC (rev 1513) @@ -31,4 +31,6 @@ int __declspec(dllexport) identity( int ); -} \ No newline at end of file +} + +int __declspec(dllexport) identity_cpp( int ); \ No newline at end of file Deleted: pyplusplus_dev/unittests/data/ctypes_pof/mydll.vcproj =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.vcproj 2008-12-28 20:45:32 UTC (rev 1512) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.vcproj 2008-12-29 14:02:40 UTC (rev 1513) @@ -1,182 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="mydll" - ProjectGUID="{E7A34C45-534F-43A6-AF95-3CA2428619E2}" - RootNamespace="mydll" - Keyword="Win32Proj" - TargetFrameworkVersion="196613" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="2" - CharacterSet="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="2" - WarningLevel="3" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - LinkIncremental="2" - GenerateDebugInformation="true" - SubSystem="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="2" - CharacterSet="1" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - EnableIntrinsicFunctions="true" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;MYDLL_EXPORTS" - RuntimeLibrary="2" - EnableFunctionLevelLinking="true" - UsePrecompiledHeader="0" - BrowseInformation="1" - WarningLevel="3" - DebugInformationFormat="3" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - LinkIncremental="1" - GenerateDebugInformation="true" - GenerateMapFile="true" - MapExports="true" - SubSystem="2" - OptimizeReferences="2" - EnableCOMDATFolding="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <File - RelativePath=".\mydll.cpp" - > - </File> - <File - RelativePath=".\mydll.h" - > - </File> - </Files> - <Globals> - </Globals> -</VisualStudioProject> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-29 22:22:49
|
Revision: 1514 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1514&view=rev Author: roman_yakovenko Date: 2008-12-29 22:22:45 +0000 (Mon, 29 Dec 2008) Log Message: ----------- adding multi-method support Modified Paths: -------------- pygccxml_dev/pygccxml/msvc/common_utils.py pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/class_introduction.py pyplusplus_dev/pyplusplus/code_creators/function_definition.py pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/unittests/ctypes_pof_tester.py Modified: pygccxml_dev/pygccxml/msvc/common_utils.py =================================================================== --- pygccxml_dev/pygccxml/msvc/common_utils.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pygccxml_dev/pygccxml/msvc/common_utils.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -126,7 +126,7 @@ name = name.replace( ', ', ',' ) return name - def __format_args_as_undecorated( self, argtypes ): + def undecorate_argtypes( self, argtypes ): if not argtypes: return 'void' else: @@ -153,7 +153,7 @@ and declarations.templates.is_instantiation( calldef.parent.name ): result.append( '<%s>' % ','.join( declarations.templates.args( calldef.parent.name ) ) ) - result.append( '(%s)' % self.__format_args_as_undecorated( calldef_type.arguments_types ) ) + result.append( '(%s)' % self.undecorate_argtypes( calldef_type.arguments_types ) ) if is_mem_fun and calldef.has_const: result.append( 'const' ) return ''.join( result ) @@ -187,11 +187,14 @@ if 'win' in sys.platform: undecorate_blob = undname_creator().undecorate_blob undecorate_decl = undname_creator().undecorated_decl + undecorate_argtypes = undname_creator().undecorate_argtypes else: def undecorate_blob( x ): raise NotImplementedError() def undecorate_decl( x ): raise NotImplementedError() + def undecorate_argtypes( x ): + raise NotImplementedError() import exceptions class LicenseWarning( exceptions.UserWarning ): Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -153,11 +153,14 @@ from class_introduction import class_declaration_introduction_t from mem_fun_introduction import mem_fun_introduction_t from mem_fun_introduction import vmem_fun_introduction_t -from mem_fun_introduction import constructor_introduction_t -from mem_fun_introduction import destructor_introduction_t +from mem_fun_introduction import init_introduction_t +from mem_fun_introduction import del_introduction_t from fields_definition import fields_definition_t from embedded_code_repository import embedded_code_repository_t from methods_definition import methods_definition_t from function_definition import function_definition_t +from function_definition import init_definition_t +from function_definition import multi_init_definition_t +from function_definition import del_definition_t Modified: pyplusplus_dev/pyplusplus/code_creators/class_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -24,6 +24,7 @@ if isinstance( self.declaration.parent, declarations.namespace_t ) \ and self.declaration.parent is not self.declaration.top_parent: #not a global namespace + result.append("") result.append( '%(ns_full_name)s = %(name)s' % dict( ns_full_name=self.complete_py_name, name=self.alias )) return os.linesep.join( result ) Modified: pyplusplus_dev/pyplusplus/code_creators/function_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -4,6 +4,7 @@ # http://www.boost.org/LICENSE_1_0.txt) import os +import compound import code_creator import ctypes_formatter import declaration_based @@ -11,6 +12,15 @@ #TODO - unable to call C function, if dll was loaded as CPPDLL +def join_arguments( args ): + args_str = '' + arg_separator = ', ' + if 1 == len( args ): + args_str = ' ' + args[0] + ' ' + else: + args_str = ' ' + arg_separator.join( args ) + ' ' + return '[%s]' % args_str + class function_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): def __init__( self, free_fun ): code_creator.code_creator_t.__init__(self) @@ -20,16 +30,6 @@ def ftype( self ): return self.declaration.function_type() - def __join_args( self, args ): - args_str = '' - arg_separator = ', ' - if 1 == len( args ): - args_str = ' ' + args[0] + ' ' - else: - args_str = ' ' + arg_separator.join( args ) + ' ' - return '[%s]' % args_str - - def _create_impl(self): result = [] result.append( '%(alias)s = getattr( %(library_var_name)s, %(library_var_name)s.undecorated_names["%(undecorated_decl_name)s"] )' @@ -46,10 +46,100 @@ tmp = [] tmp.append( '%(alias)s.argtypes = ' % dict( alias=self.declaration.alias ) ) args = map( ctypes_formatter.as_ctype, self.ftype.arguments_types ) - tmp.append( self.__join_args( args ) ) + tmp.append( join_arguments( args ) ) result.append( ''.join( tmp ) ) return os.linesep.join( result ) def _get_system_headers_impl( self ): return [] + +def mem_fun_factory_var_name( cc ): + import methods_definition + while not isinstance( cc, methods_definition.methods_definition_t ): + cc = cc.parent + return cc.mem_fun_factory_var_name + + +class METHOD_MODE: + STAND_ALONE = "stand alone" + MULTI_METHOD = "multi method" + all = [ STAND_ALONE, MULTI_METHOD ] + +class init_definition_t( code_creator.code_creator_t, declaration_based.declaration_based_t ): + def __init__( self, constructor ): + code_creator.code_creator_t.__init__( self ) + declaration_based.declaration_based_t.__init__( self, constructor ) + self.__mode = METHOD_MODE.STAND_ALONE + + def __get_mode(self): + return self.__mode + def __set_mode(self, new_mode): + assert new_mode in METHOD_MODE.all + self.__mode = new_mode + method_mode = property( __get_mode, __set_mode ) + + def _create_impl(self): + tmpl = '' + substitue_dict = dict( mfcreator=mem_fun_factory_var_name( self ) ) + if self.declaration.is_trivial_constructor: + tmpl = '%(mfcreator)s.default_constructor()' + elif self.declaration.is_copy_constructor: + tmpl = '%(mfcreator)s.copy_constructor()' + else: + if self.method_mode == METHOD_MODE.STAND_ALONE: + tmpl = '%(mfcreator)s( "%(undecorated_decl_name)s", argtypes=%(args)s )' + else: + tmpl = '"%(undecorated_decl_name)s", argtypes=%(args)s' + args = map( ctypes_formatter.as_ctype, self.declaration.function_type().arguments_types ) + substitue_dict['args'] = join_arguments( args ) + substitue_dict['undecorated_decl_name'] = self.undecorated_decl_name + if self.method_mode == METHOD_MODE.STAND_ALONE: + tmp = '"__init__" : ' + tmpl + return tmpl % substitue_dict + + def _get_system_headers_impl( self ): + return [] + +class multi_init_definition_t( compound.compound_t ): + def __init__( self ): + compound.compound_t.__init__( self ) + + def _create_impl(self): + result = [] + result.append( '"__init__" : %s.multi_method()' % mem_fun_factory_var_name(self) ) + for creator in self.creators: + code = '' + if isinstance( creator, init_definition_t ): + creator.method_mode = METHOD_MODE.MULTI_METHOD + code = '.register( %s )' % creator.create() + else: + code = creator.create() + result.append( self.indent( code, 4 ) ) + result.append( self.indent( '.finalize(),', 4 ) ) + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] + + +class del_definition_t( code_creator.code_creator_t, declaration_based.declaration_based_t ): + def __init__( self, destructor ): + code_creator.code_creator_t.__init__( self ) + declaration_based.declaration_based_t.__init__( self, destructor ) + + def _create_impl(self): + return '"__del__" : %(mfcreator)s.destructor(is_virtual=%(virtual)s)' \ + % dict( mfcreator=mem_fun_factory_var_name( self ) + , virtual=self.iif( self.declaration.virtuality==declarations.VIRTUALITY_TYPES.NOT_VIRTUAL + , 'False' + , 'True' ) ) + + def _get_system_headers_impl( self ): + return [] + + + + + + Modified: pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -16,7 +16,7 @@ def _create_impl(self): tmpl = ['def %(alias)s( self, *args ):'] tmpl.append( self.indent('"""%(name)s"""') ) - tmpl.append( self.indent("return self._methods_['%(alias)s']( ctypes.byref( self ), *args )") ) + tmpl.append( self.indent("return self._methods_['%(alias)s']( ctypes.pointer( self ), *args )") ) return os.linesep.join( tmpl ) \ % dict( alias=self.declaration.alias, name=self.undecorated_decl_name ) @@ -31,7 +31,7 @@ def _create_impl(self): tmpl = ['def %(alias)s( self, *args ):'] tmpl.append( self.indent('"""%(name)s"""') ) - tmpl.append( self.indent("return self._vtable_['%(ordinal)d'].%(alias)s( ctypes.byref( self ), *args )") ) + tmpl.append( self.indent("return self._vtable_['%(ordinal)d'].%(alias)s( ctypes.pointer( self ), *args )") ) return os.linesep.join( tmpl ) \ % dict( alias=self.declaration.alias , name=self.undecorated_decl_name @@ -40,7 +40,7 @@ def _get_system_headers_impl( self ): return [] -class constructor_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): +class init_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): def __init__( self, constructor ): code_creator.code_creator_t.__init__(self) declaration_based.declaration_based_t.__init__( self, constructor ) @@ -48,14 +48,14 @@ def _create_impl(self): tmpl = ['def __init__( self, *args ):'] tmpl.append( self.indent('"""%(name)s"""') ) - tmpl.append( self.indent("return self._methods_['__init__']( ctypes.byref( self ), *args )") ) + tmpl.append( self.indent("return self._methods_['__init__']( ctypes.pointer( self ), *args )") ) return os.linesep.join( tmpl ) \ % dict( alias=self.declaration.alias, name=self.undecorated_decl_name ) def _get_system_headers_impl( self ): return [] -class destructor_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): +class del_introduction_t(code_creator.code_creator_t, declaration_based.declaration_based_t): def __init__( self, constructor ): code_creator.code_creator_t.__init__(self) declaration_based.declaration_based_t.__init__( self, constructor ) @@ -63,7 +63,7 @@ def _create_impl(self): tmpl = ['def __del__( self ):'] tmpl.append( self.indent('"""%(name)s"""') ) - tmpl.append( self.indent("return self._methods_['__del__']( ctypes.byref( self ) )") ) + tmpl.append( self.indent("return self._methods_['__del__']( ctypes.pointer( self ) )") ) return os.linesep.join( tmpl ) \ % dict( name=self.undecorated_decl_name ) Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -11,6 +11,7 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import os import ctypes # what is the best way to treat overloaded constructors @@ -25,35 +26,44 @@ return self.func( *args, **keywd ) class native_overloaded_callable( object ): - def __init__(self, restype=None ): - self.__functions = {} # argtypes : function - self.restype = restype + def __init__(self, functions ): + self.__functions = functions - def register( self, dll, name, argtypes=None ): - f = getattr( dll, dll.undecorated_names[name] ) - f.restype = self.restype - f.argtypes = argtypes - self.__functions[ argtypes ] = f - return self - - def register_callable( self, callable ): - #TODO: check restype - self.__functions[ tuple(callable.func.argtypes) ] = callable.func - return self - def __call__( self, *args ): types = None if args: types = tuple(arg.__class__ for arg in args) f = self.__functions.get(types) if f is None: + msg = ['Unable to find a function that match the arguments you passed.'] + msg.append( 'First argument type is "this" type.' ) + msg.append( 'This function call argument types: ' + str( types ) ) + msg.append( 'Registered methods argument types: ' ) + for key in self.__functions.iterkeys(): + msg.append(' ' + str(key)) + raise TypeError(os.linesep.join(msg)) + else: return f(*args) + +class multi_method_registry_t: + def __init__( self, factory, restype ): + self.factory = factory + self.restype = restype + self.__functions = {} + + def register( self, callable_or_name, argtypes=None ): + if isinstance( callable_or_name, native_callable ): + callable = callable_or_name else: - raise TypeError("no match") + name = callable_or_name + callable = self.factory( name, restype=self.restype, argtypes=argtypes ) + self.__functions[ tuple(callable.func.argtypes) ] = callable.func + return self -def multi_method( restype=None ): - return native_overloaded_callable( restype ) + def finalize(self): + return native_overloaded_callable( self.__functions ) + class mem_fun_factory( object ): def __init__( self, dll, wrapper, class_name, namespace='' ): self.dll = dll @@ -92,9 +102,13 @@ , class_name=self.class_name ) , argtypes=[self.this_type] ) - def destructor( self ): - return self( '%(ns)s%(class_name)s::~%(class_name)s(void)' + def destructor( self, is_virtual=False ): + virtuality = '' + if is_virtual: + virtuality = 'virtual ' + return self( '%(virtuality)s%(ns)s%(class_name)s::~%(class_name)s(void)' % dict( ns=self.__get_ns_name() + , virtuality=virtuality , class_name=self.class_name ) ) def operator_assign( self ): @@ -118,4 +132,6 @@ , args=argtypes_str ) , **keywd ) + def multi_method( self, restype=None ): + return multi_method_registry_t( self, restype ) """ Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -43,6 +43,8 @@ self.curr_code_creator = self.module #mapping between class declaration and class introduction code creator self.__class2introduction = {} + #mapping between classs and its methods definition dictionary + self.__class2methods_def = {} #mapping between namespace and its code creator self.__namespace2pyclass = {} #set of all included namespaces @@ -160,17 +162,37 @@ def visit_constructor( self ): self.__dependencies_manager.add_exported( self.curr_decl ) + md_cc = self.__class2methods_def[ self.curr_decl.parent ] cls_intro_cc = self.__class2introduction[ self.curr_decl.parent ] - has_constructor = filter( lambda cc: isinstance( cc, code_creators.constructor_introduction_t ) - , cls_intro_cc.creators ) - if not has_constructor: - cls_intro_cc.adopt_creator( code_creators.constructor_introduction_t( self.curr_decl ) ) + init_def_cc = code_creators.init_definition_t( self.curr_decl ) + #TODO: calculate only exported constructors + if 1 == len( self.curr_decl.parent.constructors(recursive=False, allow_empty=True ) ): + #this is the first and the last and the only class constructor + md_cc.adopt_creator( code_creators.init_definition_t( self.curr_decl ) ) + cls_intro_cc.adopt_creator( code_creators.init_introduction_t(self.curr_decl) ) + else: + has_constructor = filter( lambda cc: isinstance( cc, code_creators.init_introduction_t ) + , cls_intro_cc.creators ) + if not has_constructor: + cls_intro_cc.adopt_creator( code_creators.init_introduction_t(self.curr_decl) ) + multi_init_def = filter( lambda cc: isinstance( cc, code_creators.multi_init_definition_t ) + , md_cc.creators ) + if not multi_init_def: + multi_init_def = code_creators.multi_init_definition_t() + md_cc.adopt_creator( multi_init_def ) + multi_init_def.adopt_creator( init_def_cc ) + else: + multi_init_def[0].adopt_creator( init_def_cc ) + def visit_destructor( self ): self.__dependencies_manager.add_exported( self.curr_decl ) cls_intro_cc = self.__class2introduction[ self.curr_decl.parent ] - cls_intro_cc.adopt_creator( code_creators.destructor_introduction_t( self.curr_decl ) ) + cls_intro_cc.adopt_creator( code_creators.del_introduction_t( self.curr_decl ) ) + md_cc = self.__class2methods_def[ self.curr_decl.parent ] + md_cc.adopt_creator( code_creators.del_definition_t( self.curr_decl ) ) + def visit_member_operator( self ): self.__dependencies_manager.add_exported( self.curr_decl ) @@ -197,7 +219,9 @@ self.__dependencies_manager.add_exported( self.curr_decl ) #fields definition should be recursive using the visitor self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) - self.__class_defs_ccs.adopt_creator( code_creators.methods_definition_t( self.curr_decl ) ) + md_cc = code_creators.methods_definition_t( self.curr_decl ) + self.__class2methods_def[ self.curr_decl ] = md_cc + self.__class_defs_ccs.adopt_creator( md_cc ) class_ = self.curr_decl for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): if self.__should_generate_code( decl ): Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-29 14:02:40 UTC (rev 1513) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-29 22:22:45 UTC (rev 1514) @@ -27,21 +27,19 @@ sys.path.append( autoconfig.build_directory ) import ctypes_pof #the following code fails - difference in the calling conventions - print ctypes_pof.identity_cpp( int(111) ) - self.failUnless( ctypes_pof.identity_cpp( int(111) ) == 111 ) + #TODO: the following test failes, because of the wrong calling convention used + #self.failUnless( ctypes_pof.identity_cpp( int(111) ) == 111 ) + n0 = ctypes_pof.pof.number_t() + n1 = ctypes_pof.pof.number_t( ctypes.c_long(1) ) + n2 = ctypes_pof.pof.number_t( ctypes.pointer(n1), 1 ) + #~ def test_bsc( self ): #~ root = r'E:\Documents and Settings\romany\Desktop\ToInstall\bsckit70\bscsdk' #~ mb = ctypes_module_builder_t( [os.path.join( root, 'bsc.h' )] #~ , os.path.join( root, 'msbsc70.dll' ), autoconfig.cxx_parsers_cfg.gccxml ) - mb.print_declarations() #~ mb.build_code_creator( self.symbols_file ) #~ mb.write_module( os.path.join( root, 'bsc.py' ) ) - #~ #mb.code_creator.create() - sys.path.append( autoconfig.build_directory ) - import ctypes_pof - print ctypes_pof.identity( 23 ) - self.failUnless( ctypes_pof.identity( 23 ) == 23 ) def create_suite(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2008-12-30 11:27:04
|
Revision: 1515 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1515&view=rev Author: roman_yakovenko Date: 2008-12-30 11:27:00 +0000 (Tue, 30 Dec 2008) Log Message: ----------- another set of changes for ctypes code generator Modified Paths: -------------- pygccxml_dev/unittests/autoconfig.py pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/compound.py pyplusplus_dev/pyplusplus/code_creators/function_definition.py pyplusplus_dev/pyplusplus/code_creators/methods_definition.py pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/unittests/autoconfig.py pyplusplus_dev/unittests/ctypes_pof_tester.py Modified: pygccxml_dev/unittests/autoconfig.py =================================================================== --- pygccxml_dev/unittests/autoconfig.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pygccxml_dev/unittests/autoconfig.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -28,7 +28,7 @@ print 'unittests will run on DEVELOPMENT version' compiler = pygccxml.utils.native_compiler.get_gccxml_compiler() - +compiler = 'msvc71' print 'GCCXML configured to simulate compiler ', compiler pygccxml.declarations.class_t.USE_DEMANGLED_AS_NAME = True Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -155,12 +155,11 @@ from mem_fun_introduction import vmem_fun_introduction_t from mem_fun_introduction import init_introduction_t from mem_fun_introduction import del_introduction_t - - from fields_definition import fields_definition_t from embedded_code_repository import embedded_code_repository_t from methods_definition import methods_definition_t from function_definition import function_definition_t from function_definition import init_definition_t -from function_definition import multi_init_definition_t +from function_definition import multi_method_definition_t from function_definition import del_definition_t +from function_definition import mem_fun_definition_t Modified: pyplusplus_dev/pyplusplus/code_creators/compound.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/compound.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/pyplusplus/code_creators/compound.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -87,3 +87,18 @@ if unique: files = self.unique_headers( files ) return files + + def find_by_creator_class( self, class_, unique=True, recursive=False ): + #I will add missing functionality later + assert recursive == False + found = filter( lambda cc: isinstance( cc, class_ ), self.creators ) + if not found: + return None + elif 1 == len( found ): + return found + else: + if unique: + raise LookupError( "Too many creators(%d) of type %s were found." + % ( len( found ), class_.__name__ ) ) + else: + return found Modified: pyplusplus_dev/pyplusplus/code_creators/function_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/pyplusplus/code_creators/function_definition.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -12,105 +12,166 @@ #TODO - unable to call C function, if dll was loaded as CPPDLL -def join_arguments( args ): - args_str = '' - arg_separator = ', ' - if 1 == len( args ): - args_str = ' ' + args[0] + ' ' - else: - args_str = ' ' + arg_separator.join( args ) + ' ' - return '[%s]' % args_str -class function_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): - def __init__( self, free_fun ): +class METHOD_MODE: + STAND_ALONE = "stand alone" + MULTI_METHOD = "multi method" + all = [ STAND_ALONE, MULTI_METHOD ] + + +def get_mem_fun_factory_var_name( cc ): + import methods_definition + while not isinstance( cc, methods_definition.methods_definition_t ): + cc = cc.parent + return cc.mem_fun_factory_var_name + +class callable_definition_t(code_creator.code_creator_t, declaration_based.declaration_based_t): + def __init__( self, callable ): code_creator.code_creator_t.__init__(self) - declaration_based.declaration_based_t.__init__( self, free_fun ) + declaration_based.declaration_based_t.__init__( self, callable ) + self.__mode = METHOD_MODE.STAND_ALONE + def __get_mode(self): + return self.__mode + def __set_mode(self, new_mode): + assert new_mode in METHOD_MODE.all + self.__mode = new_mode + method_mode = property( __get_mode, __set_mode ) + @property def ftype( self ): return self.declaration.function_type() + def join_arguments( self, args ): + args_str = '' + arg_separator = ', ' + if 1 == len( args ): + args_str = ' ' + args[0] + ' ' + else: + args_str = ' ' + arg_separator.join( args ) + ' ' + return '[%s]' % args_str + + @property + def mem_fun_factory_var_name( self ): + return get_mem_fun_factory_var_name( self ) + + def restype_code(self): + if not declarations.is_void( self.ftype.return_type ): + return ctypes_formatter.as_ctype( self.ftype.return_type ) + else: + return '' + + def argtypes_code(self): + if not self.ftype.arguments_types: + return '' + args = map( ctypes_formatter.as_ctype, self.ftype.arguments_types ) + return self.join_arguments( args ) + + def _get_system_headers_impl( self ): + return [] + + +class function_definition_t(callable_definition_t): + def __init__( self, free_fun ): + callable_definition_t.__init__( self, free_fun ) + def _create_impl(self): result = [] result.append( '%(alias)s = getattr( %(library_var_name)s, %(library_var_name)s.undecorated_names["%(undecorated_decl_name)s"] )' % dict( alias=self.declaration.alias , library_var_name=self.top_parent.library_var_name , undecorated_decl_name=self.undecorated_decl_name) ) - - if not declarations.is_void( self.ftype.return_type ): + restype = self.restype_code() + if restype: result.append( '%(alias)s.restype = %(restype)s' - % dict( alias=self.declaration.alias - , restype=ctypes_formatter.as_ctype( self.ftype.return_type ) ) ) + % dict( alias=self.declaration.alias, restype=restype ) ) - if self.ftype.arguments_types: - tmp = [] - tmp.append( '%(alias)s.argtypes = ' % dict( alias=self.declaration.alias ) ) - args = map( ctypes_formatter.as_ctype, self.ftype.arguments_types ) - tmp.append( join_arguments( args ) ) - result.append( ''.join( tmp ) ) + argtypes = self.argtypes_code() + if argtypes: + result.append( '%(alias)s.argtypes = %(argtypes)s' + % dict( alias=self.declaration.alias, argtypes=argtypes ) ) return os.linesep.join( result ) - def _get_system_headers_impl( self ): - return [] - -def mem_fun_factory_var_name( cc ): - import methods_definition - while not isinstance( cc, methods_definition.methods_definition_t ): - cc = cc.parent - return cc.mem_fun_factory_var_name - - -class METHOD_MODE: - STAND_ALONE = "stand alone" - MULTI_METHOD = "multi method" - all = [ STAND_ALONE, MULTI_METHOD ] - -class init_definition_t( code_creator.code_creator_t, declaration_based.declaration_based_t ): +class init_definition_t( callable_definition_t ): def __init__( self, constructor ): - code_creator.code_creator_t.__init__( self ) - declaration_based.declaration_based_t.__init__( self, constructor ) - self.__mode = METHOD_MODE.STAND_ALONE + callable_definition_t.__init__( self, constructor ) - def __get_mode(self): - return self.__mode - def __set_mode(self, new_mode): - assert new_mode in METHOD_MODE.all - self.__mode = new_mode - method_mode = property( __get_mode, __set_mode ) + def _get_alias_impl( self ): + return "__init__" def _create_impl(self): tmpl = '' - substitue_dict = dict( mfcreator=mem_fun_factory_var_name( self ) ) + substitue_dict = dict( mfcreator=self.mem_fun_factory_var_name ) if self.declaration.is_trivial_constructor: tmpl = '%(mfcreator)s.default_constructor()' elif self.declaration.is_copy_constructor: tmpl = '%(mfcreator)s.copy_constructor()' else: + tmpl = '"%(undecorated_decl_name)s", argtypes=%(args)s' if self.method_mode == METHOD_MODE.STAND_ALONE: - tmpl = '%(mfcreator)s( "%(undecorated_decl_name)s", argtypes=%(args)s )' - else: - tmpl = '"%(undecorated_decl_name)s", argtypes=%(args)s' - args = map( ctypes_formatter.as_ctype, self.declaration.function_type().arguments_types ) - substitue_dict['args'] = join_arguments( args ) + tmpl = '%(mfcreator)s( ' + tmpl + ' )' + + substitue_dict['args'] = self.argtypes_code() substitue_dict['undecorated_decl_name'] = self.undecorated_decl_name if self.method_mode == METHOD_MODE.STAND_ALONE: - tmp = '"__init__" : ' + tmpl + tmp = '"%s" : %s' % ( self.declaration.alias, tmpl ) return tmpl % substitue_dict - def _get_system_headers_impl( self ): - return [] +#TODO: aliases for a mem fun and const mem fun with the same name should be different -class multi_init_definition_t( compound.compound_t ): +class mem_fun_definition_t( callable_definition_t ): + def __init__( self, constructor ): + callable_definition_t.__init__( self, constructor ) + + def _create_impl(self): + result = [] + + result.append( '"%s"' % self.undecorated_decl_name ) + + restype = self.restype_code() + if self.method_mode == METHOD_MODE.STAND_ALONE and restype: + result.append( 'restype=%s' % restype ) + argtypes = self.argtypes_code() + if argtypes: + result.append( 'argtypes=%s' % argtypes ) + construction_code = ', '.join( result ) + if self.method_mode == METHOD_MODE.MULTI_METHOD: + return construction_code + else: + return '"%(alias)s" : %(mfcreator)s( %(construction_code)s ),' \ + % dict( alias=self.declaration.alias + , mfcreator=self.mem_fun_factory_var_name + , construction_code=construction_code ) + +class multi_method_definition_t( compound.compound_t ): def __init__( self ): compound.compound_t.__init__( self ) + def get_first_callable( self ): + return self.find_by_creator_class( callable_definition_t, unique=False )[0] + + @property + def multi_method_alias(self): + return self.get_first_callable().alias + def _create_impl(self): result = [] - result.append( '"__init__" : %s.multi_method()' % mem_fun_factory_var_name(self) ) + + return_type = self.get_first_callable().ftype.return_type + restype = '' + if return_type: + restype = self.iif( not declarations.is_void( return_type ) + , ctypes_formatter.as_ctype( return_type ) + , '' ) + + result.append( '"%(alias)s" : %(mfcreator)s.multi_method(%(restype)s)' + % dict( alias=self.multi_method_alias + , mfcreator=get_mem_fun_factory_var_name(self) + , restype=restype ) ) for creator in self.creators: code = '' - if isinstance( creator, init_definition_t ): + if isinstance( creator, callable_definition_t ): creator.method_mode = METHOD_MODE.MULTI_METHOD code = '.register( %s )' % creator.create() else: @@ -123,23 +184,13 @@ return [] -class del_definition_t( code_creator.code_creator_t, declaration_based.declaration_based_t ): +class del_definition_t( callable_definition_t ): def __init__( self, destructor ): - code_creator.code_creator_t.__init__( self ) - declaration_based.declaration_based_t.__init__( self, destructor ) + callable_definition_t.__init__( self, destructor ) def _create_impl(self): - return '"__del__" : %(mfcreator)s.destructor(is_virtual=%(virtual)s)' \ - % dict( mfcreator=mem_fun_factory_var_name( self ) + return '"__del__" : %(mfcreator)s.destructor(is_virtual=%(virtual)s),' \ + % dict( mfcreator=self.mem_fun_factory_var_name , virtual=self.iif( self.declaration.virtuality==declarations.VIRTUALITY_TYPES.NOT_VIRTUAL , 'False' , 'True' ) ) - - def _get_system_headers_impl( self ): - return [] - - - - - - Modified: pyplusplus_dev/pyplusplus/code_creators/methods_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -17,6 +17,20 @@ def mem_fun_factory_var_name(self): return "mfcreator" + def find_mutli_method( self, alias ): + import function_definition + mmdef_t = function_definition.multi_method_definition_t + multi_method_defs = self.find_by_creator_class( mmdef_t, unique=False ) + if None is multi_method_defs: + return + multi_method_defs = filter( lambda cc: cc.multi_method_alias == alias + , multi_method_defs ) + if multi_method_defs: + return multi_method_defs[0] + else: + return None + + def _create_impl(self): result = [] scope = declarations.algorithm.declaration_path( self.declaration ) Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -72,7 +72,7 @@ self.this_type = ctypes.POINTER( wrapper ) def __call__( self, name, **keywd ): - if 'argtypes' not in keywd: + if 'argtypes' not in keywd or keywd['argtypes'] is None: keywd['argtypes'] = [ self.this_type ] else: keywd['argtypes'].insert( 0, self.this_type ) Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -151,8 +151,26 @@ def visit_member_function( self ): self.__dependencies_manager.add_exported( self.curr_decl ) + md_cc = self.__class2methods_def[ self.curr_decl.parent ] cls_intro_cc = self.__class2introduction[ self.curr_decl.parent ] - cls_intro_cc.adopt_creator( code_creators.mem_fun_introduction_t( self.curr_decl ) ) + mem_fun_def_cc = code_creators.mem_fun_definition_t( self.curr_decl ) + #TODO: calculate only exported functions + if 0 == len( self.curr_decl.overloads): + #this is the first and the last and the only class constructor + md_cc.adopt_creator( mem_fun_def_cc ) + cls_intro_cc.adopt_creator( code_creators.mem_fun_introduction_t(self.curr_decl) ) + else: + has_introduction = cls_intro_cc.find_by_creator_class( code_creators.mem_fun_introduction_t, unique=False ) + has_introduction = filter( lambda cc: cc.alias == mem_fun_def_cc.alias, has_introduction ) + if not has_introduction: + cls_intro_cc.adopt_creator( code_creators.mem_fun_introduction_t(self.curr_decl) ) + + multi_method_def = md_cc.find_mutli_method( mem_fun_def_cc.alias ) + if not multi_method_def: + multi_method_def = code_creators.multi_method_definition_t () + md_cc.adopt_creator( multi_method_def ) + multi_method_def.adopt_creator( mem_fun_def_cc ) + #~ if self.curr_decl.virtuality == VIRTUALITY_TYPES.NOT_VIRTUAL: #~ cls_intro_cc.adopt_creator( code_creators.mem_fun_introduction_t( self.curr_decl ) ) #~ elif self.curr_decl.virtuality == VIRTUALITY_TYPES.VIRTUAL: @@ -166,24 +184,20 @@ cls_intro_cc = self.__class2introduction[ self.curr_decl.parent ] init_def_cc = code_creators.init_definition_t( self.curr_decl ) #TODO: calculate only exported constructors - if 1 == len( self.curr_decl.parent.constructors(recursive=False, allow_empty=True ) ): + if 0 == len( self.curr_decl.overloads): #this is the first and the last and the only class constructor - md_cc.adopt_creator( code_creators.init_definition_t( self.curr_decl ) ) + md_cc.adopt_creator( init_def_cc ) cls_intro_cc.adopt_creator( code_creators.init_introduction_t(self.curr_decl) ) else: - has_constructor = filter( lambda cc: isinstance( cc, code_creators.init_introduction_t ) - , cls_intro_cc.creators ) + has_constructor = cls_intro_cc.find_by_creator_class( code_creators.init_introduction_t ) if not has_constructor: cls_intro_cc.adopt_creator( code_creators.init_introduction_t(self.curr_decl) ) - multi_init_def = filter( lambda cc: isinstance( cc, code_creators.multi_init_definition_t ) - , md_cc.creators ) - if not multi_init_def: - multi_init_def = code_creators.multi_init_definition_t() - md_cc.adopt_creator( multi_init_def ) - multi_init_def.adopt_creator( init_def_cc ) - else: - multi_init_def[0].adopt_creator( init_def_cc ) + multi_method_def = md_cc.find_mutli_method( init_def_cc.alias ) + if not multi_method_def: + multi_method_def = code_creators.multi_method_definition_t () + md_cc.adopt_creator( multi_method_def ) + multi_method_def.adopt_creator( init_def_cc ) def visit_destructor( self ): self.__dependencies_manager.add_exported( self.curr_decl ) Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/unittests/autoconfig.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -29,7 +29,7 @@ class cxx_parsers_cfg: keywd = { 'working_directory' : data_directory , 'define_symbols' : [ gccxml_version ] - , 'compiler' : compiler + , 'compiler' : "msvc71" , 'gccxml_path': gccxml.executable } if 'win' in sys.platform: Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-29 22:22:45 UTC (rev 1514) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2008-12-30 11:27:00 UTC (rev 1515) @@ -26,14 +26,38 @@ #mb.code_creator.create() sys.path.append( autoconfig.build_directory ) import ctypes_pof + #the following code fails - difference in the calling conventions #TODO: the following test failes, because of the wrong calling convention used #self.failUnless( ctypes_pof.identity_cpp( int(111) ) == 111 ) + + #testing constructors n0 = ctypes_pof.pof.number_t() - n1 = ctypes_pof.pof.number_t( ctypes.c_long(1) ) - n2 = ctypes_pof.pof.number_t( ctypes.pointer(n1), 1 ) + self.failUnless( 0 == n0.get_value() ) + n1 = ctypes_pof.pof.number_t( ctypes.c_long(32) ) + self.failUnless( 32 == n1.get_value() ) + n2 = ctypes_pof.pof.number_t( ctypes.pointer(n1) ) + self.failUnless( 32 == n2.get_value() ) + #testing get/set value + n0.set_value( 1977 ) + self.failUnless( 1977 == n0.get_value() ) + #the following functionality is still missing + #~ def test_operator_assign( self ): + #~ obj1 = number_t(1) + #~ obj2 = number_t(2) + #~ x = obj1.operator_assign( obj2 ) + #~ #there are special cases, where ctypes could introduce "optimized" behaviour and not create new python object + #~ self.failUnless( x is obj1 ) + #~ self.failUnless( obj1.m_value == obj2.m_value ) + + #~ def test_clone( self ): + #~ obj1 = number_t(1) + #~ obj2 = obj1.clone() + #~ self.fail( obj1.get_value() == obj2.get_value() ) + + #~ def test_bsc( self ): #~ root = r'E:\Documents and Settings\romany\Desktop\ToInstall\bsckit70\bscsdk' #~ mb = ctypes_module_builder_t( [os.path.join( root, 'bsc.h' )] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-04 07:57:52
|
Revision: 1524 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1524&view=rev Author: roman_yakovenko Date: 2009-01-04 07:57:47 +0000 (Sun, 04 Jan 2009) Log Message: ----------- preparing unittests environment for ctypes testers Modified Paths: -------------- pyplusplus_dev/environment.py pyplusplus_dev/unittests/autoconfig.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes_pof/sconscript pyplusplus_dev/unittests/fundamental_tester_base.py Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.cpp pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.h Removed Paths: ------------- pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp pyplusplus_dev/unittests/data/ctypes_pof/mydll.h Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2009-01-03 19:48:47 UTC (rev 1523) +++ pyplusplus_dev/environment.py 2009-01-04 07:57:47 UTC (rev 1524) @@ -25,15 +25,11 @@ class scons: suffix = '' - cmd_build = '' - cmd_clean = '' + cmd_build = 'scons' + cmd_clean = 'scons --clean' ccflags = [] if 'roman' in getpass.getuser(): - - scons.cmd_build = 'scons --file=%s' - scons.cmd_clean = 'scons --clean --file=%s' - if sys.platform == 'win32': scons.suffix = '.pyd' scons.ccflags = ['/MD', '/EHsc', '/GR', '/Zc:wchar_t', '/Zc:forScope', '-DBOOST_PYTHON_NO_PY_SIGNATURES' ] @@ -50,10 +46,6 @@ boost.include = '/home/roman/boost_svn' python.include = '/usr/include/python2.5' elif 'root' == getpass.getuser(): - - scons.cmd_build = 'scons --file=%s' - scons.cmd_clean = 'scons --clean --file=%s' - if sys.platform == 'win32': scons.suffix = '.pyd' scons.ccflags = ['/MD', '/EHsc', '/GR', '/Zc:wchar_t', '/Zc:forScope', '-DBOOST_PYTHON_NO_PY_SIGNATURES' ] Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2009-01-03 19:48:47 UTC (rev 1523) +++ pyplusplus_dev/unittests/autoconfig.py 2009-01-04 07:57:47 UTC (rev 1524) @@ -7,9 +7,8 @@ import os import sys import unittest +import subprocess -#__pychecker__ = 'limit=1000' -#import pychecker.checker this_module_dir_path = os.path.abspath ( os.path.dirname( sys.modules[__name__].__file__) ) @@ -74,61 +73,32 @@ #~ , " env.AddPostAction(t, 'mt.exe -nologo -manifest %(target)s.pyd.manifest -outputresource:%(target)s.pyd;2' )" ] return os.linesep.join( code ) + @staticmethod + def compile( cmd ) : + print '\n', cmd + process = subprocess.Popen( args=cmd + , shell=True + , stdin=subprocess.PIPE + , stdout=subprocess.PIPE + , stderr=subprocess.STDOUT + , cwd=this_module_dir_path ) + process.stdin.close() + + while process.poll() is None: + line = process.stdout.readline() + print line.rstrip() + for line in process.stdout.readlines(): + print line.rstrip() + if process.returncode: + raise RuntimeError( "unable to compile extension. error: %s" % scons_msg ) + + #I need this in order to allow Python to load just compiled modules sys.path.append( build_dir ) os.chdir( build_dir ) -#~ if sys.platform == 'linux2': - #~ LD_LIBRARY_PATH = 'LD_LIBRARY_PATH' - #~ if not os.environ.has_key( LD_LIBRARY_PATH ) \ - #~ or not set( scons_config.libpath ).issubset( set( os.environ[LD_LIBRARY_PATH].split(':') ) ): - #~ #see http://hathawaymix.org/Weblog/2004-12-30 - #~ print 'error: LD_LIBRARY_PATH has not been set' if sys.platform == 'win32': PATH = os.environ.get( 'PATH', '' ) PATH=PATH + ';' + ';'.join( scons_config.libpath ) os.environ['PATH'] = PATH - - -#~ try: - #~ import pydsc - #~ pydsc.include( r'D:\pygccxml_sources\sources\pyplusplus_dev' ) - #~ pydsc.ignore( [ 'Yakovenko' - #~ , 'Bierbaum' - #~ , 'org' - #~ , 'http' - #~ , 'bool' - #~ , 'str' - #~ , 'www' - #~ , 'param' - #~ , 'txt' - #~ , 'decl' - #~ , 'decls' - #~ , 'namespace' - #~ , 'namespaces' - #~ , 'enum' - #~ , 'const' - #~ , 'GCC' - #~ , 'xcc' - #~ , 'TODO' - #~ , 'typedef' - #~ , 'os' - #~ , 'normcase' - #~ , 'normpath' - #~ , 'scopedef' - #~ , 'ira'#part of Matthias mail address - #~ , 'uka'#part of Matthias mail address - #~ , 'de'#part of Matthias mail address - #~ , 'dat'#file extension of directory cache - #~ , 'config'#parameter description - #~ , 'gccxml'#parameter description - #~ , 'Py++' - #~ , 'pygccxml' - #~ , 'calldef' - #~ , 'XXX' - #~ , 'wstring' - #~ , 'py' - #~ ] ) -#~ except ImportError: - #~ pass Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-03 19:48:47 UTC (rev 1523) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-04 07:57:47 UTC (rev 1524) @@ -11,35 +11,52 @@ from pyplusplus.module_builder import ctypes_module_builder_t class tester_t(unittest.TestCase): + _module_ref_ = None def __init__( self, *args, **keywd ): unittest.TestCase.__init__( self, *args, **keywd ) - self.project_dir = os.path.join( autoconfig.data_directory, 'ctypes_pof' ) - self.header = os.path.join( self.project_dir, 'mydll.h' ) - self.symbols_file = os.path.join( self.project_dir, 'release', 'mydll.dll' ) - self.module_name = 'ctypes_pof' + self.base_name = 'ctypes_pof' - def test(self): + @property + def project_dir( self ): + return os.path.join( autoconfig.data_directory, self.base_name ) + + @property + def header( self ): + return os.path.join( self.project_dir, self.base_name + '.h' ) + + @property + def symbols_file( self ): + return os.path.join( self.project_dir, 'binaries', self.base_name + '.dll' ) + + def setUp( self ): + if tester_t._module_ref_: + return + + autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ctypes_pof' ) mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) - #~ mb.print_declarations() mb.build_code_creator( self.symbols_file ) mb.write_module( os.path.join( autoconfig.build_directory, self.module_name + '.py' ) ) - #mb.code_creator.create() - sys.path.append( autoconfig.build_directory ) - import ctypes_pof + tester_t._module_ref_ = __import__( os.path.join( autoconfig.build_directory, self.base_name + '.py' ) ) - #the following code fails - difference in the calling conventions - #TODO: the following test failes, because of the wrong calling convention used - #self.failUnless( ctypes_pof.identity_cpp( int(111) ) == 111 ) + @property + def module_ref(self): + return self._module_ref_ - #testing constructors - n0 = ctypes_pof.pof.number_t() + def test_constructors(self): + n0 = self.module_ref.pof.number_t() self.failUnless( 0 == n0.get_value() ) - n1 = ctypes_pof.pof.number_t( ctypes.c_long(32) ) + n1 = self.module_ref.pof.number_t( ctypes.c_long(32) ) self.failUnless( 32 == n1.get_value() ) - n2 = ctypes_pof.pof.number_t( ctypes.pointer(n1) ) + n2 = self.module_ref.pof.number_t( ctypes.pointer(n1) ) self.failUnless( 32 == n2.get_value() ) - #testing get/set value + def test_free_functions(self): + #the following code fails - difference in the calling conventions + #TODO: the following test failes, because of the wrong calling convention used + self.failUnless( self.module_ref.identity_cpp( int(111) ) == 111 ) + + def test_get_set_values( self ): + n0 = self.module_ref.pof.number_t() n0.set_value( 1977 ) self.failUnless( 1977 == n0.get_value() ) @@ -58,12 +75,12 @@ #~ self.fail( obj1.get_value() == obj2.get_value() ) - #~ def test_bsc( self ): - #~ root = r'E:\Documents and Settings\romany\Desktop\ToInstall\bsckit70\bscsdk' - #~ mb = ctypes_module_builder_t( [os.path.join( root, 'bsc.h' )] - #~ , os.path.join( root, 'msbsc70.dll' ), autoconfig.cxx_parsers_cfg.gccxml ) - #~ mb.build_code_creator( self.symbols_file ) - #~ mb.write_module( os.path.join( root, 'bsc.py' ) ) + def test_bsc( self ): + root = r'E:\Documents and Settings\romany\Desktop\ToInstall\bsckit70\bscsdk' + mb = ctypes_module_builder_t( [os.path.join( root, 'bsc.h' )] + , os.path.join( root, 'msbsc70.dll' ), autoconfig.cxx_parsers_cfg.gccxml ) + mb.build_code_creator( self.symbols_file ) + mb.write_module( os.path.join( root, 'bsc.py' ) ) def create_suite(): Copied: pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.cpp (from rev 1523, pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp) =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.cpp 2009-01-04 07:57:47 UTC (rev 1524) @@ -0,0 +1,69 @@ +#include "ctypes_pof.h" +#include "windows.h" +#include <iostream> + +namespace pof{ + +number_t::number_t() +: m_value(0) +{ +// std::cout << "{C++} number_t( 0 )" << std::endl; +} + + +number_t::number_t(int value) +: m_value(value) +{ +// std::cout << "{C++} number_t( " << value << " )" << std::endl; +} + +number_t::~number_t() { +// std::cout << "{C++} ~number_t()" << std::endl; +} +void number_t::print_it() const { + std::cout << "{C++} value: " << m_value << std::endl; +} + +int number_t::get_value() const{ + return m_value; +} + +void number_t::set_value(int x){ + m_value = x; +} + +number_t number_t::clone() const{ + return number_t(*this); +} + +std::auto_ptr<number_t> number_t::clone_ptr() const{ + return std::auto_ptr<number_t>( new number_t( *this ) ); +} + +} + +using namespace pof; + +void do_smth( number_aptr_t& ){ +} + +int identity( int some_data){ return some_data;} + +int identity_cpp( int data){ return data; } + +//~ BOOL APIENTRY DllMain( HMODULE hModule, + //~ DWORD ul_reason_for_call, + //~ LPVOID lpReserved + //~ ) +//~ { + //~ switch (ul_reason_for_call) + //~ { + //~ case DLL_PROCESS_ATTACH: + //~ case DLL_THREAD_ATTACH: + //~ case DLL_THREAD_DETACH: + //~ case DLL_PROCESS_DETACH: + //~ break; + //~ } + //~ return TRUE; +//~ } + Copied: pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.h (from rev 1523, pyplusplus_dev/unittests/data/ctypes_pof/mydll.h) =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes_pof/ctypes_pof.h 2009-01-04 07:57:47 UTC (rev 1524) @@ -0,0 +1,36 @@ +#pragma once + +#include <memory> + +namespace pof{ + +class __declspec(dllexport) number_t{ +public: + number_t(); + explicit number_t(int value); + virtual ~number_t(); + virtual void print_it() const; + int get_value() const; + int get_value(){ return m_value; } + void set_value(int x); + + number_t clone() const; + std::auto_ptr<number_t> clone_ptr() const; +private: + int m_value; +}; + +} +template class __declspec(dllexport) std::auto_ptr< pof::number_t >; + +typedef std::auto_ptr< pof::number_t > number_aptr_t; + +void __declspec(dllexport) do_smth( number_aptr_t& ); + +extern "C"{ + +int __declspec(dllexport) identity( int ); + +} + +int __declspec(dllexport) identity_cpp( int ); \ No newline at end of file Deleted: pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2009-01-03 19:48:47 UTC (rev 1523) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.cpp 2009-01-04 07:57:47 UTC (rev 1524) @@ -1,69 +0,0 @@ -#include "mydll.h" -#include "windows.h" -#include <iostream> - -namespace pof{ - -number_t::number_t() -: m_value(0) -{ -// std::cout << "{C++} number_t( 0 )" << std::endl; -} - - -number_t::number_t(int value) -: m_value(value) -{ -// std::cout << "{C++} number_t( " << value << " )" << std::endl; -} - -number_t::~number_t() { -// std::cout << "{C++} ~number_t()" << std::endl; -} -void number_t::print_it() const { - std::cout << "{C++} value: " << m_value << std::endl; -} - -int number_t::get_value() const{ - return m_value; -} - -void number_t::set_value(int x){ - m_value = x; -} - -number_t number_t::clone() const{ - return number_t(*this); -} - -std::auto_ptr<number_t> number_t::clone_ptr() const{ - return std::auto_ptr<number_t>( new number_t( *this ) ); -} - -} - -using namespace pof; - -void do_smth( number_aptr_t& ){ -} - -int identity( int some_data){ return some_data;} - -int identity_cpp( int data){ return data; } - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - Deleted: pyplusplus_dev/unittests/data/ctypes_pof/mydll.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2009-01-03 19:48:47 UTC (rev 1523) +++ pyplusplus_dev/unittests/data/ctypes_pof/mydll.h 2009-01-04 07:57:47 UTC (rev 1524) @@ -1,36 +0,0 @@ -#pragma once - -#include <memory> - -namespace pof{ - -class __declspec(dllexport) number_t{ -public: - number_t(); - explicit number_t(int value); - virtual ~number_t(); - virtual void print_it() const; - int get_value() const; - int get_value(){ return m_value; } - void set_value(int x); - - number_t clone() const; - std::auto_ptr<number_t> clone_ptr() const; -private: - int m_value; -}; - -} -template class __declspec(dllexport) std::auto_ptr< pof::number_t >; - -typedef std::auto_ptr< pof::number_t > number_aptr_t; - -void __declspec(dllexport) do_smth( number_aptr_t& ); - -extern "C"{ - -int __declspec(dllexport) identity( int ); - -} - -int __declspec(dllexport) identity_cpp( int ); \ No newline at end of file Modified: pyplusplus_dev/unittests/data/ctypes_pof/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes_pof/sconscript 2009-01-03 19:48:47 UTC (rev 1523) +++ pyplusplus_dev/unittests/data/ctypes_pof/sconscript 2009-01-04 07:57:47 UTC (rev 1524) @@ -1,6 +1,9 @@ Import('*') -t = env.SharedLibrary( target=r'mydll' - , source=[ r'mydll.cpp' ] - , CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] - , LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) +target_name = 'ctypes_pof' +shlib = env.SharedLibrary( target=target_name + , source=[ target_name + '.cpp' ] + , CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] + , LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) + +env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2009-01-03 19:48:47 UTC (rev 1523) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2009-01-04 07:57:47 UTC (rev 1524) @@ -128,24 +128,6 @@ sconstruct_file.write( sconstruct_script ) sconstruct_file.close() - def _create_extension(self): - cmd = autoconfig.scons.cmd_build % self.__generated_scons_file_name - print cmd - output = os.popen( cmd ) - scons_reports = [] - while True: - data = output.readline() - scons_reports.append( data ) - if not data: - break - exit_status = output.close() - scons_msg = ''.join(scons_reports) - if scons_msg: - print os.linesep - print scons_msg - if exit_status: - raise RuntimeError( "unable to compile extension. error: %s" % scons_msg ) - def _clean_build( self, sconstruct_file ): cmd = autoconfig.scons.cmd_clean % sconstruct_file output = os.popen( cmd ) @@ -166,7 +148,7 @@ self._create_extension_source_file() sources = self.get_source_files() self._create_sconstruct(sources) - self._create_extension() + autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' --file=%s' % self.__generated_scons_file_name ) pypp = __import__( self.__module_name ) self.run_tests(pypp) finally: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-04 12:22:22
|
Revision: 1525 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1525&view=rev Author: roman_yakovenko Date: 2009-01-04 11:37:54 +0000 (Sun, 04 Jan 2009) Log Message: ----------- remove cpptypes directory ( all functionality was moved to unittests ) Modified Paths: -------------- pyplusplus_dev/unittests/ctypes_pof_tester.py Removed Paths: ------------- pyplusplus_dev/pyplusplus/cpptypes/ Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-04 07:57:47 UTC (rev 1524) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-04 11:37:54 UTC (rev 1525) @@ -32,7 +32,7 @@ if tester_t._module_ref_: return - autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ctypes_pof' ) + autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ' + self.base_name ) mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) mb.build_code_creator( self.symbols_file ) mb.write_module( os.path.join( autoconfig.build_directory, self.module_name + '.py' ) ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-04 20:29:41
|
Revision: 1528 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1528&view=rev Author: roman_yakovenko Date: 2009-01-04 20:29:35 +0000 (Sun, 04 Jan 2009) Log Message: ----------- adding more unittests Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/dependencies.py pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py pyplusplus_dev/pyplusplus/code_creators/methods_definition.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes/pof/sconscript pyplusplus_dev/unittests/sconstruct Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes/issues/ pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp pyplusplus_dev/unittests/data/ctypes/issues/issues.h pyplusplus_dev/unittests/data/ctypes/issues/sconscript Property Changed: ---------------- pygccxml_dev/unittests/ pygccxml_dev/unittests/data/msvc/ pygccxml_dev/unittests/data/msvc_build/ Modified: pygccxml_dev/pygccxml/declarations/dependencies.py =================================================================== --- pygccxml_dev/pygccxml/declarations/dependencies.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pygccxml_dev/pygccxml/declarations/dependencies.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -61,18 +61,27 @@ return None @staticmethod + def they_depend_on_me( decl ): + """returns set of declarations. every item in the returned set, depends on a + declaration from the input""" + import class_declaration #prevent cyclic imports + to_be_included = set() + for dependency_info in decl.i_depend_on_them(): + ddecl = dependency_info.find_out_depend_on_declaration() + if ddecl: + to_be_included.add( ddecl ) + + if isinstance( decl.parent, class_declaration.class_t ): + to_be_included.add( decl.parent ) + return to_be_included + + @staticmethod def they_depend_on_us( decls ): """returns set of declarations. every item in the returned set, depends on a declaration from the input""" import class_declaration #prevent cyclic imports to_be_included = set() for decl in decls: - for dependency_info in decl.i_depend_on_them(): - ddecl = dependency_info.find_out_depend_on_declaration() - if ddecl: - to_be_included.add( ddecl ) - - if isinstance( decl.parent, class_declaration.class_t ): - to_be_included.add( decl.parent ) + to_be_included.update( dependency_info_t.they_depend_on_me( decl ) ) return to_be_included Property changes on: pygccxml_dev/unittests ___________________________________________________________________ Modified: svn:ignore - *.pyc temp *.pdbrc + *.pyc temp *.pdbrc *.bak Property changes on: pygccxml_dev/unittests/data/msvc ___________________________________________________________________ Modified: svn:ignore - Release + Release Debug *.suo Property changes on: pygccxml_dev/unittests/data/msvc_build ___________________________________________________________________ Modified: svn:ignore - Debug + Debug *.ncb *.suo *.user Modified: pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py =================================================================== --- pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/examples/pyeasybmp_dev/ctypes/easybmp.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -4,9 +4,9 @@ import ctypes_utils -easybmp = ctypes.CPPDLL( r"E:\development\language-binding\pyplusplus_dev\examples\pyeasybmp_dev\easybmp\binaries\easybmp.dll" ) +easybmplib = ctypes.CPPDLL( r"E:\development\language-binding\pyplusplus_dev\examples\pyeasybmp_dev\easybmp\binaries\easybmp.dll" ) -easybmp.undecorated_names = {#mapping between decorated and undecorated names +easybmplib.undecorated_names = {#mapping between decorated and undecorated names "unsigned short FlipWORD(unsigned short)" : "?FlipWORD@@YAGG@Z", "BMP::BMP(void)" : "??0BMP@@QAE@XZ", "bool BMP::SetPixel(int,int RGBApixel)" : "?SetPixel@BMP@@QAE_NHHURGBApixel@@@Z", @@ -249,7 +249,7 @@ ("bfOffBits", ctypes.c_uint), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, BMFH, "BMFH", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMFH, "BMFH" ) BMFH._methods_ = { #class non-virtual member functions definition list "__init__" : mfcreator.multi_method() .register( mfcreator.default_constructor() ) @@ -275,7 +275,7 @@ ("biClrImportant", ctypes.c_uint), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, BMIH, "BMIH", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMIH, "BMIH" ) BMIH._methods_ = { #class non-virtual member functions definition list "__init__" : mfcreator.multi_method() .register( mfcreator.default_constructor() ) @@ -294,7 +294,7 @@ ("Alpha", ctypes.c_ubyte), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, RGBApixel, "RGBApixel", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, RGBApixel, "RGBApixel" ) RGBApixel._methods_ = { #class non-virtual member functions definition list } @@ -314,7 +314,7 @@ ("SizeOfMetaData2", ctypes.c_int), ] -mfcreator = ctypes_utils.mem_fun_factory( easybmp, BMP, "BMP", "" ) +mfcreator = ctypes_utils.mem_fun_factory( easybmplib, BMP, "BMP" ) BMP._methods_ = { #class non-virtual member functions definition list "TellBitDepth" : mfcreator( "int BMP::TellBitDepth(void)", restype=ctypes.c_int ), @@ -372,21 +372,21 @@ } del mfcreator -Square = getattr( easybmp, easybmp.undecorated_names["double Square(double)"] ) +Square = getattr( easybmplib, easybmplib.undecorated_names["double Square(double)"] ) Square.restype = ctypes.c_double Square.argtypes = [ ctypes.c_double ] -IntSquare = getattr( easybmp, easybmp.undecorated_names["int IntSquare(int)"] ) +IntSquare = getattr( easybmplib, easybmplib.undecorated_names["int IntSquare(int)"] ) IntSquare.restype = ctypes.c_int IntSquare.argtypes = [ ctypes.c_int ] -FlipDWORD = getattr( easybmp, easybmp.undecorated_names["unsigned int FlipDWORD(unsigned int)"] ) +FlipDWORD = getattr( easybmplib, easybmplib.undecorated_names["unsigned int FlipDWORD(unsigned int)"] ) FlipDWORD.restype = ctypes.c_uint FlipDWORD.argtypes = [ ctypes.c_uint ] -IsBigEndian = getattr( easybmp, easybmp.undecorated_names["bool IsBigEndian(void)"] ) +IsBigEndian = getattr( easybmplib, easybmplib.undecorated_names["bool IsBigEndian(void)"] ) IsBigEndian.restype = ctypes.c_bool -FlipWORD = getattr( easybmp, easybmp.undecorated_names["unsigned short FlipWORD(unsigned short)"] ) +FlipWORD = getattr( easybmplib, easybmplib.undecorated_names["unsigned short FlipWORD(unsigned short)"] ) FlipWORD.restype = ctypes.c_ushort FlipWORD.argtypes = [ ctypes.c_ushort ] Modified: pyplusplus_dev/pyplusplus/code_creators/methods_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/pyplusplus/code_creators/methods_definition.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -37,12 +37,16 @@ del scope[0] #del :: from the global namespace del scope[-1] #del self from the list - result.append( '%(mem_fun_factory_var_name)s = ctypes_utils.mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s", "%(ns)s" )' - % dict( mem_fun_factory_var_name=self.mem_fun_factory_var_name - , library_var_name=self.top_parent.library_var_name - , complete_py_name=self.complete_py_name - , class_name=self.declaration.name - , ns='::'.join(scope) ) ) + tmpl = '%(mem_fun_factory_var_name)s = ctypes_utils.mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s", "%(ns)s" )' + if not scope: + tmpl = '%(mem_fun_factory_var_name)s = ctypes_utils.mem_fun_factory( %(library_var_name)s, %(complete_py_name)s, "%(class_name)s" )' + + result.append( tmpl % dict( mem_fun_factory_var_name=self.mem_fun_factory_var_name + , library_var_name=self.top_parent.library_var_name + , complete_py_name=self.complete_py_name + , class_name=self.declaration.name + , ns='::'.join(scope) ) ) + result.append( '%(complete_py_name)s._methods_ = { #class non-virtual member functions definition list' % dict( complete_py_name=self.complete_py_name ) ) result.append( compound.compound_t.create_internal_code( self.creators ) ) Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -108,8 +108,7 @@ classes = class_.classes( recursive=False, allow_empty=True) classes = sort_algorithms.sort_classes( classes ) for internal_class in classes: - if self.__contains_exported( internal_class ): - self.__add_class_introductions( ci_creator, internal_class ) + self.__add_class_introductions( ci_creator, internal_class ) def create(self ): """Create and return the module for the extension. Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -88,14 +88,31 @@ included_decls = set() included_decls.update( self.global_ns.calldefs( is_exported, allow_empty=True, recursive=True ) ) included_decls.update( self.global_ns.variables( is_exported, allow_empty=True, recursive=True ) ) - #include declarations, on which exported declarations depend - they_depend_on_us = decls_package.dependency_info_t.they_depend_on_us - included_decls.update( they_depend_on_us( included_decls ) ) + + they_depend_on_me = decls_package.dependency_info_t.they_depend_on_me for d in included_decls: d.include() - if isinstance( d, decls_package.class_t ): - d.top_class.include() + self.logger.info( 'including decl %s' % str(d) ) + parent = d.parent + while True: + if isinstance( parent, decls_package.namespace_t ): + break + else: + self.logger.info( 'including parent class %s' % str(parent) ) + parent.ignore = False + parent = parent.parent + for dependency in they_depend_on_me( d ): + self.logger.info( 'discovered dependency %s' % str(dependency) ) + #include declarations, on which exported declarations depend + #I need this for classes, referenced by function arguments + decls_traits = ( decls_package.class_traits, decls_package.class_declaration_traits, decls_package.enum_traits ) + for traits in decls_traits: + if traits.is_my_case( dependency ): + self.logger.info( 'discovered dependency %s - included' % str(dependency) ) + traits.get_declaration( dependency ).ignore = False + self.logger.info( 'including decl %s - done' % str(d) ) + def build_code_creator( self, library_path, doc_extractor=None ): creator = creators_factory.ctypes_creator_t( self.global_ns , library_path Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-04 20:29:35 UTC (rev 1528) @@ -11,6 +11,7 @@ from pyplusplus.module_builder import ctypes_module_builder_t class ctypes_base_tester_t(unittest.TestCase): + _module_ref_ = None def __init__( self, base_name, *args, **keywd ): unittest.TestCase.__init__( self, *args, **keywd ) @@ -33,22 +34,23 @@ return os.path.join( self.project_dir, 'binaries', self.base_name + '.dll' ) def setUp( self ): - if ctypes_base_tester_t._module_ref_: - return - + if self.base_name in sys.modules: + return sys.modules[ self.base_name ] + #~ import pdb + #~ pdb.set_trace() autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ' + self.base_name ) mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) mb.build_code_creator( self.symbols_file ) mb.write_module( os.path.join( self.project_dir, 'binaries', self.base_name + '.py' ) ) sys.path.insert( 0, os.path.join( self.project_dir, 'binaries' ) ) - ctypes_base_tester_t._module_ref_ = __import__( self.base_name ) + __import__( self.base_name ) @property def module_ref(self): - return self._module_ref_ + return sys.modules[ self.base_name ] -class tester_t( ctypes_base_tester_t ): +class pof_tester_t( ctypes_base_tester_t ): def __init__( self, *args, **keywd ): ctypes_base_tester_t.__init__( self, 'pof', *args, **keywd ) @@ -84,10 +86,24 @@ #~ obj2 = obj1.clone() #~ self.fail( obj1.get_value() == obj2.get_value() ) + +class issues_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'issues', *args, **keywd ) + + def test_return_by_value(self): + x = self.module_ref.return_by_value_t() + result = x.add( 32, 2 ).result + self.failUnless( 34 == result, "Expected result 34, got %d" % result) + + def test_free_fun_add( self ): + self.failUnless( 1977 == self.module_ref.add( 77, 1900 ) ) + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: - suite.addTest( unittest.makeSuite(tester_t)) + suite.addTest( unittest.makeSuite(pof_tester_t)) + suite.addTest( unittest.makeSuite(issues_tester_t)) return suite def run_suite(): Added: pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/issues/issues.cpp 2009-01-04 20:29:35 UTC (rev 1528) @@ -0,0 +1,5 @@ +#include "issues.h" + +int add( int i, int j){ + return i + j; +} Added: pyplusplus_dev/unittests/data/ctypes/issues/issues.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/issues/issues.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/issues/issues.h 2009-01-04 20:29:35 UTC (rev 1528) @@ -0,0 +1,13 @@ +#pragma once + + +struct __declspec(dllexport) return_by_value_t{ +public: + struct result_t{ int i; int j; int result; }; + result_t add( int i, int j ){ + result_t r = { i, j, i + j}; + return r; + } +}; + +int __declspec(dllexport) add( int, int ); Added: pyplusplus_dev/unittests/data/ctypes/issues/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/issues/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/issues/sconscript 2009-01-04 20:29:35 UTC (rev 1528) @@ -0,0 +1,5 @@ +Import('*') + +target_name = 'issues' +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) +env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/data/ctypes/pof/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/pof/sconscript 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/unittests/data/ctypes/pof/sconscript 2009-01-04 20:29:35 UTC (rev 1528) @@ -1,7 +1,5 @@ Import('*') target_name = 'pof' -shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] - , LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) - +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/sconstruct =================================================================== --- pyplusplus_dev/unittests/sconstruct 2009-01-04 19:03:55 UTC (rev 1527) +++ pyplusplus_dev/unittests/sconstruct 2009-01-04 20:29:35 UTC (rev 1528) @@ -11,8 +11,9 @@ env.AppendUnique( CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] ) env.AppendUnique( LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) -SConscript( 'data/ctypes/pof/sconscript' - , variant_dir='data/ctypes/pof/binaries' - , duplicate=0 - , exports=["env"] ) - +scripts = [ 'pof', 'issues' ] +for s in scripts: + SConscript( 'data/ctypes/%s/sconscript' % s + , variant_dir='data/ctypes/%s/binaries' % s + , duplicate=0 + , exports=["env"] ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-05 15:07:41
|
Revision: 1533 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1533&view=rev Author: roman_yakovenko Date: 2009-01-05 15:07:31 +0000 (Mon, 05 Jan 2009) Log Message: ----------- rename bparser to binary_parsers Modified Paths: -------------- pygccxml_dev/unittests/bsc_tester.py pygccxml_dev/unittests/data/core_cache.hpp pygccxml_dev/unittests/mspdb_playground.py pygccxml_dev/unittests/pdb_tester.py pygccxml_dev/unittests/undname_creator_tester.py pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/code_creators/library_reference.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/autoconfig.py Modified: pygccxml_dev/unittests/bsc_tester.py =================================================================== --- pygccxml_dev/unittests/bsc_tester.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pygccxml_dev/unittests/bsc_tester.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -2,7 +2,7 @@ import unittest import autoconfig -from pygccxml.msvc import bsc +from pygccxml.binary_parsers binary_parsers import bsc class tester_t( unittest.TestCase ): def __init__(self, *args): Modified: pygccxml_dev/unittests/data/core_cache.hpp =================================================================== --- pygccxml_dev/unittests/data/core_cache.hpp 2009-01-05 15:05:18 UTC (rev 1532) +++ pygccxml_dev/unittests/data/core_cache.hpp 2009-01-05 15:07:31 UTC (rev 1533) @@ -22,4 +22,4 @@ #endif//__core_cache_hpp__ -//touch//touch//touch \ No newline at end of file +//touch//touch//touch//touch//touch \ No newline at end of file Modified: pygccxml_dev/unittests/mspdb_playground.py =================================================================== --- pygccxml_dev/unittests/mspdb_playground.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pygccxml_dev/unittests/mspdb_playground.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -3,9 +3,9 @@ import autoconfig import pprint -from pygccxml.msvc import mspdb +from pygccxml.binary_parsers import mspdb from pygccxml import declarations -from pygccxml.msvc import common_utils as msvc_utils +from pygccxml.binary_parsers import common_utils as msvc_utils pdb_file = r'E:\development\language-binding\pyplusplus_dev\pyplusplus\cpptypes\mydll\release\mydll.pdb' pdb_file = r'D:\AC_SERVER_4_VS2005\libs\Debug\SPDBLib_d.pdb' Modified: pygccxml_dev/unittests/pdb_tester.py =================================================================== --- pygccxml_dev/unittests/pdb_tester.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pygccxml_dev/unittests/pdb_tester.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -2,9 +2,9 @@ import unittest import autoconfig -from pygccxml.msvc import mspdb +from pygccxml.binary_parsers import mspdb from pygccxml import declarations -from pygccxml.msvc import common_utils as msvc_utils +from pygccxml.binary_parsers import common_utils as msvc_utils class tester_t( unittest.TestCase ): def __init__(self, *args): Modified: pygccxml_dev/unittests/undname_creator_tester.py =================================================================== --- pygccxml_dev/unittests/undname_creator_tester.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pygccxml_dev/unittests/undname_creator_tester.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -10,13 +10,11 @@ import parser_test_case import pprint -from pygccxml import msvc +from pygccxml import binary_parsers from pygccxml import utils from pygccxml import parser from pygccxml import declarations -print msvc.undecorate_blob( '?make_flatten@algorithms@reflection@engine_objects@@YAXAEBVinstance_info_t@23@V?$back_insert_iterator@V?$vector@Vinstance_info_t@reflection@engine_objects@@V?$allocator@Vinstance_info_t@reflection@engine_objects@@@std@@@std@@@std@@@Z' ) - class tester_t( parser_test_case.parser_test_case_t ): global_ns = None @@ -51,19 +49,19 @@ return False def __tester_impl( self, fname ): - symbols = msvc.exported_symbols.load_from_file( fname ) + symbols = binary_parsers.exported_symbols.load_from_file( fname ) self.failUnless( 'identity' in symbols ) undecorated_blob_names = set() for blob in symbols.iterkeys(): - undname = msvc.undecorate_blob( blob ) + undname = binary_parsers.undecorate_blob( blob ) if "`" in undname: continue undecorated_blob_names.add( undname ) undecorated_decl_names = set() for f in self.global_ns.decls(self.is_included): - undecorated_decl_names.add( msvc.undecorate_decl( f ) ) + undecorated_decl_names.add( binary_parsers.undecorate_decl( f ) ) issuperset = undecorated_decl_names.issuperset( undecorated_blob_names ) if not issuperset: Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -43,8 +43,8 @@ @utils.cached def undecorated_decl_name( self ): - from pygccxml import msvc #prevent import on Linux - return msvc.undecorate_decl( self.declaration ) + from pygccxml import binary_parsers #prevent import on Linux + return binary_parsers.undecorate_decl( self.declaration ) @utils.cached def complete_py_name( self ): Modified: pyplusplus_dev/pyplusplus/code_creators/library_reference.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -7,6 +7,18 @@ import code_creator from pyplusplus import decl_wrappers +#TODO: add different dlls + +#TODO: another idea is a small refactoring in ctypes: +#the idea is to introduce single "load shared library function", which servers +#as a factory for function defined in the library: +# class shared_library: +# def function( self, name_or_ordinal, calling convention, restype, argtypes ) + +#TODO: why I need to preload "C" runtime ( other libraries )? + +#TODO: how I can find out the full path of the loaded dll + class library_reference_t(code_creator.code_creator_t): """Creates reference to a library""" Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -5,7 +5,7 @@ import sort_algorithms import dependencies_manager -from pygccxml import msvc +from pygccxml import binary_parsers from pyplusplus import _logging_ from pygccxml import declarations from pyplusplus import decl_wrappers Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper_printer.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -51,9 +51,9 @@ self.writer( ' ' * (self.level+1) * self.INDENT_SIZE + "use default arguments: " + str(self.instance.use_default_arguments) + os.linesep ) try: - from pygccxml import msvc + from pygccxml import binary_parsers self.writer( ' ' * (self.level+1) * self.INDENT_SIZE - + "undecorated decl: " + msvc.undecorate_decl(self.instance) + os.linesep ) + + "undecorated decl: " + binary_parsers.undecorate_decl(self.instance) + os.linesep ) except: pass Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -10,7 +10,7 @@ import warnings import module_builder -from pygccxml import msvc +from pygccxml import binary_parsers from pygccxml import parser from pygccxml import declarations as decls_package @@ -55,7 +55,7 @@ """ module_builder.module_builder_t.__init__( self, global_ns=None, encoding=encoding ) - self.__blob2undecorated = msvc.exported_symbols.load_from_file( exported_symbols_file ) + self.__blob2undecorated = binary_parsers.exported_symbols.load_from_file( exported_symbols_file ) self.global_ns = self.__parse_declarations( files, gccxml_config ) self.__include_declarations() @@ -82,7 +82,7 @@ self.global_ns.exclude() b2u = self.__blob2undecorated undecorated = set( b2u.values() ) - is_exported = lambda d: msvc.undecorate_decl( d ) in undecorated \ + is_exported = lambda d: binary_parsers.undecorate_decl( d ) in undecorated \ or d.name in b2u and b2u[d.name] == d.name #treatment of C functions #include exported declarations included_decls = set() Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2009-01-05 15:05:18 UTC (rev 1532) +++ pyplusplus_dev/unittests/autoconfig.py 2009-01-05 15:07:31 UTC (rev 1533) @@ -90,7 +90,7 @@ for line in process.stdout.readlines(): print line.rstrip() if process.returncode: - raise RuntimeError( "unable to compile extension. error: %s" % scons_msg ) + raise RuntimeError( "unable to compile extension. See output for the errors." ) #I need this in order to allow Python to load just compiled modules This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-06 08:55:13
|
Revision: 1539 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1539&view=rev Author: roman_yakovenko Date: 2009-01-06 08:55:13 +0000 (Tue, 06 Jan 2009) Log Message: ----------- small refactoring, which allows to merge information from binary files to the declarations tree Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/code_creators/name_mappings.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/autoconfig.py pyplusplus_dev/unittests/ctypes_pof_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2009-01-06 08:38:32 UTC (rev 1538) +++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2009-01-06 08:55:13 UTC (rev 1539) @@ -43,8 +43,7 @@ @utils.cached def undecorated_decl_name( self ): - from pygccxml import binary_parsers #prevent import on Linux - return binary_parsers.undecorate_decl( self.declaration ) + return str( self.declaration ) @utils.cached def complete_py_name( self ): Modified: pyplusplus_dev/pyplusplus/code_creators/name_mappings.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2009-01-06 08:38:32 UTC (rev 1538) +++ pyplusplus_dev/pyplusplus/code_creators/name_mappings.py 2009-01-06 08:55:13 UTC (rev 1539) @@ -18,9 +18,9 @@ tmpl = '"%s" : "%s", ' items_decorated = [] items_undecorated = [] - for blob, undecorated in self._exported_symbols.iteritems(): - items_decorated.append( tmpl % ( blob, undecorated ) ) - items_undecorated.append( tmpl % ( undecorated, blob ) ) + for blob, decl in self._exported_symbols.iteritems(): + items_decorated.append( tmpl % ( blob, str(decl) ) ) + items_undecorated.append( tmpl % ( str(decl), blob ) ) result = [] result.append( '%s.undecorated_names = {#mapping between decorated and undecorated names' Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-06 08:38:32 UTC (rev 1538) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-06 08:55:13 UTC (rev 1539) @@ -218,11 +218,7 @@ def visit_free_function( self ): self.__dependencies_manager.add_exported( self.curr_decl ) - if self.curr_decl.name in self.__exported_symbols \ - and self.curr_decl.name == self.__exported_symbols[ self.curr_decl.name ]: - return #it is notpossible to call C function from CPPDLL - else: - self.curr_code_creator.adopt_creator( code_creators.function_definition_t( self.curr_decl ) ) + self.curr_code_creator.adopt_creator( code_creators.function_definition_t( self.curr_decl ) ) def visit_free_operator( self ): self.__dependencies_manager.add_exported( self.curr_decl ) Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-06 08:38:32 UTC (rev 1538) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-06 08:55:13 UTC (rev 1539) @@ -55,8 +55,9 @@ """ module_builder.module_builder_t.__init__( self, global_ns=None, encoding=encoding ) - self.__blob2undecorated = binary_parsers.exported_symbols.load_from_file( exported_symbols_file ) self.global_ns = self.__parse_declarations( files, gccxml_config ) + self.__blob2decl = binary_parsers.merge_information( self.global_ns, exported_symbols_file ) + self.__include_declarations() self.__code_creator = None @@ -80,14 +81,8 @@ def __include_declarations( self ): self.global_ns.exclude() - b2u = self.__blob2undecorated - undecorated = set( b2u.values() ) - is_exported = lambda d: binary_parsers.undecorate_decl( d ) in undecorated \ - or d.name in b2u and b2u[d.name] == d.name #treatment of C functions #include exported declarations - included_decls = set() - included_decls.update( self.global_ns.calldefs( is_exported, allow_empty=True, recursive=True ) ) - included_decls.update( self.global_ns.variables( is_exported, allow_empty=True, recursive=True ) ) + included_decls = set( self.__blob2decl.itervalues() ) they_depend_on_me = decls_package.dependency_info_t.they_depend_on_me for d in included_decls: @@ -116,7 +111,7 @@ def build_code_creator( self, library_path, doc_extractor=None ): creator = creators_factory.ctypes_creator_t( self.global_ns , library_path - , self.__blob2undecorated + , self.__blob2decl , doc_extractor) self.__code_creator = creator.create() return self.__code_creator Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2009-01-06 08:38:32 UTC (rev 1538) +++ pyplusplus_dev/unittests/autoconfig.py 2009-01-06 08:55:13 UTC (rev 1539) @@ -23,6 +23,7 @@ import pygccxml compiler = pygccxml.utils.native_compiler.get_gccxml_compiler() +compiler = "msvc71" print 'GCCXML configured to simulate compiler ', compiler gccxml_version = '__GCCXML_09__' class cxx_parsers_cfg: Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-06 08:38:32 UTC (rev 1538) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-06 08:55:13 UTC (rev 1539) @@ -31,6 +31,10 @@ @property def symbols_file( self ): + return os.path.join( self.project_dir, 'binaries', self.base_name + '.map' ) + + @property + def library_file( self ): return os.path.join( self.project_dir, 'binaries', self.base_name + '.dll' ) def setUp( self ): @@ -40,7 +44,7 @@ #~ pdb.set_trace() autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ' + self.base_name ) mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) - mb.build_code_creator( self.symbols_file ) + mb.build_code_creator( self.library_file ) mb.write_module( os.path.join( self.project_dir, 'binaries', self.base_name + '.py' ) ) sys.path.insert( 0, os.path.join( self.project_dir, 'binaries' ) ) __import__( self.base_name ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-10 21:09:03
|
Revision: 1553 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1553&view=rev Author: roman_yakovenko Date: 2009-01-10 21:08:55 +0000 (Sat, 10 Jan 2009) Log Message: ----------- adding gmp example Modified Paths: -------------- pygccxml_dev/pygccxml/binary_parsers/parsers.py pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py pyplusplus_dev/pyplusplus/code_creators/library_reference.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py Added Paths: ----------- pyplusplus_dev/examples/environment.py pyplusplus_dev/examples/gmplib_dev/ pyplusplus_dev/examples/gmplib_dev/dev/ Modified: pygccxml_dev/pygccxml/binary_parsers/parsers.py =================================================================== --- pygccxml_dev/pygccxml/binary_parsers/parsers.py 2009-01-08 21:16:13 UTC (rev 1552) +++ pygccxml_dev/pygccxml/binary_parsers/parsers.py 2009-01-10 21:08:55 UTC (rev 1553) @@ -290,7 +290,7 @@ parser = dll_file_parser_t( global_ns, fname ) elif '.map' == ext: parser = map_file_parser_t( global_ns, fname ) - elif '.so' == ext: + elif '.so' == ext or '.so.' in os.path.basename(fname): parser = so_file_parser_t( global_ns, fname ) else: raise RuntimeError( "Don't know how to read exported symbols from file '%s'" Added: pyplusplus_dev/examples/environment.py =================================================================== --- pyplusplus_dev/examples/environment.py (rev 0) +++ pyplusplus_dev/examples/environment.py 2009-01-10 21:08:55 UTC (rev 1553) @@ -0,0 +1,24 @@ +#! /usr/bin/python +# Copyright 2004-2008 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 sys + +this_module_dir_path = os.path.abspath ( os.path.dirname( sys.modules[__name__].__file__) ) +project_root = os.path.abspath( os.path.join( this_module_dir_path, '..','..' ) ) +complete_path = lambda *args: os.path.join( project_root, *args ) + +class settings: + pygccxml_path = complete_path( 'pygccxml_dev' ) + pyplusplus_path = complete_path( 'pyplusplus_dev' ) + gccxml_path = complete_path( 'gccxml_bin', 'v09', sys.platform, 'bin' ) + + @staticmethod + def setup_environment(): + sys.path.append( settings.pygccxml_path ) + sys.path.append( settings.pyplusplus_path ) + +settings.setup_environment() Modified: pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py 2009-01-08 21:16:13 UTC (rev 1552) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_formatter.py 2009-01-10 21:08:55 UTC (rev 1553) @@ -118,8 +118,8 @@ return "( %s * %d )" % ( item_type, size ) def visit_free_function_type( self ): - return_visitor = type_converter_t( self.return_type, self.decl_formatter ) - return_type = declarations.apply_visitor(return_visitor, self.return_type) + return_visitor = type_converter_t( self.user_type.return_type, self.decl_formatter ) + return_type = declarations.apply_visitor(return_visitor, self.user_type.return_type) argtypes = [] for arg in self.user_type.arguments_types: arg_visitor = type_converter_t( arg, self.decl_formatter ) Modified: pyplusplus_dev/pyplusplus/code_creators/library_reference.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2009-01-08 21:16:13 UTC (rev 1552) +++ pyplusplus_dev/pyplusplus/code_creators/library_reference.py 2009-01-10 21:08:55 UTC (rev 1553) @@ -42,7 +42,7 @@ def _create_impl(self): return '%(var)s = ctypes.%(loader)s( r"%(path)s" )' \ % dict( var=self.library_var_name - , loader=self.iif( self._is_cpp_library, 'CPPDLL', 'CDLL' ) + , loader='CDLL' , path=self._library_path ) def _get_system_headers_impl( self ): Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-08 21:16:13 UTC (rev 1552) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-10 21:08:55 UTC (rev 1553) @@ -102,6 +102,8 @@ # - implement better 0(n) algorithm def __add_class_introductions( self, cc, class_ ): + if not self.__should_generate_code( class_ ): + return ci_creator = code_creators.class_introduction_t( class_ ) self.__class2introduction[ class_ ] = ci_creator cc.adopt_creator( ci_creator ) @@ -232,9 +234,10 @@ self.__dependencies_manager.add_exported( self.curr_decl ) #fields definition should be recursive using the visitor self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) - md_cc = code_creators.methods_definition_t( self.curr_decl ) - self.__class2methods_def[ self.curr_decl ] = md_cc - self.__class_defs_ccs.adopt_creator( md_cc ) + if self.curr_decl.calldefs( self.__should_generate_code, recursive=False, allow_empty=True ): + md_cc = code_creators.methods_definition_t( self.curr_decl ) + self.__class2methods_def[ self.curr_decl ] = md_cc + self.__class_defs_ccs.adopt_creator( md_cc ) class_ = self.curr_decl for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): if self.__should_generate_code( decl ): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-11 09:42:11
|
Revision: 1556 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1556&view=rev Author: roman_yakovenko Date: 2009-01-11 09:42:07 +0000 (Sun, 11 Jan 2009) Log Message: ----------- adding support for enums for ctypes code generator Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/enum.py pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/enums_to_be_exported.hpp pyplusplus_dev/unittests/sconstruct Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes/enums/ pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp pyplusplus_dev/unittests/data/ctypes/enums/enums.h pyplusplus_dev/unittests/data/ctypes/enums/sconscript pyplusplus_dev/unittests/data/libconfig.h Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-10 21:13:22 UTC (rev 1555) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-11 09:42:07 UTC (rev 1556) @@ -164,3 +164,4 @@ from function_definition import del_definition_t from function_definition import mem_fun_definition_t from typedef_as_pyvar import typedef_as_pyvar_t +from enum import pyenum_t Modified: pyplusplus_dev/pyplusplus/code_creators/enum.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/enum.py 2009-01-10 21:13:22 UTC (rev 1555) +++ pyplusplus_dev/pyplusplus/code_creators/enum.py 2009-01-11 09:42:07 UTC (rev 1556) @@ -5,6 +5,7 @@ import os import algorithm +import code_creator import declaration_based import registration_based @@ -36,11 +37,11 @@ return '.value("%(alias)s", %(name)s)' \ % { 'alias' : self.value_aliases.get( value_name, value_name ) , 'name' : algorithm.create_identifier( self, full_name + '::' + value_name ) } - + def _create_impl(self): if self.declaration.already_exposed: return '' - + bpl_enum = '%(bpl::enum_)s< %(name)s>("%(alias)s")' \ % { 'bpl::enum_' : algorithm.create_identifier( self, '::boost::python::enum_' ) , 'name' : algorithm.create_identifier( self, self.declaration.decl_string ) @@ -60,9 +61,24 @@ values.append( self._generate_value_code( name ) ) values.append( ';' ) - + values = self.indent( os.linesep.join( values ) ) return bpl_enum + os.linesep + values def _get_system_headers_impl( self ): return [] + + +class pyenum_t( code_creator.code_creator_t, declaration_based.declaration_based_t ): + def __init__( self, enum ): + code_creator.code_creator_t.__init__( self ) + declaration_based.declaration_based_t.__init__( self, declaration=enum ) + + def _create_impl( self ): + result = [ 'class %(alias)s( ctypes_utils.Enumeration ):' % dict( alias=self.alias ) ] + for name, value in self.declaration.values: + result.append( self.indent( '%(name)s = %(value)s' % dict( name=name, value=value ) ) ) + return os.linesep.join( result ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2009-01-10 21:13:22 UTC (rev 1555) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2009-01-11 09:42:07 UTC (rev 1556) @@ -134,4 +134,9 @@ def multi_method( self, restype=None ): return multi_method_registry_t( self, restype ) + + +#take a look on http://code.activestate.com/recipes/413486/ +class Enumeration( object ): + pass """ Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-10 21:13:22 UTC (rev 1555) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-11 09:42:07 UTC (rev 1556) @@ -247,6 +247,12 @@ def visit_enumeration(self): self.__dependencies_manager.add_exported( self.curr_decl ) + paretn_cc = None + if isinstance( self.curr_decl.parent, declarations.class_t ): + paretn_cc = self.__class2introduction[ self.curr_decl.parent ] + else: + paretn_cc = self.__namespace2pyclass[ self.curr_decl.parent ] + paretn_cc.adopt_creator( code_creators.pyenum_t( self.curr_decl ) ) def visit_typedef(self): self.__dependencies_manager.add_exported( self.curr_decl ) Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-10 21:13:22 UTC (rev 1555) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-11 09:42:07 UTC (rev 1556) @@ -37,6 +37,9 @@ def library_file( self ): return os.path.join( self.project_dir, 'binaries', self.base_name + '.dll' ) + def customize(self, mb ): + pass + def setUp( self ): if self.base_name in sys.modules: return sys.modules[ self.base_name ] @@ -44,6 +47,7 @@ #~ pdb.set_trace() autoconfig.scons_config.compile( autoconfig.scons.cmd_build + ' ' + self.base_name ) mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) + self.customize( mb ) mb.build_code_creator( self.library_file ) mb.write_module( os.path.join( self.project_dir, 'binaries', self.base_name + '.py' ) ) sys.path.insert( 0, os.path.join( self.project_dir, 'binaries' ) ) @@ -103,11 +107,23 @@ def test_free_fun_add( self ): self.failUnless( 1977 == self.module_ref.add( 77, 1900 ) ) + +class enums_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'enums', *args, **keywd ) + + def customize( self, mb ): + mb.enums().include() + + def test(self): + pass + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: suite.addTest( unittest.makeSuite(pof_tester_t)) suite.addTest( unittest.makeSuite(issues_tester_t)) + suite.addTest( unittest.makeSuite(enums_tester_t)) return suite def run_suite(): Added: pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/enums/enums.cpp 2009-01-11 09:42:07 UTC (rev 1556) @@ -0,0 +1 @@ +#include "enums.h" Added: pyplusplus_dev/unittests/data/ctypes/enums/enums.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/enums/enums.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/enums/enums.h 2009-01-11 09:42:07 UTC (rev 1556) @@ -0,0 +1,2 @@ +#include "enums_to_be_exported.hpp" + Added: pyplusplus_dev/unittests/data/ctypes/enums/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/enums/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/enums/sconscript 2009-01-11 09:42:07 UTC (rev 1556) @@ -0,0 +1,7 @@ +Import('*') + +target_name = 'enums' +shlib = env.SharedLibrary( target=target_name + , source=[ target_name + '.cpp' ] + , CPPPATH=['#data'] ) +env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/data/enums_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/enums_to_be_exported.hpp 2009-01-10 21:13:22 UTC (rev 1555) +++ pyplusplus_dev/unittests/data/enums_to_be_exported.hpp 2009-01-11 09:42:07 UTC (rev 1556) @@ -6,22 +6,30 @@ #ifndef __enums_to_be_exported_hpp__ #define __enums_to_be_exported_hpp__ -enum Chisla{ nol, odin, dva, tri }; +#include "libconfig.h" -namespace enums{ +enum EXPORT_SYMBOL Chisla{ nol, odin, dva, tri }; -enum color{ +namespace enums{ + +enum EXPORT_SYMBOL color{ red = 1 , green = 2 - , blue = 4 }; + , blue = 4 }; -enum numbers{ +enum EXPORT_SYMBOL numbers{ zero = 0 , noll = 0 }; - -inline int to_int( int x=red ){ return x; } +struct EXPORT_SYMBOL struct_with_enum{ + enum fruits{ + lemon, orange, apple + }; +}; + +inline int EXPORT_SYMBOL to_int( int x=red ){ return x; } + } Added: pyplusplus_dev/unittests/data/libconfig.h =================================================================== --- pyplusplus_dev/unittests/data/libconfig.h (rev 0) +++ pyplusplus_dev/unittests/data/libconfig.h 2009-01-11 09:42:07 UTC (rev 1556) @@ -0,0 +1,15 @@ +#if defined _WIN32 || defined __CYGWIN__ + #define IMPORT_SYMBOL __declspec(dllimport) + #define EXPORT_SYMBOL __declspec(dllexport) + #define PRIVATE_SYMBOL +#else + #if __GNUC__ >= 4 + #define IMPORT_SYMBOL __attribute__ ((visibility("default"))) + #define EXPORT_SYMBOL __attribute__ ((visibility("default"))) + #define PRIVATE_SYMBOL __attribute__ ((visibility("hidden"))) + #else + #define IMPORT_SYMBOL + #define EXPORT_SYMBOL + #define PRIVATE_SYMBOL + #endif +#endif Modified: pyplusplus_dev/unittests/sconstruct =================================================================== --- pyplusplus_dev/unittests/sconstruct 2009-01-10 21:13:22 UTC (rev 1555) +++ pyplusplus_dev/unittests/sconstruct 2009-01-11 09:42:07 UTC (rev 1556) @@ -11,7 +11,7 @@ env.AppendUnique( CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] ) env.AppendUnique( LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) -scripts = [ 'pof', 'issues' ] +scripts = [ 'pof', 'issues', 'enums' ] for s in scripts: SConscript( 'data/ctypes/%s/sconscript' % s , variant_dir='data/ctypes/%s/binaries' % s This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-11 21:17:48
|
Revision: 1558 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1558&view=rev Author: roman_yakovenko Date: 2009-01-11 21:17:40 +0000 (Sun, 11 Jan 2009) Log Message: ----------- gmplis almost works Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/dependencies.py pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py pyplusplus_dev/examples/gmplib_dev/test.py pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py Modified: pygccxml_dev/pygccxml/declarations/dependencies.py =================================================================== --- pygccxml_dev/pygccxml/declarations/dependencies.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pygccxml_dev/pygccxml/declarations/dependencies.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -61,7 +61,7 @@ return None @staticmethod - def they_depend_on_me( decl ): + def i_depend_on_them( decl ): """returns set of declarations. every item in the returned set, depends on a declaration from the input""" import class_declaration #prevent cyclic imports @@ -76,7 +76,7 @@ return to_be_included @staticmethod - def they_depend_on_us( decls ): + def we_depend_on_them( decls ): """returns set of declarations. every item in the returned set, depends on a declaration from the input""" import class_declaration #prevent cyclic imports Modified: pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -24,8 +24,12 @@ #introduces define, which aliass __gmpy to gmpy for f in mb.calldefs( lambda x: x.name.startswith('__gmp') ): f.alias = f.name[2:] -#enums +#there is a bug in "include" algorithm - I need to wrote DFS +mb.class_( '_IO_marker' ).include() + +#include should work as expected - include only exported function + #~ mb.print_declarations() mb.build_code_creator( project_env.gmp.shared_library_file ) mb.write_module( os.path.join( project_env.gmp.generated_code_dir, '__init__.py' ) ) Modified: pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -617,9 +617,16 @@ "__gmpf_init_set_str" : "extern int __gmpf_init_set_str(mpf_ptr arg0, char const * arg1, int arg2) [free function]", } +class gmp_randalg_t( ctypes_utils.Enumeration ): + GMP_RAND_ALG_DEFAULT = 0 + GMP_RAND_ALG_LC = 0 + class _IO_FILE(ctypes.Structure): """class _IO_FILE""" +class _IO_marker(ctypes.Structure): + """class _IO_marker""" + class __gmp_randstate_struct(ctypes.Structure): """class __gmp_randstate_struct""" @@ -682,10 +689,16 @@ ("_mp_den", __mpz_struct), ] +_IO_marker._fields_ = [ #class _IO_marker + ("_next", ctypes.POINTER( _IO_marker )), + ("_sbuf", ctypes.POINTER( _IO_FILE )), + ("_pos", ctypes.c_int), +] + __gmp_randstate_struct._fields_ = [ #class __gmp_randstate_struct ("_mp_seed", ( __mpz_struct * 1 )), ("_mp_alg", gmp_randalg_t), - ("_mp_algdata", __gmp_randstate_struct.), + ("_mp_algdata", ctypes.c_int), ] gmpq_add_type = ctypes.CFUNCTYPE( None, ctypes.POINTER( __mpq_struct ), ctypes.POINTER( __mpq_struct ), ctypes.POINTER( __mpq_struct ) ) Modified: pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pyplusplus_dev/examples/gmplib_dev/pygmplib/ctypes_utils.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -129,3 +129,7 @@ def multi_method( self, restype=None ): return multi_method_registry_t( self, restype ) + +#take a look on http://code.activestate.com/recipes/413486/ +Enumeration = ctypes.c_int + Modified: pyplusplus_dev/examples/gmplib_dev/test.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/test.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pyplusplus_dev/examples/gmplib_dev/test.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -1,4 +1,15 @@ +import ctypes import pygmplib as gmp -mpz = gmp.__mpz_struct() +integ1 = ctypes.pointer( gmp.__mpz_struct() ) +integ2 = ctypes.pointer( gmp.__mpz_struct() ) +gmp.gmpz_init_set_ui( integ1, ctypes.c_ulong( 1900 ) ) +print 'integ1 : ', gmp.gmpz_get_si( integ1 ) +gmp.gmpz_init_set_ui( integ2, ctypes.c_ulong( 77 ) ) +print 'integ2 : ', gmp.gmpz_get_si( integ2 ) + +gmp.gmpz_add( integ1, integ1, integ2 ) + +print 'integ1 : ', gmp.gmpz_get_si( integ1 ) + Modified: pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pyplusplus_dev/pyplusplus/code_repository/ctypes_utils.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -137,6 +137,5 @@ #take a look on http://code.activestate.com/recipes/413486/ -class Enumeration( object ): - pass +Enumeration = ctypes.c_int """ Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -29,6 +29,7 @@ self.__library_path = library_path self.__exported_symbols = exported_symbols + self.__exported_decls = set( exported_symbols.itervalues() ) self.module = code_creators.ctypes_module_t( global_ns ) self.__dependencies_manager = dependencies_manager.manager_t(self.decl_logger) @@ -68,6 +69,8 @@ def __should_generate_code( self, decl ): if decl.ignore or decl.already_exposed: return False + if isinstance( decl, declarations.calldef_t ): + return decl in self.__exported_decls return True Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-11 19:18:50 UTC (rev 1557) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-11 21:17:40 UTC (rev 1558) @@ -79,33 +79,38 @@ return decls_package.matcher.get_single( decls_package.namespace_matcher_t( name='::' ) , decls ) + def __include_dependencies( self, decl): + i_depend_on_them = decls_package.dependency_info_t.i_depend_on_them + decls_traits = ( decls_package.class_traits, decls_package.class_declaration_traits, decls_package.enum_traits ) + for dependency in i_depend_on_them( decl ): + self.logger.debug( 'discovered dependency %s' % str(dependency) ) + for traits in decls_traits: + if not traits.is_my_case( dependency ): + continue + self.logger.debug( 'discovered dependency %s - included' % str(dependency) ) + dd = traits.get_declaration( dependency ) + dd.ignore = False + + def __include_parent_classes( self, decl ): + self.logger.debug( 'including decl %s' % str(decl) ) + parent = decl.parent + while True: + if isinstance( parent, decls_package.namespace_t ): + break + else: + self.logger.debug( 'including parent class %s' % str(parent) ) + parent.ignore = False + parent = parent.parent + def __include_declarations( self ): self.global_ns.exclude() #include exported declarations included_decls = set( self.__blob2decl.itervalues() ) - - they_depend_on_me = decls_package.dependency_info_t.they_depend_on_me + #include dependencies for d in included_decls: d.include() - self.logger.debug( 'including decl %s' % str(d) ) - parent = d.parent - while True: - if isinstance( parent, decls_package.namespace_t ): - break - else: - self.logger.debug( 'including parent class %s' % str(parent) ) - parent.ignore = False - parent = parent.parent - for dependency in they_depend_on_me( d ): - self.logger.debug( 'discovered dependency %s' % str(dependency) ) - #include declarations, on which exported declarations depend - #I need this for classes, referenced by function arguments - decls_traits = ( decls_package.class_traits, decls_package.class_declaration_traits, decls_package.enum_traits ) - for traits in decls_traits: - if traits.is_my_case( dependency ): - self.logger.debug( 'discovered dependency %s - included' % str(dependency) ) - traits.get_declaration( dependency ).ignore = False - + self.__include_parent_classes( d ) + self.__include_dependencies( d ) self.logger.debug( 'including decl %s - done' % str(d) ) def build_code_creator( self, library_path, doc_extractor=None ): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-12 22:27:18
|
Revision: 1562 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1562&view=rev Author: roman_yakovenko Date: 2009-01-12 21:48:25 +0000 (Mon, 12 Jan 2009) Log Message: ----------- improving ctypes code generator - adding support for opaque types Modified Paths: -------------- pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/mem_fun_introduction.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/sconstruct Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes/opaque/ pyplusplus_dev/unittests/data/ctypes/opaque/opaque.cpp pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h pyplusplus_dev/unittests/data/ctypes/opaque/sconscript Modified: pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py 2009-01-12 19:04:19 UTC (rev 1561) +++ pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py 2009-01-12 21:48:25 UTC (rev 1562) @@ -26,7 +26,7 @@ f.alias = f.name[2:] #there is a bug in "include" algorithm - I need to wrote DFS -mb.class_( '_IO_marker' ).include() +mb.class_( '_IO_FILE' ).opaque = True #include should work as expected - include only exported function Modified: pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-01-12 19:04:19 UTC (rev 1561) +++ pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-01-12 21:48:25 UTC (rev 1562) @@ -617,19 +617,217 @@ "__gmpf_init_set_str" : "extern int __gmpf_init_set_str(mpf_ptr arg0, char const * arg1, int arg2) [free function]", } +class std: + """namespace std""" + +class __gnu_cxx: + """namespace __gnu_cxx""" + +class __cxxabiv1: + """namespace __cxxabiv1""" + class gmp_randalg_t( ctypes_utils.Enumeration ): GMP_RAND_ALG_DEFAULT = 0 GMP_RAND_ALG_LC = 0 +class (ctypes.Structure): + """class """ + + class (ctypes.Structure): + """class """ + +class _G_fpos64_t(ctypes.Structure): + """class _G_fpos64_t""" + +class _G_fpos_t(ctypes.Structure): + """class _G_fpos_t""" + class _IO_FILE(ctypes.Structure): """class _IO_FILE""" + + def __init__( self, *args, **keywd ): + raise RuntimeError( "Unable to create instance of opaque type." ) +class _IO_cookie_io_functions_t(ctypes.Structure): + """class _IO_cookie_io_functions_t""" + class _IO_marker(ctypes.Structure): """class _IO_marker""" +class __base_class_type_info_pseudo(ctypes.Structure): + """class __base_class_type_info_pseudo""" + +class __class_type_info_pseudo(ctypes.Structure): + """class __class_type_info_pseudo""" + +class __forced_unwind(ctypes.Structure): + """class __cxxabiv1::__forced_unwind""" + + +__cxxabiv1.__forced_unwind = __forced_unwind + +class __fsid_t(ctypes.Structure): + """class __fsid_t""" + class __gmp_randstate_struct(ctypes.Structure): """class __gmp_randstate_struct""" + + class (ctypes.Structure): + """class __gmp_randstate_struct""" +class __add_unsigned_less__char__greater_(ctypes.Structure): + """class __gnu_cxx::__add_unsigned< char >""" + + +__gnu_cxx.__add_unsigned_less__char__greater_ = __add_unsigned_less__char__greater_ + +class __add_unsigned_less__int__greater_(ctypes.Structure): + """class __gnu_cxx::__add_unsigned< int >""" + + +__gnu_cxx.__add_unsigned_less__int__greater_ = __add_unsigned_less__int__greater_ + +class __add_unsigned_less__long_long__greater_(ctypes.Structure): + """class __gnu_cxx::__add_unsigned< long long >""" + + +__gnu_cxx.__add_unsigned_less__long_long__greater_ = __add_unsigned_less__long_long__greater_ + +class __add_unsigned_less__long__greater_(ctypes.Structure): + """class __gnu_cxx::__add_unsigned< long >""" + + +__gnu_cxx.__add_unsigned_less__long__greater_ = __add_unsigned_less__long__greater_ + +class __add_unsigned_less__short__greater_(ctypes.Structure): + """class __gnu_cxx::__add_unsigned< short >""" + + +__gnu_cxx.__add_unsigned_less__short__greater_ = __add_unsigned_less__short__greater_ + +class __add_unsigned_less__signed_char__greater_(ctypes.Structure): + """class __gnu_cxx::__add_unsigned< signed char >""" + + +__gnu_cxx.__add_unsigned_less__signed_char__greater_ = __add_unsigned_less__signed_char__greater_ + +class __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__int__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__int__greater___greater_(ctypes.Structure): + """class __gnu_cxx::__conditional_type< true, __gnu_cxx::__numeric_traits_integer< int >, __gnu_cxx::__numeric_traits_floating< int > >""" + + +__gnu_cxx.__conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__int__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__int__greater___greater_ = __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__int__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__int__greater___greater_ + +class __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__short__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__short__greater___greater_(ctypes.Structure): + """class __gnu_cxx::__conditional_type< true, __gnu_cxx::__numeric_traits_integer< short >, __gnu_cxx::__numeric_traits_floating< short > >""" + + +__gnu_cxx.__conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__short__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__short__greater___greater_ = __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__short__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__short__greater___greater_ + +class __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__unsigned_long__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__unsigned_long__greater___greater_(ctypes.Structure): + """class __gnu_cxx::__conditional_type< true, __gnu_cxx::__numeric_traits_integer< unsigned long >, __gnu_cxx::__numeric_traits_floating< unsigned long > >""" + + +__gnu_cxx.__conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__unsigned_long__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__unsigned_long__greater___greater_ = __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__unsigned_long__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__unsigned_long__greater___greater_ + +class __conditional_type_less__true_comma__unsigned_long_comma__unsigned_long_long__greater_(ctypes.Structure): + """class __gnu_cxx::__conditional_type< true, unsigned long, unsigned long long >""" + + +__gnu_cxx.__conditional_type_less__true_comma__unsigned_long_comma__unsigned_long_long__greater_ = __conditional_type_less__true_comma__unsigned_long_comma__unsigned_long_long__greater_ + +class __type(ctypes.Structure): + """class __gnu_cxx::__numeric_traits_integer< int >""" + + +__gnu_cxx.__type = __type + +class __numeric_traits_less__int__greater_(ctypes.Structure): + """class __gnu_cxx::__numeric_traits< int >""" + + +__gnu_cxx.__numeric_traits_less__int__greater_ = __numeric_traits_less__int__greater_ + +class __type(ctypes.Structure): + """class __gnu_cxx::__numeric_traits_integer< short >""" + + +__gnu_cxx.__type = __type + +class __numeric_traits_less__short__greater_(ctypes.Structure): + """class __gnu_cxx::__numeric_traits< short >""" + + +__gnu_cxx.__numeric_traits_less__short__greater_ = __numeric_traits_less__short__greater_ + +class __type(ctypes.Structure): + """class __gnu_cxx::__numeric_traits_integer< unsigned long >""" + + +__gnu_cxx.__type = __type + +class __numeric_traits_less__unsigned_long__greater_(ctypes.Structure): + """class __gnu_cxx::__numeric_traits< unsigned long >""" + + +__gnu_cxx.__numeric_traits_less__unsigned_long__greater_ = __numeric_traits_less__unsigned_long__greater_ + +class __remove_unsigned_less__char__greater_(ctypes.Structure): + """class __gnu_cxx::__remove_unsigned< char >""" + + +__gnu_cxx.__remove_unsigned_less__char__greater_ = __remove_unsigned_less__char__greater_ + +class __remove_unsigned_less__unsigned_char__greater_(ctypes.Structure): + """class __gnu_cxx::__remove_unsigned< unsigned char >""" + + +__gnu_cxx.__remove_unsigned_less__unsigned_char__greater_ = __remove_unsigned_less__unsigned_char__greater_ + +class __remove_unsigned_less__unsigned_int__greater_(ctypes.Structure): + """class __gnu_cxx::__remove_unsigned< unsigned int >""" + + +__gnu_cxx.__remove_unsigned_less__unsigned_int__greater_ = __remove_unsigned_less__unsigned_int__greater_ + +class __remove_unsigned_less__unsigned_long_long__greater_(ctypes.Structure): + """class __gnu_cxx::__remove_unsigned< unsigned long long >""" + + +__gnu_cxx.__remove_unsigned_less__unsigned_long_long__greater_ = __remove_unsigned_less__unsigned_long_long__greater_ + +class __remove_unsigned_less__unsigned_long__greater_(ctypes.Structure): + """class __gnu_cxx::__remove_unsigned< unsigned long >""" + + +__gnu_cxx.__remove_unsigned_less__unsigned_long__greater_ = __remove_unsigned_less__unsigned_long__greater_ + +class __remove_unsigned_less__unsigned_short__greater_(ctypes.Structure): + """class __gnu_cxx::__remove_unsigned< unsigned short >""" + + +__gnu_cxx.__remove_unsigned_less__unsigned_short__greater_ = __remove_unsigned_less__unsigned_short__greater_ + +class new_allocator_less__char__greater_(ctypes.Structure): + """class __gnu_cxx::new_allocator< char >""" + + +__gnu_cxx.new_allocator_less__char__greater_ = new_allocator_less__char__greater_ + +class new_allocator_less__wchar_t__greater_(ctypes.Structure): + """class __gnu_cxx::new_allocator< wchar_t >""" + + +__gnu_cxx.new_allocator_less__wchar_t__greater_ = new_allocator_less__wchar_t__greater_ + +class __locale_struct(ctypes.Structure): + """class __locale_struct""" + +class __mbstate_t(ctypes.Structure): + """class __mbstate_t""" + + class (ctypes.Structure): + """class __mbstate_t""" + class __mpf_struct(ctypes.Structure): """class __mpf_struct""" @@ -639,38 +837,1494 @@ class __mpz_struct(ctypes.Structure): """class __mpz_struct""" -_IO_FILE._fields_ = [ #class _IO_FILE - ("_flags", ctypes.c_int), - ("_IO_read_ptr", ctypes.c_char_p), - ("_IO_read_end", ctypes.c_char_p), - ("_IO_read_base", ctypes.c_char_p), - ("_IO_write_base", ctypes.c_char_p), - ("_IO_write_ptr", ctypes.c_char_p), - ("_IO_write_end", ctypes.c_char_p), - ("_IO_buf_base", ctypes.c_char_p), - ("_IO_buf_end", ctypes.c_char_p), - ("_IO_save_base", ctypes.c_char_p), - ("_IO_backup_base", ctypes.c_char_p), - ("_IO_save_end", ctypes.c_char_p), - ("_markers", ctypes.POINTER( _IO_marker )), - ("_chain", ctypes.POINTER( _IO_FILE )), - ("_fileno", ctypes.c_int), - ("_flags2", ctypes.c_int), - ("_old_offset", ctypes.c_long), - ("_cur_column", ctypes.c_ushort), - ("_vtable_offset", ctypes.c_byte), - ("_shortbuf", ( ctypes.c_char * 1 )), - ("_lock", ctypes.c_void_p), - ("_offset", ctypes.c_longlong), - ("__pad1", ctypes.c_void_p), - ("__pad2", ctypes.c_void_p), - ("__pad3", ctypes.c_void_p), - ("__pad4", ctypes.c_void_p), - ("__pad5", ctypes.c_uint), - ("_mode", ctypes.c_int), - ("_unused2", ( ctypes.c_char * 40 )), +class __pthread_cleanup_class(ctypes.Structure): + """class __pthread_cleanup_class""" + +class __pthread_cleanup_frame(ctypes.Structure): + """class __pthread_cleanup_frame""" + +class __pthread_internal_slist(ctypes.Structure): + """class __pthread_internal_slist""" + +class __sched_param(ctypes.Structure): + """class __sched_param""" + +class __si_class_type_info_pseudo(ctypes.Structure): + """class __si_class_type_info_pseudo""" + +class __sigset_t(ctypes.Structure): + """class __sigset_t""" + +class __type_info_pseudo(ctypes.Structure): + """class __type_info_pseudo""" + +class __vmi_class_type_info_pseudo1(ctypes.Structure): + """class __vmi_class_type_info_pseudo1""" + +class __vmi_class_type_info_pseudo2(ctypes.Structure): + """class __vmi_class_type_info_pseudo2""" + +class _pthread_cleanup_buffer(ctypes.Structure): + """class _pthread_cleanup_buffer""" + +class cpu_set_t(ctypes.Structure): + """class cpu_set_t""" + +class itimerspec(ctypes.Structure): + """class itimerspec""" + +class lconv(ctypes.Structure): + """class lconv""" + +class pthread_attr_t(ctypes.Structure): + """class pthread_attr_t""" + +class pthread_barrier_t(ctypes.Structure): + """class pthread_barrier_t""" + +class pthread_barrierattr_t(ctypes.Structure): + """class pthread_barrierattr_t""" + +class pthread_cond_t(ctypes.Structure): + """class pthread_cond_t""" + + class (ctypes.Structure): + """class pthread_cond_t""" + +class pthread_condattr_t(ctypes.Structure): + """class pthread_condattr_t""" + +class pthread_mutex_t(ctypes.Structure): + """class pthread_mutex_t""" + + class __pthread_mutex_s(ctypes.Structure): + """class pthread_mutex_t::__pthread_mutex_s""" + + class (ctypes.Structure): + """class pthread_mutex_t::__pthread_mutex_s""" + +class pthread_mutexattr_t(ctypes.Structure): + """class pthread_mutexattr_t""" + +class pthread_rwlock_t(ctypes.Structure): + """class pthread_rwlock_t""" + + class (ctypes.Structure): + """class pthread_rwlock_t""" + +class pthread_rwlockattr_t(ctypes.Structure): + """class pthread_rwlockattr_t""" + +class sched_param(ctypes.Structure): + """class sched_param""" + +class __copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_(ctypes.Structure): + """class std::__copy_move< false, false, std::random_access_iterator_tag >""" + + +std.__copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ = __copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ + +class __copy_move_backward_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_(ctypes.Structure): + """class std::__copy_move_backward< false, false, std::random_access_iterator_tag >""" + + +std.__copy_move_backward_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ = __copy_move_backward_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ + +class ctype_base(ctypes.Structure): + """class std::ctype_base""" + + +std.ctype_base = ctype_base + +class __ctype_abstract_base_less__wchar_t__greater_(ctypes.Structure): + """class std::__ctype_abstract_base< wchar_t >""" + + +std.__ctype_abstract_base_less__wchar_t__greater_ = __ctype_abstract_base_less__wchar_t__greater_ + +class __equal_less__true__greater_(ctypes.Structure): + """class std::__equal< true >""" + + +std.__equal_less__true__greater_ = __equal_less__true__greater_ + +class __false_type(ctypes.Structure): + """class std::__false_type""" + + +std.__false_type = __false_type + +class __is_byte_less__char__greater_(ctypes.Structure): + """class std::__is_byte< char >""" + + +std.__is_byte_less__char__greater_ = __is_byte_less__char__greater_ + +class __is_byte_less__signed_char__greater_(ctypes.Structure): + """class std::__is_byte< signed char >""" + + +std.__is_byte_less__signed_char__greater_ = __is_byte_less__signed_char__greater_ + +class __is_byte_less__unsigned_char__greater_(ctypes.Structure): + """class std::__is_byte< unsigned char >""" + + +std.__is_byte_less__unsigned_char__greater_ = __is_byte_less__unsigned_char__greater_ + +class __is_char_less__char__greater_(ctypes.Structure): + """class std::__is_char< char >""" + + +std.__is_char_less__char__greater_ = __is_char_less__char__greater_ + +class __is_char_less__wchar_t__greater_(ctypes.Structure): + """class std::__is_char< wchar_t >""" + + +std.__is_char_less__wchar_t__greater_ = __is_char_less__wchar_t__greater_ + +class __is_floating_less__double__greater_(ctypes.Structure): + """class std::__is_floating< double >""" + + +std.__is_floating_less__double__greater_ = __is_floating_less__double__greater_ + +class __is_floating_less__float__greater_(ctypes.Structure): + """class std::__is_floating< float >""" + + +std.__is_floating_less__float__greater_ = __is_floating_less__float__greater_ + +class __is_floating_less__long_double__greater_(ctypes.Structure): + """class std::__is_floating< long double >""" + + +std.__is_floating_less__long_double__greater_ = __is_floating_less__long_double__greater_ + +class __is_integer_less__bool__greater_(ctypes.Structure): + """class std::__is_integer< bool >""" + + +std.__is_integer_less__bool__greater_ = __is_integer_less__bool__greater_ + +class __is_integer_less__char__greater_(ctypes.Structure): + """class std::__is_integer< char >""" + + +std.__is_integer_less__char__greater_ = __is_integer_less__char__greater_ + +class __is_integer_less__int__greater_(ctypes.Structure): + """class std::__is_integer< int >""" + + +std.__is_integer_less__int__greater_ = __is_integer_less__int__greater_ + +class __is_integer_less__long_long__greater_(ctypes.Structure): + """class std::__is_integer< long long >""" + + +std.__is_integer_less__long_long__greater_ = __is_integer_less__long_long__greater_ + +class __is_integer_less__long__greater_(ctypes.Structure): + """class std::__is_integer< long >""" + + +std.__is_integer_less__long__greater_ = __is_integer_less__long__greater_ + +class __is_integer_less__short__greater_(ctypes.Structure): + """class std::__is_integer< short >""" + + +std.__is_integer_less__short__greater_ = __is_integer_less__short__greater_ + +class __is_integer_less__signed_char__greater_(ctypes.Structure): + """class std::__is_integer< signed char >""" + + +std.__is_integer_less__signed_char__greater_ = __is_integer_less__signed_char__greater_ + +class __is_integer_less__unsigned_char__greater_(ctypes.Structure): + """class std::__is_integer< unsigned char >""" + + +std.__is_integer_less__unsigned_char__greater_ = __is_integer_less__unsigned_char__greater_ + +class __is_integer_less__unsigned_int__greater_(ctypes.Structure): + """class std::__is_integer< unsigned int >""" + + +std.__is_integer_less__unsigned_int__greater_ = __is_integer_less__unsigned_int__greater_ + +class __is_integer_less__unsigned_long_long__greater_(ctypes.Structure): + """class std::__is_integer< unsigned long long >""" + + +std.__is_integer_less__unsigned_long_long__greater_ = __is_integer_less__unsigned_long_long__greater_ + +class __is_integer_less__unsigned_long__greater_(ctypes.Structure): + """class std::__is_integer< unsigned long >""" + + +std.__is_integer_less__unsigned_long__greater_ = __is_integer_less__unsigned_long__greater_ + +class __is_integer_less__unsigned_short__greater_(ctypes.Structure): + """class std::__is_integer< unsigned short >""" + + +std.__is_integer_less__unsigned_short__greater_ = __is_integer_less__unsigned_short__greater_ + +class __is_integer_less__wchar_t__greater_(ctypes.Structure): + """class std::__is_integer< wchar_t >""" + + +std.__is_integer_less__wchar_t__greater_ = __is_integer_less__wchar_t__greater_ + +class __is_void_less__void__greater_(ctypes.Structure): + """class std::__is_void< void >""" + + +std.__is_void_less__void__greater_ = __is_void_less__void__greater_ + +class __iter_swap_less__true__greater_(ctypes.Structure): + """class std::__iter_swap< true >""" + + +std.__iter_swap_less__true__greater_ = __iter_swap_less__true__greater_ + +class __lc_rai_less__std_scope_random_access_iterator_tag_comma__std_scope_random_access_iterator_tag__greater_(ctypes.Structure): + """class std::__lc_rai< std::random_access_iterator_tag, std::random_access_iterator_tag >""" + + +std.__lc_rai_less__std_scope_random_access_iterator_tag_comma__std_scope_random_access_iterator_tag__greater_ = __lc_rai_less__std_scope_random_access_iterator_tag_comma__std_scope_random_access_iterator_tag__greater_ + +class __lexicographical_compare_less__true__greater_(ctypes.Structure): + """class std::__lexicographical_compare< true >""" + + +std.__lexicographical_compare_less__true__greater_ = __lexicographical_compare_less__true__greater_ + +class __num_base(ctypes.Structure): + """class std::__num_base""" + + +std.__num_base = __num_base + +class __true_type(ctypes.Structure): + """class std::__true_type""" + + +std.__true_type = __true_type + +class __truth_type_less__true__greater_(ctypes.Structure): + """class std::__truth_type< true >""" + + +std.__truth_type_less__true__greater_ = __truth_type_less__true__greater_ + +class allocator_less__char__greater_(ctypes.Structure): + """class std::allocator< char >""" + + class rebind_less__char__greater_(ctypes.Structure): + """class std::allocator< char >::rebind< char >""" + +std.allocator_less__char__greater_ = allocator_less__char__greater_ + +class allocator_less__void__greater_(ctypes.Structure): + """class std::allocator< void >""" + + +std.allocator_less__void__greater_ = allocator_less__void__greater_ + +class allocator_less__wchar_t__greater_(ctypes.Structure): + """class std::allocator< wchar_t >""" + + class rebind_less__char__greater_(ctypes.Structure): + """class std::allocator< wchar_t >::rebind< char >""" + + class rebind_less__wchar_t__greater_(ctypes.Structure): + """class std::allocator< wchar_t >::rebind< wchar_t >""" + +std.allocator_less__wchar_t__greater_ = allocator_less__wchar_t__greater_ + +class exception(ctypes.Structure): + """class std::exception""" + + +std.exception = exception + +class bad_alloc(ctypes.Structure): + """class std::bad_alloc""" + + +std.bad_alloc = bad_alloc + +class bad_exception(ctypes.Structure): + """class std::bad_exception""" + + +std.bad_exception = bad_exception + +class ios_base(ctypes.Structure): + """class std::ios_base""" + + class Init(ctypes.Structure): + """class std::ios_base::Init""" + + class _Callback_list(ctypes.Structure): + """class std::ios_base::_Callback_list""" + + class _Words(ctypes.Structure): + """class std::ios_base::_Words""" + + class failure(ctypes.Structure): + """class std::ios_base::failure""" + +std.ios_base = ios_base + +class basic_ios_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class std::basic_ios< char, std::char_traits< char > >""" + + +std.basic_ios_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ios_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class basic_ios_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class std::basic_ios< wchar_t, std::char_traits< wchar_t > >""" + + +std.basic_ios_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ios_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class std::basic_istream< char, std::char_traits< char > >""" + + class sentry(ctypes.Structure): + """class std::basic_istream< char, std::char_traits< char > >::sentry""" + +std.basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class basic_ostream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class std::basic_ostream< char, std::char_traits< char > >""" + + class sentry(ctypes.Structure): + """class std::basic_ostream< char, std::char_traits< char > >::sentry""" + +std.basic_ostream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ostream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class iostream(ctypes.Structure): + """class std::basic_iostream< char, std::char_traits< char > >""" + + +std.iostream = iostream + +class basic_istream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class std::basic_istream< wchar_t, std::char_traits< wchar_t > >""" + + class sentry(ctypes.Structure): + """class std::basic_istream< wchar_t, std::char_traits< wchar_t > >::sentry""" + +std.basic_istream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_istream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class std::basic_ostream< wchar_t, std::char_traits< wchar_t > >""" + + class sentry(ctypes.Structure): + """class std::basic_ostream< wchar_t, std::char_traits< wchar_t > >::sentry""" + +std.basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class wiostream(ctypes.Structure): + """class std::basic_iostream< wchar_t, std::char_traits< wchar_t > >""" + + +std.wiostream = wiostream + +class basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class std::basic_streambuf< char, std::char_traits< char > >""" + + +std.basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class std::basic_streambuf< wchar_t, std::char_traits< wchar_t > >""" + + +std.basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class string(ctypes.Structure): + """class std::string""" + + class _Alloc_hider(ctypes.Structure): + """class std::string::_Alloc_hider""" + + class _Rep_base(ctypes.Structure): + """class std::string::_Rep_base""" + + class _Rep(ctypes.Structure): + """class std::string::_Rep""" + +std.string = string + +class wstring(ctypes.Structure): + """class std::wstring""" + + class _Alloc_hider(ctypes.Structure): + """class std::wstring::_Alloc_hider""" + + class _Rep_base(ctypes.Structure): + """class std::wstring::_Rep_base""" + + class _Rep(ctypes.Structure): + """class std::wstring::_Rep""" + +std.wstring = wstring + +class input_iterator_tag(ctypes.Structure): + """class std::input_iterator_tag""" + + +std.input_iterator_tag = input_iterator_tag + +class forward_iterator_tag(ctypes.Structure): + """class std::forward_iterator_tag""" + + +std.forward_iterator_tag = forward_iterator_tag + +class bidirectional_iterator_tag(ctypes.Structure): + """class std::bidirectional_iterator_tag""" + + +std.bidirectional_iterator_tag = bidirectional_iterator_tag + +class traits_type(ctypes.Structure): + """class std::char_traits< char >""" + + +std.traits_type = traits_type + +class traits_type(ctypes.Structure): + """class std::char_traits< wchar_t >""" + + +std.traits_type = traits_type + +class collate_less__char__greater_(ctypes.Structure): + """class std::collate< char >""" + + +std.collate_less__char__greater_ = collate_less__char__greater_ + +class collate_less__wchar_t__greater_(ctypes.Structure): + """class std::collate< wchar_t >""" + + +std.collate_less__wchar_t__greater_ = collate_less__wchar_t__greater_ + +class collate_byname_less__char__greater_(ctypes.Structure): + """class std::collate_byname< char >""" + + +std.collate_byname_less__char__greater_ = collate_byname_less__char__greater_ + +class collate_byname_less__wchar_t__greater_(ctypes.Structure): + """class std::collate_byname< wchar_t >""" + + +std.collate_byname_less__wchar_t__greater_ = collate_byname_less__wchar_t__greater_ + +class __ctype_type(ctypes.Structure): + """class std::ctype< char >""" + + +std.__ctype_type = __ctype_type + +class __ctype_type(ctypes.Structure): + """class std::ctype< wchar_t >""" + + +std.__ctype_type = __ctype_type + +class ctype_byname_less__char__greater_(ctypes.Structure): + """class std::ctype_byname< char >""" + + +std.ctype_byname_less__char__greater_ = ctype_byname_less__char__greater_ + +class ctype_byname_less__wchar_t__greater_(ctypes.Structure): + """class std::ctype_byname< wchar_t >""" + + +std.ctype_byname_less__wchar_t__greater_ = ctype_byname_less__wchar_t__greater_ + +class iterator_less__std_scope_output_iterator_tag_comma__void_comma__void_comma__void_comma__void__greater_(ctypes.Structure): + """class std::iterator< std::output_iterator_tag, void, void, void, void >""" + + +std.iterator_less__std_scope_output_iterator_tag_comma__void_comma__void_comma__void_comma__void__greater_ = iterator_less__std_scope_output_iterator_tag_comma__void_comma__void_comma__void_comma__void__greater_ + +class locale(ctypes.Structure): + """class std::locale""" + + class _Impl(ctypes.Structure): + """class std::locale::_Impl""" + + class facet(ctypes.Structure): + """class std::locale::facet""" + + class id(ctypes.Structure): + """class std::locale::id""" + +std.locale = locale + +class nothrow_t(ctypes.Structure): + """class std::nothrow_t""" + + +std.nothrow_t = nothrow_t + +class __num_get_type(ctypes.Structure): + """class std::num_get< char, std::istreambuf_iterator< char, std::char_traits< char > > >""" + + +std.__num_get_type = __num_get_type + +class __num_get_type(ctypes.Structure): + """class std::num_get< wchar_t, std::istreambuf_iterator< wchar_t, std::char_traits< wchar_t > > >""" + + +std.__num_get_type = __num_get_type + +class __num_put_type(ctypes.Structure): + """class std::num_put< char, std::ostreambuf_iterator< char, std::char_traits< char > > >""" + + +std.__num_put_type = __num_put_type + +class __num_put_type(ctypes.Structure): + """class std::num_put< wchar_t, std::ostreambuf_iterator< wchar_t, std::char_traits< wchar_t > > >""" + + +std.__num_put_type = __num_put_type + +class numpunct_less__char__greater_(ctypes.Structure): + """class std::numpunct< char >""" + + +std.numpunct_less__char__greater_ = numpunct_less__char__greater_ + +class numpunct_less__wchar_t__greater_(ctypes.Structure): + """class std::numpunct< wchar_t >""" + + +std.numpunct_less__wchar_t__greater_ = numpunct_less__wchar_t__greater_ + +class numpunct_byname_less__char__greater_(ctypes.Structure): + """class std::numpunct_byname< char >""" + + +std.numpunct_byname_less__char__greater_ = numpunct_byname_less__char__greater_ + +class numpunct_byname_less__wchar_t__greater_(ctypes.Structure): + """class std::numpunct_byname< wchar_t >""" + + +std.numpunct_byname_less__wchar_t__greater_ = numpunct_byname_less__wchar_t__greater_ + +class output_iterator_tag(ctypes.Structure): + """class std::output_iterator_tag""" + + +std.output_iterator_tag = output_iterator_tag + +class random_access_iterator_tag(ctypes.Structure): + """class std::random_access_iterator_tag""" + + +std.random_access_iterator_tag = random_access_iterator_tag + +class timespec(ctypes.Structure): + """class timespec""" + +class tm(ctypes.Structure): + """class tm""" + +class basic_istringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_istringstream< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" + _fields_ = [] +std.basic_istringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_istringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ + +class basic_ifstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_ifstream< char, std::char_traits< char > >""" + _fields_ = [] +std.basic_ifstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ifstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class money_base(ctypes.Structure): + """class declaration std::money_base""" + _fields_ = [] +std.money_base = money_base + +class time_base(ctypes.Structure): + """class declaration std::time_base""" + _fields_ = [] +std.time_base = time_base + +class basic_istringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_istringstream< char, std::char_traits< char >, std::allocator< char > >""" + _fields_ = [] +std.basic_istringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_istringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ + +class basic_stringbuf_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_stringbuf< char, std::char_traits< char >, std::allocator< char > >""" + _fields_ = [] +std.basic_stringbuf_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_stringbuf_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ + +class basic_ostringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_ostringstream< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" + _fields_ = [] +std.basic_ostringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_ostringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ + +class messages_base(ctypes.Structure): + """class declaration std::messages_base""" + _fields_ = [] +std.messages_base = messages_base + +class basic_stringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_stringstream< char, std::char_traits< char >, std::allocator< char > >""" + _fields_ = [] +std.basic_stringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_stringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ + +class __numpunct_cache_less__wchar_t__greater_(ctypes.Structure): + """class declaration std::__numpunct_cache< wchar_t >""" + _fields_ = [] +std.__numpunct_cache_less__wchar_t__greater_ = __numpunct_cache_less__wchar_t__greater_ + +class __numpunct_cache_less__char__greater_(ctypes.Structure): + """class declaration std::__numpunct_cache< char >""" + _fields_ = [] +std.__numpunct_cache_less__char__greater_ = __numpunct_cache_less__char__greater_ + +class basic_stringbuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_stringbuf< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" + _fields_ = [] +std.basic_stringbuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_stringbuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ + +class basic_ofstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_ofstream< wchar_t, std::char_traits< wchar_t > >""" + _fields_ = [] +std.basic_ofstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ofstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class basic_ofstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_ofstream< char, std::char_traits< char > >""" + _fields_ = [] +std.basic_ofstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ofstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class basic_stringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_stringstream< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" + _fields_ = [] +std.basic_stringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_stringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ + +class basic_ostringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_ostringstream< char, std::char_traits< char >, std::allocator< char > >""" + _fields_ = [] +std.basic_ostringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_ostringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ + +class basic_fstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_fstream< wchar_t, std::char_traits< wchar_t > >""" + _fields_ = [] +std.basic_fstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_fstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class basic_fstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_fstream< char, std::char_traits< char > >""" + _fields_ = [] +std.basic_fstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_fstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class istreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::istreambuf_iterator< wchar_t, std::char_traits< wchar_t > >""" + _fields_ = [] +std.istreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = istreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class istreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class declaration std::istreambuf_iterator< char, std::char_traits< char > >""" + _fields_ = [] +std.istreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = istreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class basic_ifstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_ifstream< wchar_t, std::char_traits< wchar_t > >""" + _fields_ = [] +std.basic_ifstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ifstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class basic_filebuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::basic_filebuf< wchar_t, std::char_traits< wchar_t > >""" + _fields_ = [] +std.basic_filebuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_filebuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class basic_filebuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class declaration std::basic_filebuf< char, std::char_traits< char > >""" + _fields_ = [] +std.basic_filebuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_filebuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_(ctypes.Structure): + """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< const wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > > >""" + _fields_ = [] +std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ + +class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_(ctypes.Structure): + """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > > >""" + _fields_ = [] +std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ + +class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_(ctypes.Structure): + """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< const char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >""" + _fields_ = [] +std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ + +class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_(ctypes.Structure): + """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >""" + _fields_ = [] +std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ + +class fpos_less____mbstate_t__greater_(ctypes.Structure): + """class declaration std::fpos< __mbstate_t >""" + _fields_ = [] +std.fpos_less____mbstate_t__greater_ = fpos_less____mbstate_t__greater_ + +class codecvt_base(ctypes.Structure): + """class declaration std::codecvt_base""" + _fields_ = [] +std.codecvt_base = codecvt_base + +class codecvt_less__wchar_t_comma__char_comma____mbstate_t__greater_(ctypes.Structure): + """class declaration std::codecvt< wchar_t, char, __mbstate_t >""" + _fields_ = [] +std.codecvt_less__wchar_t_comma__char_comma____mbstate_t__greater_ = codecvt_less__wchar_t_comma__char_comma____mbstate_t__greater_ + +class codecvt_less__char_comma__char_comma____mbstate_t__greater_(ctypes.Structure): + """class declaration std::codecvt< char, char, __mbstate_t >""" + _fields_ = [] +std.codecvt_less__char_comma__char_comma____mbstate_t__greater_ = codecvt_less__char_comma__char_comma____mbstate_t__greater_ + +class __iter_swap_less___obrace__obrace_std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_greater__scope___value__ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__Iter_greater__scope_reference_greater__scope___value_cbrace___ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_reference_greater__scope___value_cbrace___greater_(ctypes.Structure): + """class declaration std::__iter_swap< ((std::__are_same<typename std::iterator_traits<_Iter>::value_type,typename std::iterator_traits<_ForwardIterator2>::value_type>::__value && std::__are_same<typename std::iterator_traits<_Iter>::value_type&,typename std::iterator_traits<_Iter>::reference>::__value) && std::__are_same<typename std::iterator_traits<_ForwardIterator2>::value_type&,typename std::iterator_traits<_ForwardIterator2>::reference>::__value) >""" + _fields_ = [] +std.__iter_swap_less___obrace__obrace_std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_greater__scope___value__ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__Iter_greater__scope_reference_greater__scope___value_cbrace___ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_reference_greater__scope___value_cbrace___greater_ = __iter_swap_less___obrace__obrace_std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_greater__scope___value__ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__Iter_greater__scope_reference_greater__scope___value_cbrace___ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_reference_greater__scope___value_cbrace___greater_ + +class ostreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): + """class declaration std::ostreambuf_iterator< wchar_t, std::char_traits< wchar_t > >""" + _fields_ = [] +std.ostreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = ostreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ + +class ostreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): + """class declaration std::ostreambuf_iterator< char, std::char_traits< char > >""" + _fields_ = [] +std.ostreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = ostreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ + +class obstack(ctypes.Structure): + """class declaration obstack""" + _fields_ = [] + +class sigevent(ctypes.Structure): + """class declaration sigevent""" + _fields_ = [] + +class __numeric_traits_floating_less__short_int__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__numeric_traits_floating< short int >""" + _fields_ = [] +__gnu_cxx.__numeric_traits_floating_less__short_int__greater_ = __numeric_traits_floating_less__short_int__greater_ + +class __numeric_traits_floating_less__long_unsigned_int__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__numeric_traits_floating< long unsigned int >""" + _fields_ = [] +__gnu_cxx.__numeric_traits_floating_less__long_unsigned_int__greater_ = __numeric_traits_floating_less__long_unsigned_int__greater_ + +class __numeric_traits_floating_less__int__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__numeric_traits_floating< int >""" + _fields_ = [] +__gnu_cxx.__numeric_traits_floating_less__int__greater_ = __numeric_traits_floating_less__int__greater_ + +class __add_unsigned_less__wchar_t__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__add_unsigned< wchar_t >""" + _fields_ = [] +__gnu_cxx.__add_unsigned_less__wchar_t__greater_ = __add_unsigned_less__wchar_t__greater_ + +class __add_unsigned_less__bool__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__add_unsigned< bool >""" + _fields_ = [] +__gnu_cxx.__add_unsigned_less__bool__greater_ = __add_unsigned_less__bool__greater_ + +class __enable_if_less__!_std_scope___is_char_less__CharT2_greater__scope___value_comma__int__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__enable_if< ! std::__is_char<_CharT2>::__value, int >""" + _fields_ = [] +__gnu_cxx.__enable_if_less__!_std_scope___is_char_less__CharT2_greater__scope___value_comma__int__greater_ = __enable_if_less__!_std_scope___is_char_less__CharT2_greater__scope___value_comma__int__greater_ + +class __enable_if_less__!_std_scope___is_scalar_less__Tp_greater__scope___value_comma__void__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__enable_if< ! std::__is_scalar<_Tp>::__value, void >""" + _fields_ = [] +__gnu_cxx.__enable_if_less__!_std_scope___is_scalar_less__Tp_greater__scope___value_comma__void__greater_ = __enable_if_less__!_std_scope___is_scalar_less__Tp_greater__scope___value_comma__void__greater_ + +class __remove_unsigned_less__wchar_t__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__remove_unsigned< wchar_t >""" + _fields_ = [] +__gnu_cxx.__remove_unsigned_less__wchar_t__greater_ = __remove_unsigned_less__wchar_t__greater_ + +class __remove_unsigned_less__bool__greater_(ctypes.Structure): + """class declaration __gnu_cxx::__remove_unsigned< bool >""" + _fields_ = [] +__gnu_cxx.__remove_unsigned_less__bool__greater_ = __remove_unsigned_less__bool__greater_ + +class __normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_(ctypes.Structure): + """class declaration __gnu_cxx::__normal_iterator< wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > >""" + _fields_ = [] +__gnu_cxx.__normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ = __normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ + +class __normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_(ctypes.Structure): + """class declaration __gnu_cxx::__normal_iterator< const wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > >""" + _fields_ = [] +__gnu_cxx.__normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ = __normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ + +class __normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_(ctypes.Structure): + """class declaration __gnu_cxx::__normal_iterator< char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > >""" + _fields_ = [] +__gnu_cxx.__normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ = __normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ + +class __normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_(ctypes.Structure): + """class declaration __gnu_cxx::__normal_iterator< const char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > >""" + _fields_ = [] +__gnu_cxx.__normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ = __normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ + +class _IO_jump_t(ctypes.Structure): + """class declaration _IO_jump_t""" + _fields_ = [] + +class __jmp_buf_tag(ctypes.Structure): + """class declaration __jmp_buf_tag""" + _fields_ = [] + +class locale_data(ctypes.Structure): + """class declaration locale_data""" + _fields_ = [] + +class _IO_cookie_file(ctypes.Structure): + """class declaration _IO_cookie_file""" + _fields_ = [] + +class _IO_FILE_plus(ctypes.Structure): + """class declaration _IO_FILE_plus""" + _fields_ = [] + +std.collate_byname_less__wchar_t__greater_._fields_ = [ #class std::collate_byname< wchar_t > + ("__empty__", ctypes.c_char * 4) ] +std.collate_byname_less__char__greater_._fields_ = [ #class std::collate_byname< char > + ("__empty__", ctypes.c_char * 4) +] + +std.bad_exception._fields_ = [ #class std::bad_exception + ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), + ("__empty__", ctypes.c_char * 4) +] + +std.wstring._fields_ = [ #class std::wstring + ("npos", ctypes.c_uint), + ("_M_dataplus", std.wstring._Alloc_hider), +] + +std.wstring._Rep_base._fields_ = [ #class std::wstring::_Rep_base + ("_M_length", ctypes.c_uint), + ("_M_capacity", ctypes.c_uint), + ("_M_refcount", ctypes.c_int), +] + +std.wstring._Rep._fields_ = [ #class std::wstring::_Rep + ("_S_max_size", ctypes.c_uint), + ("_S_terminal", ctypes.c_wchar), + ("_S_empty_rep_storage", ( ctypes.c_uint * 4 )), +] + +std.wstring._Alloc_hider._fields_ = [ #class std::wstring::_Alloc_hider + ("_M_p", ctypes.c_wchar_p), +] + +std.basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_._fields_ = [ #class std::basic_istream< char, std::char_traits< char > > + ("_M_gcount", ctypes.c_int), +] + +std.basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_.sentry._fields_ = [ #class std::basic_istream< char, std::char_traits< char > >::sentry + ("_M_ok", ctypes.c_bool), +] + +std.basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_._fields_ = [ #class std::basic_streambuf< wchar_t, std::char_traits< wchar_t > > + ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), + ("_M_in_beg", ctypes.c_wchar_p), + ("_M_in_cur", ctypes.c_wchar_p), + ("_M_in_end", ctypes.c_wchar_p), + ("_M_out_beg", ctypes.c_wchar_p), + ("_M_out_cur", ctypes.c_wchar_p), + ("_M_out_end", ctypes.c_wchar_p), + ("_M_buf_locale", std.locale), +] + +std.basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_._fields_ = [ #class std::basic_streambuf< char, std::char_traits< char > > + ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), + ("_M_in_beg", ctypes.c_char_p), + ("_M_in_cur", ctypes.c_char_p), + ("_M_in_end", ctypes.c_char_p), + ("_M_out_beg", ctypes.c_char_p), + ("_M_out_cur", ctypes.c_char_p), + ("_M_out_end", ctypes.c_char_p), + ("_M_buf_locale", std.locale), +] + +std.input_iterator_tag._fields_ = [ #class std::input_iterator_tag + ("__empty__", ctypes.c_char * 4) +] + +std.__copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_._fields_ = [ #class std::__copy_move< false, false, std::random_access_iterator_tag > + ("__empty__", ctypes.c_char * 4) +] + +std.__false_type._fields_ = [ #class std::__false_type + ("__empty__", ctypes.c_char * 4) +] + +std.collate_less__wchar_t__greater_._fields_ = [ #class std::collate< wchar_t > + ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), + ("_M_c_locale_collate", ctypes.POINTER( __locale_struct )), + ("id", std.locale.id), +] + +std.collate_less__char__greater_._fields_ = [ #class std::collate< char > + ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), + ("_M_c_locale_collate", ctypes.POINTER( __locale_struct )), + ("id", std.locale.id), +] + +std.__lexicographical_compare_less__true__greater_._fields_ = [ #class std::__lexicographical_compare< true > + ("__empty__", ctypes.c_char * 4) +] + +std.basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_... [truncated message content] |
From: <rom...@us...> - 2009-01-13 23:29:52
|
Revision: 1567 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1567&view=rev Author: roman_yakovenko Date: 2009-01-13 23:29:45 +0000 (Tue, 13 Jan 2009) Log Message: ----------- adding support for anonymous structs Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py pyplusplus_dev/pyplusplus/code_creators/fields_definition.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp pyplusplus_dev/unittests/sconstruct Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes/anonymous/ pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript pyplusplus_dev/unittests/data/ctypes/include_algorithm/ pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript Modified: pyplusplus_dev/pyplusplus/code_creators/class_introduction.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/code_creators/class_introduction.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -9,14 +9,26 @@ import declaration_based from pygccxml import declarations +ctypes_base_classes = { + declarations.CLASS_TYPES.CLASS : 'Structure' + , declarations.CLASS_TYPES.UNION : 'Union' + , declarations.CLASS_TYPES.STRUCT : 'Structure' +} + class class_introduction_t(compound.compound_t, declaration_based.declaration_based_t): def __init__( self, class_ ): compound.compound_t.__init__(self) declaration_based.declaration_based_t.__init__( self, class_ ) + @property + def ctypes_base_class( self ): + global ctypes_base_classes + return ctypes_base_classes[ self.declaration.class_type ] + def _create_impl(self): result = [] - result.append( "class %s(ctypes.Structure):" % self.alias ) + result.append( "class %(alias)s(ctypes.%(base)s):" + % dict( alias=self.alias, base=self.ctypes_base_class ) ) result.append( self.indent( '"""class %s"""' % self.decl_identifier ) ) if self.creators: result.append( self.indent( '' ) ) Modified: pyplusplus_dev/pyplusplus/code_creators/fields_definition.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/code_creators/fields_definition.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -4,6 +4,7 @@ # http://www.boost.org/LICENSE_1_0.txt) import os +import algorithm import code_creator import ctypes_formatter import declaration_based @@ -19,8 +20,29 @@ code_creator.code_creator_t.__init__(self) declaration_based.declaration_based_t.__init__( self, class_ ) + def has_unnamed_type( self, var ): + type_ = declarations.remove_pointer( var.type ) + #~ type_ = declarations.remove_declarated( type_ ) + if declarations.class_traits.is_my_case( type_ ): + cls = declarations.class_traits.get_declaration( type_ ) + return bool( not cls.name ) + else: + return False + def _create_impl(self): result = [] + #~ import pdb + #~ pdb.set_trace() + + anonymous_vars = self.declaration.vars( self.has_unnamed_type, recursive=False, allow_empty=True ) + if anonymous_vars: + formated_vars = [] + for var in anonymous_vars: + formated_vars.append( '"%s"' % var.alias ) + result.append( '%(complete_py_name)s._anonymous_ = [%(vars)s]' + % dict( complete_py_name=self.complete_py_name + , vars=', '.join( formated_vars ) ) ) + result.append( '%(complete_py_name)s._fields_ = [ #class %(decl_identifier)s' % dict( complete_py_name=self.complete_py_name , decl_identifier=self.decl_identifier) ) @@ -35,7 +57,7 @@ vars.sort( key=lambda d: d.location.line ) for v in vars: result.append( self.indent( '("%(name)s", %(type)s),' - % dict( name=v.name + % dict( name=v.alias ,type=ctypes_formatter.as_ctype( v.type ) ) ) ) result.append( ']' ) return os.linesep.join( result ) Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -235,8 +235,6 @@ def visit_class(self): self.__dependencies_manager.add_exported( self.curr_decl ) if not self.curr_decl.opaque: - #fields definition should be recursive using the visitor - self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) if self.curr_decl.calldefs( self.__should_generate_code, recursive=False, allow_empty=True ): md_cc = code_creators.methods_definition_t( self.curr_decl ) self.__class2methods_def[ self.curr_decl ] = md_cc @@ -247,6 +245,9 @@ self.curr_decl = decl declarations.apply_visitor( self, decl ) self.curr_decl = class_ + #fields definition should be recursive using the visitor + #internal classes fields should be defined first + self.__class_defs_ccs.adopt_creator( code_creators.fields_definition_t( self.curr_decl ) ) else: cls_intro_cc = self.__class2introduction[ self.curr_decl ] cls_intro_cc.adopt_creator( code_creators.opaque_init_introduction_t( self.curr_decl ) ) Modified: pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/pyplusplus/module_builder/ctypes_builder.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -58,7 +58,7 @@ self.global_ns = self.__parse_declarations( files, gccxml_config ) self.__blob2decl = binary_parsers.merge_information( self.global_ns, exported_symbols_file ) - self.__include_declarations() + self.__apply_defaults() self.__code_creator = None if optimize_queries: @@ -89,7 +89,7 @@ continue self.logger.debug( 'discovered dependency %s - included' % str(dependency) ) dd = traits.get_declaration( dependency ) - dd.ignore = False + dd.include() def __include_parent_classes( self, decl ): self.logger.debug( 'including decl %s' % str(decl) ) @@ -99,7 +99,7 @@ break else: self.logger.debug( 'including parent class %s' % str(parent) ) - parent.ignore = False + parent.include() parent = parent.parent def __include_declarations( self ): @@ -113,6 +113,15 @@ self.__include_dependencies( d ) self.logger.debug( 'including decl %s - done' % str(d) ) + def __apply_defaults( self ): + self.__include_declarations() + anonymous_classes = self.global_ns.classes( '', recursive=True, allow_empty=True ) + anonymous_classes.alias = '_' + #TODO: check whether the anonymous class unique or not + #if 1 == len( anonymous.parent.classes( '', recursive=False ) ): + anonymous_vars = self.global_ns.vars( '', recursive=True, allow_empty=True ) + anonymous_vars.alias = '_' + def build_code_creator( self, library_path, doc_extractor=None ): creator = creators_factory.ctypes_creator_t( self.global_ns , library_path Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-13 23:29:45 UTC (rev 1567) @@ -141,9 +141,29 @@ udt = self.module_ref.create() self.failUnless( 1977 == self.module_ref.read_user_data(udt) ) self.module_ref.destroy( udt ) + +class include_algorithm_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'include_algorithm', *args, **keywd ) + def customize( self, mb ): + self.failUnless( mb.global_ns.class_( 'io_marker_t' ).ignore == False ) + def test(self): + self.failUnless( mb.module_ref.io_marker_t ) +class anonymous_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'anonymous', *args, **keywd ) + + def customize( self, mb ): + mb.class_( 'rgbai' ).include() + + def test(self): + c = self.module_ref.color() + c.r + c.val + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: @@ -151,6 +171,8 @@ suite.addTest( unittest.makeSuite(issues_tester_t)) suite.addTest( unittest.makeSuite(enums_tester_t)) suite.addTest( unittest.makeSuite(opaque_tester_t)) + suite.addTest( unittest.makeSuite(include_algorithm_tester_t)) + suite.addTest( unittest.makeSuite(anonymous_tester_t)) return suite def run_suite(): Added: pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,3 @@ +#include "anonymous.h" + +void do_smth( color ){} Added: pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,26 @@ +#pragma once +#include "libconfig.h" + + +struct EXPORT_SYMBOL rgbai{ + struct { + float r,g,b,a; + }; + int i; +}; + +struct EXPORT_SYMBOL color{ + union{ + struct { + float r,g,b,a; + }; + float val[4]; + }; +}; + +struct { + int x; +} unnamed_struct_with_mem_var_x; + +void EXPORT_SYMBOL do_smth( color ); + Added: pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/anonymous/sconscript 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,5 @@ +Import('*') + +target_name = 'anonymous' +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) +env.Alias( target_name, shlib ) Added: pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.cpp 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,5 @@ +#include "include_algorithm.h" + +void do_nothing( io_file_t* ){ + return; +} Added: pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/include_algorithm/include_algorithm.h 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,11 @@ +#pragma once + +#include "libconfig.h" + +struct EXPORT_SYMBOL io_marker_t{}; + +struct EXPORT_SYMBOL io_file_t{ + io_marker_t* io_marker; +}; + +void EXPORT_SYMBOL do_nothing( io_file_t* ); Added: pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/include_algorithm/sconscript 2009-01-13 23:29:45 UTC (rev 1567) @@ -0,0 +1,5 @@ +Import('*') + +target_name = 'include_algorithm' +shlib = env.SharedLibrary( target=target_name, source=[ target_name + '.cpp' ] ) +env.Alias( target_name, shlib ) Modified: pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/data/ctypes/opaque/opaque.h 2009-01-13 23:29:45 UTC (rev 1567) @@ -1,10 +1,12 @@ #pragma once -struct user_data_t{ +#include "libconfig.h" + +struct EXPORT_SYMBOL user_data_t{ int i; }; -user_data_t* create(); -int read_user_data(user_data_t*); -void destroy(user_data_t*); +user_data_t* EXPORT_SYMBOL create(); +int EXPORT_SYMBOL read_user_data(user_data_t*); +void EXPORT_SYMBOL destroy(user_data_t*); Modified: pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp 2009-01-13 23:29:45 UTC (rev 1567) @@ -6,9 +6,11 @@ #ifndef __unnamed_enums_to_be_exported_hpp__ #define __unnamed_enums_to_be_exported_hpp__ +#include "libconfig.h" + namespace unnamed_enums{ -struct color{ +struct EXPORT_SYMBOL color{ union{ struct { float r,g,b,a; @@ -17,10 +19,12 @@ }; }; -struct{ +struct { int x; } unnamed_struct_with_mem_var_x; +void EXPORT_SYMBOL do_smth( color ){} + } #endif//__unnamed_enums_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/sconstruct =================================================================== --- pyplusplus_dev/unittests/sconstruct 2009-01-13 15:36:40 UTC (rev 1566) +++ pyplusplus_dev/unittests/sconstruct 2009-01-13 23:29:45 UTC (rev 1567) @@ -13,7 +13,9 @@ env.AppendUnique( CCFLAGS=[ r"/MD",r"/EHsc",r"/GR",r"/Zc:wchar_t",r"/Zc:forScope" ] ) env.AppendUnique( LINKFLAGS=[r"/MAP:${TARGET.base}.map", r"/MAPINFO:EXPORTS"] ) -scripts = [ 'pof', 'issues', 'enums', 'opaque' ] +env.AppendUnique( CPPPATH=['#data'] ) + +scripts = [ 'pof', 'issues', 'enums', 'opaque', 'include_algorithm', 'anonymous' ] for s in scripts: SConscript( 'data/ctypes/%s/sconscript' % s , variant_dir='data/ctypes/%s/binaries' % s This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-14 19:30:17
|
Revision: 1573 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1573&view=rev Author: roman_yakovenko Date: 2009-01-14 19:30:12 +0000 (Wed, 14 Jan 2009) Log Message: ----------- making gmp example to work Modified Paths: -------------- pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.cpp pyplusplus_dev/unittests/data/ctypes/anonymous/anonymous.h Modified: pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py 2009-01-14 15:14:35 UTC (rev 1572) +++ pyplusplus_dev/examples/gmplib_dev/dev/generate_code.py 2009-01-14 19:30:12 UTC (rev 1573) @@ -25,12 +25,12 @@ for f in mb.calldefs( lambda x: x.name.startswith('__gmp') ): f.alias = f.name[2:] -#there is a bug in "include" algorithm - I need to wrote DFS +#there is a bug in "include" algorithm - I need to wrote BFS mb.class_( '_IO_FILE' ).opaque = True +#another dependency bug - internal union is not included +mb.class_( '__gmp_randstate_struct' ).include() -#include should work as expected - include only exported function -#~ mb.print_declarations() mb.build_code_creator( project_env.gmp.shared_library_file ) mb.write_module( os.path.join( project_env.gmp.generated_code_dir, '__init__.py' ) ) Modified: pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py =================================================================== --- pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-01-14 15:14:35 UTC (rev 1572) +++ pyplusplus_dev/examples/gmplib_dev/pygmplib/__init__.py 2009-01-14 19:30:12 UTC (rev 1573) @@ -617,217 +617,22 @@ "__gmpf_init_set_str" : "extern int __gmpf_init_set_str(mpf_ptr arg0, char const * arg1, int arg2) [free function]", } -class std: - """namespace std""" - -class __gnu_cxx: - """namespace __gnu_cxx""" - -class __cxxabiv1: - """namespace __cxxabiv1""" - class gmp_randalg_t( ctypes_utils.Enumeration ): GMP_RAND_ALG_DEFAULT = 0 GMP_RAND_ALG_LC = 0 -class (ctypes.Structure): - """class """ - - class (ctypes.Structure): - """class """ - -class _G_fpos64_t(ctypes.Structure): - """class _G_fpos64_t""" - -class _G_fpos_t(ctypes.Structure): - """class _G_fpos_t""" - class _IO_FILE(ctypes.Structure): """class _IO_FILE""" def __init__( self, *args, **keywd ): raise RuntimeError( "Unable to create instance of opaque type." ) -class _IO_cookie_io_functions_t(ctypes.Structure): - """class _IO_cookie_io_functions_t""" - -class _IO_marker(ctypes.Structure): - """class _IO_marker""" - -class __base_class_type_info_pseudo(ctypes.Structure): - """class __base_class_type_info_pseudo""" - -class __class_type_info_pseudo(ctypes.Structure): - """class __class_type_info_pseudo""" - -class __forced_unwind(ctypes.Structure): - """class __cxxabiv1::__forced_unwind""" - - -__cxxabiv1.__forced_unwind = __forced_unwind - -class __fsid_t(ctypes.Structure): - """class __fsid_t""" - class __gmp_randstate_struct(ctypes.Structure): """class __gmp_randstate_struct""" - class (ctypes.Structure): + class _(ctypes.Union): """class __gmp_randstate_struct""" -class __add_unsigned_less__char__greater_(ctypes.Structure): - """class __gnu_cxx::__add_unsigned< char >""" - - -__gnu_cxx.__add_unsigned_less__char__greater_ = __add_unsigned_less__char__greater_ - -class __add_unsigned_less__int__greater_(ctypes.Structure): - """class __gnu_cxx::__add_unsigned< int >""" - - -__gnu_cxx.__add_unsigned_less__int__greater_ = __add_unsigned_less__int__greater_ - -class __add_unsigned_less__long_long__greater_(ctypes.Structure): - """class __gnu_cxx::__add_unsigned< long long >""" - - -__gnu_cxx.__add_unsigned_less__long_long__greater_ = __add_unsigned_less__long_long__greater_ - -class __add_unsigned_less__long__greater_(ctypes.Structure): - """class __gnu_cxx::__add_unsigned< long >""" - - -__gnu_cxx.__add_unsigned_less__long__greater_ = __add_unsigned_less__long__greater_ - -class __add_unsigned_less__short__greater_(ctypes.Structure): - """class __gnu_cxx::__add_unsigned< short >""" - - -__gnu_cxx.__add_unsigned_less__short__greater_ = __add_unsigned_less__short__greater_ - -class __add_unsigned_less__signed_char__greater_(ctypes.Structure): - """class __gnu_cxx::__add_unsigned< signed char >""" - - -__gnu_cxx.__add_unsigned_less__signed_char__greater_ = __add_unsigned_less__signed_char__greater_ - -class __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__int__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__int__greater___greater_(ctypes.Structure): - """class __gnu_cxx::__conditional_type< true, __gnu_cxx::__numeric_traits_integer< int >, __gnu_cxx::__numeric_traits_floating< int > >""" - - -__gnu_cxx.__conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__int__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__int__greater___greater_ = __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__int__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__int__greater___greater_ - -class __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__short__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__short__greater___greater_(ctypes.Structure): - """class __gnu_cxx::__conditional_type< true, __gnu_cxx::__numeric_traits_integer< short >, __gnu_cxx::__numeric_traits_floating< short > >""" - - -__gnu_cxx.__conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__short__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__short__greater___greater_ = __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__short__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__short__greater___greater_ - -class __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__unsigned_long__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__unsigned_long__greater___greater_(ctypes.Structure): - """class __gnu_cxx::__conditional_type< true, __gnu_cxx::__numeric_traits_integer< unsigned long >, __gnu_cxx::__numeric_traits_floating< unsigned long > >""" - - -__gnu_cxx.__conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__unsigned_long__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__unsigned_long__greater___greater_ = __conditional_type_less__true_comma____gnu_cxx_scope___numeric_traits_integer_less__unsigned_long__greater__comma____gnu_cxx_scope___numeric_traits_floating_less__unsigned_long__greater___greater_ - -class __conditional_type_less__true_comma__unsigned_long_comma__unsigned_long_long__greater_(ctypes.Structure): - """class __gnu_cxx::__conditional_type< true, unsigned long, unsigned long long >""" - - -__gnu_cxx.__conditional_type_less__true_comma__unsigned_long_comma__unsigned_long_long__greater_ = __conditional_type_less__true_comma__unsigned_long_comma__unsigned_long_long__greater_ - -class __type(ctypes.Structure): - """class __gnu_cxx::__numeric_traits_integer< int >""" - - -__gnu_cxx.__type = __type - -class __numeric_traits_less__int__greater_(ctypes.Structure): - """class __gnu_cxx::__numeric_traits< int >""" - - -__gnu_cxx.__numeric_traits_less__int__greater_ = __numeric_traits_less__int__greater_ - -class __type(ctypes.Structure): - """class __gnu_cxx::__numeric_traits_integer< short >""" - - -__gnu_cxx.__type = __type - -class __numeric_traits_less__short__greater_(ctypes.Structure): - """class __gnu_cxx::__numeric_traits< short >""" - - -__gnu_cxx.__numeric_traits_less__short__greater_ = __numeric_traits_less__short__greater_ - -class __type(ctypes.Structure): - """class __gnu_cxx::__numeric_traits_integer< unsigned long >""" - - -__gnu_cxx.__type = __type - -class __numeric_traits_less__unsigned_long__greater_(ctypes.Structure): - """class __gnu_cxx::__numeric_traits< unsigned long >""" - - -__gnu_cxx.__numeric_traits_less__unsigned_long__greater_ = __numeric_traits_less__unsigned_long__greater_ - -class __remove_unsigned_less__char__greater_(ctypes.Structure): - """class __gnu_cxx::__remove_unsigned< char >""" - - -__gnu_cxx.__remove_unsigned_less__char__greater_ = __remove_unsigned_less__char__greater_ - -class __remove_unsigned_less__unsigned_char__greater_(ctypes.Structure): - """class __gnu_cxx::__remove_unsigned< unsigned char >""" - - -__gnu_cxx.__remove_unsigned_less__unsigned_char__greater_ = __remove_unsigned_less__unsigned_char__greater_ - -class __remove_unsigned_less__unsigned_int__greater_(ctypes.Structure): - """class __gnu_cxx::__remove_unsigned< unsigned int >""" - - -__gnu_cxx.__remove_unsigned_less__unsigned_int__greater_ = __remove_unsigned_less__unsigned_int__greater_ - -class __remove_unsigned_less__unsigned_long_long__greater_(ctypes.Structure): - """class __gnu_cxx::__remove_unsigned< unsigned long long >""" - - -__gnu_cxx.__remove_unsigned_less__unsigned_long_long__greater_ = __remove_unsigned_less__unsigned_long_long__greater_ - -class __remove_unsigned_less__unsigned_long__greater_(ctypes.Structure): - """class __gnu_cxx::__remove_unsigned< unsigned long >""" - - -__gnu_cxx.__remove_unsigned_less__unsigned_long__greater_ = __remove_unsigned_less__unsigned_long__greater_ - -class __remove_unsigned_less__unsigned_short__greater_(ctypes.Structure): - """class __gnu_cxx::__remove_unsigned< unsigned short >""" - - -__gnu_cxx.__remove_unsigned_less__unsigned_short__greater_ = __remove_unsigned_less__unsigned_short__greater_ - -class new_allocator_less__char__greater_(ctypes.Structure): - """class __gnu_cxx::new_allocator< char >""" - - -__gnu_cxx.new_allocator_less__char__greater_ = new_allocator_less__char__greater_ - -class new_allocator_less__wchar_t__greater_(ctypes.Structure): - """class __gnu_cxx::new_allocator< wchar_t >""" - - -__gnu_cxx.new_allocator_less__wchar_t__greater_ = new_allocator_less__wchar_t__greater_ - -class __locale_struct(ctypes.Structure): - """class __locale_struct""" - -class __mbstate_t(ctypes.Structure): - """class __mbstate_t""" - - class (ctypes.Structure): - """class __mbstate_t""" - class __mpf_struct(ctypes.Structure): """class __mpf_struct""" @@ -837,1494 +642,6 @@ class __mpz_struct(ctypes.Structure): """class __mpz_struct""" -class __pthread_cleanup_class(ctypes.Structure): - """class __pthread_cleanup_class""" - -class __pthread_cleanup_frame(ctypes.Structure): - """class __pthread_cleanup_frame""" - -class __pthread_internal_slist(ctypes.Structure): - """class __pthread_internal_slist""" - -class __sched_param(ctypes.Structure): - """class __sched_param""" - -class __si_class_type_info_pseudo(ctypes.Structure): - """class __si_class_type_info_pseudo""" - -class __sigset_t(ctypes.Structure): - """class __sigset_t""" - -class __type_info_pseudo(ctypes.Structure): - """class __type_info_pseudo""" - -class __vmi_class_type_info_pseudo1(ctypes.Structure): - """class __vmi_class_type_info_pseudo1""" - -class __vmi_class_type_info_pseudo2(ctypes.Structure): - """class __vmi_class_type_info_pseudo2""" - -class _pthread_cleanup_buffer(ctypes.Structure): - """class _pthread_cleanup_buffer""" - -class cpu_set_t(ctypes.Structure): - """class cpu_set_t""" - -class itimerspec(ctypes.Structure): - """class itimerspec""" - -class lconv(ctypes.Structure): - """class lconv""" - -class pthread_attr_t(ctypes.Structure): - """class pthread_attr_t""" - -class pthread_barrier_t(ctypes.Structure): - """class pthread_barrier_t""" - -class pthread_barrierattr_t(ctypes.Structure): - """class pthread_barrierattr_t""" - -class pthread_cond_t(ctypes.Structure): - """class pthread_cond_t""" - - class (ctypes.Structure): - """class pthread_cond_t""" - -class pthread_condattr_t(ctypes.Structure): - """class pthread_condattr_t""" - -class pthread_mutex_t(ctypes.Structure): - """class pthread_mutex_t""" - - class __pthread_mutex_s(ctypes.Structure): - """class pthread_mutex_t::__pthread_mutex_s""" - - class (ctypes.Structure): - """class pthread_mutex_t::__pthread_mutex_s""" - -class pthread_mutexattr_t(ctypes.Structure): - """class pthread_mutexattr_t""" - -class pthread_rwlock_t(ctypes.Structure): - """class pthread_rwlock_t""" - - class (ctypes.Structure): - """class pthread_rwlock_t""" - -class pthread_rwlockattr_t(ctypes.Structure): - """class pthread_rwlockattr_t""" - -class sched_param(ctypes.Structure): - """class sched_param""" - -class __copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_(ctypes.Structure): - """class std::__copy_move< false, false, std::random_access_iterator_tag >""" - - -std.__copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ = __copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ - -class __copy_move_backward_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_(ctypes.Structure): - """class std::__copy_move_backward< false, false, std::random_access_iterator_tag >""" - - -std.__copy_move_backward_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ = __copy_move_backward_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_ - -class ctype_base(ctypes.Structure): - """class std::ctype_base""" - - -std.ctype_base = ctype_base - -class __ctype_abstract_base_less__wchar_t__greater_(ctypes.Structure): - """class std::__ctype_abstract_base< wchar_t >""" - - -std.__ctype_abstract_base_less__wchar_t__greater_ = __ctype_abstract_base_less__wchar_t__greater_ - -class __equal_less__true__greater_(ctypes.Structure): - """class std::__equal< true >""" - - -std.__equal_less__true__greater_ = __equal_less__true__greater_ - -class __false_type(ctypes.Structure): - """class std::__false_type""" - - -std.__false_type = __false_type - -class __is_byte_less__char__greater_(ctypes.Structure): - """class std::__is_byte< char >""" - - -std.__is_byte_less__char__greater_ = __is_byte_less__char__greater_ - -class __is_byte_less__signed_char__greater_(ctypes.Structure): - """class std::__is_byte< signed char >""" - - -std.__is_byte_less__signed_char__greater_ = __is_byte_less__signed_char__greater_ - -class __is_byte_less__unsigned_char__greater_(ctypes.Structure): - """class std::__is_byte< unsigned char >""" - - -std.__is_byte_less__unsigned_char__greater_ = __is_byte_less__unsigned_char__greater_ - -class __is_char_less__char__greater_(ctypes.Structure): - """class std::__is_char< char >""" - - -std.__is_char_less__char__greater_ = __is_char_less__char__greater_ - -class __is_char_less__wchar_t__greater_(ctypes.Structure): - """class std::__is_char< wchar_t >""" - - -std.__is_char_less__wchar_t__greater_ = __is_char_less__wchar_t__greater_ - -class __is_floating_less__double__greater_(ctypes.Structure): - """class std::__is_floating< double >""" - - -std.__is_floating_less__double__greater_ = __is_floating_less__double__greater_ - -class __is_floating_less__float__greater_(ctypes.Structure): - """class std::__is_floating< float >""" - - -std.__is_floating_less__float__greater_ = __is_floating_less__float__greater_ - -class __is_floating_less__long_double__greater_(ctypes.Structure): - """class std::__is_floating< long double >""" - - -std.__is_floating_less__long_double__greater_ = __is_floating_less__long_double__greater_ - -class __is_integer_less__bool__greater_(ctypes.Structure): - """class std::__is_integer< bool >""" - - -std.__is_integer_less__bool__greater_ = __is_integer_less__bool__greater_ - -class __is_integer_less__char__greater_(ctypes.Structure): - """class std::__is_integer< char >""" - - -std.__is_integer_less__char__greater_ = __is_integer_less__char__greater_ - -class __is_integer_less__int__greater_(ctypes.Structure): - """class std::__is_integer< int >""" - - -std.__is_integer_less__int__greater_ = __is_integer_less__int__greater_ - -class __is_integer_less__long_long__greater_(ctypes.Structure): - """class std::__is_integer< long long >""" - - -std.__is_integer_less__long_long__greater_ = __is_integer_less__long_long__greater_ - -class __is_integer_less__long__greater_(ctypes.Structure): - """class std::__is_integer< long >""" - - -std.__is_integer_less__long__greater_ = __is_integer_less__long__greater_ - -class __is_integer_less__short__greater_(ctypes.Structure): - """class std::__is_integer< short >""" - - -std.__is_integer_less__short__greater_ = __is_integer_less__short__greater_ - -class __is_integer_less__signed_char__greater_(ctypes.Structure): - """class std::__is_integer< signed char >""" - - -std.__is_integer_less__signed_char__greater_ = __is_integer_less__signed_char__greater_ - -class __is_integer_less__unsigned_char__greater_(ctypes.Structure): - """class std::__is_integer< unsigned char >""" - - -std.__is_integer_less__unsigned_char__greater_ = __is_integer_less__unsigned_char__greater_ - -class __is_integer_less__unsigned_int__greater_(ctypes.Structure): - """class std::__is_integer< unsigned int >""" - - -std.__is_integer_less__unsigned_int__greater_ = __is_integer_less__unsigned_int__greater_ - -class __is_integer_less__unsigned_long_long__greater_(ctypes.Structure): - """class std::__is_integer< unsigned long long >""" - - -std.__is_integer_less__unsigned_long_long__greater_ = __is_integer_less__unsigned_long_long__greater_ - -class __is_integer_less__unsigned_long__greater_(ctypes.Structure): - """class std::__is_integer< unsigned long >""" - - -std.__is_integer_less__unsigned_long__greater_ = __is_integer_less__unsigned_long__greater_ - -class __is_integer_less__unsigned_short__greater_(ctypes.Structure): - """class std::__is_integer< unsigned short >""" - - -std.__is_integer_less__unsigned_short__greater_ = __is_integer_less__unsigned_short__greater_ - -class __is_integer_less__wchar_t__greater_(ctypes.Structure): - """class std::__is_integer< wchar_t >""" - - -std.__is_integer_less__wchar_t__greater_ = __is_integer_less__wchar_t__greater_ - -class __is_void_less__void__greater_(ctypes.Structure): - """class std::__is_void< void >""" - - -std.__is_void_less__void__greater_ = __is_void_less__void__greater_ - -class __iter_swap_less__true__greater_(ctypes.Structure): - """class std::__iter_swap< true >""" - - -std.__iter_swap_less__true__greater_ = __iter_swap_less__true__greater_ - -class __lc_rai_less__std_scope_random_access_iterator_tag_comma__std_scope_random_access_iterator_tag__greater_(ctypes.Structure): - """class std::__lc_rai< std::random_access_iterator_tag, std::random_access_iterator_tag >""" - - -std.__lc_rai_less__std_scope_random_access_iterator_tag_comma__std_scope_random_access_iterator_tag__greater_ = __lc_rai_less__std_scope_random_access_iterator_tag_comma__std_scope_random_access_iterator_tag__greater_ - -class __lexicographical_compare_less__true__greater_(ctypes.Structure): - """class std::__lexicographical_compare< true >""" - - -std.__lexicographical_compare_less__true__greater_ = __lexicographical_compare_less__true__greater_ - -class __num_base(ctypes.Structure): - """class std::__num_base""" - - -std.__num_base = __num_base - -class __true_type(ctypes.Structure): - """class std::__true_type""" - - -std.__true_type = __true_type - -class __truth_type_less__true__greater_(ctypes.Structure): - """class std::__truth_type< true >""" - - -std.__truth_type_less__true__greater_ = __truth_type_less__true__greater_ - -class allocator_less__char__greater_(ctypes.Structure): - """class std::allocator< char >""" - - class rebind_less__char__greater_(ctypes.Structure): - """class std::allocator< char >::rebind< char >""" - -std.allocator_less__char__greater_ = allocator_less__char__greater_ - -class allocator_less__void__greater_(ctypes.Structure): - """class std::allocator< void >""" - - -std.allocator_less__void__greater_ = allocator_less__void__greater_ - -class allocator_less__wchar_t__greater_(ctypes.Structure): - """class std::allocator< wchar_t >""" - - class rebind_less__char__greater_(ctypes.Structure): - """class std::allocator< wchar_t >::rebind< char >""" - - class rebind_less__wchar_t__greater_(ctypes.Structure): - """class std::allocator< wchar_t >::rebind< wchar_t >""" - -std.allocator_less__wchar_t__greater_ = allocator_less__wchar_t__greater_ - -class exception(ctypes.Structure): - """class std::exception""" - - -std.exception = exception - -class bad_alloc(ctypes.Structure): - """class std::bad_alloc""" - - -std.bad_alloc = bad_alloc - -class bad_exception(ctypes.Structure): - """class std::bad_exception""" - - -std.bad_exception = bad_exception - -class ios_base(ctypes.Structure): - """class std::ios_base""" - - class Init(ctypes.Structure): - """class std::ios_base::Init""" - - class _Callback_list(ctypes.Structure): - """class std::ios_base::_Callback_list""" - - class _Words(ctypes.Structure): - """class std::ios_base::_Words""" - - class failure(ctypes.Structure): - """class std::ios_base::failure""" - -std.ios_base = ios_base - -class basic_ios_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class std::basic_ios< char, std::char_traits< char > >""" - - -std.basic_ios_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ios_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class basic_ios_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class std::basic_ios< wchar_t, std::char_traits< wchar_t > >""" - - -std.basic_ios_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ios_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class std::basic_istream< char, std::char_traits< char > >""" - - class sentry(ctypes.Structure): - """class std::basic_istream< char, std::char_traits< char > >::sentry""" - -std.basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class basic_ostream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class std::basic_ostream< char, std::char_traits< char > >""" - - class sentry(ctypes.Structure): - """class std::basic_ostream< char, std::char_traits< char > >::sentry""" - -std.basic_ostream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ostream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class iostream(ctypes.Structure): - """class std::basic_iostream< char, std::char_traits< char > >""" - - -std.iostream = iostream - -class basic_istream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class std::basic_istream< wchar_t, std::char_traits< wchar_t > >""" - - class sentry(ctypes.Structure): - """class std::basic_istream< wchar_t, std::char_traits< wchar_t > >::sentry""" - -std.basic_istream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_istream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class std::basic_ostream< wchar_t, std::char_traits< wchar_t > >""" - - class sentry(ctypes.Structure): - """class std::basic_ostream< wchar_t, std::char_traits< wchar_t > >::sentry""" - -std.basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class wiostream(ctypes.Structure): - """class std::basic_iostream< wchar_t, std::char_traits< wchar_t > >""" - - -std.wiostream = wiostream - -class basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class std::basic_streambuf< char, std::char_traits< char > >""" - - -std.basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class std::basic_streambuf< wchar_t, std::char_traits< wchar_t > >""" - - -std.basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class string(ctypes.Structure): - """class std::string""" - - class _Alloc_hider(ctypes.Structure): - """class std::string::_Alloc_hider""" - - class _Rep_base(ctypes.Structure): - """class std::string::_Rep_base""" - - class _Rep(ctypes.Structure): - """class std::string::_Rep""" - -std.string = string - -class wstring(ctypes.Structure): - """class std::wstring""" - - class _Alloc_hider(ctypes.Structure): - """class std::wstring::_Alloc_hider""" - - class _Rep_base(ctypes.Structure): - """class std::wstring::_Rep_base""" - - class _Rep(ctypes.Structure): - """class std::wstring::_Rep""" - -std.wstring = wstring - -class input_iterator_tag(ctypes.Structure): - """class std::input_iterator_tag""" - - -std.input_iterator_tag = input_iterator_tag - -class forward_iterator_tag(ctypes.Structure): - """class std::forward_iterator_tag""" - - -std.forward_iterator_tag = forward_iterator_tag - -class bidirectional_iterator_tag(ctypes.Structure): - """class std::bidirectional_iterator_tag""" - - -std.bidirectional_iterator_tag = bidirectional_iterator_tag - -class traits_type(ctypes.Structure): - """class std::char_traits< char >""" - - -std.traits_type = traits_type - -class traits_type(ctypes.Structure): - """class std::char_traits< wchar_t >""" - - -std.traits_type = traits_type - -class collate_less__char__greater_(ctypes.Structure): - """class std::collate< char >""" - - -std.collate_less__char__greater_ = collate_less__char__greater_ - -class collate_less__wchar_t__greater_(ctypes.Structure): - """class std::collate< wchar_t >""" - - -std.collate_less__wchar_t__greater_ = collate_less__wchar_t__greater_ - -class collate_byname_less__char__greater_(ctypes.Structure): - """class std::collate_byname< char >""" - - -std.collate_byname_less__char__greater_ = collate_byname_less__char__greater_ - -class collate_byname_less__wchar_t__greater_(ctypes.Structure): - """class std::collate_byname< wchar_t >""" - - -std.collate_byname_less__wchar_t__greater_ = collate_byname_less__wchar_t__greater_ - -class __ctype_type(ctypes.Structure): - """class std::ctype< char >""" - - -std.__ctype_type = __ctype_type - -class __ctype_type(ctypes.Structure): - """class std::ctype< wchar_t >""" - - -std.__ctype_type = __ctype_type - -class ctype_byname_less__char__greater_(ctypes.Structure): - """class std::ctype_byname< char >""" - - -std.ctype_byname_less__char__greater_ = ctype_byname_less__char__greater_ - -class ctype_byname_less__wchar_t__greater_(ctypes.Structure): - """class std::ctype_byname< wchar_t >""" - - -std.ctype_byname_less__wchar_t__greater_ = ctype_byname_less__wchar_t__greater_ - -class iterator_less__std_scope_output_iterator_tag_comma__void_comma__void_comma__void_comma__void__greater_(ctypes.Structure): - """class std::iterator< std::output_iterator_tag, void, void, void, void >""" - - -std.iterator_less__std_scope_output_iterator_tag_comma__void_comma__void_comma__void_comma__void__greater_ = iterator_less__std_scope_output_iterator_tag_comma__void_comma__void_comma__void_comma__void__greater_ - -class locale(ctypes.Structure): - """class std::locale""" - - class _Impl(ctypes.Structure): - """class std::locale::_Impl""" - - class facet(ctypes.Structure): - """class std::locale::facet""" - - class id(ctypes.Structure): - """class std::locale::id""" - -std.locale = locale - -class nothrow_t(ctypes.Structure): - """class std::nothrow_t""" - - -std.nothrow_t = nothrow_t - -class __num_get_type(ctypes.Structure): - """class std::num_get< char, std::istreambuf_iterator< char, std::char_traits< char > > >""" - - -std.__num_get_type = __num_get_type - -class __num_get_type(ctypes.Structure): - """class std::num_get< wchar_t, std::istreambuf_iterator< wchar_t, std::char_traits< wchar_t > > >""" - - -std.__num_get_type = __num_get_type - -class __num_put_type(ctypes.Structure): - """class std::num_put< char, std::ostreambuf_iterator< char, std::char_traits< char > > >""" - - -std.__num_put_type = __num_put_type - -class __num_put_type(ctypes.Structure): - """class std::num_put< wchar_t, std::ostreambuf_iterator< wchar_t, std::char_traits< wchar_t > > >""" - - -std.__num_put_type = __num_put_type - -class numpunct_less__char__greater_(ctypes.Structure): - """class std::numpunct< char >""" - - -std.numpunct_less__char__greater_ = numpunct_less__char__greater_ - -class numpunct_less__wchar_t__greater_(ctypes.Structure): - """class std::numpunct< wchar_t >""" - - -std.numpunct_less__wchar_t__greater_ = numpunct_less__wchar_t__greater_ - -class numpunct_byname_less__char__greater_(ctypes.Structure): - """class std::numpunct_byname< char >""" - - -std.numpunct_byname_less__char__greater_ = numpunct_byname_less__char__greater_ - -class numpunct_byname_less__wchar_t__greater_(ctypes.Structure): - """class std::numpunct_byname< wchar_t >""" - - -std.numpunct_byname_less__wchar_t__greater_ = numpunct_byname_less__wchar_t__greater_ - -class output_iterator_tag(ctypes.Structure): - """class std::output_iterator_tag""" - - -std.output_iterator_tag = output_iterator_tag - -class random_access_iterator_tag(ctypes.Structure): - """class std::random_access_iterator_tag""" - - -std.random_access_iterator_tag = random_access_iterator_tag - -class timespec(ctypes.Structure): - """class timespec""" - -class tm(ctypes.Structure): - """class tm""" - -class basic_istringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_istringstream< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" - _fields_ = [] -std.basic_istringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_istringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ - -class basic_ifstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_ifstream< char, std::char_traits< char > >""" - _fields_ = [] -std.basic_ifstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ifstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class money_base(ctypes.Structure): - """class declaration std::money_base""" - _fields_ = [] -std.money_base = money_base - -class time_base(ctypes.Structure): - """class declaration std::time_base""" - _fields_ = [] -std.time_base = time_base - -class basic_istringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_istringstream< char, std::char_traits< char >, std::allocator< char > >""" - _fields_ = [] -std.basic_istringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_istringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ - -class basic_stringbuf_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_stringbuf< char, std::char_traits< char >, std::allocator< char > >""" - _fields_ = [] -std.basic_stringbuf_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_stringbuf_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ - -class basic_ostringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_ostringstream< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" - _fields_ = [] -std.basic_ostringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_ostringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ - -class messages_base(ctypes.Structure): - """class declaration std::messages_base""" - _fields_ = [] -std.messages_base = messages_base - -class basic_stringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_stringstream< char, std::char_traits< char >, std::allocator< char > >""" - _fields_ = [] -std.basic_stringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_stringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ - -class __numpunct_cache_less__wchar_t__greater_(ctypes.Structure): - """class declaration std::__numpunct_cache< wchar_t >""" - _fields_ = [] -std.__numpunct_cache_less__wchar_t__greater_ = __numpunct_cache_less__wchar_t__greater_ - -class __numpunct_cache_less__char__greater_(ctypes.Structure): - """class declaration std::__numpunct_cache< char >""" - _fields_ = [] -std.__numpunct_cache_less__char__greater_ = __numpunct_cache_less__char__greater_ - -class basic_stringbuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_stringbuf< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" - _fields_ = [] -std.basic_stringbuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_stringbuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ - -class basic_ofstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_ofstream< wchar_t, std::char_traits< wchar_t > >""" - _fields_ = [] -std.basic_ofstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ofstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class basic_ofstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_ofstream< char, std::char_traits< char > >""" - _fields_ = [] -std.basic_ofstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_ofstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class basic_stringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_stringstream< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > >""" - _fields_ = [] -std.basic_stringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ = basic_stringstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater_ - -class basic_ostringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_ostringstream< char, std::char_traits< char >, std::allocator< char > >""" - _fields_ = [] -std.basic_ostringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ = basic_ostringstream_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater_ - -class basic_fstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_fstream< wchar_t, std::char_traits< wchar_t > >""" - _fields_ = [] -std.basic_fstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_fstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class basic_fstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_fstream< char, std::char_traits< char > >""" - _fields_ = [] -std.basic_fstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_fstream_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class istreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::istreambuf_iterator< wchar_t, std::char_traits< wchar_t > >""" - _fields_ = [] -std.istreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = istreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class istreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class declaration std::istreambuf_iterator< char, std::char_traits< char > >""" - _fields_ = [] -std.istreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = istreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class basic_ifstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_ifstream< wchar_t, std::char_traits< wchar_t > >""" - _fields_ = [] -std.basic_ifstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_ifstream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class basic_filebuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::basic_filebuf< wchar_t, std::char_traits< wchar_t > >""" - _fields_ = [] -std.basic_filebuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = basic_filebuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class basic_filebuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class declaration std::basic_filebuf< char, std::char_traits< char > >""" - _fields_ = [] -std.basic_filebuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = basic_filebuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_(ctypes.Structure): - """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< const wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > > >""" - _fields_ = [] -std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ - -class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_(ctypes.Structure): - """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > > >""" - _fields_ = [] -std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater___greater_ - -class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_(ctypes.Structure): - """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< const char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >""" - _fields_ = [] -std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ - -class reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_(ctypes.Structure): - """class declaration std::reverse_iterator< __gnu_cxx::__normal_iterator< char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > > >""" - _fields_ = [] -std.reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ = reverse_iterator_less____gnu_cxx_scope___normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater___greater_ - -class fpos_less____mbstate_t__greater_(ctypes.Structure): - """class declaration std::fpos< __mbstate_t >""" - _fields_ = [] -std.fpos_less____mbstate_t__greater_ = fpos_less____mbstate_t__greater_ - -class codecvt_base(ctypes.Structure): - """class declaration std::codecvt_base""" - _fields_ = [] -std.codecvt_base = codecvt_base - -class codecvt_less__wchar_t_comma__char_comma____mbstate_t__greater_(ctypes.Structure): - """class declaration std::codecvt< wchar_t, char, __mbstate_t >""" - _fields_ = [] -std.codecvt_less__wchar_t_comma__char_comma____mbstate_t__greater_ = codecvt_less__wchar_t_comma__char_comma____mbstate_t__greater_ - -class codecvt_less__char_comma__char_comma____mbstate_t__greater_(ctypes.Structure): - """class declaration std::codecvt< char, char, __mbstate_t >""" - _fields_ = [] -std.codecvt_less__char_comma__char_comma____mbstate_t__greater_ = codecvt_less__char_comma__char_comma____mbstate_t__greater_ - -class __iter_swap_less___obrace__obrace_std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_greater__scope___value__ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__Iter_greater__scope_reference_greater__scope___value_cbrace___ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_reference_greater__scope___value_cbrace___greater_(ctypes.Structure): - """class declaration std::__iter_swap< ((std::__are_same<typename std::iterator_traits<_Iter>::value_type,typename std::iterator_traits<_ForwardIterator2>::value_type>::__value && std::__are_same<typename std::iterator_traits<_Iter>::value_type&,typename std::iterator_traits<_Iter>::reference>::__value) && std::__are_same<typename std::iterator_traits<_ForwardIterator2>::value_type&,typename std::iterator_traits<_ForwardIterator2>::reference>::__value) >""" - _fields_ = [] -std.__iter_swap_less___obrace__obrace_std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_greater__scope___value__ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__Iter_greater__scope_reference_greater__scope___value_cbrace___ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_reference_greater__scope___value_cbrace___greater_ = __iter_swap_less___obrace__obrace_std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_greater__scope___value__ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__Iter_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__Iter_greater__scope_reference_greater__scope___value_cbrace___ref__ref__std_scope___are_same_less_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_value_type_ref__comma_typename_std_scope_iterator_traits_less__ForwardIterator2_greater__scope_reference_greater__scope___value_cbrace___greater_ - -class ostreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_(ctypes.Structure): - """class declaration std::ostreambuf_iterator< wchar_t, std::char_traits< wchar_t > >""" - _fields_ = [] -std.ostreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ = ostreambuf_iterator_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ - -class ostreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_(ctypes.Structure): - """class declaration std::ostreambuf_iterator< char, std::char_traits< char > >""" - _fields_ = [] -std.ostreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ = ostreambuf_iterator_less__char_comma__std_scope_char_traits_less__char__greater___greater_ - -class obstack(ctypes.Structure): - """class declaration obstack""" - _fields_ = [] - -class sigevent(ctypes.Structure): - """class declaration sigevent""" - _fields_ = [] - -class __numeric_traits_floating_less__short_int__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__numeric_traits_floating< short int >""" - _fields_ = [] -__gnu_cxx.__numeric_traits_floating_less__short_int__greater_ = __numeric_traits_floating_less__short_int__greater_ - -class __numeric_traits_floating_less__long_unsigned_int__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__numeric_traits_floating< long unsigned int >""" - _fields_ = [] -__gnu_cxx.__numeric_traits_floating_less__long_unsigned_int__greater_ = __numeric_traits_floating_less__long_unsigned_int__greater_ - -class __numeric_traits_floating_less__int__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__numeric_traits_floating< int >""" - _fields_ = [] -__gnu_cxx.__numeric_traits_floating_less__int__greater_ = __numeric_traits_floating_less__int__greater_ - -class __add_unsigned_less__wchar_t__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__add_unsigned< wchar_t >""" - _fields_ = [] -__gnu_cxx.__add_unsigned_less__wchar_t__greater_ = __add_unsigned_less__wchar_t__greater_ - -class __add_unsigned_less__bool__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__add_unsigned< bool >""" - _fields_ = [] -__gnu_cxx.__add_unsigned_less__bool__greater_ = __add_unsigned_less__bool__greater_ - -class __enable_if_less__!_std_scope___is_char_less__CharT2_greater__scope___value_comma__int__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__enable_if< ! std::__is_char<_CharT2>::__value, int >""" - _fields_ = [] -__gnu_cxx.__enable_if_less__!_std_scope___is_char_less__CharT2_greater__scope___value_comma__int__greater_ = __enable_if_less__!_std_scope___is_char_less__CharT2_greater__scope___value_comma__int__greater_ - -class __enable_if_less__!_std_scope___is_scalar_less__Tp_greater__scope___value_comma__void__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__enable_if< ! std::__is_scalar<_Tp>::__value, void >""" - _fields_ = [] -__gnu_cxx.__enable_if_less__!_std_scope___is_scalar_less__Tp_greater__scope___value_comma__void__greater_ = __enable_if_less__!_std_scope___is_scalar_less__Tp_greater__scope___value_comma__void__greater_ - -class __remove_unsigned_less__wchar_t__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__remove_unsigned< wchar_t >""" - _fields_ = [] -__gnu_cxx.__remove_unsigned_less__wchar_t__greater_ = __remove_unsigned_less__wchar_t__greater_ - -class __remove_unsigned_less__bool__greater_(ctypes.Structure): - """class declaration __gnu_cxx::__remove_unsigned< bool >""" - _fields_ = [] -__gnu_cxx.__remove_unsigned_less__bool__greater_ = __remove_unsigned_less__bool__greater_ - -class __normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_(ctypes.Structure): - """class declaration __gnu_cxx::__normal_iterator< wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > >""" - _fields_ = [] -__gnu_cxx.__normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ = __normal_iterator_less__wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ - -class __normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_(ctypes.Structure): - """class declaration __gnu_cxx::__normal_iterator< const wchar_t*, std::basic_string< wchar_t, std::char_traits< wchar_t >, std::allocator< wchar_t > > >""" - _fields_ = [] -__gnu_cxx.__normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ = __normal_iterator_less__const_wchar_t_ptr__comma__std_scope_basic_string_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater__comma__std_scope_allocator_less__wchar_t__greater___greater___greater_ - -class __normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_(ctypes.Structure): - """class declaration __gnu_cxx::__normal_iterator< char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > >""" - _fields_ = [] -__gnu_cxx.__normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ = __normal_iterator_less__char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ - -class __normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_(ctypes.Structure): - """class declaration __gnu_cxx::__normal_iterator< const char*, std::basic_string< char, std::char_traits< char >, std::allocator< char > > >""" - _fields_ = [] -__gnu_cxx.__normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ = __normal_iterator_less__const_char_ptr__comma__std_scope_basic_string_less__char_comma__std_scope_char_traits_less__char__greater__comma__std_scope_allocator_less__char__greater___greater___greater_ - -class _IO_jump_t(ctypes.Structure): - """class declaration _IO_jump_t""" - _fields_ = [] - -class __jmp_buf_tag(ctypes.Structure): - """class declaration __jmp_buf_tag""" - _fields_ = [] - -class locale_data(ctypes.Structure): - """class declaration locale_data""" - _fields_ = [] - -class _IO_cookie_file(ctypes.Structure): - """class declaration _IO_cookie_file""" - _fields_ = [] - -class _IO_FILE_plus(ctypes.Structure): - """class declaration _IO_FILE_plus""" - _fields_ = [] - -std.collate_byname_less__wchar_t__greater_._fields_ = [ #class std::collate_byname< wchar_t > - ("__empty__", ctypes.c_char * 4) -] - -std.collate_byname_less__char__greater_._fields_ = [ #class std::collate_byname< char > - ("__empty__", ctypes.c_char * 4) -] - -std.bad_exception._fields_ = [ #class std::bad_exception - ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), - ("__empty__", ctypes.c_char * 4) -] - -std.wstring._fields_ = [ #class std::wstring - ("npos", ctypes.c_uint), - ("_M_dataplus", std.wstring._Alloc_hider), -] - -std.wstring._Rep_base._fields_ = [ #class std::wstring::_Rep_base - ("_M_length", ctypes.c_uint), - ("_M_capacity", ctypes.c_uint), - ("_M_refcount", ctypes.c_int), -] - -std.wstring._Rep._fields_ = [ #class std::wstring::_Rep - ("_S_max_size", ctypes.c_uint), - ("_S_terminal", ctypes.c_wchar), - ("_S_empty_rep_storage", ( ctypes.c_uint * 4 )), -] - -std.wstring._Alloc_hider._fields_ = [ #class std::wstring::_Alloc_hider - ("_M_p", ctypes.c_wchar_p), -] - -std.basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_._fields_ = [ #class std::basic_istream< char, std::char_traits< char > > - ("_M_gcount", ctypes.c_int), -] - -std.basic_istream_less__char_comma__std_scope_char_traits_less__char__greater___greater_.sentry._fields_ = [ #class std::basic_istream< char, std::char_traits< char > >::sentry - ("_M_ok", ctypes.c_bool), -] - -std.basic_streambuf_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_._fields_ = [ #class std::basic_streambuf< wchar_t, std::char_traits< wchar_t > > - ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), - ("_M_in_beg", ctypes.c_wchar_p), - ("_M_in_cur", ctypes.c_wchar_p), - ("_M_in_end", ctypes.c_wchar_p), - ("_M_out_beg", ctypes.c_wchar_p), - ("_M_out_cur", ctypes.c_wchar_p), - ("_M_out_end", ctypes.c_wchar_p), - ("_M_buf_locale", std.locale), -] - -std.basic_streambuf_less__char_comma__std_scope_char_traits_less__char__greater___greater_._fields_ = [ #class std::basic_streambuf< char, std::char_traits< char > > - ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), - ("_M_in_beg", ctypes.c_char_p), - ("_M_in_cur", ctypes.c_char_p), - ("_M_in_end", ctypes.c_char_p), - ("_M_out_beg", ctypes.c_char_p), - ("_M_out_cur", ctypes.c_char_p), - ("_M_out_end", ctypes.c_char_p), - ("_M_buf_locale", std.locale), -] - -std.input_iterator_tag._fields_ = [ #class std::input_iterator_tag - ("__empty__", ctypes.c_char * 4) -] - -std.__copy_move_less__false_comma__false_comma__std_scope_random_access_iterator_tag__greater_._fields_ = [ #class std::__copy_move< false, false, std::random_access_iterator_tag > - ("__empty__", ctypes.c_char * 4) -] - -std.__false_type._fields_ = [ #class std::__false_type - ("__empty__", ctypes.c_char * 4) -] - -std.collate_less__wchar_t__greater_._fields_ = [ #class std::collate< wchar_t > - ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), - ("_M_c_locale_collate", ctypes.POINTER( __locale_struct )), - ("id", std.locale.id), -] - -std.collate_less__char__greater_._fields_ = [ #class std::collate< char > - ("_vtable_", ctypes.POINTER(ctypes.c_void_p)), - ("_M_c_locale_collate", ctypes.POINTER( __locale_struct )), - ("id", std.locale.id), -] - -std.__lexicographical_compare_less__true__greater_._fields_ = [ #class std::__lexicographical_compare< true > - ("__empty__", ctypes.c_char * 4) -] - -std.basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_._fields_ = [ #class std::basic_ostream< wchar_t, std::char_traits< wchar_t > > - ("__empty__", ctypes.c_char * 4) -] - -std.basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_.sentry._fields_ = [ #class std::basic_ostream< wchar_t, std::char_traits< wchar_t > >::sentry - ("_M_ok", ctypes.c_bool), - ("_M_os", ctypes.POINTER( std.basic_ostream_less__wchar_t_comma__std_scope_char_traits_less__wchar_t__greater___greater_ )), -] - -std.string._fields_ = [ #class std::string - ("npos", ctypes.c_uint), - ("_M_dataplus", std.string._Alloc_hider), -] - -std.string._Rep_base._fields_ = [ #class std::string::_Rep_base - ("_M_length", ctypes.c_uint), - ("_M_capacity", ctypes.c_uint), - ("_M_refcount", ctypes.c_int), -] - -std.string._Rep._fields_ = [ #class std::string::_Rep - ("_S_max_size", ctypes.c_uint), - ("_S_terminal", ctypes.c_char), - ("_S_empty_rep_storage", ( ctypes.c_uint * 4 )), -] - -std.string._Alloc_hider._fields_ = [ #class std::string::_Alloc_hider - ("_M_p", ctypes.c_char_p), -] - -std.locale._fields_ = [ #class std::locale - ("none", ctypes.c_int), - ("ctype", ctypes.c_int), - ("numer... [truncated message content] |
From: <rom...@us...> - 2009-01-17 20:24:55
|
Revision: 1583 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1583&view=rev Author: roman_yakovenko Date: 2009-01-17 20:24:45 +0000 (Sat, 17 Jan 2009) Log Message: ----------- adding support for global variables Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/global_variable.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/unittests/ctypes_pof_tester.py pyplusplus_dev/unittests/sconstruct Added Paths: ----------- pyplusplus_dev/unittests/data/ctypes/variables/ pyplusplus_dev/unittests/data/ctypes/variables/sconscript pyplusplus_dev/unittests/data/ctypes/variables/variables.cpp pyplusplus_dev/unittests/data/ctypes/variables/variables.h Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-17 09:29:36 UTC (rev 1582) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2009-01-17 20:24:45 UTC (rev 1583) @@ -167,3 +167,4 @@ from function_definition import mem_fun_definition_t from typedef_as_pyvar import typedef_as_pyvar_t from enum import pyenum_t +from global_variable import global_variable_reference_t Modified: pyplusplus_dev/pyplusplus/code_creators/global_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2009-01-17 09:29:36 UTC (rev 1582) +++ pyplusplus_dev/pyplusplus/code_creators/global_variable.py 2009-01-17 20:24:45 UTC (rev 1583) @@ -7,6 +7,7 @@ import pygccxml import algorithm import code_creator +import ctypes_formatter import declaration_based import registration_based from pygccxml import declarations @@ -182,3 +183,18 @@ def _get_system_headers_impl( self ): return [code_repository.ctypes_integration.file_name] + +class global_variable_reference_t( code_creator.code_creator_t, declaration_based.declaration_based_t ): + def __init__( self, var ): + code_creator.code_creator_t.__init__( self ) + declaration_based.declaration_based_t.__init__( self, var ) + + def _create_impl( self ): + return '%(alias)s = %(type)s.in_dll( %(library_var_name)s, "%(name)s" )' \ + % dict( alias=self.alias + , type=ctypes_formatter.as_ctype( self.declaration.type ) + , library_var_name=self.top_parent.library_var_name + , name=self.declaration.name ) + + def _get_system_headers_impl( self ): + return [] Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-17 09:29:36 UTC (rev 1582) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-17 20:24:45 UTC (rev 1583) @@ -39,8 +39,6 @@ self.__class_defs_ccs = code_creators.bookmark_t() #bookmark for typedef definitions self.__typedefs_ccs = code_creators.bookmark_t() - #~ prepared_decls = self.__prepare_decls( global_ns, doc_extractor ) - #~ self.__decls = sort_algorithms.sort( prepared_decls ) self.curr_decl = global_ns self.curr_code_creator = self.module #mapping between class declaration and class introduction code creator @@ -49,9 +47,6 @@ self.__class2methods_def = {} #mapping between namespace and its code creator self.__namespace2pyclass = {} - #set of all included namespaces - #~ self.__included_nss = set() - #~ for decl in self.global_ns def __print_readme( self, decl ): readme = decl.readme() @@ -71,6 +66,9 @@ return False if isinstance( decl, declarations.calldef_t ): return decl in self.__exported_decls + if isinstance( decl, declarations.variable_t ): + if isinstance( decl.parent, declarations.namespace_t ): + return decl in self.__exported_decls return True #~ def __prepare_decls( self, global_ns, doc_extractor ): @@ -241,6 +239,8 @@ self.__class_defs_ccs.adopt_creator( md_cc ) class_ = self.curr_decl for decl in self.curr_decl.decls( recursive=False, allow_empty=True ): + if isinstance( decl, declarations.variable_t ): + continue #fields_definition_t class treats them if self.__should_generate_code( decl ): self.curr_decl = decl declarations.apply_visitor( self, decl ) @@ -267,7 +267,8 @@ def visit_variable(self): self.__dependencies_manager.add_exported( self.curr_decl ) - + self.curr_code_creator.adopt_creator( code_creators.global_variable_reference_t( self.curr_decl ) ) + def visit_namespace(self ): if not self.__contains_exported( self.curr_decl ): return Modified: pyplusplus_dev/unittests/ctypes_pof_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-17 09:29:36 UTC (rev 1582) +++ pyplusplus_dev/unittests/ctypes_pof_tester.py 2009-01-17 20:24:45 UTC (rev 1583) @@ -169,6 +169,28 @@ c.r c.val +class variables_tester_t( ctypes_base_tester_t ): + def __init__( self, *args, **keywd ): + ctypes_base_tester_t.__init__( self, 'variables', *args, **keywd ) + + def customize( self, mb ): + pass + + def test(self): + self.module_ref.init() + self.failUnless( self.module_ref.j.value == 87 ) + self.failUnless( self.module_ref.data.i == 1900 ) + self.failUnless( self.module_ref.data_ptr.contents.i == 11 ) + + self.module_ref.j.value = 78 + self.failUnless( self.module_ref.get_value_j() == 78 ) + + self.module_ref.data.i = 987 + self.failUnless( self.module_ref.get_value_data() == 987 ) + + self.module_ref.data_ptr.contents.i = 34 + self.failUnless( self.module_ref.get_value_data_p() == 34 ) + def create_suite(): suite = unittest.TestSuite() if 'win' in sys.platform: @@ -178,6 +200,7 @@ suite.addTest( unittest.makeSuite(opaque_tester_t)) suite.addTest( unittest.makeSuite(include_algorithm_tester_t)) suite.addTest( unittest.makeSuite(anonymous_tester_t)) + suite.addTest( unittest.makeSuite(variables_tester_t)) return suite def run_suite(): Added: pyplusplus_dev/unittests/data/ctypes/variables/sconscript =================================================================== --- pyplusplus_dev/unittests/data/ctypes/variables/sconscript (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/variables/sconscript 2009-01-17 20:24:45 UTC (rev 1583) @@ -0,0 +1,7 @@ +Import('*') + +target_name = 'variables' +shlib = env.SharedLibrary( target=target_name + , source=[ target_name + '.cpp' ] + , CPPPATH=['#data'] ) +env.Alias( target_name, shlib ) Added: pyplusplus_dev/unittests/data/ctypes/variables/variables.cpp =================================================================== --- pyplusplus_dev/unittests/data/ctypes/variables/variables.cpp (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/variables/variables.cpp 2009-01-17 20:24:45 UTC (rev 1583) @@ -0,0 +1,22 @@ +#include "variables.h" + +EXPORT_SYMBOL void init(){ + data.i = 1900; + data_ptr = new data_t(); + data_ptr->i = 11; + j = 87; +} + +EXPORT_SYMBOL int get_value_j(){ + return j; +} + +EXPORT_SYMBOL int get_value_data(){ + return data.i; +} + +EXPORT_SYMBOL int get_value_data_p(){ + return data_ptr->i; +} + + Added: pyplusplus_dev/unittests/data/ctypes/variables/variables.h =================================================================== --- pyplusplus_dev/unittests/data/ctypes/variables/variables.h (rev 0) +++ pyplusplus_dev/unittests/data/ctypes/variables/variables.h 2009-01-17 20:24:45 UTC (rev 1583) @@ -0,0 +1,16 @@ +#include "libconfig.h" + +struct EXPORT_SYMBOL data_t{ + int i; +}; + +EXPORT_SYMBOL int j; +EXPORT_SYMBOL data_t data; +EXPORT_SYMBOL data_t* data_ptr; + +EXPORT_SYMBOL void init(); +EXPORT_SYMBOL int get_value_j(); +EXPORT_SYMBOL int get_value_data(); +EXPORT_SYMBOL int get_value_data_p(); + + Modified: pyplusplus_dev/unittests/sconstruct =================================================================== --- pyplusplus_dev/unittests/sconstruct 2009-01-17 09:29:36 UTC (rev 1582) +++ pyplusplus_dev/unittests/sconstruct 2009-01-17 20:24:45 UTC (rev 1583) @@ -25,7 +25,14 @@ env.AppendUnique( CPPPATH=['#data'] ) -scripts = [ 'pof', 'issues', 'enums', 'opaque', 'include_algorithm', 'anonymous' ] +scripts = [ 'pof' + , 'issues' + , 'enums' + , 'opaque' + , 'include_algorithm' + , 'anonymous' + , 'variables' ] + for s in scripts: SConscript( 'data/ctypes/%s/sconscript' % s , variant_dir='data/ctypes/%s/binaries' % s This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-19 22:29:16
|
Revision: 1595 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1595&view=rev Author: roman_yakovenko Date: 2009-01-19 21:57:33 +0000 (Mon, 19 Jan 2009) Log Message: ----------- embedding indexing suite v2 Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_repository/__init__.py pyplusplus_dev/pyplusplus/file_writers/writer.py Added Paths: ----------- pyplusplus_dev/indexing_suite_v2/update_code_repository.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/ pyplusplus_dev/pyplusplus/code_repository/indexing_suite/__init__.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/algorithms_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_proxy_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_suite_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_traits_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/deque_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/element_proxy_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/element_proxy_traits_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/int_slice_helper_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/iterator_range_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/iterator_traits_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/list_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/map_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/methods_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/multimap_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/pair_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/proxy_iterator_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/python_iterator_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/set_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/shared_proxy_impl_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/slice_handler_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/slice_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/suite_utils_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/value_traits_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/vector_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/visitor_header.py pyplusplus_dev/pyplusplus/code_repository/indexing_suite/workaround_header.py Added: pyplusplus_dev/indexing_suite_v2/update_code_repository.py =================================================================== --- pyplusplus_dev/indexing_suite_v2/update_code_repository.py (rev 0) +++ pyplusplus_dev/indexing_suite_v2/update_code_repository.py 2009-01-19 21:57:33 UTC (rev 1595) @@ -0,0 +1,79 @@ +# Copyright 2004-2008 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) + +"""updates code repository""" + +import os +import sys + +header_tmpl = \ +'''# Copyright 2004-2008 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) + +""" +This file contains indexing suite v2 code +""" + +file_name = "%(file_path)s" + +code = \ +"""%(code)s + +""" +''' + +init_code = [ +'''# Copyright 2004-2008 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) + +""" +code repository for Indexing Suite V2 - std containers wrappers +""" + +all = [] +'''] + +pyplusplus_dev_root = os.path.dirname( os.path.dirname( os.path.abspath( __file__ ) ) ) +source_dir = os.path.join( pyplusplus_dev_root, 'indexing_suite_v2', 'indexing_suite' ) +target_dir = os.path.join( pyplusplus_dev_root, 'pyplusplus', 'code_repository', 'indexing_suite' ) + +if not os.path.exists( target_dir ): + os.mkdir( target_dir ) + +for f in os.listdir( source_dir ): + name, ext = os.path.splitext( f ) + if ext != '.hpp': + print 'file "%s" was skipped' % f + continue + else: + print 'converting file "%s"' % f + file_path = 'indexing_suite/' + f + code = file( os.path.join( source_dir, f ), 'r' ).read() + py_name = name + '_header' + py_file = file( os.path.join( target_dir, py_name + '.py' ), 'w+' ) + py_file.write( header_tmpl % dict( file_path=file_path, code=code ) ) + py_file.close() + init_code.append( 'import %s' % py_name ) + init_code.append( 'all.append( %s )' % py_name ) + init_code.append( '' ) + +init_code.append( 'headers = map( lambda f: f.file_name, all )' ) + +print 'creating __init__.py file' + +init_file = file( os.path.join( target_dir, '__init__.py' ), 'w+' ) +init_file.write( '\n'.join( init_code ) ) +init_file.close() + + + + + + + Modified: pyplusplus_dev/pyplusplus/code_repository/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/__init__.py 2009-01-19 21:55:39 UTC (rev 1594) +++ pyplusplus_dev/pyplusplus/code_repository/__init__.py 2009-01-19 21:57:33 UTC (rev 1595) @@ -18,8 +18,9 @@ import named_tuple import convenience import return_range +import ctypes_utils import call_policies -import ctypes_utils +import indexing_suite import ctypes_integration all = [ array_1 @@ -31,5 +32,15 @@ , ctypes_utils , ctypes_integration ] +all.extend( indexing_suite.all ) + headers = map( lambda f: f.file_name, all ) +def i_depend_on_them( fname ): + """returns list of files, the file fname depends on""" + if fname in indexing_suite.headers: + result = indexing_suite.all[:] + del result[ indexing_suite.headers.index( fname ) ] + return result + else: + return [] Added: pyplusplus_dev/pyplusplus/code_repository/indexing_suite/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/indexing_suite/__init__.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_repository/indexing_suite/__init__.py 2009-01-19 21:57:33 UTC (rev 1595) @@ -0,0 +1,91 @@ +# Copyright 2004-2008 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) + +""" +code repository for Indexing Suite V2 - std containers wrappers +""" + +all = [] + +import algorithms_header +all.append( algorithms_header ) + +import container_proxy_header +all.append( container_proxy_header ) + +import container_suite_header +all.append( container_suite_header ) + +import container_traits_header +all.append( container_traits_header ) + +import deque_header +all.append( deque_header ) + +import element_proxy_header +all.append( element_proxy_header ) + +import element_proxy_traits_header +all.append( element_proxy_traits_header ) + +import int_slice_helper_header +all.append( int_slice_helper_header ) + +import iterator_range_header +all.append( iterator_range_header ) + +import iterator_traits_header +all.append( iterator_traits_header ) + +import list_header +all.append( list_header ) + +import map_header +all.append( map_header ) + +import methods_header +all.append( methods_header ) + +import multimap_header +all.append( multimap_header ) + +import pair_header +all.append( pair_header ) + +import proxy_iterator_header +all.append( proxy_iterator_header ) + +import python_iterator_header +all.append( python_iterator_header ) + +import set_header +all.append( set_header ) + +import shared_proxy_impl_header +all.append( shared_proxy_impl_header ) + +import slice_header +all.append( slice_header ) + +import slice_handler_header +all.append( slice_handler_header ) + +import suite_utils_header +all.append( suite_utils_header ) + +import value_traits_header +all.append( value_traits_header ) + +import vector_header +all.append( vector_header ) + +import visitor_header +all.append( visitor_header ) + +import workaround_header +all.append( workaround_header ) + +headers = map( lambda f: f.file_name, all ) + Added: pyplusplus_dev/pyplusplus/code_repository/indexing_suite/algorithms_header.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/indexing_suite/algorithms_header.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_repository/indexing_suite/algorithms_header.py 2009-01-19 21:57:33 UTC (rev 1595) @@ -0,0 +1,578 @@ +# Copyright 2004-2008 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) + +""" +This file contains indexing suite v2 code +""" + +file_name = "indexing_suite/algorithms.hpp" + +code = """// Header file algorithms.hpp +// +// Uniform interface layer for all containers. +// +// Copyright (c) 2003 Raoul M. Gough +// +// Use, modification and distribution is subject to 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) +// +// History +// ======= +// 2003/ 9/11 rmg File creation from suite_utils.hpp +// 2003/10/28 rmg Split container-specific versions into separate headers +// 2006/10/25 Roman Adding keys function to assoc_algorithms class +// 2008/12/08 Roman Change indexing suite layout +// +// $Id: algorithms.hpp,v 1.1.2.15 2004/02/08 18:57:42 raoulgough Exp $ +// + +#ifndef BOOST_PYTHON_INDEXING_ALGORITHMS_HPP +#define BOOST_PYTHON_INDEXING_ALGORITHMS_HPP + +#include <indexing_suite/suite_utils.hpp> + +#include <boost/type_traits.hpp> +#include <boost/python/errors.hpp> +#include <indexing_suite/int_slice_helper.hpp> +#include <indexing_suite/slice.hpp> +#include <boost/mpl/if.hpp> +#include <boost/limits.hpp> +#include <algorithm> +#include <functional> +#include <stdexcept> +#include <string> +#include <set> + +namespace boost { namespace python { namespace indexing { + template<typename ContainerTraits, typename Ovr = detail::no_override> + class default_algorithms + { + typedef default_algorithms<ContainerTraits, Ovr> self_type; + typedef typename detail::maybe_override<self_type, Ovr> + ::type most_derived; + + public: + typedef ContainerTraits container_traits; + + // Import typedefs from the container_traits for convenience + typedef typename ContainerTraits::container container; + typedef typename ContainerTraits::iterator iterator; + typedef typename ContainerTraits::reference reference; + typedef typename ContainerTraits::size_type size_type; + typedef typename ContainerTraits::value_type value_type; + typedef typename ContainerTraits::value_param value_param; + typedef typename ContainerTraits::index_param index_param; + typedef typename ContainerTraits::key_param key_param; + + // Defer selection of supported_methods to the ContainerTraits + // template argument. This makes sense because default_algorithms + // derives all of its other information from this argument, and + // can't decide which of the static member functions will + // instantiate successfully for the container. Obviously a + // custom-written Algorithms implementation could choose to + // provide the supported_methods directly. + + BOOST_STATIC_CONSTANT( + method_set_type, + supported_methods = ContainerTraits::supported_methods); + + static size_type size (container &); + static iterator find (container &, key_param); + static size_type get_index (container &, key_param); + static size_type count (container &, key_param); + static bool contains (container &, key_param); + static void reverse (container &); + static reference get (container &, index_param); + static void assign (container &, index_param, value_param); + static void insert (container &, index_param, value_param); + static void erase_one (container &, index_param); + static void erase_range(container &, index_param, index_param); + static void push_back (container &, value_param); + static void sort (container &); + // static void sort (container &, PyObject *); + + static iterator begin (container &c) { return c.begin(); } + static iterator end (container &c) { return c.end(); } + + // Reasonable defaults for slice handling + typedef int_slice_helper<self_type, integer_slice> slice_helper; + + static slice_helper make_slice_helper (container &c, slice const &); + + // Default visit_container_class + template<typename PythonClass, typename Policy> + static void visit_container_class( + PythonClass &pyClass, Policy const &policy) + { + container_traits::visit_container_class (pyClass, policy); + } + +#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) + // MSVC6 and 7.0 seem to complain about most_derived::bounds_check + // for an instantiation of list_algorithms. + public: +#else + private: +#endif + static size_type bounds_check( + container &, index_param, char const *msg, + bool one_past = false, + bool truncate = false); + // Throws std::out_of_range if necessary. If one_past is set, then + // indexes up to container.size() *inclusive* are allowed. If + // truncate is set, then out of bounds values are reset to the + // nearest in-bound value (and if none exists, throws an + // exception). If truncate is *not* set, then negative values index + // from the upper bound backwards and are bounds-checked. + }; + + ///////////////////////////////////////////////////////////////////////// + // Base class for associative containers + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr = detail::no_override> + class assoc_algorithms + : public default_algorithms + <ContainerTraits, + BOOST_DEDUCED_TYPENAME detail::maybe_override + <assoc_algorithms<ContainerTraits, Ovr>, Ovr> + ::type> + { + typedef assoc_algorithms<ContainerTraits, Ovr> self_type; + typedef typename detail::maybe_override<self_type, Ovr> + ::type most_derived; + typedef default_algorithms<ContainerTraits, most_derived> Parent; + + public: + typedef typename Parent::iterator iterator; + typedef typename Parent::size_type size_type; + typedef typename Parent::container container; + typedef typename Parent::reference reference; + typedef typename Parent::key_param key_param; + typedef typename Parent::value_param value_param; + typedef typename Parent::index_param index_param; + + static reference get (container &, index_param); + + // Use member functions for the following (hiding base class versions) + static void erase_one (container &, key_param); + static iterator find (container &, key_param); + static size_type count (container &, key_param); + static bool contains (container &, key_param); + + // Default visit_container_class + template<typename PythonClass, typename Policy> + static void visit_container_class( PythonClass &pyClass, Policy const &policy) + { + ContainerTraits::visit_container_class (pyClass, policy); + } + + + protected: + static iterator find_or_throw (container &, index_param); + }; + + ///////////////////////////////////////////////////////////////////////// + // Get the size of a container + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME default_algorithms<ContainerTraits, Ovr>::size_type + default_algorithms<ContainerTraits, Ovr>::size (container &c) + { + return c.size(); + } + + ///////////////////////////////////////////////////////////////////////// + // Range check an index and throw out_of_range if necessary + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME default_algorithms<ContainerTraits, Ovr>::size_type + default_algorithms<ContainerTraits, Ovr>::bounds_check( + container &c, + index_param ix, + char const *msg, + bool one_past, + bool truncate) + { + size_type bound = most_derived::size(c) + (one_past ? 1 : 0); + size_type result; + + if (truncate) + { + if (ix < 0) + { + result = 0; + } + + else + { + result = ix; + + if ((result >= bound) && (bound > 0)) + { + result = bound - 1; + } + } + } + + else if (ix < 0) + { + if (size_type(-ix) > bound) + { + throw std::out_of_range (msg); + } + + result = bound + ix; + } + + else + { + result = ix; + } + + if (result >= bound) + { + throw std::out_of_range (msg); + } + + return result; + } + + ///////////////////////////////////////////////////////////////////////// + // Find an element in a container (std algorithm version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME default_algorithms<ContainerTraits, Ovr>::iterator + default_algorithms<ContainerTraits, Ovr>::find( + container &c, key_param key) + { + typedef typename container_traits::value_traits_type vtraits; + typedef typename vtraits::equal_to comparison; + + return std::find_if( + most_derived::begin(c), + most_derived::end(c), + std::bind1st (comparison(), key)); + } + + ///////////////////////////////////////////////////////////////////////// + // Find an element and return its index (std algorithm version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME default_algorithms<ContainerTraits, Ovr>::size_type + default_algorithms<ContainerTraits, Ovr>::get_index( + container &c, key_param key) + { + iterator found (most_derived::find (c, key)); + + if (found == most_derived::end(c)) + { + PyErr_SetString( + PyExc_ValueError, "get_index: element not found"); + + boost::python::throw_error_already_set (); + } + + iterator start (most_derived::begin (c)); + return std::distance (start, found); + } + + ///////////////////////////////////////////////////////////////////////// + // Count occurances of an element in a container (std algorithm version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME default_algorithms<ContainerTraits, Ovr>::size_type + default_algorithms<ContainerTraits, Ovr>::count( + container &c, key_param key) + { + typedef typename container_traits::value_traits_type vtraits; + typedef typename vtraits::equal_to comparison; + + return std::count_if( + most_derived::begin(c), + most_derived::end(c), + std::bind1st (comparison(), key)); + } + + ///////////////////////////////////////////////////////////////////////// + // Check whether a container contains the given element (std algo ver) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + bool + default_algorithms<ContainerTraits, Ovr>::contains( + container &c, key_param key) + { + return most_derived::find (c, key) != most_derived::end(c); + } + + ///////////////////////////////////////////////////////////////////////// + // Index into a container (generic version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME default_algorithms<ContainerTraits, Ovr>::reference + default_algorithms<ContainerTraits, Ovr>::get( + container &c, index_param ix) + { + return c[most_derived::bounds_check (c, ix, "get")]; + } + + ///////////////////////////////////////////////////////////////////////// + // Assign a value at a particular index (generic version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void + default_algorithms<ContainerTraits, Ovr>::assign( + container &c, index_param ix, value_param val) + { + c[most_derived::bounds_check (c, ix, "assign")] = val; + } + + ///////////////////////////////////////////////////////////////////////// + // Insert at end of a container (generic version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void + default_algorithms<ContainerTraits, Ovr>::push_back( + container &c, value_param v) + { + c.push_back (v); + } + + ///////////////////////////////////////////////////////////////////////// + // Insert at an index in the container (generic version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void + default_algorithms<ContainerTraits, Ovr>::insert( + container &c, index_param i, value_param v) + { + iterator insert_pos (most_derived::begin(c)); + + // Index may range up to c.size() inclusive to allow inserting at end + std::advance( + insert_pos, most_derived::bounds_check (c, i, "insert", true, true)); + + c.insert (insert_pos, v); + } + + ///////////////////////////////////////////////////////////////////////// + // Erase between given indexes in the container (generic version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void + default_algorithms<ContainerTraits, Ovr>::erase_range( + container &c, index_param from, index_param to) + { + iterator start (most_derived::begin(c)); + iterator finish (most_derived::begin(c)); + + // Start index must be properly in bounds + std::advance + (start, most_derived::bounds_check (c, from, "erase_range (from)")); + + // End index is one-past-the-end, so may range up to c.size() inclusive + std::advance + (finish, most_derived::bounds_check (c, to, "erase_range (to)", true)); + + c.erase (start, finish); + } + + ///////////////////////////////////////////////////////////////////////// + // Erase one element at the given index in the container (generic version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void + default_algorithms<ContainerTraits, Ovr>::erase_one( + container &c, index_param ix) + { + iterator iter (most_derived::begin(c)); + std::advance (iter, most_derived::bounds_check (c, ix, "erase_one")); + c.erase (iter); + } + + ///////////////////////////////////////////////////////////////////////// + // Reverse the contents of a container (std algorithm version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void default_algorithms<ContainerTraits, Ovr>::reverse (container &c) + { + std::reverse (most_derived::begin(c), most_derived::end(c)); + } + + ///////////////////////////////////////////////////////////////////////// + // Sort the contents of a container (std algorithm version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void default_algorithms<ContainerTraits, Ovr>::sort (container &c) + { + typedef typename container_traits::value_traits_type vtraits; + typedef typename vtraits::less comparison; + std::sort (most_derived::begin(c), most_derived::end(c), comparison()); + } + + ///////////////////////////////////////////////////////////////////////// + // slice_helper factory function (default version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME default_algorithms<ContainerTraits, Ovr>::slice_helper + default_algorithms<ContainerTraits, Ovr> + ::make_slice_helper (container &c, slice const &sl) + { + return slice_helper (c, integer_slice (sl, most_derived::size (c))); + } + + ///////////////////////////////////////////////////////////////////////// + // Index into a container (associative version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME assoc_algorithms<ContainerTraits, Ovr>::reference + assoc_algorithms<ContainerTraits, Ovr>::get (container &c, index_param ix) + { + return *most_derived::find_or_throw (c, ix); + } + + ///////////////////////////////////////////////////////////////////////// + // Erase elements with the given key (associative version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + void + assoc_algorithms<ContainerTraits, Ovr>::erase_one( + container &c, key_param key) + { + if (c.erase (key) == 0) + { + PyErr_SetString( + PyExc_ValueError, "Container does not hold value to be erased"); + + boost::python::throw_error_already_set (); + } + } + + ///////////////////////////////////////////////////////////////////////// + // Find an element in an associative container + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME assoc_algorithms<ContainerTraits, Ovr>::iterator + assoc_algorithms<ContainerTraits, Ovr> + ::find (container &c, key_param key) + { + return c.find (key); + } + + ///////////////////////////////////////////////////////////////////////// + // Find an element in an associative container + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + bool + assoc_algorithms<ContainerTraits, Ovr>::contains( + container &c, key_param key) + { + return most_derived::find (c, key) != most_derived::end(c); + } + + ///////////////////////////////////////////////////////////////////////// + // Find an element in an associative container - throw an exception if + // not found + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME assoc_algorithms<ContainerTraits, Ovr>::iterator + assoc_algorithms<ContainerTraits, Ovr>::find_or_throw( + container &c, index_param ix) + { + iterator iter = most_derived::find (c, ix); + + if (iter == most_derived::end(c)) + { + PyErr_SetString( + PyExc_ValueError, "associative container: key not found"); + + boost::python::throw_error_already_set (); + } + + return iter; + } + + ///////////////////////////////////////////////////////////////////////// + // Count occurances of an element in a container (associative version) + ///////////////////////////////////////////////////////////////////////// + + template<typename ContainerTraits, typename Ovr> + BOOST_DEDUCED_TYPENAME assoc_algorithms<ContainerTraits, Ovr>::size_type + assoc_algorithms<ContainerTraits, Ovr>::count( + container &c, key_param key) + { + return c.count (key); + } + + ///////////////////////////////////////////////////////////////////////// + // Some meta-information to select algorithms for const and + // non-const qualified containers. All algorithms_selector specializations + // include two publically accessible typedefs, called + // mutable_algorithms and const_algorithms. This saves having to + // have separate partial specializations of algorithms for + // const and non-const containers. Client code should probably + // specialize algorithms directly. + ///////////////////////////////////////////////////////////////////////// + + namespace detail { + template<typename Container> class algorithms_selector +# if defined(BOOST_MPL_MSVC_ETI_BUG) + { + // Bogus types to prevent compile errors due to ETI + typedef algorithms_selector<Container> mutable_algorithms; + typedef algorithms_selector<Container> const_algorithms; + } +# endif + ; + } + + ///////////////////////////////////////////////////////////////////////// + // Algorithms selection for mutable containers + ///////////////////////////////////////////////////////////////////////// + + template<class Container> + struct algorithms + : public detail::algorithms_selector<Container>::mutable_algorithms + { + }; + +# if !defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) + ///////////////////////////////////////////////////////////////////////// + // Algorithms selection for const-qualified containers + ///////////////////////////////////////////////////////////////////////// + + template<class Container> + struct algorithms<Container const> + : public detail::algorithms_selector<Container>::const_algorithms + { + }; +# endif +} } } + +#endif // BOOST_PYTHON_INDEXING_ALGORITHMS_HPP + + +""" Added: pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_proxy_header.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_proxy_header.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_proxy_header.py 2009-01-19 21:57:33 UTC (rev 1595) @@ -0,0 +1,752 @@ +# Copyright 2004-2008 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) + +""" +This file contains indexing suite v2 code +""" + +file_name = "indexing_suite/container_proxy.hpp" + +code = """// Copyright (c) 2003 Raoul M. Gough +// +// Use, modification and distribution is subject to 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) +// +// Header file container_proxy.hpp +// +// A container-wrapper that provides Python-style reference semantics +// for values stored in vector-like containers via element proxies. +// +// Class invariant: +// size() == m_proxies.size() +// for 0 <= i < size() +// m_proxies[i].get() != 0 +// m_proxies[i]->owner() == this +// m_proxies[i]->index() == i +// m_proxies[i]->m_element_ptr.get() == 0 +// +// History +// ======= +// 2003/ 8/26 rmg File creation +// 2003/10/23 rmg Change pointer container from map to sequence +// 2008/12/08 Roman Change indexing suite layout +// +// $Id: container_proxy.hpp,v 1.1.2.28 2004/02/08 18:57:42 raoulgough Exp $ +// + +#ifndef BOOST_PYTHON_INDEXING_CONTAINER_PROXY_HPP +#define BOOST_PYTHON_INDEXING_CONTAINER_PROXY_HPP + +#include <indexing_suite/proxy_iterator.hpp> +#include <indexing_suite/shared_proxy_impl.hpp> +#include <indexing_suite/element_proxy.hpp> +#include <indexing_suite/element_proxy_traits.hpp> +#include <indexing_suite/workaround.hpp> +#include <indexing_suite/methods.hpp> + +#include <vector> +#include <cassert> +#include <boost/shared_ptr.hpp> +#include <boost/mpl/apply.hpp> +#include <boost/iterator/iterator_traits.hpp> +#include <indexing_suite/container_traits.hpp> +#include <indexing_suite/container_suite.hpp> +#include <indexing_suite/algorithms.hpp> + +namespace boost { namespace python { namespace indexing { + + template<typename T> struct identity { + typedef T held_type; + + static T & get(T & obj) { return obj; } + static T const & get(T const & obj) { return obj; } + + static T create () { return T(); } + static T copy (T const ©) { return copy; } + static void assign (T &to, T const &from) { to = from; } + static void pre_destruction (T &) { } + static void swap (T &one, T &two) { std::swap (one, two); } + }; + + template<typename P> struct deref { + typedef P held_type; + + typedef typename boost::iterator_value<P>::type value; + + static value & get (P & ptr) { return *ptr; } + static value const & get (P const & ptr) { return *ptr; } + + static P create () { return P(); } + static P copy (P const ©) { return copy; } + static void assign (P &to, P const &from) { to = from; } + static void pre_destruction (P &) { } + static void swap (P &one, P &two) { std::swap (one, two); } + }; + + struct vector_generator { + // Generates vector type for any element type with default allocator + template<typename Element> struct apply { + typedef std::vector<Element> type; + }; + }; + +#if BOOST_WORKAROUND (BOOST_MSVC, == 1200) + // Early template instantiation (ETI) workaround + namespace detail { + template<typename Container> struct msvc6_iterator { + typedef Container::iterator type; + }; + + template<> struct msvc6_iterator<int> { + typedef int *type; + }; + } +#endif + + template<class Container, + class Holder = identity<Container>, + class Generator = vector_generator> + class container_proxy + { + typedef container_proxy<Container, Holder, Generator> self_type; + typedef typename Container::iterator raw_iterator; + typedef ::boost::detail::iterator_traits<raw_iterator> raw_iterator_traits; + +#if !defined (BOOST_NO_MEMBER_TEMPLATE_FRIENDS) + template<class C> friend class shared_proxy_impl; + template<class C, typename E, typename T, typename S, typename I> + friend class proxy_iterator; +#endif + + public: + typedef typename Holder::held_type held_type; + + typedef typename Container::size_type size_type; + typedef typename Container::difference_type difference_type; + + typedef shared_proxy_impl<self_type> shared_proxy; + + typedef typename Container::value_type raw_value_type; + + typedef element_proxy<self_type> value_type; + typedef value_type reference; // Already has ref. semantics + + typedef const_element_proxy<self_type> const_value_type; + typedef const_value_type const_reference; // Ref. semantics + + typedef proxy_iterator <self_type, value_type, raw_iterator_traits, + size_type, raw_iterator> iterator; + typedef iterator const_iterator; // No const_iterator yet implemented + + public: + // Constructors + template<typename Iter> container_proxy (Iter start, Iter finish) + // Define inline for MSVC6 compatibility + : m_held_obj (Holder::create()), + m_proxies () + { + insert (begin(), start, finish); + } + + container_proxy (); + explicit container_proxy (held_type const &h); + + container_proxy (container_proxy const &); + container_proxy &operator= (container_proxy const &); + ~container_proxy (); + + Container const &raw_container() const; // OK to expose const reference + + reference at (size_type index); + const_reference at (size_type index) const; + + reference operator[] (size_type index) { return at(index); } + const_reference operator[] (size_type index) const { return at(index); } + + size_type size () const { return raw_container().size(); } + size_type capacity () const { return raw_container().capacity(); } + void reserve (size_type s); + + public: + iterator begin() { return iterator (this, static_cast<size_type>(0)); } + iterator end() { return iterator (this, raw_container().size()); } + + iterator erase (iterator); + iterator erase (iterator, iterator); + iterator insert (iterator, raw_value_type const &); + + template<typename Iter> void insert (iterator iter, Iter from, Iter to) + // Define here for MSVC6 compatibility + { + // Forward insertion to the right overloaded version + typedef typename BOOST_ITERATOR_CATEGORY<Iter>::type category; + insert (iter, from, to, category()); + } + + void push_back (raw_value_type const ©) { insert (end(), copy); } + + value_type pop_back () { + value_type result = at (size() - 1); + erase (end() - 1); + return result; + } + + public: + // These functions are useful only when client code has direct + // non-const acccess to the raw container (e.g. via an indirect + // holder supplied to our constructor). Any code that directly + // modifies the contents of the raw container (by replacing, + // inserting or erasing elements) must notify the container_proxy. + + void detach_proxy (size_type index); + void detach_proxies (size_type from, size_type to); + // Call before overwriting element(s) in the raw container + + void prepare_erase (size_type from, size_type to); + // Call before erasing elements directly from the raw container + + void notify_insertion (size_type from, size_type to); + // Call after inserting elements directly into the raw container + + public: + // Convenient replacement of elements (automatic proxy detachment) + void replace (size_type index, raw_value_type const &); + // template<typename Iter> void replace (size_type index, Iter, Iter); + + void swap_elements (size_type index1, size_type index2); + + bool is_valid () const; // Check the class invariant (for testing purposes) + + private: + // Overloads for insertions with/without useful std::distance + template<typename Iter> + void insert (iterator iter, Iter from, Iter to, std::forward_iterator_tag) + // Define here for MSVC6 compatibility + { + assert (iter.ptr == this); + size_type count = std::distance (from, to); + + // Add empty proxy pointers for the new value(s) (could throw) + m_proxies.insert (m_proxies.begin() + iter.index, count, pointer_impl()); + + try + { + // Insert the new element(s) into the real container (could throw) + raw_container().insert( + raw_container().begin() + iter.index, + from, + to); + + try + { + // Create new proxies for the new elements (could throw) + write_proxies (iter.index, iter.index + count); + } + + catch (...) + { + raw_container().erase( + raw_container().begin() + iter.index, + raw_container().begin() + iter.index + count); + + throw; + } + } + + catch (...) + { + m_proxies.erase( + m_proxies.begin() + iter.index, + m_proxies.begin() + iter.index + count); + + throw; + } + + // Adjust any proxies after the inserted elements (nothrow) + adjust_proxies( + m_proxies.begin() + iter.index + count, + m_proxies.end(), + static_cast<difference_type> (count)); + } + + template<typename Iter> + void insert (iterator iter, Iter from, Iter to, std::input_iterator_tag) + // Define here for MSVC6 compatibility + { + // insert overload for iterators where we *can't* get distance() + // so just insert elements one at a time + while (from != to) + { + iter = insert (iter, *from++) + 1; + } + } + + private: + typedef boost::shared_ptr<shared_proxy> pointer_impl; + + typedef typename mpl::apply1<Generator, pointer_impl>::type + pointer_container; + +#if BOOST_WORKAROUND (BOOST_MSVC, == 1200) + typedef detail::msvc6_iterator<pointer_container>::type pointer_iterator; +#else + typedef typename pointer_container::iterator pointer_iterator; +#endif + +#if defined (BOOST_NO_MEMBER_TEMPLATE_FRIENDS) + // Proxies need mutable access, and can't be friends with MSVC6 + public: +#endif + Container &raw_container(); + + private: + void adjust_proxies (pointer_iterator, pointer_iterator, difference_type); + void write_proxies (size_type, size_type); + bool clear_proxy (pointer_impl &); // detach and do not reset + void clear_proxies (size_type, size_type); // detach and do not reset + void claim_all_proxies (); // Makes all proxies point at this object + + private: + held_type m_held_obj; + pointer_container m_proxies; + }; + + template<class Container, class Holder, class Generator> + container_proxy<Container, Holder, Generator> + ::container_proxy () + : m_held_obj (Holder::create()), + m_proxies () + { + // Container is empty - no further processing + } + + template<class Container, class Holder, class Generator> + container_proxy<Container, Holder, Generator> + ::container_proxy (held_type const &held) + : m_held_obj (Holder::copy (held)), + m_proxies (size()) + { + write_proxies (0, size()); + } + + template<class Container, class Holder, class Generator> + container_proxy<Container, Holder, Generator> + ::container_proxy (container_proxy const ©) + : m_held_obj (Holder::copy (copy.m_held_obj)), + m_proxies (size()) + { + write_proxies (0, size()); // Create our own proxies for the copied values + } + + template<class Container, class Holder, class Generator> + container_proxy<Container, Holder, Generator> & + container_proxy<Container, Holder, Generator> + ::operator= (container_proxy const ©) + { + container_proxy<Container, Holder, Generator> temp (copy); + // This could throw, but none of the remaining operations can + + Holder::swap (m_held_obj, temp.m_held_obj); + std::swap (m_proxies, temp.m_proxies); + + claim_all_proxies (); + temp.claim_all_proxies (); // Prepare for detach + + return *this; + // temp destruction detaches any proxies that used to belong to us + } + + template<class Container, class Holder, class Generator> + container_proxy<Container, Holder, Generator> + ::~container_proxy () + { + // Copy original values into any proxies being shared by external pointers + clear_proxies (0, size()); + Holder::pre_destruction (m_held_obj); + } + + template<class Container, class Holder, class Generator> + Container & + container_proxy<Container, Holder, Generator> + ::raw_container () + { + return Holder::get (m_held_obj); + } + + template<class Container, class Holder, class Generator> + Container const & + container_proxy<Container, Holder, Generator> + ::raw_container () const + { + return Holder::get (m_held_obj); + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator>::reserve (size_type size) + { + raw_container().reserve (size); + m_proxies.reserve (size); + } + + template<class Container, class Holder, class Generator> + BOOST_DEDUCED_TYPENAME container_proxy<Container, Holder, Generator>::reference + container_proxy<Container, Holder, Generator> + ::at (size_type index) + { + pointer_impl const &ptr = m_proxies.BOOST_PYTHON_INDEXING_AT (index); + assert (ptr->owner() == this); + assert (ptr->index() == index); + return reference (ptr); + } + + template<class Container, class Holder, class Generator> + BOOST_DEDUCED_TYPENAME container_proxy<Container, Holder, Generator>::const_reference + container_proxy<Container, Holder, Generator> + ::at (size_type index) const + { + pointer_impl const &ptr = m_proxies.BOOST_PYTHON_INDEXING_AT (index); + assert (ptr->owner() == this); + assert (ptr->index() == index); + return const_reference (ptr); + } + + template<class Container, class Holder, class Generator> + void + container_proxy<Container, Holder, Generator> + ::replace (size_type index, raw_value_type const ©) + { + detach_proxy (index); + raw_container().BOOST_PYTHON_INDEXING_AT (index) = copy; + write_proxies (index, index + 1); + } + + template<class Container, class Holder, class Generator> + void + container_proxy<Container, Holder, Generator> + ::swap_elements (size_type index1, size_type index2) + { + pointer_impl &ptr1 = m_proxies[index1]; + pointer_impl &ptr2 = m_proxies[index2]; + + assert (ptr1->owner() == this); + assert (ptr2->owner() == this); + assert (ptr1->index() == index1); + assert (ptr2->index() == index2); + + // Swap produces the diagrammed transformation. Any external + // pointers that refer to proxy1 or proxy2 will end up still + // pointing to their original (now relocated) values. + // + // .. ptr1 .. ptr2 .. .. ptr1 .. ptr2 .. (m_proxies) + // | | \ / + // | | \/ + // | | /\. + // V V / \. + // proxy1 proxy2 --> proxy1 proxy2 + // | | \ / + // | | \/ + // | | /\. + // V V / \. + // .. v1 ... v2 .. .. v2 .. v1 .. (raw_container) + + std::swap (ptr1->m_index, ptr2->m_index); + std::swap (ptr1, ptr2); + std::swap (raw_container()[index1], raw_container()[index2]); + + assert (m_proxies[index1]->index() == index1); + assert (m_proxies[index2]->index() == index2); + } + + template<class Container, class Holder, class Generator> + BOOST_DEDUCED_TYPENAME container_proxy<Container, Holder, Generator>::iterator + container_proxy<Container, Holder, Generator>::erase (iterator iter) + { + return erase (iter, iter + 1); + } + + template<class Container, class Holder, class Generator> + BOOST_DEDUCED_TYPENAME container_proxy<Container, Holder, Generator>::iterator + container_proxy<Container, Holder, Generator>::erase( + iterator from, iterator to) + { + assert (from.ptr == this); + assert (to.ptr == this); + + // Detach and remove the proxies for the about-to-be-erased elements + prepare_erase (from.index, to.index); + + // Erase the elements from the real container + raw_iterator result + = raw_container().erase( + raw_container().begin() + from.index, + raw_container().begin() + to.index); + + return iterator (this, result); + } + + template<class Container, class Holder, class Generator> + BOOST_DEDUCED_TYPENAME container_proxy<Container, Holder, Generator>::iterator + container_proxy<Container, Holder, Generator>::insert( + iterator iter, raw_value_type const ©) + { + // Use the iterator-based version by treating the value as an + // array of size one (see section 5.7/4 of the C++98 standard) + insert (iter, ©, (©) + 1, std::random_access_iterator_tag()); + + return iter; + } + + template<class Container, class Holder, class Generator> + bool container_proxy<Container, Holder, Generator>::clear_proxy( + pointer_impl &ptr) + { + // Warning - this can break the class invariant. Use only when the + // pointer is about to be overwritten or removed from m_proxies + + assert (ptr->owner() == this); + + if (!ptr.unique()) + { + ptr->detach (); // Cause proxy to copy element value + return true; + } + + else + { + // If the pointer isn't shared, don't bother causing a copy of + // the container element, since the proxy is about to be + // deleted or reused. + return false; + } + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator>::clear_proxies( + size_type from_index, size_type to_index) + { + while (from_index != to_index) + { + clear_proxy (m_proxies[from_index]); + ++from_index; + } + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator> + ::detach_proxy (size_type index) + { + pointer_impl &ptr = m_proxies[index]; + + assert (ptr->index() == index); + + if (clear_proxy (ptr)) + { + // To maintain class invariant + ptr.reset (new shared_proxy (this, index)); + } + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator>::detach_proxies( + size_type from_index, size_type to_index) + { + while (from_index != to_index) + { + detach_proxy (from_index); + ++from_index; + } + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator> + ::prepare_erase (size_type from_index, size_type to_index) + { + difference_type deleting = to_index - from_index; + pointer_iterator erase_begin = m_proxies.begin() + from_index; + pointer_iterator erase_end = m_proxies.begin() + to_index; + + // Adjust the indexes of any trailing proxies + adjust_proxies (erase_end, m_proxies.end(), -deleting); + + // Detach any proxies without updating our pointers to them + clear_proxies (from_index, to_index); + + // Remove the pointers + m_proxies.erase (erase_begin, erase_end); + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator>::notify_insertion( + size_type from_index, size_type to_index) + { + size_type count = to_index - from_index; + + m_proxies.insert( + m_proxies.begin() + from_index, count, pointer_impl()); + + try + { + write_proxies (from_index, to_index); // Could throw + } + + catch (...) + { + m_proxies.erase( + m_proxies.begin() + from_index, + m_proxies.begin() + to_index); + + throw; + } + + // Adjust any proxies after the inserted elements (nothrow) + adjust_proxies( + m_proxies.begin() + to_index, + m_proxies.end(), + static_cast<difference_type> (count)); + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator>::adjust_proxies( + pointer_iterator from, + pointer_iterator to, + difference_type offset) + { + while (from != to) + { + (*from)->m_index += offset; + ++from; + } + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator>::write_proxies( + size_type from, size_type to) + { + // (over)write proxy pointers in the given range. Re-uses existing + // shared_proxy objects where possible. Does not call detach_proxy + // since it is assumed that the original values could have already + // been modified and copying them now would be wrong. + + while (from != to) + { + pointer_impl &ptr = m_proxies[from]; + + if ((ptr.get() == 0) || (!ptr.unique())) + { + // Either no proxy yet allocated here, or there is one + // but it is being shared by an external pointer. + ptr.reset (new shared_proxy (this, from)); + } + + else + { + // Re-use the existing object since we have the only pointer to it + assert (ptr->owner() == this); + ptr->m_index = from; + } + + ++from; + } + } + + template<class Container, class Holder, class Generator> + void container_proxy<Container, Holder, Generator>::claim_all_proxies () + { + for (pointer_iterator iter = m_proxies.begin(); + iter != m_proxies.end(); + ++iter) + { + (*iter)->m_owner_ptr = this; + } + } + + template<class Container, class Holder, class Generator> + bool container_proxy<Container, Holder, Generator>::is_valid () const + { + bool ok = size() == m_proxies.size(); // Sizes must match + + for (size_type count = 0; ok && (count < size()); ++count) + { + pointer_impl const &ptr = m_proxies[count]; + + ok = ptr.get() && (ptr->owner() == this) && (ptr->index() == count) + && !ptr->m_element_ptr.get(); + } + + return ok; + } + + ///////////////////////////////////////////////////////////////////////// + // ContainerTraits implementation for container_proxy instances + ///////////////////////////////////////////////////////////////////////// + + template<typename Container> + struct container_proxy_traits : random_access_sequence_traits<Container> + { + typedef Container container; + typedef typename container::raw_value_type value_type; // insert, ... + typedef typename container::raw_value_type key_type; // find, count, ... + typedef typename container::reference reference; // return values + + typedef typename BOOST_PYTHON_INDEXING_CALL_TRAITS <value_type>::param_type + value_param; + typedef typename BOOST_PYTHON_INDEXING_CALL_TRAITS <key_type>::param_type + key_param; + +#if defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) + // value_traits for the reference type (i.e. our element_proxy + // instance) supplies a custom visit_container_class. Compilers + // without partial specialization need help here. + + typedef element_proxy_traits<Container> value_traits_type; + + // Hide base class visit_container_class, which would call the + // unspecialized value_traits version + template<typename PythonClass, typename Policy> + static void visit_container_class( + PythonClass &pyClass, Policy const &policy) + { + value_traits_type::visit_container_class (pyClass, policy); + } +#endif + }; + +#if !defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) + namespace detail { + /////////////////////////////////////////////////////////////////////// + // algorithms support for container_proxy instances + /////////////////////////////////////////////////////////////////////// + + template <typename RawContainer, typename Holder, typename Generator> + class algorithms_selector<container_proxy<RawContainer, Holder, Generator> > + { + typedef container_proxy<RawContainer, Holder, Generator> Container; + + typedef container_proxy_traits<Container> mutable_traits; + typedef container_proxy_traits<Container const> const_traits; + + public: + typedef default_algorithms<mutable_traits> mutable_algorithms; + typedef default_algorithms<const_traits> const_algorithms; + }; + } +#endif + template< + class Container, + method_set_type MethodMask = all_methods, + class Traits = container_proxy_traits<Container> + > + struct container_proxy_suite + : container_suite<Container, MethodMask, default_algorithms<Traits> > + { + }; + +} } } + +#endif // BOOST_PYTHON_INDEXING_CONTAINER_PROXY_HPP + + +""" Added: pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_suite_header.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_suite_header.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_suite_header.py 2009-01-19 21:57:33 UTC (rev 1595) @@ -0,0 +1,68 @@ +# Copyright 2004-2008 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) + +""" +This file contains indexing suite v2 code +""" + +file_name = "indexing_suite/container_suite.hpp" + +code = """// Copyright (c) 2003 Raoul M. Gough +// +// Use, modification and distribution is subject to 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) +// +// Header file container_suite.hpp +// +// Top-level interface to the container suite. +// +// History +// ======= +// 2003/ 8/23 rmg File creation +// 2003/ 9/ 8 rmg Extracted trait facilities into container_traits.hpp +// 2008/12/08 Roman Change indexing suite layout +// +// $Id: container_suite.hpp,v 1.1.2.7 2004/02/08 18:57:42 raoulgough Exp $ +// + +#ifndef BOOST_PYTHON_INDEXING_CONTAINER_SUITE_HPP +#define BOOST_PYTHON_INDEXING_CONTAINER_SUITE_HPP + +#include <indexing_suite/methods.hpp> +#include <indexing_suite/algorithms.hpp> +#include <indexing_suite/visitor.hpp> + +#include <boost/python/return_by_value.hpp> +#include <boost/python/return_value_policy.hpp> + +namespace boost { namespace python { namespace indexing { + typedef boost::python::return_value_policy<boost::python::return_by_value> + default_container_policies; + + template< + class Container, + method_set_type MethodMask = all_methods, // All supported by algorithms + class Algorithms + = algorithms<Container> + > + struct container_suite + : public visitor<Algorithms, default_container_policies, MethodMask> + { + typedef Algorithms algorithms; + + template<typename Policy> + static visitor<Algorithms, Policy, MethodMask> + with_policies (Policy const &policy) + { + return visitor <Algorithms, Policy, MethodMask> (policy); + } + }; +} } } + +#endif // BOOST_PYTHON_INDEXING_CONTAINER_SUITE_HPP + + +""" Added: pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_traits_header.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_traits_header.py (rev 0) +++ pyplusplus_dev/pyplusplus/code_repository/indexing_suite/container_traits_header.py 2009-01-19 21:57:33 UTC (rev 1595) @@ -0,0 +1,174 @@ +# Copyright 2004-2008 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) + +""" +This file contains indexing suite v2 code +""" + +file_name = "indexing_suite/container_traits.hpp" + +code = """// Copyright (c) 2003 Raoul M. Gough +// +// Use, modification and distribution is subject to 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) +// +// Header file container_traits.hpp +// +// Traits information about entire containers for use in determining +// what Python methods to provide. +// +// History +// ======= +// 2003/ 8/23 rmg File creation as container_suite.hpp +// 2003/ 9/ 8 rmg Renamed container_traits.hpp +// 2003/10/28 rmg Split container-specific versions into separate headers +// 2004/ 1/28 rmg Convert to bitset-based feature selection +// 2008/12/08 Roman Change indexing suite layout +// +// $Id: container_traits.hpp,v 1.1.2.15 2004/02/08 18:57:42 raoulgough Exp $ +// + +#ifndef BOOST_PYTHON_INDEXING_CONTAINER_TRAITS_HPP +#define BOOST_PYTHON_INDEXING_CONTAINER_TRAITS_HPP + +#include <indexing_suite/suite_utils.hpp> +#include <indexing_suite/methods.hpp> +#include <indexing_suite/value_traits.hpp> + +#include <boost/type_traits.hpp> +#include <boost/call_traits.hpp> +#include <boost/mpl/if.hpp> +#include <boost/type_traits/ice.hpp> +#include <boost/iterator/iterator_traits.hpp> + +namespace boost { namespace python { namespace indexing { +#if BOOST_WORKAROUND (BOOST_MSVC, <= 1200) + // MSVC6 has problems with get_signature if parameter types have + // top-level const qualification (e.g. int const). Unfortunately, + // this is exactly what happens with boost::call_traits, so we + // substitute a really dumb version of it instead. + + template<typename T> struct broken_call_traits { + typedef T const & param_type; + }; +# define BOOST_PYTHON_INDEXING_CALL_TRAITS broken_cal... [truncated message content] |
From: <rom...@us...> - 2009-01-19 22:29:18
|
Revision: 1596 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1596&view=rev Author: roman_yakovenko Date: 2009-01-19 22:15:33 +0000 (Mon, 19 Jan 2009) Log Message: ----------- embedding indexing suite into Py++ Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/unittests/autoconfig.py Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-01-19 21:57:33 UTC (rev 1595) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-01-19 22:15:33 UTC (rev 1596) @@ -36,6 +36,11 @@ self.__exposed_decls_db.register_decls( extmodule.global_ns , extmodule.specially_exposed_decls ) + def makedirs_for_file( self, file_path ): + destination_dir = os.path.dirname( file_path ) + if not os.path.exists( destination_dir ): + os.makedirs( destination_dir ) + @property def encoding( self ): """encoding name used to write generated code to files""" @@ -75,12 +80,16 @@ if cr.file_name in visited: continue - self.write_file( os.path.join( dir, cr.file_name ), cr.code ) + destination_path = os.path.normpath( os.path.join( dir, cr.file_name ) ) + self.makedirs_for_file( destination_path ) + self.write_file( destination_path, cr.code ) visited.add( cr.file_name ) for fdepend in code_repository.i_depend_on_them( cr.file_name ): if fdepend.file_name not in visited: - self.write_file( os.path.join( dir, fdepend.file_name ), fdepend.code ) + destination_path = os.path.normpath( os.path.join( dir, fdepend.file_name ) ) + self.makedirs_for_file( destination_path ) + self.write_file( destination_path, fdepend.code ) visited.add( fdepend.file_name ) @staticmethod Modified: pyplusplus_dev/unittests/autoconfig.py =================================================================== --- pyplusplus_dev/unittests/autoconfig.py 2009-01-19 21:57:33 UTC (rev 1595) +++ pyplusplus_dev/unittests/autoconfig.py 2009-01-19 22:15:33 UTC (rev 1596) @@ -41,7 +41,7 @@ class scons_config: libs = [] libpath = [ python.libs ] + boost.libs - cpppath = [ boost.include, python.include, indexing_suite.include ] + cpppath = [ boost.include, python.include, build_directory ] #indexing_suite.include ] include_dirs = cpppath + [data_directory] @staticmethod This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-21 20:07:45
|
Revision: 1607 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1607&view=rev Author: roman_yakovenko Date: 2009-01-21 20:07:41 +0000 (Wed, 21 Jan 2009) Log Message: ----------- fix few bugs, related to code_repository functionality Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/bpmodule.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/compound.py pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/unittests/ctypes_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/bpmodule.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/bpmodule.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/code_creators/bpmodule.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -11,9 +11,7 @@ import compound import algorithm import module_body -import declaration_based import include_directories -from pygccxml import utils class bpmodule_t(module.module_t): """This class represents the source code for the entire extension module. @@ -23,7 +21,7 @@ def __init__(self, global_ns): """Constructor. """ - module.module_t.__init__(self, global_ns) + module.module_t.__init__(self, global_ns, bpmodule_t.CODE_GENERATOR_TYPES.BOOST_PYTHON) self.__body = None def _get_include_dirs(self): @@ -157,19 +155,3 @@ def add_declaration_code( self, code, position ): self.adopt_declaration_creator( custom.custom_text_t( code ) ) - - @utils.cached - def specially_exposed_decls(self): - """list of exposed declarations, which were not ``included``, but still - were exposed. For example, std containers. - """ - decls = set() - #select all declaration based code creators - ccs = filter( lambda cc: isinstance( cc, declaration_based.declaration_based_t ) - , algorithm.make_flatten_list( self ) ) - #leave only "ignored" - ccs = filter( lambda cc: cc.declaration.ignore == True, ccs ) - - decls = map( lambda cc: cc.declaration, ccs ) - - return set( decls ) Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -41,6 +41,8 @@ @property def code_generator( self ): + if self._code_generator is None: + self._code_generator = self.top_parent.code_generator return self._code_generator def _get_works_on_instance(self): Modified: pyplusplus_dev/pyplusplus/code_creators/compound.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/compound.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/code_creators/compound.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -78,8 +78,7 @@ return os.linesep.join( internals ) def get_system_files( self, recursive=False, unique=False, language='any' ): - files = [ "boost/python.hpp" ] - files.extend( self._get_system_files_impl() ) + files = super( compound_t, self ).get_system_files(recursive, unique=False, language=language) if recursive: for creator in self._creators: files.extend( creator.get_system_files(recursive, unique=False, language=language) ) Modified: pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/code_creators/ctypes_module.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -17,7 +17,7 @@ def __init__(self, global_ns): """Constructor. """ - module.module_t.__init__(self, global_ns) + module.module_t.__init__(self, global_ns, ctypes_module_t.CODE_GENERATOR_TYPES.CTYPES) def _create_impl(self): return self.create_internal_code( self.creators, indent_code=False ) Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -7,18 +7,22 @@ import license import include import compound +import algorithm +import declaration_based +from pygccxml import utils class module_t(compound.compound_t): """This class represents the source code for the entire extension module. The root of the code creator tree is always a module_t object. """ - def __init__(self, global_ns): + def __init__(self, global_ns, code_generator_type): """Constructor. """ compound.compound_t.__init__(self) self.__global_ns = global_ns - + self._code_generator = code_generator_type + @property def global_ns(self): "reference to global_ns ( namespace_t ) declaration" @@ -43,3 +47,20 @@ def _get_system_files_impl( self ): return [] + + @utils.cached + def specially_exposed_decls(self): + """list of exposed declarations, which were not ``included``, but still + were exposed. For example, std containers. + """ + decls = set() + #select all declaration based code creators + ccs = filter( lambda cc: isinstance( cc, declaration_based.declaration_based_t ) + , algorithm.make_flatten_list( self ) ) + #leave only "ignored" + ccs = filter( lambda cc: cc.declaration.ignore == True, ccs ) + + decls = map( lambda cc: cc.declaration, ccs ) + + return set( decls ) + Modified: pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/creators_factory/bpcreator.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -81,6 +81,7 @@ self.__types_db = types_database.types_database_t() global_ns = declarations.get_global_namespace(decls) + self.__extmodule = code_creators.bpmodule_t( global_ns ) if boost_python_ns_name: bp_ns_alias = code_creators.namespace_alias_t( alias=boost_python_ns_name @@ -353,9 +354,6 @@ self.__dependencies_manager.inform_user() - for cc in code_creators.make_flatten( self.__extmodule ): - cc._code_generator = decl_wrappers.CODE_GENERATOR_TYPES.BOOST_PYTHON - return self.__extmodule def visit_member_function( self ): Modified: pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/creators_factory/ctypes_creator.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -152,9 +152,6 @@ self.__dependencies_manager.inform_user() - for cc in code_creators.make_flatten( self.module ): - cc._code_generator = decl_wrappers.CODE_GENERATOR_TYPES.CTYPES - return self.module def visit_member_function( self ): Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -32,9 +32,8 @@ if None is files_sum_repository: self.__files_sum_repository = md5sum_repository.dummy_repository_t() self.__exposed_decls_db = utils.exposed_decls_db_t() - if isinstance( self.__extmodule, code_creators.bpmodule_t ): - self.__exposed_decls_db.register_decls( extmodule.global_ns - , extmodule.specially_exposed_decls ) + self.__exposed_decls_db.register_decls( extmodule.global_ns + , extmodule.specially_exposed_decls ) def makedirs_for_file( self, file_path ): destination_dir = os.path.dirname( file_path ) Modified: pyplusplus_dev/unittests/ctypes_tester.py =================================================================== --- pyplusplus_dev/unittests/ctypes_tester.py 2009-01-21 14:42:56 UTC (rev 1606) +++ pyplusplus_dev/unittests/ctypes_tester.py 2009-01-21 20:07:41 UTC (rev 1607) @@ -6,6 +6,7 @@ import os import sys import ctypes +import shutil import unittest import autoconfig from pyplusplus.module_builder import ctypes_module_builder_t @@ -58,6 +59,11 @@ if self.base_name in sys.modules: return sys.modules[ self.base_name ] + binaries_dir = os.path.dirname( self.symbols_file ) + if os.path.exists( binaries_dir ): + print '\nrmdir ', binaries_dir + shutil.rmtree( binaries_dir ) + autoconfig.scons_config.compile( self.__build_scons_cmd(), cwd=autoconfig.this_module_dir_path ) mb = ctypes_module_builder_t( [self.header], self.symbols_file, autoconfig.cxx_parsers_cfg.gccxml ) self.customize( mb ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-26 10:40:19
|
Revision: 1618 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1618&view=rev Author: roman_yakovenko Date: 2009-01-26 10:40:12 +0000 (Mon, 26 Jan 2009) Log Message: ----------- removing deprecated functionality Modified Paths: -------------- pygccxml_dev/pygccxml/__init__.py pygccxml_dev/pygccxml/binary_parsers/undname.py pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/scopedef.py pygccxml_dev/pygccxml/utils/__init__.py pygccxml_dev/unittests/test_all.py pyplusplus_dev/pyplusplus/messages/__init__.py pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py pyplusplus_dev/unittests/fundamental_tester_base.py Removed Paths: ------------- pygccxml_dev/pygccxml/declarations/filtering.py pygccxml_dev/unittests/filtering_tester.py Modified: pygccxml_dev/pygccxml/__init__.py =================================================================== --- pygccxml_dev/pygccxml/__init__.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/pygccxml/__init__.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -34,8 +34,7 @@ import pygccxml.utils as utils #TODO: -# 1. Write documentation for filtering functionality. -# 2. Add "explicit" property for constructors +# 1. Add "explicit" property for constructors __version__ = '1.0.0' Modified: pygccxml_dev/pygccxml/binary_parsers/undname.py =================================================================== --- pygccxml_dev/pygccxml/binary_parsers/undname.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/pygccxml/binary_parsers/undname.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -4,7 +4,14 @@ # http://www.boost.org/LICENSE_1_0.txt) """ -provides functionality needed to undecorate\demangle compiler generated unique names +provides low-level functionality, needed to undecorate\demangle compiler generated +unique names and map them to the declarations + +On Windows: + ctypes package is used to call UnDecorateSymbolName function from dbghelp.dll + +On Linux: + "nm" utility is used. """ import os @@ -14,6 +21,8 @@ from pygccxml import declarations class UNDECORATE_NAME_OPTIONS: + """defines few constants for UnDecorateSymbolName function""" + UNDNAME_COMPLETE = 0x0000 #Enables full undecoration. UNDNAME_NO_LEADING_UNDERSCORES = 0x0001 #Removes leading underscores from Microsoft extended keywords. UNDNAME_NO_MS_KEYWORDS = 0x0002 #Disables expansion of Microsoft extended keywords. @@ -48,39 +57,19 @@ SHORT_UNIQUE_NAME = UNDNAME_NO_MS_KEYWORDS | UNDNAME_NO_ACCESS_SPECIFIERS | UNDNAME_NO_ECSU -#~ The following code doesn't work - access violation +class undname_creator_t: + """formats declarations string representation and exported symbols, so they + could be matched later. -#~__unDName definition was taken from: -#~http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2006-02/msg00754.html + The class formats variables, free and member functions, symbols exported from + .dll, .map and .so files. -#~ msvcrxx = ctypes.windll.msvcr90 -#~ free_type = ctypes.CFUNCTYPE( None, ctypes.c_void_p ) #free type -#~ malloc_type = ctypes.CFUNCTYPE( ctypes.c_void_p, ctypes.c_uint ) #malloc type -#~ __unDName = msvcrxx.__unDName -#~ __unDName.argtypes = [ ctypes.c_char_p #undecorated name - #~ , ctypes.c_char_p #decorated name - #~ , ctypes.c_int #sizeof undecorated name - #~ , malloc_type - #~ , free_type - #~ , ctypes.c_ushort #flags - #~ ] -#~ __unDName.restype = ctypes.c_char_p -#~ def undecorate_name( name, options=None ): - #~ if not name: - #~ return '' - #~ if options is None: - #~ options = UNDECORATE_NAME_OPTIONS.SHORT_UNIQUE_NAME - #~ buffer_size = 1024 * 32 - #~ undecorated_name = ctypes.create_string_buffer('\0' * buffer_size) #should be enouph for any symbol - #~ __unDName( undecorated_name - #~ , str(name) - #~ , buffer_size - #~ , malloc_type( msvcrxx.malloc ) - #~ , free_type( msvcrxx.free ) - #~ , options ) - #~ return undecorated_name.value + On Windows, the class works with unique name produced by MSVC compiler and + with undecorated names produced by dbghelp.dll -class undname_creator_t: + On Linux, the class works with mangled names produced by GCC-XML ( GCC 4.2 ) + compiler and demangled name produced by "nm" utility. + """ def __init__( self ): if 'win32' in sys.platform: import ctypes.wintypes @@ -147,7 +136,6 @@ result = result.replace( ' ' + x, x ) return result - def __normalize( self, name ): for what, with_ in self.__fundamental_types: name = name.replace( what, with_ ) Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -217,8 +217,6 @@ import templates import call_invocation -from filtering import filtering - from decl_factory import decl_factory_t from matchers import matcher_base_t Deleted: pygccxml_dev/pygccxml/declarations/filtering.py =================================================================== --- pygccxml_dev/pygccxml/declarations/filtering.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/pygccxml/declarations/filtering.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -1,79 +0,0 @@ -# Copyright 2004-2008 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) - -""" -deprecated! - -This module defines few algorithms for filtering declarations. -""" - -import os -import algorithm - -class filtering: - """deprecated! - - defines few algorithms for filtering declarations - """ - - @staticmethod - def normalize_path( some_path ): - """return os.path.normcase( os.path.normpath( some_path ) )""" - return os.path.normcase( os.path.normpath( some_path ) ) - - @staticmethod - def contains_parent_dir( fpath, dirs ): - #precondition: dirs and fpath should be normalize_path'ed before calling this function - return bool( filter( lambda dir: fpath.startswith( dir ), dirs ) ) - - @staticmethod - def by_location( decls, locations ): - """ - returns list of declarations that belongs to specified locations. - - This function works recursively. Pay attention: if you remove namespace, - then you remove all declarations defined within the namespace. - - @param decls: declaration or list of declarations - @type decls: L{declaration<declaration_t>} or list of L{declarations<declaration_t>} - - @param locations: list of directories and/or files names - @type locations: list of strings - - @return: list of L{declarations<declaration_t>} - """ - #precondition: decls is a list of op level namespaces - #locations is list of directories and\or files - temp_decls = algorithm.make_flatten( decls ) - locations = map( filtering.normalize_path, locations ) - dirs = filter( lambda location: os.path.isdir( location ), locations ) - files = filter( lambda location: os.path.isfile( location ), locations ) - result = [] - for decl in temp_decls: - if not decl.location: - result.append( decl ) - continue - fpath = filtering.normalize_path( decl.location.file_name ) - if filtering.contains_parent_dir( fpath, dirs ) or fpath in files: - result.append( decl ) - return result - - @staticmethod - def user_defined( decls, matcher ): - """ - returns list of declarations that match user specified criteria. - - This function works recursively. - - @param decls: declaration or list of declarations - @type decls: L{declaration<declaration_t>} or list of L{declarations<declaration_t>} - - @param matcher: callable object, that takes 1 argument - declaration - and returns True if object should stay, and false otherwise - - @return: list of L{declarations<declaration_t>} - """ - #precondition: decls is a list of op level namespaces - return filter( matcher, algorithm.make_flatten( decls ) ) Modified: pygccxml_dev/pygccxml/declarations/scopedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/scopedef.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/pygccxml/declarations/scopedef.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -9,7 +9,6 @@ import time import algorithm -import filtering import templates import declaration import mdecl_wrapper Modified: pygccxml_dev/pygccxml/utils/__init__.py =================================================================== --- pygccxml_dev/pygccxml/utils/__init__.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/pygccxml/utils/__init__.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -89,6 +89,13 @@ """return os.path.normpath( os.path.normcase( some_path ) )""" return os.path.normpath( os.path.normcase( some_path ) ) +def contains_parent_dir( fpath, dirs ): + """returns bool( filter( lambda dir: fpath.startswith( dir ), dirs ) ) + precondition: dirs and fpath should be normalize_path'ed before calling this function + """ + return bool( filter( lambda dir: fpath.startswith( dir ), dirs ) ) + + def get_architecture(): """returns computer architecture: 32 or 64. Deleted: pygccxml_dev/unittests/filtering_tester.py =================================================================== --- pygccxml_dev/unittests/filtering_tester.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/unittests/filtering_tester.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -1,46 +0,0 @@ -# Copyright 2004-2008 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 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.__fname = 'declarations_for_filtering.hpp' - self.__fpath = declarations.filtering.normalize_path( - os.path.join( autoconfig.data_directory, self.__fname ) ) - - def test_by_location(self): - reader = parser.source_reader_t( self.config ) - decls = reader.read_file( self.__fname ) - decls_count = len( declarations.make_flatten( decls ) ) - filtered = declarations.filtering.by_location( decls, [autoconfig.data_directory] ) - flatten_filtered = declarations.make_flatten( filtered ) - self.failUnless( len( flatten_filtered ) != decls_count ) - for decl in flatten_filtered: - if decl.location: - self.failUnless( declarations.filtering.normalize_path( decl.location.file_name ) - , self.__fpath ) - self.failUnless( declarations.find_declaration( filtered - , name='color' - , type=declarations.enumeration_t - , recursive=False) ) - -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() \ No newline at end of file Modified: pygccxml_dev/unittests/test_all.py =================================================================== --- pygccxml_dev/unittests/test_all.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pygccxml_dev/unittests/test_all.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -19,7 +19,6 @@ import type_traits_tester import core_tester import xmlfile_reader_tester -import filtering_tester import text_reader_tester import hierarchy_traveling import patcher_tester @@ -70,7 +69,6 @@ , type_traits_tester , core_tester , xmlfile_reader_tester - , filtering_tester , text_reader_tester , hierarchy_traveling , patcher_tester Modified: pyplusplus_dev/pyplusplus/messages/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/__init__.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pyplusplus_dev/pyplusplus/messages/__init__.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -8,16 +8,6 @@ """ from warnings_ import * -#implementation using regular expression is deprecated, I will leave it here for -#some time to be sure that the new one does not cause any problems. -#import re -#__RE_GET_WARNING_ID = re.compile( r'warning\s(?P<id>W(\d){4})' ) -#match_obj = __RE_GET_WARNING_ID.search(msg) -# if not match_obj: -# return None -# else: -# return match_obj.group( 'id' ) - def find_out_message_id( msg ): return msg.identifier Modified: pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pyplusplus_dev/pyplusplus/module_builder/boost_python_builder.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -11,6 +11,7 @@ import module_builder from pygccxml import parser +from pygccxml import utils as pygccxml_utils from pygccxml import declarations as decls_package from pyplusplus import utils @@ -76,7 +77,7 @@ , compiler=compiler) #may be in future I will add those directories to user_defined_directories to self.__code_creator. - self.__parsed_files = map( decls_package.filtering.normalize_path + self.__parsed_files = map( pygccxml_utils.normalize_path , parser.project_reader_t.get_os_file_names( files ) ) tmp = map( lambda file_: os.path.split( file_ )[0], self.__parsed_files ) self.__parsed_dirs = filter( None, tmp ) @@ -151,8 +152,8 @@ for decl in flatten_decls: if not decl.location: continue - fpath = decls_package.filtering.normalize_path( decl.location.file_name ) - if decls_package.filtering.contains_parent_dir( fpath, self.__parsed_dirs ): + fpath = pygccxml_utils.normalize_path( decl.location.file_name ) + if pygccxml_utils.contains_parent_dir( fpath, self.__parsed_dirs ): continue if fpath in self.__parsed_files: continue @@ -203,7 +204,6 @@ def build_code_creator( self , module_name , boost_python_ns_name='bp' - , create_casting_constructor=True , call_policies_resolver_=None , types_db=None , target_configuration=None @@ -226,16 +226,7 @@ and returns documentation string @type doc_extractor: callable or None """ - if not create_casting_constructor: - msg = os.linesep.join([ - "create_casting_constructor argument is deprecated." - , "If want to disable boost::python::implicitly_convertible code generation, consider to use allow_implicit_conversion constructor property" - , ">>> mb = module_builder_t(...)" - , ">>> mb.constructors().allow_implicit_conversion = False"]) - warnings.warn(msg, DeprecationWarning, stacklevel=2) - self.global_ns.constructors(allow_empty=True).allow_implicit_conversion = False - creator = creators_factory.bpcreator_t( self.global_ns , module_name , boost_python_ns_name Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2009-01-26 09:11:26 UTC (rev 1617) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2009-01-26 10:40:12 UTC (rev 1618) @@ -102,7 +102,7 @@ , include_paths=[autoconfig.boost.include] , undefine_symbols=['__MINGW32__'] , indexing_suite_version=self.__indexing_suite_version - , compiler=pygccxml.utils.native_compiler.get_gccxml_compiler()) + , compiler=autoconfig.cxx_parsers_cfg.gccxml.compiler) for decl in mb.decls(): decl.documentation = '"documentation"' self.customize( mb ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2009-01-30 20:34:47
|
Revision: 1643 http://pygccxml.svn.sourceforge.net/pygccxml/?rev=1643&view=rev Author: roman_yakovenko Date: 2009-01-30 20:34:42 +0000 (Fri, 30 Jan 2009) Log Message: ----------- add extract_return_type to indexing suite v2 - patch from Maik Beckmann Modified Paths: -------------- pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp pyplusplus_dev/pyplusplus/code_repository/indexing_suite/slice_handler_header.py Modified: pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp 2009-01-30 20:03:31 UTC (rev 1642) +++ pyplusplus_dev/indexing_suite_v2/indexing_suite/slice_handler.hpp 2009-01-30 20:34:42 UTC (rev 1643) @@ -12,7 +12,8 @@ // ======= // 2003/ 9/ 9 rmg File creation // 2008/12/08 Roman Change indexing suite layout -// +// 2009/01/30 Roman patch from Maik Beckmann was applied - fixes error: +// // error: no class template named 'extract_return_type' // $Id: slice_handler.hpp,v 1.1.2.10 2003/11/24 16:35:52 raoulgough Exp $ // @@ -64,6 +65,9 @@ typedef boost::python::default_result_converter result_converter; typedef typename Policy::argument_package argument_package; + template<class Sig> struct extract_return_type : + Policy::template extract_return_type<Sig> { }; + postcall_override (Policy const &p); bool precall (PyObject *args); Modified: pyplusplus_dev/pyplusplus/code_repository/indexing_suite/slice_handler_header.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/indexing_suite/slice_handler_header.py 2009-01-30 20:03:31 UTC (rev 1642) +++ pyplusplus_dev/pyplusplus/code_repository/indexing_suite/slice_handler_header.py 2009-01-30 20:34:42 UTC (rev 1643) @@ -1,14 +1,14 @@ -# Copyright 2004-2008 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) - -""" -This file contains indexing suite v2 code -""" - -file_name = "indexing_suite/slice_handler.hpp" - +# Copyright 2004-2008 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) + +""" +This file contains indexing suite v2 code +""" + +file_name = "indexing_suite/slice_handler.hpp" + code = """// -*- mode:c++ -*- // // Header file slice_handler.hpp @@ -23,7 +23,8 @@ // ======= // 2003/ 9/ 9 rmg File creation // 2008/12/08 Roman Change indexing suite layout -// +// 2009/01/30 Roman patch from Maik Beckmann was applied - fixes error: +// // error: no class template named 'extract_return_type' // $Id: slice_handler.hpp,v 1.1.2.10 2003/11/24 16:35:52 raoulgough Exp $ // @@ -75,6 +76,9 @@ typedef boost::python::default_result_converter result_converter; typedef typename Policy::argument_package argument_package; + template<class Sig> struct extract_return_type : + Policy::template extract_return_type<Sig> { }; + postcall_override (Policy const &p); bool precall (PyObject *args); @@ -307,6 +311,6 @@ } } } #endif // BOOST_PYTHON_INDEXING_SLICE_HANDLER_HPP - - -""" + + +""" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |