Thread: [pygccxml-commit] SF.net SVN: pygccxml: [857] pyplusplus_dev (Page 3)
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2007-01-07 14:32:46
|
Revision: 857 http://svn.sourceforge.net/pygccxml/?rev=857&view=rev Author: roman_yakovenko Date: 2007-01-07 06:32:46 -0800 (Sun, 07 Jan 2007) Log Message: ----------- adding support for auto aliasing Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py pyplusplus_dev/pyplusplus/messages/warnings_.py pyplusplus_dev/unittests/classes_tester.py pyplusplus_dev/unittests/data/classes_to_be_exported.hpp Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2007-01-07 12:51:09 UTC (rev 856) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2007-01-07 14:32:46 UTC (rev 857) @@ -47,18 +47,27 @@ name = self.name return algorithm.create_valid_name( name ) + def __select_alias_directives( self ): + if not isinstance( self, declarations.class_t ): + return [] + return list( set( filter( lambda typedef: typedef.is_directive, self.aliases ) ) ) + def _get_alias(self): if not self._alias: - if declarations.templates.is_instantiation( self.name ): - container_aliases = [ 'value_type', 'key_type', 'mapped_type' ] - if isinstance( self, declarations.class_t ) \ - and 1 == len( set( map( lambda typedef: typedef.name, self.aliases ) ) ) \ - and self.aliases[0].name not in container_aliases: - self._alias = self.aliases[0].name + directives = self.__select_alias_directives() + if 1 == len( directives ): + self._alias = directives[0].name + else: + if declarations.templates.is_instantiation( self.name ): + container_aliases = [ 'value_type', 'key_type', 'mapped_type' ] + if isinstance( self, declarations.class_t ) \ + and 1 == len( set( map( lambda typedef: typedef.name, self.aliases ) ) ) \ + and self.aliases[0].name not in container_aliases: + self._alias = self.aliases[0].name + else: + self._alias = self._generate_valid_name() else: - self._alias = self._generate_valid_name() - else: - self._alias = self.name + self._alias = self.name return self._alias def _set_alias(self, alias): self._alias = alias @@ -132,7 +141,12 @@ if declarations.templates.is_instantiation( self.name ) \ and self.alias == self._generate_valid_name(): msgs.append( messages.W1043 % self.alias ) - + + directives = self.__select_alias_directives() + if 1 < len( directives ): + msgs.append( messages.W1048 + % ', '.join( map( lambda typedef: typedef.name, directives ) ) ) + msgs.extend( self._readme_impl() ) return messages.filter_disabled_msgs( msgs, self.__msgs_to_ignore ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py 2007-01-07 12:51:09 UTC (rev 856) +++ pyplusplus_dev/pyplusplus/decl_wrappers/typedef_wrapper.py 2007-01-07 14:32:46 UTC (rev 857) @@ -19,3 +19,14 @@ def __init__(self, *arguments, **keywords): declarations.typedef_t.__init__(self, *arguments, **keywords ) decl_wrapper.decl_wrapper_t.__init__( self ) + self.__is_directive = None + + @property + def is_directive( self ): + if None is self.__is_directive: + dpath = declarations.declaration_path( self ) + if len( dpath ) != 4: + self.__is_directive = False + else: + self.__is_directive = dpath[:3] == ['::', 'pyplusplus', 'aliases'] + return self.__is_directive Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-07 12:51:09 UTC (rev 856) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-07 14:32:46 UTC (rev 857) @@ -142,6 +142,10 @@ 'of the classes will not be exposed to Python.' \ 'Other classes : %s' +W1048 = 'There are two or more aliases within "pyplusplus::aliases" namespace for ' \ + 'the class. In order to enjoy from automatic aliasing, the class alias ' \ + 'should be unique. Other aliases: %s' + warnings = globals() for identifier, explanation in warnings.items(): Modified: pyplusplus_dev/unittests/classes_tester.py =================================================================== --- pyplusplus_dev/unittests/classes_tester.py 2007-01-07 12:51:09 UTC (rev 856) +++ pyplusplus_dev/unittests/classes_tester.py 2007-01-07 14:32:46 UTC (rev 857) @@ -19,6 +19,9 @@ def customize(self, mb ): mb.class_( 'fundamental2' ).alias = 'FUNDAMENTAL2' + apple = mb.class_( 'apple' ) + self.failUnless( apple.alias == 'the_tastest_fruit' ) + apple.alias = 'apple' def run_tests(self, module): self.failIfRaisesAny( module.fundamental1 ) @@ -52,4 +55,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() Modified: pyplusplus_dev/unittests/data/classes_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/classes_to_be_exported.hpp 2007-01-07 12:51:09 UTC (rev 856) +++ pyplusplus_dev/unittests/data/classes_to_be_exported.hpp 2007-01-07 14:32:46 UTC (rev 857) @@ -97,4 +97,13 @@ }//classes +namespace pyplusplus{ namespace aliases{ + +typedef classes::hierarchical::apple the_tastest_fruit; + +typedef classes::protected_static::protected_static_t PROTECTED_STATIC_T_1; +typedef classes::protected_static::protected_static_t PROTECTED_STATIC_T_2; + +}} + #endif//__classes_to_be_exported_hpp__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-08 07:23:21
|
Revision: 858 http://svn.sourceforge.net/pygccxml/?rev=858&view=rev Author: roman_yakovenko Date: 2007-01-07 23:23:19 -0800 (Sun, 07 Jan 2007) Log Message: ----------- adding non overridable tester Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/messages/warnings_.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/non_overridable_to_be_exported.cpp pyplusplus_dev/unittests/data/non_overridable_to_be_exported.hpp pyplusplus_dev/unittests/non_overridable_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-01-07 14:32:46 UTC (rev 857) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-01-08 07:23:19 UTC (rev 858) @@ -153,9 +153,7 @@ return algorithm.create_identifier( self, declarations.full_name( self.declaration.parent ) ) def unoverriden_function_body( self ): - msg = r'This function could not be overriden in Python!' - msg = msg + 'Reason: function returns reference to local variable!' - return 'throw std::logic_error("%s");' % msg + return 'throw std::logic_error("%s");' % self.declaration.non_overridable_reason def throw_specifier_code( self ): if self.declaration.does_throw: @@ -256,7 +254,7 @@ } def create_body( self ): - if declarations.is_reference( self.declaration.return_type ): + if not self.declaration.overridable: return self.unoverriden_function_body() template = [] template.append( '%(override)s func_%(alias)s = this->get_override( "%(alias)s" );' ) @@ -665,7 +663,7 @@ } def create_body( self ): - if declarations.is_reference( self.declaration.return_type ): + if not self.declaration.overridable: return self.unoverriden_function_body() template = [] @@ -720,7 +718,7 @@ } def create_body( self ): - if declarations.is_reference( self.declaration.return_type ): + if not self.declaration.overridable: return self.unoverriden_function_body() template = [] Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-01-07 14:32:46 UTC (rev 857) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-01-08 07:23:19 UTC (rev 858) @@ -33,6 +33,7 @@ self._use_default_arguments = True self._create_with_signature = False self._overridable = None + self._non_overridable_reason = None self._transformations = None def get_call_policies(self): @@ -90,7 +91,7 @@ and self.virtuality != declarations.VIRTUALITY_TYPES.NOT_VIRTUAL \ and declarations.is_reference( self.return_type ): self._overridable = False - self._non_overridable_reason = messages.W1003 + self._non_overridable_reason = messages.W1049 else: self._overridable = True self._non_overridable_reason = "" @@ -98,10 +99,18 @@ def set_overridable( self, overridable ): self._overridable = overridable - + overridable = property( get_overridable, set_overridable , doc = get_overridable.__doc__ ) + @property + def non_overridable_reason( self ): + return self._non_overridable_reason + + def mark_as_non_overridable( self, reason ): + self.overridable = False + self._non_overridable_reason = reason + @property def transformations(self): """Get method for property 'function_transformers'. Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-07 14:32:46 UTC (rev 857) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-08 07:23:19 UTC (rev 858) @@ -145,7 +145,10 @@ W1048 = 'There are two or more aliases within "pyplusplus::aliases" namespace for ' \ 'the class. In order to enjoy from automatic aliasing, the class alias ' \ 'should be unique. Other aliases: %s' - + +W1049 = 'This method could not be overriden in Python - method returns reference ' \ + 'to local variable!' + warnings = globals() for identifier, explanation in warnings.items(): Added: pyplusplus_dev/unittests/data/non_overridable_to_be_exported.cpp =================================================================== --- pyplusplus_dev/unittests/data/non_overridable_to_be_exported.cpp (rev 0) +++ pyplusplus_dev/unittests/data/non_overridable_to_be_exported.cpp 2007-01-08 07:23:19 UTC (rev 858) @@ -0,0 +1,13 @@ +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#include "non_overridable_to_be_exported.hpp" + +namespace non_overridable{ + + +}//non_overridable + + Added: pyplusplus_dev/unittests/data/non_overridable_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/non_overridable_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/non_overridable_to_be_exported.hpp 2007-01-08 07:23:19 UTC (rev 858) @@ -0,0 +1,47 @@ +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __non_overridable_to_be_exported_hpp__ +#define __non_overridable_to_be_exported_hpp__ +#include <string> + +namespace non_overridables{ + +struct non_overridable_v_t{ + + + static bool test( const non_overridable_v_t& impl ){ + return impl.void_ptr() ? true : false; + } + + + virtual const void* void_ptr() const { + return this; + } + + virtual std::string& string_ref() const { + static std::string x( "string_ref" ); + return x; + } + +}; + +struct non_overridable_pv_t{ + + static bool test( const non_overridable_pv_t& impl ){ + return impl.void_ptr() ? true : false; + } + + virtual void* void_ptr() const = 0; + + virtual std::string& string_ref() const = 0; + +}; + + + +} + +#endif//__non_overridable_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/non_overridable_tester.py =================================================================== --- pyplusplus_dev/unittests/non_overridable_tester.py (rev 0) +++ pyplusplus_dev/unittests/non_overridable_tester.py 2007-01-08 07:23:19 UTC (rev 858) @@ -0,0 +1,63 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +import sys +import ctypes +import unittest +import fundamental_tester_base +from pyplusplus.module_builder import call_policies + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'non_overridable' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + mb.mem_funs( 'string_ref' ).call_policies \ + = call_policies.return_value_policy( call_policies.copy_non_const_reference ) + + non_overridable_pv_t = mb.class_( 'non_overridable_pv_t' ) + non_overridable_pv_t.mem_fun( 'void_ptr' ).mark_as_non_overridable( reason='xxx void*' ) + + def create_pv_derived(self, module): + class py_pv_t( module.non_overridable_pv_t ): + def __init__( self ): + module.non_overridable_pv_t.__init__( self ) + + def void_ptr( self ): + return ctypes.c_void_p( id(self) ) + return py_pv_t() + + def create_v_derived(self, module): + class py_v_t( module.non_overridable_v_t ): + def __init__( self ): + module.non_overridable_v_t.__init__( self ) + + def void_ptr( self ): + return ctypes.c_void_p( id(self) ) + return py_v_t() + + def run_tests( self, module): + x = self.create_pv_derived(module) + self.failUnlessRaises( RuntimeError, module.non_overridable_pv_t.test, x ) + + y = self.create_v_derived(module) + self.failUnlessRaises( ReferenceError, module.non_overridable_v_t.test, y ) + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2007-01-07 14:32:46 UTC (rev 857) +++ pyplusplus_dev/unittests/test_all.py 2007-01-08 07:23:19 UTC (rev 858) @@ -70,6 +70,7 @@ import function_transformations_tester import throw_tester import duplicate_aliases_tester +import non_overridable_tester def create_suite(times): testers = [ @@ -136,6 +137,7 @@ , function_transformations_tester , throw_tester , duplicate_aliases_tester + , non_overridable_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-09 07:11:11
|
Revision: 861 http://svn.sourceforge.net/pygccxml/?rev=861&view=rev Author: roman_yakovenko Date: 2007-01-08 23:11:09 -0800 (Mon, 08 Jan 2007) Log Message: ----------- adding ability to guess call policies for indexing suite v2 Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/unittests/indexing_suites2_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2007-01-09 06:20:10 UTC (rev 860) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2007-01-09 07:11:09 UTC (rev 861) @@ -6,7 +6,7 @@ """defines interface for exposing STD containers, using next version of indexing suite""" from pygccxml import declarations - +import call_policies """ method_len method_iter @@ -86,9 +86,21 @@ element_type = property( _get_element_type , doc="Reference to container value_type( mapped_type ) type" ) - def _get_call_policies( self ): - #TODO find out call policies + def _get_call_policies( self ): + if self.__call_policies: + return self.__call_policies + + element_type = None + try: + element_type = self.element_type + except: + return + if declarations.is_const( element_type ): + element_type = declarations.remove_const( element_type ) + if declarations.is_pointer( element_type ): + self.__call_policies = call_policies.return_internal_reference() return self.__call_policies + def _set_call_policies( self, call_policies ): self.__call_policies = call_policies call_policies = property( _get_call_policies, _set_call_policies Modified: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py 2007-01-09 06:20:10 UTC (rev 860) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2007-01-09 07:11:09 UTC (rev 861) @@ -32,8 +32,8 @@ #fvector.indexing_suite.call_policies = module_builder.call_policies.default_call_policies() items_ptr = generator.global_ns.typedef( 'items_ptr_t' ) items_ptr = declarations.remove_declarated( items_ptr.type ) - items_ptr.indexing_suite.call_policies = module_builder.call_policies.return_internal_reference() - + self.failUnless( items_ptr.indexing_suite.call_policies.__class__ + is module_builder.call_policies.return_internal_reference().__class__ ) def run_tests( self, module): fv = module.fvector() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-09 09:29:07
|
Revision: 862 http://svn.sourceforge.net/pygccxml/?rev=862&view=rev Author: roman_yakovenko Date: 2007-01-09 01:29:03 -0800 (Tue, 09 Jan 2007) Log Message: ----------- fixing indexing suite and adding aliases to class declarations Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/__init__.py pygccxml_dev/pygccxml/declarations/class_declaration.py pygccxml_dev/pygccxml/parser/source_reader.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/messages/warnings_.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/classes_tester.py Modified: pygccxml_dev/pygccxml/declarations/__init__.py =================================================================== --- pygccxml_dev/pygccxml/declarations/__init__.py 2007-01-09 07:11:09 UTC (rev 861) +++ pygccxml_dev/pygccxml/declarations/__init__.py 2007-01-09 09:29:03 UTC (rev 862) @@ -199,6 +199,22 @@ ] """list, that contains all STD container traits classes""" +sequential_container_traits = \ +[ + list_traits + , deque_traits + , queue_traits + , priority_queue + , vector_traits + , stack_traits + , set_traits + , hash_set_traits + , multiset_traits + , hash_multiset_traits +] +"""list, that contains all STD container traits classes""" + + import templates import call_invocation Modified: pygccxml_dev/pygccxml/declarations/class_declaration.py =================================================================== --- pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-01-09 07:11:09 UTC (rev 861) +++ pygccxml_dev/pygccxml/declarations/class_declaration.py 2007-01-09 09:29:03 UTC (rev 862) @@ -80,14 +80,22 @@ def __init__( self, name='' ): """creates class that describes C++ class declaration( and not definition )""" declaration.declaration_t.__init__( self, name ) - + self._aliases = [] + def _get__cmp__items(self): """implementation details""" return [] def i_depend_on_them( self, recursive=True ): return [] - + + def _get_aliases(self): + return self._aliases + def _set_aliases( self, new_aliases ): + self._aliases = new_aliases + aliases = property( _get_aliases, _set_aliases + , doc="List of L{aliases<typedef_t>} to this instance") + class class_t( scopedef.scopedef_t ): """describes class definition""" Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2007-01-09 07:11:09 UTC (rev 861) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2007-01-09 09:29:03 UTC (rev 862) @@ -35,7 +35,7 @@ if not isinstance( type_, declarated_t ): continue cls_inst = type_.declaration - if not isinstance( cls_inst, class_t ): + if not isinstance( cls_inst, class_types ): continue if id( cls_inst ) not in visited: visited.add( id( cls_inst ) ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2007-01-09 07:11:09 UTC (rev 861) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2007-01-09 09:29:03 UTC (rev 862) @@ -12,6 +12,7 @@ from pyplusplus import messages class decl_wrapper_t(object): + SPECIAL_TYPEDEF_PICK_ANY = True """Declaration interface. This class represents the interface to the declaration tree. Its @@ -47,14 +48,28 @@ name = self.name return algorithm.create_valid_name( name ) - def __select_alias_directives( self ): - if not isinstance( self, declarations.class_t ): + def __select_alias_directives( self, be_smart ): + if not isinstance( self, declarations.class_types ): return [] - return list( set( filter( lambda typedef: typedef.is_directive, self.aliases ) ) ) + typedefs = list( set( filter( lambda typedef: typedef.is_directive, self.aliases ) ) ) + if decl_wrapper_t.SPECIAL_TYPEDEF_PICK_ANY: + if typedefs and be_smart: + longest_name_len = 0 + longest_typedef = None + for typedef in typedefs: + typedef_name_len = len( typedef.name ) + if longest_name_len < typedef_name_len: + longest_name_len = typedef_name_len + longest_typedef = typedef + return [longest_typedef] + else: + return typedefs + else: + return typedefs def _get_alias(self): if not self._alias: - directives = self.__select_alias_directives() + directives = self.__select_alias_directives(be_smart=True) if 1 == len( directives ): self._alias = directives[0].name else: @@ -142,10 +157,10 @@ and self.alias == self._generate_valid_name(): msgs.append( messages.W1043 % self.alias ) - directives = self.__select_alias_directives() + directives = self.__select_alias_directives(be_smart=False) if 1 < len( directives ): msgs.append( messages.W1048 - % ', '.join( map( lambda typedef: typedef.name, directives ) ) ) + % ( self.alias, ', '.join( map( lambda typedef: typedef.name, directives ) ) ) ) msgs.extend( self._readme_impl() ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2007-01-09 07:11:09 UTC (rev 861) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2007-01-09 09:29:03 UTC (rev 862) @@ -76,7 +76,7 @@ , doc="Reference to STD container class" ) def _get_container_traits( self ): - return self._get_container_traits() + return self.__container_traits container_traits = property( _get_container_traits , doc="Reference to container traits. See " "pygccxml documentation for STD container traits.") @@ -89,7 +89,9 @@ def _get_call_policies( self ): if self.__call_policies: return self.__call_policies - + if self.container_traits not in declarations.sequential_container_traits: + #TODO: find out why map's don't like the policy + return self.__call_policies element_type = None try: element_type = self.element_type Modified: pyplusplus_dev/pyplusplus/messages/warnings_.py =================================================================== --- pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-09 07:11:09 UTC (rev 861) +++ pyplusplus_dev/pyplusplus/messages/warnings_.py 2007-01-09 09:29:03 UTC (rev 862) @@ -143,8 +143,7 @@ 'Other classes : %s' W1048 = 'There are two or more aliases within "pyplusplus::aliases" namespace for ' \ - 'the class. In order to enjoy from automatic aliasing, the class alias ' \ - 'should be unique. Other aliases: %s' + 'the class. Py++ selected "%s" as class alias. Other aliases: %s' W1049 = 'This method could not be overriden in Python - method returns reference ' \ 'to local variable!' Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-09 07:11:09 UTC (rev 861) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-09 09:29:03 UTC (rev 862) @@ -300,6 +300,9 @@ if not isuite.has_key( container_name ): continue #not supported + for msg in cls.readme(): + self.decl_logger.warn( "%s;%s" % ( cls, msg ) ) + if isuite is INDEXING_SUITE_2_CONTAINERS: used_headers.add( INDEXING_SUITE_2_MAIN_HEADER ) Modified: pyplusplus_dev/unittests/classes_tester.py =================================================================== --- pyplusplus_dev/unittests/classes_tester.py 2007-01-09 07:11:09 UTC (rev 861) +++ pyplusplus_dev/unittests/classes_tester.py 2007-01-09 09:29:03 UTC (rev 862) @@ -23,6 +23,10 @@ self.failUnless( apple.alias == 'the_tastest_fruit' ) apple.alias = 'apple' + protected_static_t = mb.class_( 'protected_static_t' ) + self.failUnless( 'PROTECTED_STATIC' in protected_static_t.alias) + protected_static_t.alias = 'protected_static_t' + def run_tests(self, module): self.failIfRaisesAny( module.fundamental1 ) self.failIfRaisesAny( module.FUNDAMENTAL2 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-30 12:08:53
|
Revision: 887 http://svn.sourceforge.net/pygccxml/?rev=887&view=rev Author: roman_yakovenko Date: 2007-01-30 04:08:48 -0800 (Tue, 30 Jan 2007) Log Message: ----------- expose operator= as "assign" function, with call policy "return_self" Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/operators_to_be_exported.hpp pyplusplus_dev/unittests/operators_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-01-29 07:26:32 UTC (rev 886) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-01-30 12:08:48 UTC (rev 887) @@ -316,7 +316,7 @@ @staticmethod def exportable( oper ): """returns True if Boost.Python or Py++ know how to export the operator""" - if isinstance( oper, declarations.member_operator_t ) and oper.symbol in ( '()', '[]' ): + if isinstance( oper, declarations.member_operator_t ) and oper.symbol in ( '()', '[]', '=' ): return '' if not operators_helper.is_supported( oper ): return messages.W1014 % oper.name @@ -335,6 +335,8 @@ alias = '__call__' elif self.symbol == '[]': alias = '__getitem__' + elif self.symbol == '=': + alias = 'assign' else: pass return alias Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2007-01-29 07:26:32 UTC (rev 886) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2007-01-30 12:08:48 UTC (rev 887) @@ -18,6 +18,14 @@ ACCESS_TYPES = declarations.ACCESS_TYPES VIRTUALITY_TYPES = declarations.VIRTUALITY_TYPES +class impl_details: + class GAEUS_VALUES: #guess always expose using scope values + TRUE = 'true' + FALSE = 'false' + ALWAYS_TRUE = 'always true' + all = [ TRUE, FALSE, ALWAYS_TRUE ] + + always_expose_using_scope_documentation = \ """boolean, configures how Py++ should generate code for class. Py can generate code using IDL like syntax: @@ -49,7 +57,7 @@ """ def __init__(self): object.__init__( self ) - self._always_expose_using_scope = False + self._always_expose_using_scope = None self._indexing_suite = None self._equality_comparable = None self._less_than_comparable = None @@ -80,12 +88,24 @@ , doc="reference to indexing suite configuration class. " \ +"If the class is not STD container, returns None") - def _get_always_expose_using_scope( self ): - #I am almost sure this logic should be moved to code_creators + def guess_always_expose_using_scope_value( self ): if isinstance( self.indexing_suite, isuite2.indexing_suite2_t ) \ and ( self.indexing_suite.disable_methods or self.indexing_suite.disabled_methods_groups ): + return impl_details.GAEUS_VALUES.ALWAYS_TRUE + else: + return impl_details.GAEUS_VALUES.FALSE + + def _get_always_expose_using_scope( self ): + tmp = self.guess_always_expose_using_scope_value() + if tmp == impl_details.GAEUS_VALUES.ALWAYS_TRUE: return True + if None is self._always_expose_using_scope: + if impl_details.GAEUS_VALUES.TRUE == tmp: + self._always_expose_using_scope = True + else: + self._always_expose_using_scope = False return self._always_expose_using_scope + def _set_always_expose_using_scope( self, value ): self._always_expose_using_scope = value always_expose_using_scope = property( _get_always_expose_using_scope, _set_always_expose_using_scope @@ -328,17 +348,21 @@ vfunction_selector = lambda member: isinstance( member, declarations.member_function_t ) \ and member.virtuality == declarations.VIRTUALITY_TYPES.PURE_VIRTUAL members.extend( filter( vfunction_selector, self.private_members ) ) - #now lets filter out none public operators: Py++ does not support them right now - members = filter( lambda decl: not isinstance( decl, declarations.member_operator_t ) - or decl.access_type == declarations.ACCESS_TYPES.PUBLIC - , members ) + + def is_exportable( decl ): + #filter out non-public member operators - Py++ does not support them right now + if isinstance( decl, declarations.member_operator_t ) \ + and decl.access_type != declarations.ACCESS_TYPES.PUBLIC: + return False + #remove artificial constructors + if isinstance( decl, declarations.constructor_t ) and decl.is_artificial: + return False + if decl.ignore == True or decl.exportable == False: + return False + return True #-#if declarations.has_destructor( self ) \ #-# and not declarations.has_public_destructor( self ): - #remove artificial constructors - members = filter( lambda decl: not isinstance( decl, declarations.constructor_t ) - or not decl.is_artificial - , members ) - members = filter( lambda member: member.ignore == False and member.exportable, members ) + members = filter( is_exportable, members ) sorted_members = members if sort: sorted_members = sort( members ) @@ -484,3 +508,17 @@ def _readme_impl( self ): return self.is_wrapper_needed() + + def guess_always_expose_using_scope_value( self ): + def is_assign( oper ): + if oper.symbol != '=': + return False + if oper.is_artificial: + return False + if oper.access_type != ACCESS_TYPES.PUBLIC: + return False + return True + #MSVC 7.1 has problem with taking reference to operator= + if self.member_operators( is_assign, allow_empty=True, recursive=False ): + return impl_details.GAEUS_VALUES.ALWAYS_TRUE + return super(class_t, self).guess_always_expose_using_scope_value() Modified: pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2007-01-29 07:26:32 UTC (rev 886) +++ pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2007-01-30 12:08:48 UTC (rev 887) @@ -115,6 +115,19 @@ else: return decl_wrappers.return_internal_reference() +class return_self_resolver_t( resolver_t ): + def __init__( self ): + resolver_t.__init__( self ) + + def __call__(self, calldef, hint=None): + if not isinstance( calldef, declarations.member_operator_t ): + return None + + if calldef.symbol != '=': + return None + + return decl_wrappers.return_self() + class variable_accessors_resolver_t( resolver_t ): def __init__( self ): resolver_t.__init__( self ) @@ -170,6 +183,7 @@ self.__resolvers.append( void_pointer_resolver_t() ) self.__resolvers.append( return_internal_reference_resolver_t() ) self.__resolvers.append( variable_accessors_resolver_t() ) + self.__resolvers.append( return_self_resolver_t() ) def __call__( self, calldef, hint=None ): for resolver in self.__resolvers: Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-29 07:26:32 UTC (rev 886) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-30 12:08:48 UTC (rev 887) @@ -472,7 +472,7 @@ pass def visit_member_operator( self ): - if self.curr_decl.symbol in ( '()', '[]' ): + if self.curr_decl.symbol in ( '()', '[]', '=' ): self.visit_member_function() else: self.__types_db.update( self.curr_decl ) Modified: pyplusplus_dev/unittests/data/operators_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/operators_to_be_exported.hpp 2007-01-29 07:26:32 UTC (rev 886) +++ pyplusplus_dev/unittests/data/operators_to_be_exported.hpp 2007-01-30 12:08:48 UTC (rev 887) @@ -1,29 +1,32 @@ -// Copyright 2004 Roman Yakovenko. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -#ifndef __operators_to_be_exported_hpp__ -#define __operators_to_be_exported_hpp__ - -#include "boost/rational.hpp" +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __operators_to_be_exported_hpp__ +#define __operators_to_be_exported_hpp__ + +#include "boost/rational.hpp" #include <iostream> - -namespace pyplusplus{ namespace rational{ - -typedef boost::rational< long int > pyrational; - -struct helper{ - - void instantiate(){ - sizeof( pyrational ); - boost::gcd<long int>( 1, 1); + +namespace pyplusplus{ namespace rational{ + +typedef boost::rational< long int > pyrational; + +struct helper{ + + void instantiate(){ + sizeof( pyrational ); + boost::gcd<long int>( 1, 1); boost::lcm<long int>( 1, 1); - std::cout << pyrational( 1,1); - } -}; - -} } - - -#endif//__operators_to_be_exported_hpp__ + std::cout << pyrational( 1,1); + pyrational x(1,1); + x = pyrational( 2, 3 ); + + } +}; + +} } + + +#endif//__operators_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/operators_tester.py =================================================================== --- pyplusplus_dev/unittests/operators_tester.py 2007-01-29 07:26:32 UTC (rev 886) +++ pyplusplus_dev/unittests/operators_tester.py 2007-01-30 12:08:48 UTC (rev 887) @@ -76,6 +76,9 @@ self.failUnless( 0 < r1 ) + r1 = pyrational( 5, 7 ) + self.failUnless( r1.assign( 17 ) == pyrational( 17, 1 ) ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) @@ -85,4 +88,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-31 08:41:50
|
Revision: 889 http://svn.sourceforge.net/pygccxml/?rev=889&view=rev Author: roman_yakovenko Date: 2007-01-31 00:41:50 -0800 (Wed, 31 Jan 2007) Log Message: ----------- adding exposing of copy constructors Modified Paths: -------------- pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/vector3_tester.py Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-30 18:03:43 UTC (rev 888) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-31 08:41:50 UTC (rev 889) @@ -449,8 +449,6 @@ self.curr_code_creator.adopt_creator( static_method ) def visit_constructor( self ): - if self.curr_decl.is_copy_constructor: - return self.__types_db.update( self.curr_decl ) self.__dependencies_manager.add_exported( self.curr_decl ) if self.curr_decl.allow_implicit_conversion: Modified: pyplusplus_dev/unittests/vector3_tester.py =================================================================== --- pyplusplus_dev/unittests/vector3_tester.py 2007-01-30 18:03:43 UTC (rev 888) +++ pyplusplus_dev/unittests/vector3_tester.py 2007-01-31 08:41:50 UTC (rev 889) @@ -31,6 +31,8 @@ def run_tests( self, module): v3 = module.Vector3() self.failUnless( v3.ZERO == v3.do_smth() ) + #test copy constructor + self.failUnless( module.Vector3(v3.ZERO) == v3.do_smth() ) def create_suite(): suite = unittest.TestSuite() @@ -41,4 +43,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-01-31 22:12:43
|
Revision: 891 http://svn.sourceforge.net/pygccxml/?rev=891&view=rev Author: roman_yakovenko Date: 2007-01-31 14:12:43 -0800 (Wed, 31 Jan 2007) Log Message: ----------- adding initial support for input_c_buffer transformer Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/include.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/code_repository/convenience.py pyplusplus_dev/pyplusplus/function_transformers/__init__.py pyplusplus_dev/pyplusplus/function_transformers/transformers.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp pyplusplus_dev/unittests/function_transformations_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/include.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/include.py 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/pyplusplus/code_creators/include.py 2007-01-31 22:12:43 UTC (rev 891) @@ -12,10 +12,15 @@ """ Creates C++ code for include directive """ - def __init__( self, header ): + def __init__( self, header, user_defined=False ): code_creator.code_creator_t.__init__(self) self._header = include_directories.include_directories_t.normalize( header ) self._include_dirs_optimization = None #This parameter will be set from module_t.create function + self._user_defined = user_defined + + @property + def is_user_defined(self): + return self._user_defined def _get_header(self): return self._header @@ -30,6 +35,10 @@ include_dirs_optimization = property( _get_include_dirs_optimization, _set_include_dirs_optimization ) def _create_impl(self): + header = self.header.strip() + if header.startswith( '"' ) or header.startswith( '<' ): + return '#include %s' % self.header + if not self.include_dirs_optimization: return '#include "%s"' % self.header else: Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2007-01-31 22:12:43 UTC (rev 891) @@ -133,6 +133,8 @@ if creator.header in self.__system_headers: if not leave_system_headers: self.remove_creator( creator ) + if creator.is_user_defined: + pass else: self.remove_creator( creator ) map( lambda header: self.adopt_include( include.include_t( header=header ) ) @@ -169,8 +171,8 @@ code = self.unindent(code) return os.linesep.join( includes ) + 2 * os.linesep + code + os.linesep - def add_include( self, header ): - self.adopt_include( include.include_t( header=header ) ) + def add_include( self, header, user_defined ): + self.adopt_include( include.include_t( header=header, user_defined=user_defined ) ) def add_namespace_usage( self, namespace_name ): self.adopt_creator( namespace.namespace_using_t( namespace_name ) Modified: pyplusplus_dev/pyplusplus/code_repository/convenience.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/convenience.py 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/pyplusplus/code_repository/convenience.py 2007-01-31 22:12:43 UTC (rev 891) @@ -88,10 +88,19 @@ void copy_sequence( boost::python::object const& seq, Inserter inserter ){ index_type length = boost::python::len( seq ); for( index_type index = 0; index < length; ++index ){ - inserter( seq[index] ); + inserter = seq[index]; } } +template< class Inserter, class TItemType > +void copy_sequence( boost::python::object const& seq, Inserter inserter, boost::type< TItemType > ){ + index_type length = boost::python::len( seq ); + for( index_type index = 0; index < length; ++index ){ + boost::python::object item = seq[index]; + inserter = boost::python::extract< TItemType >( item ); + } +} + struct list_inserter{ list_inserter( boost::python::list& py_list ) : m_py_list( py_list ) @@ -112,17 +121,23 @@ , m_curr_pos( 0 ) , m_size( size ) {} - - void operator()( boost::python::object const & item ){ + + void insert( const T& item ){ if( m_size <= m_curr_pos ){ std::stringstream err; err << "Index out of range. Array size is" << m_size << ", " << "current position is" << m_curr_pos << "."; raise_error( PyExc_ValueError, err.str().c_str() ); } - m_array[ m_curr_pos ] = boost::python::extract< T >( item ); + m_array[ m_curr_pos ] = item; m_curr_pos += 1; } + + array_inserter_t<T>& + operator=( boost::python::object const & item ){ + insert( boost::python::extract< T >( item ) ); + return *this; + } private: T* m_array; Modified: pyplusplus_dev/pyplusplus/function_transformers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/__init__.py 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/pyplusplus/function_transformers/__init__.py 2007-01-31 22:12:43 UTC (rev 891) @@ -49,3 +49,8 @@ def creator( function ): return transformers.type_modifier_t( function, *args, **keywd ) return creator + +def input_c_buffer( *args, **keywd ): + def creator( function ): + return transformers.input_c_buffer_t( function, *args, **keywd ) + return creator Modified: pyplusplus_dev/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-01-31 22:12:43 UTC (rev 891) @@ -224,9 +224,13 @@ _seq2arr = string.Template( os.linesep.join([ - 'pyplus_conv::ensure_uniform_sequence< $type >( $pylist, $array_size );' + 'pyplus_conv::ensure_uniform_sequence< $type >( $pylist, $array_size );' , 'pyplus_conv::copy_sequence( $pylist, pyplus_conv::array_inserter( $native_array, $array_size ) );'])) +_seq2vector = string.Template( os.linesep.join([ + 'pyplus_conv::ensure_uniform_sequence< $type >( $pylist );' + , 'pyplus_conv::copy_sequence( $pylist, std::back_inserter( $native_array), boost::type< $type >() );'])) + _arr2seq = string.Template( 'pyplus_conv::copy_container( $native_array, $native_array + $array_size, pyplus_conv::list_inserter( $pylist ) );' ) @@ -395,3 +399,95 @@ def configure_virtual_mem_fun( self, controller ): self.__configure_v_mem_fun_override( controller.override_controller ) self.__configure_v_mem_fun_default( controller.default_controller ) + + +class input_c_buffer_t(transformer.transformer_t): + """Handles an input of C buffere: + + void write( byte *buffer, int size ) -> void write( python sequence ) + """ + + def __init__(self, function, buffer_arg_ref, size_arg_ref): + """Constructor. + + @param buffer_arg_ref: "reference" to the buffer argument + @param buffer_arg_ref: "reference" to argument, which holds buffer size + """ + transformer.transformer_t.__init__( self, function ) + + self.buffer_arg = self.get_argument( buffer_arg_ref ) + self.buffer_arg_index = self.function.arguments.index( self.buffer_arg ) + + self.size_arg = self.get_argument( size_arg_ref ) + self.size_arg_index = self.function.arguments.index( self.size_arg ) + + if not is_ptr_or_array( self.buffer_arg.type ): + raise ValueError( '%s\nin order to use "input_c_buffer" transformation, "buffer" argument %s type must be a array or a pointer (got %s).' ) \ + % ( function, self.buffer_arg.name, self.buffer_arg.type) + + if not declarations.is_integral( self.size_arg.type ): + raise ValueError( '%s\nin order to use "input_c_buffer" transformation, "size" argument %s type must be an integral type (got %s).' ) \ + % ( function, self.size_arg.name, self.size_arg.type) + + self.buffer_item_type = declarations.array_item_type( self.buffer_arg.type ) + + def __str__(self): + return "input_c_buffer(buffer arg=%s, size arg=%s)" \ + % ( self.buffer_arg.name, self.size_arg.name) + + def required_headers( self ): + """Returns list of header files that transformer generated code depends on.""" + return [ code_repository.convenience.file_name, '<vector>', '<iterator>' ] + + def __configure_sealed(self, controller): + global _seq2arr + w_buffer_arg = controller.find_wrapper_arg( self.buffer_arg.name ) + w_buffer_arg.type = declarations.dummy_type_t( "boost::python::object" ) + + controller.remove_wrapper_arg( self.size_arg.name ) + + size_var = controller.declare_variable( + declarations.remove_const( self.size_arg.type ) + , self.size_arg.name + , ' = boost::python::len(%s)' % w_buffer_arg.name ) + + # Declare a variable that will hold the C array... + buffer_var = controller.declare_variable( + declarations.dummy_type_t( "std::vector< %s >" % self.buffer_item_type.decl_string ) + , "native_" + self.buffer_arg.name + , '(%s)' % size_var ) + + copy_pylist2arr = _seq2vector.substitute( type=self.buffer_item_type + , pylist=w_buffer_arg.name + , native_array=buffer_var ) + + controller.add_pre_call_code( copy_pylist2arr ) + + controller.modify_arg_expression( self.buffer_arg_index, '&%s[0]' % buffer_var ) + controller.modify_arg_expression( self.size_arg_index, '%s' % size_var ) + + def __configure_v_mem_fun_default( self, controller ): + self.__configure_sealed( controller ) + + def __configure_v_mem_fun_override( self, controller ): + raise NotImplementedError() + #global _arr2seq + #pylist = controller.declare_py_variable( declarations.dummy_type_t( 'boost::python::list' ) + #, 'py_' + self.arg.name ) + + #copy_arr2pylist = _arr2seq.substitute( native_array=self.arg.name + #, array_size=self.array_size + #, pylist=pylist ) + + #controller.add_py_pre_call_code( copy_arr2pylist ) + + def configure_mem_fun( self, controller ): + self.__configure_sealed( controller ) + + def configure_free_fun(self, controller ): + self.__configure_sealed( controller ) + + def configure_virtual_mem_fun( self, controller ): + self.__configure_v_mem_fun_override( controller.override_controller ) + self.__configure_v_mem_fun_default( controller.default_controller ) + Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-01-31 22:12:43 UTC (rev 891) @@ -429,7 +429,7 @@ included = filter( lambda cc: isinstance(cc, code_creators.include_t) and cc.header==header , self.__extmodule.creators) if not included: - self.__extmodule.add_include( header ) + self.__extmodule.add_include( header, user_defined=True ) # Check if it is a header from the code repository if header in code_repository.headers: Modified: pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2007-01-31 22:12:43 UTC (rev 891) @@ -8,6 +8,7 @@ #include <cmath> #include <string> +#include <iostream> namespace ft2{ @@ -219,6 +220,18 @@ }; +struct input_c_buffer_tester_t{ + std::string write( char* buffer, int dummy, int size ) const { + std::cout << "wwwwwwwwwww> " << std::string( buffer, size ); + return std::string( buffer, size ); + } + + static std::string write_s( int dummy, char* buffer, int size ){ + return std::string( buffer, size ); + } + +}; + } #endif//__function_transformations_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/function_transformations_tester.py =================================================================== --- pyplusplus_dev/unittests/function_transformations_tester.py 2007-01-31 18:53:51 UTC (rev 890) +++ pyplusplus_dev/unittests/function_transformations_tester.py 2007-01-31 22:12:43 UTC (rev 891) @@ -79,6 +79,12 @@ clone.call_policies = call_policies.return_value_policy( call_policies.manage_new_object ) clone.add_transformation( ft.modify_type(0, declarations.remove_reference ) ) + cls = mb.class_( 'input_c_buffer_tester_t') + write_mf = cls.mem_fun( 'write' ) + write_mf.add_transformation( ft.input_c_buffer( 'buffer', 'size' ) ) + write_s = cls.mem_fun( 'write_s' ) + write_s.add_transformation( ft.input_c_buffer( 'buffer', 'size' ) ) + def run_tests(self, module): """Run the actual unit tests. """ @@ -226,6 +232,13 @@ tmp = module.modify_type_tester_t() self.failUnless( 123 == tmp.do_nothing(123) ) self.failUnless( tmp != tmp.clone(123) ) + + tmp = module.input_c_buffer_tester_t() + hw = 'hello world' + dummy = 11 + print 'xxxxxxxxxxx> ', tmp.write( list( hw ), dummy ) + self.failUnless( 'hello world' == tmp.write( list( hw ), dummy ) ) + self.failUnless( 'hello world' == tmp.write_s( dummy, tuple( list( hw ) ) ) ) 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...> - 2007-02-01 05:50:02
|
Revision: 892 http://svn.sourceforge.net/pygccxml/?rev=892&view=rev Author: roman_yakovenko Date: 2007-01-31 21:50:00 -0800 (Wed, 31 Jan 2007) Log Message: ----------- fixing input_c_buffer transformer Modified Paths: -------------- pyplusplus_dev/docs/history/history.rest pyplusplus_dev/pyplusplus/code_creators/calldef_utils.py pyplusplus_dev/pyplusplus/function_transformers/transformers.py pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp pyplusplus_dev/unittests/function_transformations_tester.py Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2007-01-31 22:12:43 UTC (rev 891) +++ pyplusplus_dev/docs/history/history.rest 2007-02-01 05:50:00 UTC (rev 892) @@ -43,7 +43,16 @@ * Declaration of virtual functions that have an exception specification with an empty throw was fixed. Now the exception specification is generated properly. Many thanks to Martin Preisler for reporting the bug. + +2. Added exposing of copy constructors and "operator=". "operator=" is exposed + under "assign" name. + +3. Added new call policy - `as_tuple`_ +.. _`as_tuple` : ../documentation/functions/call_policies.html + +4. Added initial support for multi-module development. + ------------- Version 0.8.5 ------------- Modified: pyplusplus_dev/pyplusplus/code_creators/calldef_utils.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef_utils.py 2007-01-31 22:12:43 UTC (rev 891) +++ pyplusplus_dev/pyplusplus/code_creators/calldef_utils.py 2007-02-01 05:50:00 UTC (rev 892) @@ -113,6 +113,8 @@ and ( self.__function.call_policies.is_default() \ or False == bool( self.__controller.return_variables ) ): self.__pre_return_code = '' + elif self.__function.call_policies.is_default(): + self.__pre_return_code = '' else: c_p_typedef = 'typedef %s %s;' \ % ( self.__function.call_policies.create_template_arg( self.__creator ) Modified: pyplusplus_dev/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-01-31 22:12:43 UTC (rev 891) +++ pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-02-01 05:50:00 UTC (rev 892) @@ -454,8 +454,7 @@ # Declare a variable that will hold the C array... buffer_var = controller.declare_variable( declarations.dummy_type_t( "std::vector< %s >" % self.buffer_item_type.decl_string ) - , "native_" + self.buffer_arg.name - , '(%s)' % size_var ) + , "native_" + self.buffer_arg.name ) copy_pylist2arr = _seq2vector.substitute( type=self.buffer_item_type , pylist=w_buffer_arg.name Modified: pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2007-01-31 22:12:43 UTC (rev 891) +++ pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2007-02-01 05:50:00 UTC (rev 892) @@ -222,7 +222,6 @@ struct input_c_buffer_tester_t{ std::string write( char* buffer, int dummy, int size ) const { - std::cout << "wwwwwwwwwww> " << std::string( buffer, size ); return std::string( buffer, size ); } Modified: pyplusplus_dev/unittests/function_transformations_tester.py =================================================================== --- pyplusplus_dev/unittests/function_transformations_tester.py 2007-01-31 22:12:43 UTC (rev 891) +++ pyplusplus_dev/unittests/function_transformations_tester.py 2007-02-01 05:50:00 UTC (rev 892) @@ -236,7 +236,6 @@ tmp = module.input_c_buffer_tester_t() hw = 'hello world' dummy = 11 - print 'xxxxxxxxxxx> ', tmp.write( list( hw ), dummy ) self.failUnless( 'hello world' == tmp.write( list( hw ), dummy ) ) self.failUnless( 'hello world' == tmp.write_s( dummy, tuple( list( hw ) ) ) ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-01 06:54:08
|
Revision: 893 http://svn.sourceforge.net/pygccxml/?rev=893&view=rev Author: roman_yakovenko Date: 2007-01-31 22:54:04 -0800 (Wed, 31 Jan 2007) Log Message: ----------- improving "input_c_buffer" memory allocation adding documentation Modified Paths: -------------- pyplusplus_dev/docs/history/history.rest pyplusplus_dev/pyplusplus/function_transformers/transformers.py Added Paths: ----------- pyplusplus_dev/docs/documentation/functions/transformation/built_in/input_c_buffer.rest Added: pyplusplus_dev/docs/documentation/functions/transformation/built_in/input_c_buffer.rest =================================================================== --- pyplusplus_dev/docs/documentation/functions/transformation/built_in/input_c_buffer.rest (rev 0) +++ pyplusplus_dev/docs/documentation/functions/transformation/built_in/input_c_buffer.rest 2007-02-01 06:54:04 UTC (rev 893) @@ -0,0 +1,82 @@ +================================== +``input_c_buffer`` transformer +================================== + +.. contents:: Table of contents + +---------- +Definition +---------- + +"input_c_buffer" transformer works on C buffers. It handles the translation +between a `Python`_ sequence object and the buffer. + +"input_c_buffer" transformer takes as first argument name or index of the +"buffer" argument. The argument should have "array" or "pointer" type. +The second argument should be name or index of another original function argument, +which represents array size. + +------- +Example +------- + +.. code-block:: C++ + + struct file_t{ + void write( char* buffer, int size ) const; + }; + +In order to expose ``write`` member function we need to create small wrapper: +Next `Py++`_ code does it for you: + + .. code-block:: Python + + from pyplusplus import module_builder + from pyplusplus import function_transformers as FT + + mb = module_builder.module_builder_t( ... ) + f = mb.class_( 'file_t' ) + f.mem_fun( 'write' ).add_transformation( FT.input_c_buffer( 'buffer', 'size' ) ) + +What you see below is the relevant pieces of generated code: + + .. code-block:: C++ + + #include "__convenience.pypp.hpp" //Py++ header file, which contains few convenience function + + #include <vector> + + #include <iterator> + + namespace bp = boost::python; + + static void write_8883fea8925bad9911e6c5a4015ed106( ::file_t const & inst, boost::python::object buffer ){ + int size2 = boost::python::len(buffer); + std::vector< char > native_buffer; + native_buffer.reserve( size2 ); + pyplus_conv::ensure_uniform_sequence< char >( buffer ); + pyplus_conv::copy_sequence( buffer, std::back_inserter( native_buffer), boost::type< char >() ); + inst.write(&native_buffer[0], size2); + } + + BOOST_PYTHON_MODULE(...){ + ... + bp::class_< file_t >( "file_t" ) + .def( + "write" + , (void (*)( ::file_t const &,boost::python::object ))( &write_8883fea8925bad9911e6c5a4015ed106 ) + , ( bp::arg("inst"), bp::arg("buffer") ) ); + } + +.. _`Py++` : ./../pyplusplus.html +.. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html +.. _`Python`: http://www.python.org +.. _`GCC-XML`: http://www.gccxml.org + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + End: Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2007-02-01 05:50:00 UTC (rev 892) +++ pyplusplus_dev/docs/history/history.rest 2007-02-01 06:54:04 UTC (rev 893) @@ -43,16 +43,28 @@ * Declaration of virtual functions that have an exception specification with an empty throw was fixed. Now the exception specification is generated properly. Many thanks to Martin Preisler for reporting the bug. - + +.. line-separator + 2. Added exposing of copy constructors and "operator=". "operator=" is exposed under "assign" name. - + +.. line-separator + 3. Added new call policy - `as_tuple`_ -.. _`as_tuple` : ../documentation/functions/call_policies.html +.. _`as_tuple` : ../documentation/functions/call_policies.html#as-tuple 4. Added initial support for multi-module development. +.. line-separator + +5. `input_c_buffer`_ - new functions transformation, which allows to pass a Python + sequence to function, instead of pair of arguments: pointer to buffer and size. + +.. _`input_c_buffer` : ../documentation/functions/transformation/built_in/input_c_buffer.html + + ------------- Version 0.8.5 ------------- Modified: pyplusplus_dev/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-02-01 05:50:00 UTC (rev 892) +++ pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-02-01 06:54:04 UTC (rev 893) @@ -455,7 +455,9 @@ buffer_var = controller.declare_variable( declarations.dummy_type_t( "std::vector< %s >" % self.buffer_item_type.decl_string ) , "native_" + self.buffer_arg.name ) - + + controller.add_pre_call_code( '%s.reserve( %s );' % ( buffer_var, size_var ) ) + copy_pylist2arr = _seq2vector.substitute( type=self.buffer_item_type , pylist=w_buffer_arg.name , native_array=buffer_var ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-11 20:59:49
|
Revision: 902 http://svn.sourceforge.net/pygccxml/?rev=902&view=rev Author: roman_yakovenko Date: 2007-02-11 12:59:49 -0800 (Sun, 11 Feb 2007) Log Message: ----------- porting indexing suite recent changes to linux Modified Paths: -------------- pyplusplus_dev/indexing_suite_v2/indexing/map.hpp pyplusplus_dev/indexing_suite_v2/indexing/multimap.hpp pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites2_tester.py Modified: pyplusplus_dev/indexing_suite_v2/indexing/map.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing/map.hpp 2007-02-11 13:45:41 UTC (rev 901) +++ pyplusplus_dev/indexing_suite_v2/indexing/map.hpp 2007-02-11 20:59:49 UTC (rev 902) @@ -111,7 +111,7 @@ typedef BOOST_DEDUCED_TYPENAME most_derived::container::value_type value_type; mapping::register_value_type< PythonClass, value_type, Policy >( pyClass ); //now we can expose iterators functionality - pyClass.def( "__iter__", python::iterator< most_derived::container >() ); + pyClass.def( "__iter__", python::iterator< BOOST_DEDUCED_TYPENAME most_derived::container >() ); } }; Modified: pyplusplus_dev/indexing_suite_v2/indexing/multimap.hpp =================================================================== --- pyplusplus_dev/indexing_suite_v2/indexing/multimap.hpp 2007-02-11 13:45:41 UTC (rev 901) +++ pyplusplus_dev/indexing_suite_v2/indexing/multimap.hpp 2007-02-11 20:59:49 UTC (rev 902) @@ -108,7 +108,7 @@ typedef BOOST_DEDUCED_TYPENAME most_derived::container::value_type value_type; mapping::register_value_type< PythonClass, value_type, Policy >( pyClass ); //now we can expose iterators functionality - pyClass.def( "__iter__", python::iterator< most_derived::container >() ); + pyClass.def( "__iter__", python::iterator< BOOST_DEDUCED_TYPENAME most_derived::container >() ); } @@ -148,7 +148,8 @@ boost::python::list _keys; //For some reason code with set could not be compiled //std::set< key_param > unique_keys; - for( iterator index = most_derived::begin(c); index != most_derived::end(c); ++index ){ + typedef BOOST_DEDUCED_TYPENAME container::iterator iter_type; + for( iter_type index = most_derived::begin(c); index != most_derived::end(c); ++index ){ //if( unique_keys.end() == unique_keys.find( index->first ) ){ // unique_keys.insert( index->first ); if( !_keys.count( index->first ) ){ Modified: pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp 2007-02-11 13:45:41 UTC (rev 901) +++ pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp 2007-02-11 20:59:49 UTC (rev 902) @@ -81,4 +81,8 @@ } +namespace pyplusplus{ namespace aliases{ + typedef std::vector<indexing_suites2::item_t*> items_ptr_t; +}} + #endif//__indexing_suites2_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py 2007-02-11 13:45:41 UTC (rev 901) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2007-02-11 20:59:49 UTC (rev 902) @@ -30,7 +30,7 @@ fvector.indexing_suite.disable_method( 'extend' ) fvector.indexing_suite.disable_methods_group( 'reorder' ) #fvector.indexing_suite.call_policies = module_builder.call_policies.default_call_policies() - items_ptr = generator.global_ns.typedef( 'items_ptr_t' ) + items_ptr = generator.global_ns.typedefs( 'items_ptr_t' )[0] items_ptr = declarations.remove_declarated( items_ptr.type ) self.failUnless( items_ptr.indexing_suite.call_policies.__class__ is module_builder.call_policies.return_internal_reference().__class__ ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-17 11:54:13
|
Revision: 911 http://svn.sourceforge.net/pygccxml/?rev=911&view=rev Author: roman_yakovenko Date: 2007-02-17 03:54:13 -0800 (Sat, 17 Feb 2007) Log Message: ----------- adding return_range call policy Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_repository/call_policies.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py pyplusplus_dev/pyplusplus/module_builder/call_policies.py pyplusplus_dev/unittests/call_policies_tester.py pyplusplus_dev/unittests/data/call_policies_to_be_exported.hpp Modified: pyplusplus_dev/pyplusplus/code_repository/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/code_repository/call_policies.py 2007-02-17 11:53:00 UTC (rev 910) +++ pyplusplus_dev/pyplusplus/code_repository/call_policies.py 2007-02-17 11:54:13 UTC (rev 911) @@ -26,7 +26,7 @@ #include "boost/function.hpp" #include "boost/python/suite/indexing/iterator_range.hpp" #include "boost/python/object/class_detail.hpp" - +#include "boost/type_traits/is_same.hpp" namespace pyplusplus{ namespace call_policies{ namespace bpl = boost::python; @@ -169,33 +169,41 @@ } //detail -template < typename ValueType, typename SizeGetter, typename GetItemCallPolicies=bpl::default_call_policies > -struct return_range : bpl::default_call_policies -{ - typedef return_range< ValueType, SizeGetter, GetItemCallPolicies > this_type; +template < typename TGetSize, typename TValueType, typename TValuePolicies=bpl::default_call_policies > +struct return_range : bpl::default_call_policies{ + + typedef return_range< TGetSize, TValueType, TValuePolicies > this_type; + public: - //result converter generator should return PyCObject instance - //postcall will destruct it + typedef typename detail::return_raw_data_ref result_converter; - typedef GetItemCallPolicies get_item_call_policies; - typedef ValueType value_type; + + typedef TValueType value_type; + typedef TGetSize get_size_type; + typedef TValuePolicies value_policies_type; + typedef bpl::indexing::iterator_range<value_type*> range_type; static void register_range_class_on_demand(){ - - // Check the registry. If one is already registered, return it. + //Check the registry. If the class doesn't exist, register it. bpl::handle<> class_obj( bpl::objects::registered_class_object(bpl::type_id<range_type>())); if (class_obj.get() == 0){ - bpl::class_<range_type>( "_range_iterator_", bpl::init<value_type*, value_type*>() ) - .def(bpl::indexing::container_suite<range_type>() ); + bpl::class_<range_type> registrator( "_impl_details_range_iterator_", bpl::init<value_type*, value_type*>() ); + if( boost::is_same< bpl::default_call_policies, value_policies_type>::value ){ + registrator.def(bpl::indexing::container_suite<range_type>() ); + } + else{ + //I need to find out why this code does not compiles + //typedef bpl::indexing::iterator_range_suite< range_type > suite_type; + //registrator.def(suite_type::with_policies( value_policies_type() ) ); + } } } template <class ArgumentPackage> - static PyObject* postcall(ArgumentPackage const& args, PyObject* result) - { + static PyObject* postcall(ArgumentPackage const& args, PyObject* result){ if( result == bpl::detail::none() ){ return result; } @@ -210,9 +218,9 @@ register_range_class_on_demand(); - SizeGetter get_size; - ssize_t size = get_size( self ); - range_type the_range( raw_data, raw_data+size ); + get_size_type get_size; + range_type the_range( raw_data, raw_data + get_size( self ) ); + bpl::object range_obj( the_range ); return bpl::incref( range_obj.ptr() ); Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2007-02-17 11:53:00 UTC (rev 910) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2007-02-17 11:54:13 UTC (rev 911) @@ -90,6 +90,8 @@ from call_policies import convert_array_to_tuple_t from call_policies import convert_array_to_tuple from call_policies import memory_managers +from call_policies import return_range +from call_policies import return_range_t from decl_wrapper_printer import decl_wrapper_printer_t from decl_wrapper_printer import print_declarations Modified: pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2007-02-17 11:53:00 UTC (rev 910) +++ pyplusplus_dev/pyplusplus/decl_wrappers/call_policies.py 2007-02-17 11:54:13 UTC (rev 911) @@ -11,8 +11,9 @@ convinience function. """ +import algorithm +import python_traits from pygccxml import declarations -import algorithm class CREATION_POLICY: """Implementation details""" @@ -24,9 +25,6 @@ def __init__(self): object.__init__(self) - def create_type(self): - return self.create( None, CREATION_POLICY.AS_TEMPLATE_ARGUMENT ) - def create(self, function_creator, creation_policy=CREATION_POLICY.AS_INSTANCE): """Creates code from the call policies class instance. @param function_creator: parent code creator @@ -41,6 +39,9 @@ code = code + '()' return code + def create_type(self): + return self.create( None, CREATION_POLICY.AS_TEMPLATE_ARGUMENT ) + def create_template_arg( self, function_creator ): return self.create( function_creator, CREATION_POLICY.AS_TEMPLATE_ARGUMENT ) @@ -305,4 +306,51 @@ return [ declarations.templates.join( as_tuple, as_tuple_args ) ] def convert_array_to_tuple( array_size, memory_manager, make_object_call_policies=None, base=None ): - return convert_array_to_tuple_t( array_size, memory_manager, make_object_call_policies, base ) \ No newline at end of file + return convert_array_to_tuple_t( array_size, memory_manager, make_object_call_policies, base ) + +class return_range_t( call_policy_t ): + def __init__( self, get_size_class, value_type, value_policies): + call_policy_t.__init__( self ) + self._value_type = value_type + self._get_size_class = get_size_class + self._value_policies = value_policies + + def _get_get_size_class( self ): + return self._get_size_class + def _set_get_size_class( self, new_get_size_class): + self._get_size_class = new_get_size_class + get_size_class = property( _get_get_size_class, _set_get_size_class ) + + def _get_value_type( self ): + return self._value_type + def _set_value_type( self, new_value_type): + self._value_type = new_value_type + value_type = property( _get_value_type, _set_value_type ) + + def _get_value_policies( self ): + return self._value_policies + def _set_value_policies( self, new_value_policies): + self._value_policies = new_value_policies + value_policies = property( _get_value_policies, _set_value_policies ) + + def _create_impl(self, function_creator ): + name = algorithm.create_identifier( function_creator, '::pyplusplus::call_policies::return_range' ) + args = [ self.get_size_class, self.value_type.decl_string ] + if not self.value_policies.is_default(): + args.append( self.value_policies.create_type() ) + return declarations.templates.join( name, args ) + +def return_range( function, get_size_class, value_policies=None ): + r_type = function.return_type + if not declarations.is_pointer( r_type ): + raise TypeError( 'Function "%s" return type should be pointer, got "%s"' + % r_type.decl_string ) + + value_type = declarations.remove_pointer( r_type ) + if None is value_policies: + if python_traits.is_immutable( value_type ): + value_policies = default_call_policies() + else: + raise RuntimeError( "return_range call policies requieres specification of value_policies" ) + return return_range_t( get_size_class, value_type, value_policies ) + Modified: pyplusplus_dev/pyplusplus/module_builder/call_policies.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/call_policies.py 2007-02-17 11:53:00 UTC (rev 910) +++ pyplusplus_dev/pyplusplus/module_builder/call_policies.py 2007-02-17 11:54:13 UTC (rev 911) @@ -21,3 +21,5 @@ from pyplusplus.decl_wrappers import custom_call_policies from pyplusplus.decl_wrappers import convert_array_to_tuple from pyplusplus.decl_wrappers import memory_managers +from pyplusplus.decl_wrappers import return_range +from pyplusplus.decl_wrappers import return_range_t Modified: pyplusplus_dev/unittests/call_policies_tester.py =================================================================== --- pyplusplus_dev/unittests/call_policies_tester.py 2007-02-17 11:53:00 UTC (rev 910) +++ pyplusplus_dev/unittests/call_policies_tester.py 2007-02-17 11:54:13 UTC (rev 911) @@ -9,6 +9,27 @@ import fundamental_tester_base from pyplusplus.module_builder import call_policies +get_size_code = """ +struct raw_data_size_t{ + ssize_t + operator()( boost::python::object self ){ + boost::python::object raw_data = self.attr( "raw_data" ); + return boost::python::len( raw_data ); + } +}; +""" + +get_size_code = """ +struct raw_data_size_t{ + ssize_t + operator()( boost::python::object self ){ + call_policies::return_range_image_t& image + = boost::python::extract<call_policies::return_range_image_t&>( self ); + return image.raw_data.size(); + } +}; +""" + class tester_t(fundamental_tester_base.fundamental_tester_base_t): EXTENSION_NAME = 'call_policies' @@ -36,6 +57,17 @@ mb.calldef( 'create_arr_3' ).call_policies \ = call_policies.convert_array_to_tuple( 3, call_policies.memory_managers.delete_ ) + image = mb.class_('return_range_image_t') + #image.exclude() + image.add_declaration_code( get_size_code ) + get_raw_data = image.mem_fun( 'get_raw_data' ) + get_raw_data.call_policies \ + = call_policies.return_range( get_raw_data, 'raw_data_size_t' ) + get_raw_data_const = image.mem_fun( 'get_raw_data_const' ) + get_raw_data_const.call_policies \ + = call_policies.return_range( get_raw_data_const, 'raw_data_size_t' ) + + def run_tests(self, module): self.failUnless( module.compare( module.my_address() ) ) @@ -64,6 +96,12 @@ for i in range( 4 ): arr3 = x.create_arr_3() self.failUnless( arr3 == (0,1,2) ) + + image = module.return_range_image_t() + raw_data = image.get_raw_data() + self.failUnless( ['1', '\0', '2']==list( raw_data ) ) + raw_data[1] = 'x' + self.failUnless( raw_data[1] == image.raw_data[1] ) def create_suite(): suite = unittest.TestSuite() Modified: pyplusplus_dev/unittests/data/call_policies_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/call_policies_to_be_exported.hpp 2007-02-17 11:53:00 UTC (rev 910) +++ pyplusplus_dev/unittests/data/call_policies_to_be_exported.hpp 2007-02-17 11:54:13 UTC (rev 911) @@ -6,6 +6,8 @@ #ifndef __call_policies_to_be_exported_hpp__ #define __call_policies_to_be_exported_hpp__ +#include <string> + namespace call_policies{ struct dummy{ @@ -84,6 +86,27 @@ } }; +struct return_range_image_t{ + return_range_image_t() + : raw_data( "" ) + { + raw_data += '1'; + raw_data += '\0'; + raw_data += '2'; + } + + std::string raw_data; + + const char* get_raw_data_const() const{ + return raw_data.c_str(); + } + + char* get_raw_data(){ + return &raw_data.at(0); + } + +}; + } #endif//__call_policies_to_be_exported_hpp__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-18 18:54:29
|
Revision: 913 http://svn.sourceforge.net/pygccxml/?rev=913&view=rev Author: roman_yakovenko Date: 2007-02-18 10:54:27 -0800 (Sun, 18 Feb 2007) Log Message: ----------- adding transfer ownership transformation Modified Paths: -------------- pyplusplus_dev/pyplusplus/function_transformers/__init__.py pyplusplus_dev/pyplusplus/function_transformers/transformers.py pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp pyplusplus_dev/unittests/function_transformations_tester.py pyplusplus_dev/unittests/fundamental_tester_base.py Modified: pyplusplus_dev/pyplusplus/function_transformers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/__init__.py 2007-02-17 19:25:02 UTC (rev 912) +++ pyplusplus_dev/pyplusplus/function_transformers/__init__.py 2007-02-18 18:54:27 UTC (rev 913) @@ -54,3 +54,8 @@ def creator( function ): return transformers.input_c_buffer_t( function, *args, **keywd ) return creator + +def transfer_ownership( *args, **keywd ): + def creator( function ): + return transformers.transfer_ownership_t( function, *args, **keywd ) + return creator Modified: pyplusplus_dev/pyplusplus/function_transformers/transformers.py =================================================================== --- pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-02-17 19:25:02 UTC (rev 912) +++ pyplusplus_dev/pyplusplus/function_transformers/transformers.py 2007-02-18 18:54:27 UTC (rev 913) @@ -495,3 +495,38 @@ self.__configure_v_mem_fun_override( controller.override_controller ) self.__configure_v_mem_fun_default( controller.default_controller ) + +class transfer_ownership_t(type_modifier_t): + """see http://boost.org/libs/python/doc/v2/faq.html#ownership + """ + def __init__(self, function, arg_ref): + """Constructor.""" + transformer.transformer_t.__init__( self, function ) + self.arg = self.get_argument( arg_ref ) + self.arg_index = self.function.arguments.index( self.arg ) + if not declarations.is_pointer( self.arg.type ): + raise ValueError( '%s\nin order to use "transfer ownership" transformation, argument %s type must be a pointer (got %s).' ) \ + % ( function, self.arg_ref.name, arg.type) + + def __str__(self): + return "transfer_ownership(%s)" % self.arg.name + + def __configure_sealed( self, controller ): + w_arg = controller.find_wrapper_arg( self.arg.name ) + naked_type = declarations.remove_pointer( self.arg.type ) + naked_type = declarations.remove_declarated( naked_type ) + w_arg.type = declarations.dummy_type_t( 'std::auto_ptr< %s >' % naked_type.decl_string ) + controller.modify_arg_expression(self.arg_index, w_arg.name + '.release()' ) + + def __configure_v_mem_fun_default( self, controller ): + self.__configure_sealed( controller ) + + def configure_mem_fun( self, controller ): + self.__configure_sealed( controller ) + + def configure_free_fun(self, controller ): + self.__configure_sealed( controller ) + + def configure_virtual_mem_fun( self, controller ): + raise NotImplementedError() + Modified: pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2007-02-17 19:25:02 UTC (rev 912) +++ pyplusplus_dev/unittests/data/function_transformations_to_be_exported.hpp 2007-02-18 18:54:27 UTC (rev 913) @@ -231,6 +231,20 @@ }; +struct transfer_ownership_tester_t{ + struct resources_t{ + resources_t(){ + std::cout << "created"; + } + ~resources_t(){ + std::cout << "destroyed"; + } + }; + void tester(resources_t* r){ + delete r; + } +}; + } #endif//__function_transformations_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/function_transformations_tester.py =================================================================== --- pyplusplus_dev/unittests/function_transformations_tester.py 2007-02-17 19:25:02 UTC (rev 912) +++ pyplusplus_dev/unittests/function_transformations_tester.py 2007-02-18 18:54:27 UTC (rev 913) @@ -85,6 +85,12 @@ write_s = cls.mem_fun( 'write_s' ) write_s.add_transformation( ft.input_c_buffer( 'buffer', 'size' ) ) + resource = mb.class_( 'resources_t' ) + resource.held_type = 'std::auto_ptr< %s >' % resource.decl_string + transfer_ownership_tester = mb.class_( 'transfer_ownership_tester_t' ) + tester = transfer_ownership_tester.mem_fun( 'tester' ) + tester.add_transformation( ft.transfer_ownership( 0 ) ) + def run_tests(self, module): """Run the actual unit tests. """ @@ -238,6 +244,10 @@ dummy = 11 self.failUnless( 'hello world' == tmp.write( list( hw ), dummy ) ) self.failUnless( 'hello world' == tmp.write_s( dummy, tuple( list( hw ) ) ) ) + + tmp = module.transfer_ownership_tester_t() + resource = tmp.resources_t(); + tmp.tester( resource ) def create_suite(): suite = unittest.TestSuite() Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2007-02-17 19:25:02 UTC (rev 912) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2007-02-18 18:54:27 UTC (rev 913) @@ -65,11 +65,12 @@ def _create_extension_source_file(self): global LICENSE - xml_file = os.path.split( self.__to_be_exported_header )[1] - xml_file = os.path.join( autoconfig.build_dir, xml_file + '.xml' ) - xml_cached_fc = parser.create_cached_source_fc( self.__to_be_exported_header, xml_file ) + #xml_file = os.path.split( self.__to_be_exported_header )[1] + #xml_file = os.path.join( autoconfig.build_dir, xml_file + '.xml' ) + #xml_cached_fc = parser.create_cached_source_fc( self.__to_be_exported_header, xml_file ) - mb = module_builder.module_builder_t( [xml_cached_fc] + #mb = module_builder.module_builder_t( [xml_cached_fc] + mb = module_builder.module_builder_t( [self.__to_be_exported_header] , gccxml_path=autoconfig.gccxml.executable , include_paths=[autoconfig.boost.include] , undefine_symbols=['__MINGW32__'] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-22 12:19:30
|
Revision: 919 http://svn.sourceforge.net/pygccxml/?rev=919&view=rev Author: roman_yakovenko Date: 2007-02-22 04:19:27 -0800 (Thu, 22 Feb 2007) Log Message: ----------- adding functionality necessary to implement correct "transfer_ownership" behaviour Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py Added Paths: ----------- pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp pyplusplus_dev/unittests/transfer_ownership_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-02-20 19:41:57 UTC (rev 918) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-02-22 12:19:27 UTC (rev 919) @@ -260,6 +260,9 @@ if not self.declaration.overridable: return self.unoverriden_function_body() template = [] + precall_code = self.declaration.override_precall_code + if precall_code: + template.append( os.linesep.join( precall_code ) ) template.append( '%(override)s func_%(alias)s = this->get_override( "%(alias)s" );' ) template.append( '%(return_)sfunc_%(alias)s( %(args)s );') template = os.linesep.join( template ) @@ -360,6 +363,9 @@ def create_virtual_body(self): template = [] + precall_code = self.declaration.override_precall_code + if precall_code: + template.append( os.linesep.join( precall_code ) ) template.append( 'if( %(override)s func_%(alias)s = this->get_override( "%(alias)s" ) )' ) template.append( self.indent('%(return_)sfunc_%(alias)s( %(args)s );') ) template.append( 'else' ) @@ -385,8 +391,12 @@ body = self.wrapped_class_identifier() + '::' + function_call + ';' if not declarations.is_void( self.declaration.return_type ): body = 'return ' + body + precall_code = self.declaration.default_precall_code + if precall_code: + body = os.linesep.join( precall_code ) + os.linesep + body return body + def create_function(self): answer = [ self.create_declaration(self.declaration.name) + '{' ] answer.append( self.indent( self.create_virtual_body() ) ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-02-20 19:41:57 UTC (rev 918) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-02-22 12:19:27 UTC (rev 919) @@ -215,7 +215,23 @@ declarations.member_function_t.__init__( self, *arguments, **keywords ) calldef_t.__init__( self ) self._use_overload_macro = False + self._override_precall_code = [] + self._default_precall_code = [] + def add_override_precall_code(self, code): + self._override_precall_code.append( code ) + + @property + def override_precall_code(self): + return self._override_precall_code + + def add_default_precall_code(self, code): + self._default_precall_code.append( code ) + + @property + def default_precall_code(self): + return self._default_precall_code + def get_use_overload_macro(self): return self._use_overload_macro def set_use_overload_macro(self, use_macro): Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-02-20 19:41:57 UTC (rev 918) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-02-22 12:19:27 UTC (rev 919) @@ -154,7 +154,9 @@ if doc_extractor and decl.exportable: if decl.documentation: - decl.documentation = decl.documentation + doc_extractor( decl ) + extracted_doc = doc_extractor( decl ) + if extracted_doc != decl.documentation: + decl.documentation = decl.documentation + extracted_doc else: decl.documentation = doc_extractor( decl ) Added: pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp 2007-02-22 12:19:27 UTC (rev 919) @@ -0,0 +1,31 @@ +#ifndef __transfer_ownership_to_be_exported_hpp__ +#define __transfer_ownership_to_be_exported_hpp__ + +struct event_t +{ + virtual void notify() = 0; + virtual ~event_t(){} +}; + +struct do_nothing_t : event_t{ + virtual void notify(){}; +}; + +struct simulator_t{ + + void schedule(event_t *event) { + m_event = event; + }; + + void run() { + m_event->notify(); + delete m_event; + m_event = 0; + }; + +private: + event_t* m_event; +}; + + +#endif//__transfer_ownership_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/transfer_ownership_tester.py =================================================================== --- pyplusplus_dev/unittests/transfer_ownership_tester.py (rev 0) +++ pyplusplus_dev/unittests/transfer_ownership_tester.py 2007-02-22 12:19:27 UTC (rev 919) @@ -0,0 +1,107 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +import sys +import unittest +import fundamental_tester_base +from pyplusplus import code_creators +from pyplusplus import function_transformers as ft + +decref_code = \ +""" +virtual ~%(cls)s(){ + if (this->m_pyobj) { + //Py_DECREF(this->m_pyobj); + this->m_pyobj = 0; + } +} +""" + +incref_code = \ +""" +if( !this->m_pyobj) { + this->m_pyobj = boost::python::detail::wrapper_base_::get_owner(*this); + Py_INCREF(this->m_pyobj); +} +""" + +impl_conv_code = \ +""" +boost::python::implicitly_convertible< std::auto_ptr< %(from)s >, std::auto_ptr< %(to)s > >(); +""" + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'transfer_ownership' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + event_clss = mb.classes( lambda cls: cls.name in ( 'event_t', 'do_nothing_t' ) ) + for cls in event_clss: + cls.add_wrapper_code( decref_code % { 'cls' : cls.wrapper_alias } ) + cls.add_wrapper_code( 'PyObject* m_pyobj;' ) + cls.set_constructors_body( 'm_pyobj=0;' ) + cls.mem_fun( 'notify' ).add_override_precall_code( incref_code ) + cls.mem_fun( 'notify' ).add_default_precall_code( incref_code ) + + cls.held_type = 'std::auto_ptr< %s >' % cls.wrapper_alias + cls.add_registration_code( impl_conv_code % { 'from' : cls.wrapper_alias + , 'to' : cls.decl_string } + , False) + for base in cls.recursive_bases: + if base.access_type == 'public': + cls.add_registration_code( #from class to its base + impl_conv_code % { 'from' : cls.decl_string + , 'to' : base.related_class.decl_string } + , False) + + cls.add_registration_code( #from wrapper to clas base class + impl_conv_code % { 'from' : cls.wrapper_alias + , 'to' : base.related_class.decl_string } + , False) + + schedule = mb.mem_fun( 'schedule' ) + schedule.add_transformation( ft.transfer_ownership(0), alias='schedule' ) + + def run_tests( self, module): + class py_event_t( module.event_t ): + def __init__( self, container ): + module.event_t.__init__( self ) + self.container = container + + def notify( self ): + print 1 + #self.container.append( 1 ) + + print '1' + notify_data = [] + simulator = module.simulator_t() + print '2' + event = py_event_t( notify_data ) + print '3' + simulator.schedule( event ) + print 'refcount: ', sys.getrefcount( event ) + print '4' + del event + print '5' + simulator.run() + print '6' + self.failUnless( notify_data[0] == 1 ) + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-02-24 19:09:21
|
Revision: 924 http://svn.sourceforge.net/pygccxml/?rev=924&view=rev Author: roman_yakovenko Date: 2007-02-24 11:09:22 -0800 (Sat, 24 Feb 2007) Log Message: ----------- adding functionality necessary to implement correct "transfer_ownership" behaviour Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/unittests/member_functions_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-02-24 18:39:53 UTC (rev 923) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-02-24 19:09:22 UTC (rev 924) @@ -600,6 +600,11 @@ def create_virtual_body(self): template = [] + + precall_code = self.declaration.override_precall_code + if precall_code: + template.append( os.linesep.join( precall_code ) ) + template.append( 'if( %(override)s func_%(alias)s = this->get_override( "%(alias)s" ) )' ) template.append( self.indent('%(return_)sfunc_%(alias)s( %(args)s );') ) template.append( 'else' ) @@ -680,6 +685,11 @@ return self.unoverriden_function_body() template = [] + + precall_code = self.declaration.override_precall_code + if precall_code: + template.append( os.linesep.join( precall_code ) ) + template.append( '%(override)s func_%(alias)s = this->get_override( "%(alias)s" );' ) template.append( '%(return_)sfunc_%(alias)s( %(args)s );') template = os.linesep.join( template ) @@ -735,6 +745,11 @@ return self.unoverriden_function_body() template = [] + + precall_code = self.declaration.override_precall_code + if precall_code: + template.append( os.linesep.join( precall_code ) ) + template.append( '%(override)s func_%(alias)s = this->get_override( "%(alias)s" );' ) template.append( '%(return_)sfunc_%(alias)s( %(args)s );') template = os.linesep.join( template ) Modified: pyplusplus_dev/unittests/member_functions_tester.py =================================================================== --- pyplusplus_dev/unittests/member_functions_tester.py 2007-02-24 18:39:53 UTC (rev 923) +++ pyplusplus_dev/unittests/member_functions_tester.py 2007-02-24 19:09:22 UTC (rev 924) @@ -45,6 +45,9 @@ mb.class_('mem_fun_constness_t' ).always_expose_using_scope = True + mb.mem_funs().add_override_precall_code( '/*override precall code*/' ) + mb.mem_funs().add_default_precall_code( '/*default precall code*/' ) + def create_py_immutable_by_ref( self, module ): class py_immutable_by_ref( module.immutable_by_ref_t ): def __init__( self ): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-03-04 20:41:10
|
Revision: 944 http://svn.sourceforge.net/pygccxml/?rev=944&view=rev Author: roman_yakovenko Date: 2007-03-04 12:41:03 -0800 (Sun, 04 Mar 2007) Log Message: ----------- fixing spelling errors Modified Paths: -------------- pyplusplus_dev/docs/documentation/multi_module_development.rest pyplusplus_dev/environment.py Modified: pyplusplus_dev/docs/documentation/multi_module_development.rest =================================================================== --- pyplusplus_dev/docs/documentation/multi_module_development.rest 2007-03-04 20:38:31 UTC (rev 943) +++ pyplusplus_dev/docs/documentation/multi_module_development.rest 2007-03-04 20:41:03 UTC (rev 944) @@ -8,11 +8,11 @@ Introduction ------------ -It is a common practices to construct final program or a package from few +It is a common practises to construct final program or a package from few different dependent or independent C++ libraries. Many time these libraries reuse classes\\functions defined in some other library. I think this is a must requirement from a code generator to be able to expose these libraries to `Python`_ , -without "re-exposing" the class\\functions definition twise. +without "re-exposing" the class\\functions definition twice. This functionality is new in version "0.8.6". Modified: pyplusplus_dev/environment.py =================================================================== --- pyplusplus_dev/environment.py 2007-03-04 20:38:31 UTC (rev 943) +++ pyplusplus_dev/environment.py 2007-03-04 20:41:03 UTC (rev 944) @@ -5,7 +5,7 @@ class boost: libs = '' include = '' - + class python: libs = '' include = '' @@ -18,9 +18,9 @@ cmd_build = '' cmd_clean = '' ccflags = [] - + if 'roman' in getpass.getuser(): - + scons.cmd_build = 'scons --file=%s' scons.cmd_clean = 'scons --clean --file=%s' @@ -34,7 +34,7 @@ gccxml.executable = r'd:/dev/gccxml_cvs/gccxml-bin/bin/release/gccxml.exe' else: scons.suffix = '.so' - boost.libs = [ '/home/roman/boost_cvs/libs/python/build/bin-stage' ] + boost.libs = ['/home/roman/boost_cvs/libs/python/build/bin-stage' ] boost.include = '/home/roman/boost_cvs' python.include = '/usr/include/python2.4' gccxml.executable = '/home/roman/gccxml/bin/gccxml' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-03-07 18:54:52
|
Revision: 951 http://svn.sourceforge.net/pygccxml/?rev=951&view=rev Author: roman_yakovenko Date: 2007-03-07 10:54:53 -0800 (Wed, 07 Mar 2007) Log Message: ----------- adding work-around to boost.python def_readwrite and def_readonly bugs Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/unittests/custom_string_tester.py pyplusplus_dev/unittests/data/custom_string_to_be_exported.hpp Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2007-03-07 09:55:51 UTC (rev 950) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2007-03-07 18:54:53 UTC (rev 951) @@ -108,7 +108,7 @@ return result - def _generate_for_smart_ptr( self ): + def _generate_using_functions( self ): doc = '' add_property = '' make_getter = algorithm.create_identifier( self, '::boost::python::make_getter') @@ -148,8 +148,8 @@ def _create_impl( self ): if declarations.is_pointer( self.declaration.type ): return self._generate_for_pointer() - elif self.declaration.apply_smart_ptr_wa: - return self._generate_for_smart_ptr() + elif self.declaration.apply_smart_ptr_wa or self.declaration.use_make_functions: + return self._generate_using_functions() else: return self._generate_for_none_pointer() Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2007-03-07 09:55:51 UTC (rev 950) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2007-03-07 18:54:53 UTC (rev 951) @@ -20,7 +20,8 @@ self._setter_call_policies = None self._apply_smart_ptr_wa = False self._is_read_only = None - + self._use_make_functions = None + __call_policies_doc__ = \ """There are usecase, when exporting member variable forces Py++ to create accessors functions. Sometime, those functions requires call policies. @@ -40,6 +41,10 @@ else: value_policy = call_policies.copy_non_const_reference self._getter_call_policies = call_policies.return_value_policy( value_policy ) + elif self.use_make_functions: + self._getter_call_policies = call_policies.return_internal_reference() + else: + pass return self._getter_call_policies def set_getter_call_policies( self, call_policies ): self._getter_call_policies = call_policies @@ -48,7 +53,7 @@ def get_setter_call_policies( self ): if None is self._getter_call_policies: - if self.apply_smart_ptr_wa: + if self.apply_smart_ptr_wa or self.use_make_functions: self._setter_call_policies = call_policies.default_call_policies() return self._setter_call_policies def set_setter_call_policies( self, call_policies ): @@ -56,14 +61,35 @@ setter_call_policies = property( get_setter_call_policies, set_setter_call_policies , doc=__call_policies_doc__ ) + __use_make_functions_doc__ = \ + """Generate code using make_getter and make_setter functions + + Basically you don't need to use this, untill you have one of the next use-cases: + * member variable is smart pointer - in this case Boost.Python has small problem + to expose it right. Using the functions is a work around to the problem. + * member variable defined custom r-value converter - may be you don't know + but the conversion is applied only on functions arguments. So you need to + use make_getter/make_setter in order to allow user to enjoy from the + conversion. + + Setting "apply_smart_ptr_wa" and/or "use_make_functions" to "True" will tell + Py++ to generate such code. + """ + def get_apply_smart_ptr_wa( self ): return self._apply_smart_ptr_wa def set_apply_smart_ptr_wa( self, value): self._apply_smart_ptr_wa = value apply_smart_ptr_wa = property( get_apply_smart_ptr_wa, set_apply_smart_ptr_wa - , doc="" ) + , doc=__use_make_functions_doc__ ) - + def get_use_make_functions( self ): + return self._use_make_functions + def set_use_make_functions( self, value ): + self._use_make_functions = value + use_make_functions = property( get_use_make_functions, set_use_make_functions + , doc=__use_make_functions_doc__) + def __find_out_is_read_only(self): type_ = declarations.remove_alias( self.type ) Modified: pyplusplus_dev/unittests/custom_string_tester.py =================================================================== --- pyplusplus_dev/unittests/custom_string_tester.py 2007-03-07 09:55:51 UTC (rev 950) +++ pyplusplus_dev/unittests/custom_string_tester.py 2007-03-07 18:54:53 UTC (rev 951) @@ -66,11 +66,17 @@ mb.add_declaration_code( auto_convert_code ) mb.add_registration_code( register_auto_convert_code ) mb.constructors().allow_implicit_conversion = False + mb.variable( 'm_name' ).use_make_functions = True + mb.variable( 'm_123' ).use_make_functions = True def run_tests( self, module): self.failUnless( "1" == module.utf16_to_string( "1" ) ) self.failUnless( "22" == module.utf16_to_wstring( u"22" ) ) - + n = module.name_t() + n.m_name = '456' + self.failUnless( '456' == module.utf16_to_string( n.m_name ) ) + self.failUnless( '123' == module.utf16_to_string( n.m_123 ) ) + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) Modified: pyplusplus_dev/unittests/data/custom_string_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/custom_string_to_be_exported.hpp 2007-03-07 09:55:51 UTC (rev 950) +++ pyplusplus_dev/unittests/data/custom_string_to_be_exported.hpp 2007-03-07 18:54:53 UTC (rev 951) @@ -15,7 +15,16 @@ utf16_t() {} explicit utf16_t(std::string const& value) : m_value_a(value) {} explicit utf16_t(std::wstring const& value) : m_value_w(value) {} - + + utf16_t( const utf16_t& other ) + : m_value_a( other.m_value_a ), m_value_w( other.m_value_w ) + {} + + utf16_t& operator=( const utf16_t& other ){ + m_value_a = other.m_value_a; + m_value_w = other.m_value_w; + } + std::string const& value_a() const { return m_value_a; } std::wstring const& value_w() const { return m_value_w; } @@ -24,6 +33,13 @@ std::string m_value_a; }; +struct name_t{ + name_t() : m_123( "123" ){} + + utf16_t m_name; + const utf16_t m_123; +}; + inline std::string utf16_to_string( const utf16_t& x ){ return x.value_a(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-03-11 11:12:25
|
Revision: 955 http://svn.sourceforge.net/pygccxml/?rev=955&view=rev Author: roman_yakovenko Date: 2007-03-11 04:10:10 -0700 (Sun, 11 Mar 2007) Log Message: ----------- correcting small bug in generating wrapper copy constructors Modified Paths: -------------- pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp pyplusplus_dev/unittests/operators_bug_tester.py Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-03-08 07:33:42 UTC (rev 954) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-03-11 11:10:10 UTC (rev 955) @@ -622,9 +622,10 @@ else: self.__extmodule.adopt_declaration_creator( wrapper ) if declarations.has_trivial_copy( self.curr_decl ): - #I don't know but sometimes boost.python requieres - #to construct wrapper from wrapped classe - if not self.curr_decl.noncopyable: + #~ #I don't know but sometimes boost.python requieres + #~ #to construct wrapper from wrapped classe + copy_constr = self.curr_decl.constructor( lambda c: c.is_copy_constructor, recursive=False ) + if not self.curr_decl.noncopyable and copy_constr.is_artificial: copy_constr = code_creators.copy_constructor_wrapper_t( class_inst=self.curr_decl ) wrapper.adopt_creator( copy_constr ) null_constr = declarations.find_trivial_constructor(self.curr_decl) Modified: pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp 2007-03-08 07:33:42 UTC (rev 954) +++ pyplusplus_dev/unittests/data/operators_bug_to_be_exported.hpp 2007-03-11 11:10:10 UTC (rev 955) @@ -6,6 +6,8 @@ #ifndef __operators_bug_to_be_exported_hpp__ #define __operators_bug_to_be_exported_hpp__ +#include <string> + namespace operators_bug{ template< typename derived_type, typename value_type > @@ -46,7 +48,19 @@ }; +struct call_copy_constructor_t{ + explicit call_copy_constructor_t( const std::string& x ) + {} + + call_copy_constructor_t( const call_copy_constructor_t& x ){}; + + call_copy_constructor_t& operator=( const call_copy_constructor_t& x ){ + return *this; + } + + virtual void do_nothing(){} +}; } -#endif//__operators_bug_to_be_exported_hpp__ \ No newline at end of file +#endif//__operators_bug_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/operators_bug_tester.py =================================================================== --- pyplusplus_dev/unittests/operators_bug_tester.py 2007-03-08 07:33:42 UTC (rev 954) +++ pyplusplus_dev/unittests/operators_bug_tester.py 2007-03-11 11:10:10 UTC (rev 955) @@ -24,6 +24,7 @@ tg = code_creators.target_configuration_t( ) #tg.boost_python_has_wrapper_held_type = False mb.build_code_creator( self.EXTENSION_NAME, target_configuration=tg ) + mb.constructors().allow_implicit_conversion = False def run_tests(self, module): i = module.integral() @@ -31,6 +32,9 @@ j = i + i v = module.vector( 2 ) + module.vector.one self.failUnless( v.x == 3 ) + + call_copy_constructor = module.call_copy_constructor_t( "" ) + call_copy_constructor2 = module.call_copy_constructor_t( call_copy_constructor ) def create_suite(): suite = unittest.TestSuite() @@ -41,4 +45,4 @@ unittest.TextTestRunner(verbosity=2).run( create_suite() ) if __name__ == "__main__": - run_suite() \ No newline at end of file + run_suite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-03-25 09:54:14
|
Revision: 958 http://svn.sourceforge.net/pygccxml/?rev=958&view=rev Author: roman_yakovenko Date: 2007-03-25 02:54:13 -0700 (Sun, 25 Mar 2007) Log Message: ----------- another attempt to solve "transfer ownership" problem Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites2_tester.py pyplusplus_dev/unittests/transfer_ownership_tester.py Added Paths: ----------- pyplusplus_dev/unittests/data/transfer_ownership_old_to_be_exported.hpp pyplusplus_dev/unittests/transfer_ownership_old_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2007-03-25 09:54:13 UTC (rev 958) @@ -862,8 +862,9 @@ result.append( self.parent.wrapper_alias ) result.append( '(' ) args = [] - if not self.target_configuration.boost_python_has_wrapper_held_type: - args.append( 'PyObject*' ) + if not self.target_configuration.boost_python_has_wrapper_held_type \ + or self.declaration.parent.require_self_reference: + args.append( 'PyObject* self' ) args_decl = self.args_declaration() if args_decl: args.append( args_decl ) @@ -905,17 +906,18 @@ """ Creates wrapper class constructor from wrapped class instance. """ - def __init__( self, class_inst ): + def __init__( self, constructor ): code_creator.code_creator_t.__init__( self ) - declaration_based.declaration_based_t.__init__( self, declaration=class_inst ) + declaration_based.declaration_based_t.__init__( self, declaration=constructor ) def _create_declaration(self): result = [] - result.append( self.parent.wrapper_alias ) + result.append( self.parent.declaration.wrapper_alias ) result.append( '(' ) - if not self.target_configuration.boost_python_has_wrapper_held_type: - result.append( 'PyObject*, ' ) - declarated = declarations.declarated_t( self.declaration ) + if not self.target_configuration.boost_python_has_wrapper_held_type \ + or self.declaration.parent.require_self_reference: + result.append( 'PyObject* self, ' ) + declarated = declarations.declarated_t( self.declaration.parent ) const_decl = declarations.const_t( declarated ) const_ref_decl = declarations.reference_t( const_decl ) identifier = algorithm.create_identifier( self, const_ref_decl.decl_string ) @@ -933,7 +935,7 @@ answer.append( ': ' + self._create_constructor_call() ) answer.append( ' , ' + self.parent.boost_wrapper_identifier + '(){' ) answer.append( self.indent( '// copy constructor' ) ) - answer.append( self.indent( self.declaration.copy_constructor_body ) ) + answer.append( self.indent( self.parent.declaration.copy_constructor_body ) ) answer.append( '}' ) return os.linesep.join( answer ) @@ -943,22 +945,23 @@ """ Creates wrapper for compiler generated null constructor. """ - def __init__( self, class_inst ): + def __init__( self, constructor ): code_creator.code_creator_t.__init__( self ) - declaration_based.declaration_based_t.__init__( self, declaration=class_inst ) - + declaration_based.declaration_based_t.__init__( self, declaration=constructor ) + def _create_constructor_call( self ): return algorithm.create_identifier( self, self.parent.declaration.decl_string ) + '()' def _create_impl(self): - answer = [ self.parent.wrapper_alias + '(' ] - if not self.target_configuration.boost_python_has_wrapper_held_type: - answer[0] = answer[0] + 'PyObject*' + answer = [ self.parent.declaration.wrapper_alias + '(' ] + if not self.target_configuration.boost_python_has_wrapper_held_type \ + or self.declaration.parent.require_self_reference: + answer[0] = answer[0] + 'PyObject* self' answer[0] = answer[0] + ')' answer.append( ': ' + self._create_constructor_call() ) answer.append( ' , ' + self.parent.boost_wrapper_identifier + '(){' ) answer.append( self.indent( '// null constructor' ) ) - answer.append( self.indent( self.declaration.null_constructor_body ) ) + answer.append( self.indent( self.parent.declaration.null_constructor_body ) ) answer.append( '}' ) return os.linesep.join( answer ) Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2007-03-25 09:54:13 UTC (rev 958) @@ -178,11 +178,17 @@ held_type = self._generated_held_type() if self.wrapper: - if not self.target_configuration.boost_python_has_wrapper_held_type: + if not self.target_configuration.boost_python_has_wrapper_held_type \ + or self.declaration.require_self_reference: args.append( algorithm.create_identifier( self, self.declaration.decl_string ) ) - args.append( self.wrapper.full_name ) + if self.declaration.require_self_reference: + if not held_type: + args.append( self.wrapper.full_name ) + else: + args.append( self.wrapper.full_name ) else: args.append( algorithm.create_identifier( self, self.declaration.decl_string ) ) + bases = self._generate_bases(base_creators) if bases: args.append( bases ) Modified: pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2007-03-25 09:54:13 UTC (rev 958) @@ -67,7 +67,8 @@ and self.class_creator.held_type \ and isinstance( self.class_creator.held_type, held_type_t ) \ and self.class_creator.held_type.smart_ptr == self.smart_ptr \ - and self.target_configuration.boost_python_has_wrapper_held_type: + and self.target_configuration.boost_python_has_wrapper_held_type \ + and not self.class_creator.declaration.require_self_reference: return '' #boost.python does it automaticly rptp = algorithm.create_identifier( self, '::boost::python::register_ptr_to_python' ) held_type = held_type_t(self.smart_ptr).create( self ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2007-03-25 09:54:13 UTC (rev 958) @@ -194,7 +194,8 @@ self._exception_translation_code = None self._properties = [] self._redefined_funcs = None - + self._require_self_reference = False + def _get_redefine_operators( self ): return self._redefine_operators def _set_redefine_operators( self, new_value ): @@ -528,3 +529,10 @@ if self.member_operators( is_assign, allow_empty=True, recursive=False ): return impl_details.GAEUS_VALUES.ALWAYS_TRUE return super(class_t, self).guess_always_expose_using_scope_value() + + def _get_require_self_reference(self): + return self._require_self_reference + def _set_require_self_reference(self, require_self_reference): + self._require_self_reference = require_self_reference + require_self_reference = property( _get_require_self_reference, _set_require_self_reference + , doc="boolean, if True the first argument to the constructor will be reference to self object" ) Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-03-25 09:54:13 UTC (rev 958) @@ -626,12 +626,12 @@ #~ #to construct wrapper from wrapped classe copy_constr = self.curr_decl.constructor( lambda c: c.is_copy_constructor, recursive=False ) if not self.curr_decl.noncopyable and copy_constr.is_artificial: - copy_constr = code_creators.copy_constructor_wrapper_t( class_inst=self.curr_decl ) - wrapper.adopt_creator( copy_constr ) + cccc = code_creators.copy_constructor_wrapper_t( constructor=copy_constr ) + wrapper.adopt_creator( cccc ) null_constr = declarations.find_trivial_constructor(self.curr_decl) if null_constr and null_constr.is_artificial: #this constructor is not going to be exposed - tcons = code_creators.null_constructor_wrapper_t( class_inst=self.curr_decl ) + tcons = code_creators.null_constructor_wrapper_t( constructor=null_constr ) wrapper.adopt_creator( tcons ) exposed = self.expose_overloaded_mem_fun_using_macro( cls_decl, cls_cc ) Added: pyplusplus_dev/unittests/data/transfer_ownership_old_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/transfer_ownership_old_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/transfer_ownership_old_to_be_exported.hpp 2007-03-25 09:54:13 UTC (rev 958) @@ -0,0 +1,9 @@ +#ifndef __transfer_ownership_old_to_be_exported_hpp__ +#define __transfer_ownership_old_to_be_exported_hpp__ + +#include <iostream> + +#include "transfer_ownership_to_be_exported.hpp" + + +#endif//__transfer_ownership_old_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp 2007-03-25 09:54:13 UTC (rev 958) @@ -8,7 +8,7 @@ notify(); } protected: - virtual void notify() = 0; + virtual void notify(){}; }; struct do_nothing_t : event_t{ @@ -22,6 +22,10 @@ m_event = event; }; + const event_t* get_event(){ + return m_event; + } + void run() { m_event->invoke(); delete m_event; Modified: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2007-03-25 09:54:13 UTC (rev 958) @@ -54,6 +54,8 @@ self.failUnless( kv.key == "x" and kv.value == "y" ) for k, v in name2value: self.failUnless( k == "x" and v == "y" ) + for k, v in name2value.iteritems(): + self.failUnless( k == "x" and v == "y" ) items_ptr = module.items_ptr_t() items_ptr.append( item ) Added: pyplusplus_dev/unittests/transfer_ownership_old_tester.py =================================================================== --- pyplusplus_dev/unittests/transfer_ownership_old_tester.py (rev 0) +++ pyplusplus_dev/unittests/transfer_ownership_old_tester.py 2007-03-25 09:54:13 UTC (rev 958) @@ -0,0 +1,128 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +import os +import sys +import unittest +import fundamental_tester_base +from pyplusplus import code_creators +from pyplusplus.module_builder import call_policies +from pyplusplus import function_transformers as ft + +decref_code = \ +""" +virtual ~%(cls)s(){ + Py_DECREF( boost::python::detail::wrapper_base_::get_owner(*this) ); +// if (this->m_pyobj) { +// Py_DECREF(this->m_pyobj); +// this->m_pyobj = 0; +// } +} +""" + +incref_code = \ +""" +//if( !this->m_pyobj) { + //this->m_pyobj = boost::python::detail::wrapper_base_::get_owner(*this); + std::cout << "py owner id: " << (int)(boost::python::detail::wrapper_base_::get_owner(*this)); + //Py_INCREF(this->m_pyobj); +//} +""" + +impl_conv_code = \ +""" +boost::python::implicitly_convertible< std::auto_ptr< %(from)s >, std::auto_ptr< %(to)s > >(); +""" + +register_sptr = \ +""" +boost::python::register_ptr_to_python< %s >(); +""" + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'transfer_ownership_old' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + event_clss = mb.classes( lambda cls: cls.name in ( 'event_t', 'do_nothing_t' ) ) + for cls in event_clss: + cls.require_self_reference = True + cls.set_constructors_body( 'Py_INCREF(self); std::cout<< "self: " << (int)(self) << "\\n" << (int)( boost::python::detail::wrapper_base_::get_owner(*this));' ) + cls.add_wrapper_code( decref_code % { 'cls' : cls.wrapper_alias } ) + #~ cls.add_wrapper_code( 'PyObject* m_pyobj;' ) + #~ cls.set_constructors_body( 'm_pyobj=0;' ) + cls.mem_fun( 'notify' ).add_override_precall_code( incref_code ) + #~ cls.mem_fun( 'notify' ).add_default_precall_code( incref_code ) + + cls.held_type = 'std::auto_ptr< %s >' % cls.wrapper_alias + cls.add_registration_code( register_sptr % 'std::auto_ptr< %s >' % cls.decl_string, False ) + cls.add_registration_code( register_sptr % 'std::auto_ptr< %s >' % cls.wrapper_alias, False ) + #~ cls.held_type = 'std::auto_ptr< %s >' % cls.decl_string + cls.add_registration_code( impl_conv_code % { 'from' : cls.wrapper_alias + , 'to' : cls.decl_string } + , False) + for base in cls.recursive_bases: + if base.access_type == 'public': + cls.add_registration_code( #from class to its base + impl_conv_code % { 'from' : cls.decl_string + , 'to' : base.related_class.decl_string } + , False) + + cls.add_registration_code( #from wrapper to clas base class + impl_conv_code % { 'from' : cls.wrapper_alias + , 'to' : base.related_class.decl_string } + , False) + + simulator = mb.class_( 'simulator_t' ) + simulator.mem_fun( 'get_event' ).call_policies \ + = call_policies.return_internal_reference() + schedule = mb.mem_fun( 'schedule' ) + schedule.add_transformation( ft.transfer_ownership(0), alias='schedule' ) + + def run_tests( self, module): + class py_event_t( module.event_t ): + def __init__( self, container ): + module.event_t.__init__( self ) + self.container = container + + def notify( self ): + print 'notify' + self.container.append( 1 ) + + print 'test started' + notify_data = [] + simulator = module.simulator_t() + print 'simulator created' + event = py_event_t( notify_data ) + print 'py_event_t created: ', id( event ) + simulator.schedule( event ) + print 'event was shceduled' + print 'event refcount: ', sys.getrefcount( event ) + print 'simulator refcount: ', sys.getrefcount( simulator ) + #del event + print 'event was deleted' + event = simulator.get_event() + print 'event was restored via saved reference in simulator: ', id( event ) + print 'event refcount: ', sys.getrefcount( simulator.get_event() ) + #print 'call event.notify(): ', simulator.get_event().notify() + print 'call simulator.run()' + simulator.run() + self.failUnless( notify_data[0] == 1 ) + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() Modified: pyplusplus_dev/unittests/transfer_ownership_tester.py =================================================================== --- pyplusplus_dev/unittests/transfer_ownership_tester.py 2007-03-21 22:51:36 UTC (rev 957) +++ pyplusplus_dev/unittests/transfer_ownership_tester.py 2007-03-25 09:54:13 UTC (rev 958) @@ -9,6 +9,7 @@ import fundamental_tester_base from pyplusplus import code_creators from pyplusplus import function_transformers as ft +from pyplusplus.module_builder import call_policies decref_code = \ """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-03-31 18:28:05
|
Revision: 965 http://svn.sourceforge.net/pygccxml/?rev=965&view=rev Author: roman_yakovenko Date: 2007-03-31 11:27:37 -0700 (Sat, 31 Mar 2007) Log Message: ----------- separating indexing suite v2 dependent call policies from the others Modified Paths: -------------- pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml pyplusplus_dev/examples/pyboost_dev/dev/date_time/sconscript pyplusplus_dev/examples/pyboost_dev/sconstruct pyplusplus_dev/pyplusplus/code_repository/__init__.py pyplusplus_dev/pyplusplus/code_repository/call_policies.py pyplusplus_dev/pyplusplus/module_creator/creator.py Added Paths: ----------- pyplusplus_dev/pyplusplus/code_repository/return_range.py Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml 2007-03-31 17:13:57 UTC (rev 964) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml 2007-03-31 18:27:37 UTC (rev 965) @@ -1,1808 +1,1831 @@ <?xml version="1.0"?> -<GCC_XML cvs_revision="1.113"> - <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31 _32 _33 _34 _35 _36 _37 _38 _39 _40 _41 _42 _43 _44 _45 _46 _47 _48 _49 _50 _51 _52 _53 _54 _55 _56 _57 _58 _59 _60 _61 _62 _63 _64 _65 _66 _67 _68 _69 _70 _71 _72 _73 _74 _75 _76 _77 _78 _79 _80 _81 _82 _83 _84 _85 _86 _87 _88 _89 _90 _91 _92 _93 _94 _95 _96 _97 _98 _99 _100 _101 _102 _103 _104 _105 _106 _107 _108 _109 _110 _111 _112 _113 _114 _115 _116 _117 _118 _119 _120 _121 _122 _123 _124 _125 _126 _127 _128 _129 _130 _131 _132 _133 _134 _135 _136 _137 _138 _139 _140 _141 _142 _143 _144 _145 _146 _147 _148 _149 _150 _151 _152 _153 _154 _155 _156 _157 _158 _159 _160 _161 _162 _163 _164 _165 _166 _167 _168 _169 _170 _171 _172 _173 _174 _175 _176 _177 _178 _179 _180 _181 _182 _183 _184 _185 _186 _187 _188 _189 _190 _191 _192 _193 _194 _195 _196 _197 _198 _199 _200 _201 _202 _203 _204 _205 _206 _207 _208 _209 _210 _211 _212 _213 _214 _215 _216 _217 _218 _219 _220 _221 _222 _223 _224 _225 _226 _227 _228 _229 _230 _231 _232 _233 _234 _235 _236 _237 _238 _239 _240 _241 _242 _243 _244 _245 _246 _247 _248 _249 _250 _251 _252 _253 _254 _255 _256 _257 _258 _259 _260 _261 _262 _263 _264 _265 _266 _267 _268 _269 _270 _271 _272 _273 _274 _275 _276 _277 _278 _279 _280 _281 _282 _283 _284 _285 _286 _287 _288 _289 _290 _291 _292 _293 _294 _295 _296 _297 _298 _299 _300 _301 _302 _303 _304 _305 _306 _307 _308 _309 _310 _311 _312 _313 _314 _315 _316 _317 _318 _319 _320 _321 _322 _323 _324 _325 _326 _327 _328 _329 _330 _331 _332 _333 _334 _335 _336 _337 _338 _339 _340 _341 _342 _343 _344 _345 _346 _347 _348 _349 _350 _351 _352 _353 _354 _355 _356 _357 _358 _359 _360 _361 _362 _363 _364 _365 _366 _367 _368 _369 _370 _371 _372 _373 _374 _375 _376 _377 _378 _379 _380 _381 _382 _383 _384 _385 _386 _387 _388 _389 _390 _391 _392 _393 _394 _395 _396 _397 _398 _399 _400 _401 _402 _403 _404 _405 _406 _407 _408 _409 _410 _411 _412 _413 _414 _415 _416 _417 _418 _419 _420 _421 _422 _423 _424 _425 _426 _427 _428 _429 _430 _431 _432 _433 _434 _435 _436 _437 _438 _439 _440 _441 _442 _443 _444 _445 _446 _447 _448 _449 _450 _451 _452 _453 _454 _455 _456 _457 _458 _459 _460 _461 _462 _463 _464 _465 _466 _467 _468 _469 _470 _471 _472 _473 _474 _475 _476 _477 _478 _479 _480 _481 _483 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _500 _502 _503 _504 _505 _506 _507 _509 _510 _511 _512 _513 _514 _515 _516 _517 _518 _519 _520 _521 _522 _523 _524 _525 _526 _527 _528 _529 _530 _531 _532 _533 _534 _535 _536 _537 _538 _539 _540 _541 _542 _543 _544 _545 _546 _547 _548 _549 _550 _551 _552 _553 _554 _555 _556 _557 _558 _559 _560 _561 _562 _563 _564 _565 _566 _567 _568 _569 _570 _571 _572 _573 _574 _575 _576 _577 _578 _579 _580 _581 _582 _583 _584 _585 _586 _587 _588 _589 _590 _591 _592 _593 _594 _595 _596 _597 _598 _599 _600 _601 _602 _603 _604 _605 _606 _607 _608 _609 _610 _611 _612 _613 _614 _615 _616 _617 _618 _619 _620 _622 _623 _624 _625 _626 _627 _628 _629 _630 _631 _632 _633 _634 _635 _636 _637 _639 _640 _641 _642 _643 _644 _645 _646 _647 _648 _649 _650 _651 _652 _653 _654 _655 _656 _657 _658 _659 _660 _661 _662 _663 _664 _665 _666 _667 _668 _669 _670 _671 _672 _673 _674 _675 _676 _677 _678 _679 _680 _681 _682 _683 _684 _685 _686 _687 _688 _689 _690 _691 _692 _693 _694 _695 _696 _697 _698 _699 _700 _701 _702 _703 _704 _705 _706 _707 _708 _709 _710 _711 _712 _713 _714 _715 _716 _717 _718 _719 _720 _721 _722 _723 _724 _725 _726 _727 _728 _729 _730 _731 _732 _733 _734 _735 _736 _737 _738 _739 _740 _741 _742 _743 _744 _745 _746 _747 _748 _749 _750 _751 _752 _753 _754 _755 _756 _757 _758 _759 _760 _761 _762 _763 _764 _765 _767 _768 _769 _770 _771 _772 _773 _774 _775 _776 _777 _778 _779 _780 _781 _782 _783 _784 _785 _786 _787 _788 _789 _790 _791 _792 _793 _794 _795 _796 _797 _798 _799 _800 _801 _802 _803 _804 _805 _806 _807 _808 _809 _810 _811 _812 _813 _814 _815 _816 _817 _818 _820 _821 _822 _824 _825 _826 _827 _828 _829 _830 _831 _832 _833 _834 _835 _836 _837 _838 _839 _840 _841 _842 _843 _844 _845 _846 _847 _848 _849 _850 _851 _852 _853 _854 _855 _856 _857 _858 _859 _860 _861 _862 _863 _864 _865 _866 _867 _868 _869 _870 _871 _872 _873 _874 _875 _876 _877 _878 _879 _880 _881 _882 _883 _884 _885 _886 _887 _888 _889 _890 _891 _892 _893 _894 _895 _896 _897 _898 _899 _900 _901 _902 _903 _904 _905 _906 _907 _908 _909 _910 _911 _912 _913 _914 _915 _916 _917 _918 _919 _920 _921 _922 _923 _924 _925 _926 _927 _928 _929 _930 _931 _932 _933 _934 _935 _936 _937 _938 _939 _940 _941 _942 _943 _944 _945 _946 _947 _948 _949 _950 _951 _952 _953 _954 _955 _956 _957 _958 _959 _960 _961 _962 _963 _964 _965 _966 _967 _968 _969 _970 _971 _972 _973 _974 _975 _976 _977 _978 _979 _980 _981 _982 _983 _984 _985 _986 _987 _988 _989 _990 _991 _992 _993 _994 _995 _996 _997 _998 _999 _1000 _1001 _1002 _1003 _1004 _1006 _1007 _1008 _1009 _1010 _1011 _1012 _1013 _1014 _1015 _1016 _1017 _1018 _1019 _1020 _1021 _1022 _1023 _1024 _1025 _1026 _1027 _1028 _1029 _1030 _1031 _1032 _1033 _1034 _1035 _1036 _1037 _1038 _1039 _1040 _1041 _1042 _1043 _1044 _1045 _1046 _1047 _1048 _1049 _1050 _1051 _1052 _1053 _1054 _1055 _1056 _1057 _1058 _1059 _1060 _1061 _1062 _1063 _1064 _1065 _1066 _1067 _1068 _1069 _1070 _1071 _1072 _1073 _1074 _1075 _1076 _1077 _1078 _1079 _1080 _1081 _1082 _1083 _1084 _1085 _1086 _1087 _1088 _1089 _1090 _1091 _1092 _1093 _1094 _1095 _1096 _1097 _1098 _1099 _1100 _1101 _1102 _1103 _1104 _1105 _1107 _1109 _1111 _1112 _1113 _1114 _1115 _1116 _1117 _1118 _1119 _1120 _1121 _1122 _1123 _1124 _1125 _1126 _1127 _1128 _1129 _1130 _1131 _1132 _1133 _1134 _1136 _1135 _1138 _1140 _1142 _1144 _1145 _1146 _1147 _1148 _1149 _1150 _1151 _1152 _1153 _1154 _1156 _1157 _1158 _1159 _1161 _1162 _1164 _1165 _1167 _1168 _1170 _1172 _1174 _1176 _1178 _1180 _1182 _1184 _1186 _1187 _1188 _1189 _1190 _1191 _1192 _1106 _1108 _766 _1193 _1195 _1196 _1194 _1197 _1198 _1199 _1200 _1201 _1202 _1203 _1204 _1205 _1206 _1207 _1208 _1209 _1210 _1211 _1212 _1213 _1214 _1215 _1216 _1217 _1218 _1219 _1220 _1221 _1222 _1223 _1224 _1225 _1226 _1227 _1228 _1229 _1230 _1231 _1232 _1233 _1234 _1235 _1236 _1237 _1238 _1239 _1240 _1242 _1243 _1244 _1245 _1246 _1248 _1250 _1251 _1252 _1253 _1254 _1256 _1257 _1258 _1259 _1261 _1262 _1263 _1264 _1265 _1266 _1267 _1268 _1269 _1270 _1271 _1272 _1273 _1274 _1275 _1276 _1277 _1278 _1279 _1280 _1281 _1282 _1283 _1284 _1285 _1286 _1287 _1288 _1289 _1290 _1291 _1292 _1293 _1294 _1295 _1296 _1297 _1298 _1299 _1300 _1301 _1302 _1303 _1304 _1305 _1306 _1307 _1308 _1309 _1310 _1311 _1312 _1313 _1314 _1315 _1316 _1317 _1318 _1319 _1320 _1321 _1322 _1323 _1324 _1325 _1326 _1327 _1328 _1329 _1330 _1331 _1332 _1333 _1334 _1335 _1336 _1337 _1338 _1339 _1340 _1341 _1342 _1343 _1344 _1345 _1346 _1347 _1348 _1349 _1350 _1351 _1352 _1353 _1354 _1355 _1356 _1357 _1358 _1359 _1360 _1361 _1362 _1363 _1364 _1365 _1366 _1367 _1368 _1369 _1370 _1371 _1372 _1373 _1374 _1375 _1376 _1377 _1378 _1379 _1380 _1381 _1382 _1383 _1384 _1385 _1386 _1387 _1388 _1389 _1390 _1391 _1392 _1393 _1394 _1395 _1396 _1397 _1398 _1399 _1400 _1401 _1402 _1403 _1404 _1405 _1406 _1407 _1408 _1409 _1410 _1411 _1412 _1413 _1414 _1415 _1416 _1417 _1418 _1419 _1420 _1421 _1422 _1423 _1424 _1425 _1426 _1427 _1428 _1429 _1431 _1432 _1433 _1434 _1435 _1436 _1437 _1438 _1439 _1440 _1441 _1442 _1443 _1444 _1445 _1446 _1447 _1448 _1449 _1450 _1451 _1452 _1453 _1454 _1455 _1456 _1457 _1458 _1459 _1460 _1461 _1462 _1463 _1464 _1465 _1466 _1467 _1468 _1469 _1470 _1471 _1472 _1473 _1474 _1475 _1476 _1477 _1478 _1479 _1480 _1481 _1482 _1483 _1484 _1485 _1486 _1487 _1488 _1489 _1490 _1492 _1491 _1493 _1494 _819 _1495 _1496 _1497 _1498 _1500 _1499 _1502 _1503 _1504 _1505 _1506 _1507 _1508 _1509 _1510 _1511 _1513 _1514 _1515 _1516 _1517 _1518 _1519 _1520 _1521 _1522 _1523 _1524 _1526 _1525 _1527 _1528 _1529 _1530 _1531 _1532 _1533 _1534 _1535 _1536 _1537 _1538 _1539 _1540 _1541 _1542 _1543 _1544 _1545 _1546 _1547 _1548 _1549 _1550 _1551 _1552 _1553 _1554 _1555 _1556 _1557 _1558 _1559 _1560 _1561 _1563 _1564 _1565 _1566 _1567 _1568 _1569 _1570 _1571 _1572 _1574 _1575 _1576 _1577 _1578 _1579 _1580 _1581 _1582 _1583 _1584 _1585 _1586 _1587 _1588 _1589 _1590 _1591 _1592 _1593 _1594 _1595 _1562 _1596 _1597 _1598 _1599 _1600 _1601 _1602 _1603 _1604 _1605 _1606 _1607 _1608 _1609 _1610 _1611 _1612 _1613 _1614 _1615 _1616 _1617 _1618 _1619 _1620 _1621 _1622 _1623 _1624 _1625 _1626 _1627 _1628 _1629 _1630 _1631 _1632 _1633 _1634 _1635 _1636 _1637 _1638 _1639 _1640 _1641 _1642 _1643 _1644 _1645 _1646 _1647 _1648 _1649 _1650 _1651 _1652 _1653 _1654 _1655 _1656 _1657 _1658 _1659 _1660 _1661 _1662 _1663 _1664 _1665 _1666 _1667 _1668 _1669 _1670 _1671 _1672 _1673 _1674 _1675 _1676 _1677 _1678 _1679 _1680 _1681 _1682 _1683 _1684 _1685 _1686 _1687 _1688 _1689 _1690 _1691 _1692 _1693 _1694 _1695 _1696 _1697 _1698 _1699 _1700 _1701 _1702 _1703 _1704 _1705 _1706 _1707 _1708 _1709 _1710 _1711 _1712 _1713 _1714 _1715 _1716 _1717 _1718 _1719 _1720 _1721 _1722 _1723 _1724 _1725 _1726 _1727 _1728 _1729 _1730 _1731 _1732 _1733 _1734 _1735 _1736 _1737 _1738 _1739 _1740 _1741 _1742 _1743 _1744 _1745 _1746 _1747 _1748 _1749 _1750 _1751 _1752 _1753 _1754 _1755 _1756 _1757 _1758 _1759 _1760 _1761 _1762 _1763 _1764 _1765 _1766 _1767 _1768 _1769 _1770 _1771 _1772 _1773 _1774 _1775 _1776 _1777 _1778 _1779 _1780 _1781 _1782 _1783 _1784 _1785 _1786 _1787 _1788 _1789 _1790 _1791 _1792 _1793 _1794 _1795 _1796 _1797 _1798 _1799 _1800 _1801 _1802 _1803 _1804 _1805 _1806 _1807 _1808 _1809 _1810 _1811 _1812 _1813 _1814 _1815 _1816 _1817 _1818 _1819 _1820 _1821 _1822 _1823 _1824 _1825 _1826 _1827 _1828 _1829 _1830 _1831 _1832 _1833 _1834 _1835 _1836 _1837 _1838 _1839 _1840 _1841 _1842 _1843 _1844 _1845 _1846 _1847 _1848 _1849 _1850 _1851 " mangled="_Z2::" demangled="::"/> - <Namespace id="_2" name="std" context="_1" members="_1853 _1854 _1855 _1856 _1857 _1858 _1859 _1860 _1861 _1862 _1863 _1864 _1865 _1866 _1867 _1868 _1869 _1870 _1871 _1872 _1873 _1874 _1875 _1876 _1877 _1878 _1879 _1880 _1881 _1882 _1883 _1884 _1885 _1886 _1887 _1888 _1889 _1890 _1891 _1892 _1893 _1894 _1895 _1896 _1897 _1898 _1899 _1900 _1901 _1902 _1907 _1908 _1913 _1914 _1927 _1928 _1933 _1934 _1939 _1940 _1941 _1942 _1943 _1944 _1945 _1946 _1947 _1948 _1949 _1963 _1964 _1965 _1966 _1967 _1968 _1969 _1970 _1971 _1972 _1975 _1980 _1981 _1982 _1983 _1988 _1989 _1990 _1991 _1994 _1995 _1996 _1997 _1998 _1999 _2000 _2001 _2002 _2003 _2004 _2013 _2014 _2015 _2046 _2055 _2056 _2057 _2058 _2059 _2060 _2061 _2062 _2063 _2064 _2065 _2066 _2067 _2068 _2069 _2070 _2071 _2072 _2073 _2074 _2075 _2076 _2077 _2078 _2079 _2080 _2081 _2082 _2083 _2084 _2085 _2086 _2087 _2088 _2089 _2090 _2091 _2092 _2093 _2094 _2095 _2096 _2097 _2098 _2099 _2100 _2101 _2107 _2108 _2148 _2149 _2150 _2168 _2169 _2209 _2211 _2212 _2213 _2274 _2287 _2296 _2313 _2314 _2319 _2321 _2322 _2323 _2330 _2331 _2332 _2455 _2456 _2457 _2458 _2459 _2460 _2461 _2462 _2463 _2465 _2467 _2469 _2471 _2473 _2475 _2477 _2479 _2481 _2483 _2485 _2487 _2489 _2491 _2493 _2495 _2497 _2499 _2501 _2503 _2505 _2507 _2509 _2511 _2513 _2515 _2516 _2521 _2522 _2523 _2524 _2525 _2526 _2527 _2528 _2529 _2530 _2531 _2532 _2533 _2534 _2536 _2537 _2538 _2539 _2540 _2541 _2542 _2543 _2544 _2546 _2548 _2567 _2568 _2569 _2570 _2571 _2572 _2573 _2574 _2575 _2638 _2639 _2640 _2641 _2642 _2643 _2644 _2653 _2654 _2655 " mangled="_Z3std" demangled="std"/> - <Function id="_3" name="_GLOBAL__D__home_roman_pygccxml_sources_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hppstnHfb" returns="_1155" context="_1" location="f0:131" file="f0" line="131" endline="131"/> - <Function id="_4" name="_GLOBAL__I__home_roman_pygccxml_sources_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hppstnHfb" returns="_1155" context="_1" location="f0:131" file="f0" line="131" endline="131"/> - <Variable id="_5" name="_ZGVN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE" type="_1249" context="_1" location="f1:372" file="f1" line="372" artificial="1"/> - <Function id="_6" name="__static_initialization_and_destruction_0" returns="_1155" context="_1" mangled="_Z41__static_initialization_and_destruction_0ii" demangled="__static_initialization_and_destruction_0(int, int)" location="f0:131" file="f0" line="131" endline="76"> - <Argument name="__initialize_p" type="_501" location="f0:131" file="f0" line="131"/> - <Argument name="__priority" type="_501" location="f0:131" file="f0" line="131"/> +<GCC_XML cvs_revision="1.114"> + <Namespace id="_1" name="::" members="_3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 _16 _17 _18 _19 _20 _21 _22 _23 _24 _25 _26 _27 _28 _29 _30 _31 _32 _33 _34 _35 _36 _37 _38 _39 _40 _41 _42 _43 _44 _45 _46 _47 _48 _49 _50 _51 _52 _53 _54 _55 _56 _57 _58 _59 _60 _61 _62 _63 _64 _65 _66 _67 _68 _69 _70 _71 _72 _73 _74 _75 _76 _77 _78 _79 _80 _81 _82 _83 _84 _85 _86 _87 _88 _89 _90 _91 _92 _93 _94 _95 _96 _97 _98 _99 _100 _101 _102 _103 _104 _105 _106 _107 _108 _109 _110 _111 _112 _113 _114 _115 _116 _117 _118 _119 _120 _121 _122 _123 _124 _125 _126 _127 _128 _129 _130 _131 _132 _133 _134 _135 _136 _137 _138 _139 _140 _141 _142 _143 _144 _145 _146 _147 _148 _149 _150 _151 _152 _153 _154 _155 _156 _157 _158 _159 _160 _161 _162 _163 _164 _165 _166 _167 _168 _169 _170 _171 _172 _173 _174 _175 _176 _177 _178 _179 _180 _181 _182 _183 _184 _185 _186 _187 _188 _189 _190 _191 _192 _193 _194 _195 _196 _197 _198 _199 _200 _201 _202 _203 _204 _205 _206 _207 _208 _209 _210 _211 _212 _213 _214 _215 _216 _217 _218 _219 _220 _221 _222 _223 _224 _225 _226 _227 _228 _229 _230 _231 _232 _233 _234 _235 _236 _237 _238 _239 _240 _241 _242 _243 _244 _245 _246 _247 _248 _249 _250 _251 _252 _253 _254 _255 _256 _257 _258 _259 _260 _261 _262 _263 _264 _265 _266 _267 _268 _269 _270 _271 _272 _273 _274 _275 _276 _277 _278 _279 _280 _281 _282 _283 _284 _285 _286 _287 _288 _289 _290 _291 _292 _293 _294 _295 _296 _297 _298 _299 _300 _301 _302 _303 _304 _305 _306 _307 _308 _309 _310 _311 _312 _313 _314 _315 _316 _317 _318 _319 _320 _321 _322 _323 _324 _325 _326 _327 _328 _329 _330 _331 _332 _333 _334 _335 _336 _337 _338 _339 _340 _341 _342 _343 _344 _345 _346 _347 _348 _349 _350 _351 _352 _353 _354 _355 _356 _357 _358 _359 _360 _361 _362 _363 _364 _365 _366 _367 _368 _369 _370 _371 _372 _373 _374 _375 _376 _377 _378 _379 _380 _381 _382 _383 _384 _385 _386 _387 _388 _389 _390 _391 _392 _393 _394 _395 _396 _397 _398 _399 _400 _401 _402 _403 _404 _405 _406 _407 _408 _409 _410 _411 _412 _413 _414 _415 _416 _417 _418 _419 _420 _421 _422 _423 _424 _425 _426 _427 _428 _429 _430 _431 _432 _433 _434 _435 _436 _437 _438 _439 _440 _441 _442 _443 _444 _445 _446 _447 _448 _449 _450 _451 _452 _453 _454 _455 _456 _457 _458 _459 _460 _461 _462 _463 _464 _465 _466 _467 _468 _469 _470 _471 _472 _473 _474 _475 _476 _477 _478 _479 _480 _481 _482 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _500 _501 _502 _504 _505 _506 _507 _508 _509 _511 _512 _513 _514 _515 _516 _517 _518 _519 _520 _521 _522 _523 _524 _525 _526 _527 _528 _529 _530 _531 _532 _533 _534 _535 _536 _537 _538 _539 _540 _541 _542 _543 _544 _545 _546 _547 _548 _549 _550 _551 _552 _553 _554 _555 _556 _557 _558 _559 _560 _561 _562 _563 _564 _565 _566 _567 _568 _569 _570 _571 _572 _573 _574 _575 _576 _577 _578 _579 _580 _581 _582 _583 _584 _585 _586 _587 _588 _589 _590 _591 _592 _593 _594 _595 _596 _597 _598 _599 _600 _601 _602 _603 _604 _605 _606 _607 _608 _609 _610 _611 _612 _613 _614 _615 _616 _617 _618 _619 _620 _621 _622 _623 _624 _625 _627 _628 _629 _630 _631 _632 _633 _634 _635 _636 _637 _638 _639 _640 _641 _642 _644 _645 _646 _647 _648 _649 _650 _651 _652 _653 _654 _655 _656 _657 _658 _659 _660 _661 _662 _663 _664 _665 _666 _667 _668 _669 _670 _671 _672 _673 _674 _675 _676 _677 _678 _679 _680 _681 _682 _683 _684 _685 _686 _687 _688 _689 _690 _691 _692 _693 _694 _695 _696 _697 _698 _699 _700 _701 _702 _703 _704 _705 _706 _707 _708 _709 _710 _711 _712 _713 _714 _715 _716 _717 _718 _719 _720 _721 _722 _723 _724 _725 _726 _727 _728 _729 _730 _731 _732 _733 _734 _735 _736 _737 _738 _739 _740 _741 _742 _743 _744 _745 _746 _747 _748 _749 _750 _751 _752 _753 _754 _755 _756 _757 _758 _759 _760 _761 _762 _763 _764 _765 _767 _768 _769 _770 _771 _772 _773 _774 _775 _776 _777 _778 _779 _780 _781 _782 _783 _784 _785 _786 _787 _788 _789 _790 _791 _792 _793 _794 _795 _796 _797 _798 _799 _800 _801 _802 _803 _804 _805 _806 _807 _808 _809 _810 _811 _812 _813 _814 _815 _816 _817 _818 _819 _820 _821 _822 _823 _824 _825 _826 _827 _828 _829 _830 _831 _832 _834 _835 _836 _838 _839 _840 _841 _842 _843 _844 _845 _846 _847 _848 _849 _850 _851 _852 _853 _854 _855 _856 _857 _858 _859 _860 _861 _862 _863 _864 _865 _866 _867 _868 _869 _870 _871 _872 _873 _874 _875 _876 _877 _878 _879 _880 _881 _882 _883 _884 _885 _886 _887 _888 _889 _890 _891 _892 _893 _894 _895 _896 _897 _898 _899 _900 _901 _902 _903 _904 _905 _906 _907 _908 _910 _909 _911 _912 _913 _914 _915 _916 _917 _918 _919 _920 _921 _922 _923 _924 _925 _926 _927 _928 _929 _930 _931 _932 _933 _934 _935 _936 _937 _938 _939 _940 _941 _942 _943 _944 _945 _946 _947 _948 _949 _950 _951 _952 _953 _954 _955 _956 _957 _958 _959 _960 _961 _962 _963 _964 _965 _967 _968 _969 _970 _971 _972 _973 _974 _975 _976 _977 _978 _979 _980 _981 _982 _983 _984 _985 _986 _987 _988 _989 _990 _991 _992 _993 _994 _995 _996 _997 _998 _999 _1000 _1001 _1002 _1003 _1004 _1005 _1006 _1007 _1008 _1009 _1010 _1011 _1012 _1013 _1014 _1015 _1016 _1017 _1018 _1019 _1020 _1021 _1022 _1023 _1024 _1025 _1026 _1027 _1028 _1029 _1030 _1031 _1032 _1033 _1034 _1035 _1036 _1037 _1038 _1039 _1040 _1041 _1043 _1044 _1045 _1046 _1047 _1048 _1049 _1050 _1051 _1052 _1053 _1054 _1055 _1056 _1057 _1058 _1059 _1060 _1061 _1062 _1063 _1064 _1065 _1066 _1067 _1068 _1069 _1070 _1071 _1072 _1073 _1074 _1075 _1076 _1077 _1078 _1079 _1080 _1081 _1082 _1083 _1084 _1085 _1086 _1087 _1088 _1089 _1090 _1091 _1092 _1093 _1094 _1095 _1096 _1097 _1098 _1099 _1100 _1101 _1102 _1103 _1104 _1105 _1106 _1107 _1108 _1109 _1110 _1111 _1112 _1113 _1114 _1115 _1116 _1117 _1118 _1119 _1120 _1121 _1122 _1123 _1124 _1125 _1126 _1127 _1128 _1129 _1130 _1131 _1132 _1133 _1134 _1135 _1136 _1137 _1138 _1139 _1140 _1141 _1142 _1143 _1144 _1146 _1148 _1150 _1151 _1152 _1153 _1154 _1155 _1156 _1157 _1158 _1159 _1160 _1161 _1162 _1163 _1164 _1165 _1166 _1167 _1168 _1169 _1170 _1171 _1172 _1173 _1175 _1174 _1177 _1179 _1181 _1183 _1184 _1185 _1186 _1187 _1188 _1189 _1190 _1191 _1192 _1193 _1195 _1196 _1197 _1198 _1200 _1201 _1203 _1204 _1206 _1207 _1209 _1211 _1213 _1215 _1217 _1219 _1221 _1223 _1225 _1226 _1227 _1228 _1229 _1230 _1231 _1145 _1147 _766 _1232 _1234 _1235 _1233 _1236 _1237 _1238 _1239 _1240 _1241 _1242 _1243 _1244 _1245 _1246 _1247 _1248 _1249 _1250 _1251 _1252 _1253 _1254 _1255 _1256 _1257 _1258 _1259 _1260 _1261 _1262 _1263 _1264 _1265 _1266 _1267 _1268 _1269 _1270 _1271 _1272 _1273 _1274 _1275 _1276 _1277 _1278 _1279 _1281 _1282 _1283 _1284 _1285 _1286 _1287 _1289 _1291 _1292 _1293 _1294 _1295 _1297 _1298 _1299 _1300 _1302 _1303 _1304 _1305 _1306 _1307 _1308 _1309 _1310 _1311 _1312 _1313 _1314 _1315 _1316 _1317 _1318 _1319 _1320 _1321 _1322 _1323 _1324 _1325 _1326 _1327 _1328 _1329 _1330 _1331 _1332 _1333 _1334 _1335 _1336 _1337 _1338 _1339 _1340 _1341 _1342 _1343 _1344 _1345 _1346 _1347 _1348 _1349 _1350 _1351 _1352 _1353 _1354 _1355 _1356 _1357 _1358 _1359 _1360 _1361 _1362 _1363 _1364 _1365 _1366 _1367 _1368 _1369 _1370 _1371 _1372 _1373 _1374 _1375 _1376 _1377 _1378 _1379 _1380 _1381 _1382 _1383 _1384 _1385 _1386 _1387 _1388 _1389 _1390 _1391 _1392 _1393 _1394 _1395 _1396 _1397 _1398 _1399 _1400 _1401 _1402 _1403 _1404 _1405 _1406 _1407 _1408 _1409 _1410 _1411 _1412 _1413 _1414 _1415 _1416 _1417 _1418 _1419 _1420 _1421 _1422 _1423 _1424 _1425 _1426 _1427 _1428 _1429 _1430 _1431 _1432 _1433 _1434 _1435 _1436 _1437 _1438 _1439 _1440 _1441 _1442 _1443 _1444 _1445 _1446 _1447 _1448 _1449 _1450 _1451 _1452 _1453 _1454 _1455 _1456 _1457 _1458 _1459 _1460 _1461 _1462 _1463 _1464 _1465 _1466 _1467 _1468 _1469 _1470 _1471 _1472 _1473 _1474 _1475 _1476 _1477 _1479 _1480 _1481 _1482 _1483 _1484 _1485 _1486 _1487 _1488 _1489 _1490 _1491 _1492 _1493 _1494 _1495 _1496 _1497 _1498 _1499 _1500 _1501 _1502 _1503 _1504 _1505 _1506 _1507 _1508 _1509 _1510 _1511 _1512 _1513 _1514 _1515 _1516 _1517 _1518 _1519 _1520 _1521 _1522 _1523 _1524 _1525 _1526 _1527 _1528 _1529 _1530 _1531 _1532 _1533 _1534 _1535 _1536 _1537 _1538 _1539 _1540 _1541 _1542 _1543 _833 _1545 _1544 _1546 _1547 _1548 _1549 _1550 _1551 _1552 _1554 _1555 _1556 _1557 _1558 _1559 _1560 _1561 _1562 _1563 _1564 _1565 _1567 _1566 _1568 _1569 _1570 _1571 _1572 _1573 _1574 _1575 _1576 _1577 _1578 _1579 _1580 _1581 _1582 _1583 _1584 _1585 _1586 _1587 _1588 _1589 _1590 _1591 _1592 _1593 _1594 _1595 _1596 _1597 _1598 _1599 _1600 _1601 _1602 _1604 _1605 _1606 _1607 _1608 _1609 _1610 _1611 _1612 _1613 _1615 _1616 _1617 _1618 _1619 _1620 _1621 _1622 _1623 _1624 _1625 _1626 _1627 _1628 _1629 _1630 _1631 _1632 _1633 _1634 _1635 _1636 _1603 _1637 _1638 _1639 _1640 _1641 _1642 _1643 _1644 _1645 _1646 _1647 _1648 _1649 _1650 _1651 _1652 _1653 _1654 _1655 _1656 _1657 _1658 _1659 _1660 _1661 _1662 _1663 _1664 _1665 _1666 _1667 _1668 _1669 _1670 _1671 _1672 _1673 _1674 _1675 _1676 _1677 _1678 _1679 _1680 _1681 _1682 _1683 _1684 _1685 _1686 _1687 _1688 _1689 _1690 _1691 _1692 _1693 _1694 _1695 _1696 _1697 _1698 _1699 _1700 _1701 _1702 _1703 _1704 _1705 _1706 _1707 _1708 _1709 _1710 _1711 _1712 _1713 _1714 _1715 _1716 _1717 _1718 _1719 _1720 _1721 _1722 _1723 _1724 _1725 _1726 _1727 _1728 _1729 _1730 _1731 _1732 _1733 _1734 _1735 _1736 _1737 _1738 _1739 _1740 _1741 _1742 _1743 _1744 _1745 _1746 _1747 _1748 _1749 _1750 _1751 _1752 _1753 _1754 _1755 _1756 _1757 _1758 _1759 _1760 _1761 _1762 _1763 _1764 _1765 _1766 _1767 _1768 _1769 _1770 _1771 _1772 _1773 _1774 _1775 _1776 _1777 _1778 _1779 _1780 _1781 _1782 _1783 _1784 _1785 _1786 _1787 _1788 _1789 _1790 _1791 _1792 _1793 _1794 _1795 _1796 _1797 _1798 _1799 _1800 _1801 _1802 _1803 _1804 _1805 _1806 _1807 _1808 _1809 _1810 _1811 _1812 _1813 _1814 _1815 _1816 _1817 _1818 _1819 _1820 _1821 _1822 _1823 _1824 _1825 _1826 _1827 _1828 _1829 _1830 _1831 _1832 _1833 _1834 _1835 _1836 _1837 _1838 _1839 _1840 _1841 _1842 _1843 _1844 _1845 _1846 _1847 _1848 _1849 _1850 _1851 _1852 _1853 _1854 _1855 _1856 _1857 _1858 _1859 _1860 _1861 _1862 _1863 _1864 _1865 _1866 _1867 _1868 _1869 _1870 _1871 _1872 _1873 _1874 _1875 _1876 _1877 _1878 _1879 _1880 _1881 _1882 _1883 _1884 _1885 _1886 _1887 _1888 _1889 _1890 _1891 _1892 _1893 _1894 _1895 " mangled="_Z2::" demangled="::"/> + <Namespace id="_2" name="std" context="_1" members="_1897 _1898 _1899 _1900 _1901 _1902 _1903 _1904 _1905 _1906 _1907 _1908 _1909 _1910 _1911 _1912 _1913 _1914 _1915 _1916 _1917 _1918 _1919 _1920 _1921 _1922 _1923 _1924 _1925 _1926 _1927 _1928 _1929 _1930 _1931 _1932 _1933 _1934 _1935 _1936 _1937 _1938 _1939 _1940 _1941 _1942 _1943 _1944 _1945 _1946 _1951 _1952 _1957 _1958 _1971 _1972 _1977 _1978 _1983 _1984 _1985 _1986 _1987 _1988 _1989 _1990 _1991 _1992 _1993 _2007 _2008 _2009 _2010 _2011 _2012 _2013 _2014 _2015 _2016 _2019 _2024 _2025 _2026 _2027 _2032 _2033 _2034 _2035 _2038 _2039 _2040 _2041 _2042 _2043 _2044 _2045 _2046 _2047 _2048 _2057 _2058 _2059 _2090 _2099 _2100 _2101 _2102 _2103 _2104 _2105 _2106 _2107 _2108 _2109 _2110 _2111 _2112 _2113 _2114 _2115 _2116 _2117 _2118 _2119 _2120 _2121 _2122 _2123 _2124 _2125 _2126 _2127 _2128 _2129 _2130 _2131 _2132 _2133 _2134 _2135 _2136 _2137 _2138 _2139 _2140 _2141 _2142 _2143 _2144 _2145 _2151 _2152 _2192 _2193 _2194 _2212 _2213 _2253 _2255 _2256 _2257 _2318 _2331 _2340 _2357 _2358 _2363 _2365 _2366 _2367 _2374 _2375 _2376 _2416 _2417 _2418 _2419 _2420 _2421 _2422 _2423 _2424 _2426 _2428 _2430 _2432 _2434 _2436 _2438 _2440 _2442 _2444 _2446 _2448 _2450 _2452 _2454 _2456 _2458 _2460 _2462 _2464 _2466 _2468 _2470 _2472 _2474 _2476 _2477 _2482 _2483 _2484 _2485 _2486 _2487 _2488 _2489 _2490 _2491 _2492 _2493 _2494 _2495 _2497 _2498 _2499 _2500 _2501 _2502 _2503 _2504 _2505 _2507 _2509 _2532 _2533 _2534 _2535 _2536 _2537 _2538 _2539 _2700 _2701 _2702 _2703 _2704 _2705 _2706 _2715 _2716 _2717 " mangled="_Z3std" demangled="std"/> + <Function id="_3" name="_GLOBAL__D__home_roman_language_binding_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hppStu8kb" returns="_1194" context="_1" location="f0:131" file="f0" line="131" endline="131"/> + <Function id="_4" name="_GLOBAL__I__home_roman_language_binding_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hppStu8kb" returns="_1194" context="_1" location="f0:131" file="f0" line="131" endline="131"/> + <Variable id="_5" name="_ZGVN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE" type="_1290" context="_1" location="f1:372" file="f1" line="372" artificial="1"/> + <Function id="_6" name="__static_initialization_and_destruction_0" returns="_1194" context="_1" mangled="_Z41__static_initialization_and_destruction_0ii" demangled="__static_initialization_and_destruction_0(int, int)" location="f0:131" file="f0" line="131" endline="76"> + <Argument name="__initialize_p" type="_503" location="f0:131" file="f0" line="131"/> + <Argument name="__priority" type="_503" location="f0:131" file="f0" line="131"/> </Function> - <Variable id="_7" name="_ZTSSt12out_of_range" type="_2656c" init=""St12out_of_range"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_8" name="_ZTSN5boost9gregorian11bad_weekdayE" type="_2658c" init=""N5boost9gregorian11bad_weekdayE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_9" name="_ZTSN5boost9gregorian15bad_day_of_yearE" type="_2660c" init=""N5boost9gregorian15bad_day_of_yearE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_10" name="_ZTSN5boost9gregorian16bad_day_of_monthE" type="_2662c" init=""N5boost9gregorian16bad_day_of_monthE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_11" name="_ZTSN5boost9gregorian8bad_yearE" type="_2664c" init=""N5boost9gregorian8bad_yearE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_12" name="_ZTSN5boost12bad_weak_ptrE" type="_2666c" init=""N5boost12bad_weak_ptrE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_13" name="_ZTSN5boost9gregorian9bad_monthE" type="_2668c" init=""N5boost9gregorian9bad_monthE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_14" name="_ZTSN5boost16bad_lexical_castE" type="_2670c" init=""N5boost16bad_lexical_castE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> - <Variable id="_15" name="_ZTIs" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> - <Variable id="_16" name="_ZTIx" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> - <Variable id="_17" name="_ZTIi" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> - <Variable id="_18" name="_ZTIt" type="_2672c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> - <Variable id="_19" name="_ZTISs" type="_2674c" context="_1" location="f2:856" file="f2" line="856" extern="1" artificial="1"/> - <Variable id="_20" name="_ZTIN5boost6detail17lexical_streambufIcEE" type="_2676c" context="_1" location="f2:336" file="f2" line="336" extern="1" artificial="1"/> - <Function id="_21" name="__cxa_rethrow" returns="_1155" context="_1" location="f3:575" file="f3" line="575" extern="1"/> - <Variable id="_22" name="_ZTIN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE" type="_2676c" context="_1" location="f1:45" file="f1" line="45" extern="1" artificial="1"/> - <Variable id="_23" name="_ZTIN5boost10local_time21custom_time_zone_baseIcEE" type="_2676c" context="_1" location="f4:29" file="f4" line="29" extern="1" artificial="1"/> - <Variable id="_24" name="_ZTIN5boost10local_time20posix_time_zone_baseIcEE" type="_2676c" context="_1" location="f5:64" file="f5" line="64" extern="1" artificial="1"/> - <Variable id="_25" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_kday_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_26" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time19last_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_27" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time20first_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_28" name="_ZTIN5boost9date_time14time_zone_baseINS_10posix_time5ptimeEcEE" type="_2674c" context="_1" location="f7:33" file="f7" line="33" extern="1" artificial="1"/> - <Variable id="_29" name="_ZTIN5boost9date_time15bad_field_countE" type="_2676c" context="_1" location="f8:40" file="f8" line="40" extern="1" artificial="1"/> - <Variable id="_30" name="_ZTIN5boost9date_time19data_not_accessibleE" type="_2676c" context="_1" location="f8:28" file="f8" line="28" extern="1" artificial="1"/> - <Variable id="_31" name="_ZTISt13basic_fstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> - <Variable id="_32" name="_ZTISt14basic_ofstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> - <Variable id="_33" name="_ZTISt14basic_ifstreamIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> - <Variable id="_34" name="_ZTISt13basic_filebufIwSt11char_traitsIwEE" type="_2676c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> - <Variable id="_35" name="_ZTISt13basic_fstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> - <Variable id="_36" name="_ZTISt14basic_ofstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> - <Variable id="_37" name="_ZTISt14basic_ifstreamIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> - <Variable id="_38" name="_ZTISt13basic_filebufIcSt11char_traitsIcEE" type="_2676c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> - <Variable id="_39" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time22partial_date_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_40" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_last_rule_specEEE" type="_2676c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> - <Variable id="_41" name="_ZTIN5boost9date_time17dst_day_calc_ruleINS_9gregorian4dateEEE" type="_2674c" context="_1" location="f6:18" file="f6" line="18" extern="1" artificial="1"/> - <Variable id="_42" name="_ZTIN5boost10local_time14bad_adjustmentE" type="_2676c" context="_1" location="f5:33" file="f5" line="33" extern="1" artificial="1"/> - <Variable id="_43" name="_ZTIN5boost10local_time10bad_offsetE" type="_2676c" context="_1" location="f5:28" file="f5" line="28" extern="1" artificial="1"/> - <Variable id="_44" name="_ZTIN5boost10local_time13dst_not_validE" type="_2676c" context="_1" location="f10:37" file="f10" line="37" extern="1" artificial="1"/> - <Variable id="_45" name="_ZTIN5boost10local_time18time_label_invalidE" type="_2676c" context="_1" location="f10:32" file="f10" line="32" extern="1" artificial="1"/> - <Variable id="_46" name="_ZTIN5boost10local_time16ambiguous_resultE" type="_2676c" context="_1" location="f10:26" file="f10" line="26" extern="1" artificial="1"/> - <Function id="_47" name="matherr" returns="_501" throw="" context="_1" location="f11:293" file="f11" line="293" extern="1"> - <Argument name="__exc" type="_2678" location="f11:293" file="f11" line="293"/> + <Variable id="_7" name="_ZTSSt12out_of_range" type="_2718c" init=""St12out_of_range"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_8" name="_ZTSN5boost9gregorian11bad_weekdayE" type="_2720c" init=""N5boost9gregorian11bad_weekdayE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_9" name="_ZTSN5boost9gregorian15bad_day_of_yearE" type="_2722c" init=""N5boost9gregorian15bad_day_of_yearE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_10" name="_ZTSN5boost9gregorian16bad_day_of_monthE" type="_2724c" init=""N5boost9gregorian16bad_day_of_monthE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_11" name="_ZTSN5boost9gregorian8bad_yearE" type="_2726c" init=""N5boost9gregorian8bad_yearE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_12" name="_ZTSN5boost12bad_weak_ptrE" type="_2728c" init=""N5boost12bad_weak_ptrE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_13" name="_ZTSN5boost9gregorian9bad_monthE" type="_2730c" init=""N5boost9gregorian9bad_monthE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_14" name="_ZTSN5boost16bad_lexical_castE" type="_2732c" init=""N5boost16bad_lexical_castE"" context="_1" location="f0:131" file="f0" line="131" artificial="1"/> + <Variable id="_15" name="_ZTIs" type="_2734c" context="_1" location="f2:1054" file="f2" line="1054" extern="1" artificial="1"/> + <Function id="_16" name="__cxa_rethrow" returns="_1194" context="_1" location="f3:575" file="f3" line="575" extern="1"/> + <Variable id="_17" name="_ZTIx" type="_2734c" context="_1" location="f2:1054" file="f2" line="1054" extern="1" artificial="1"/> + <Variable id="_18" name="_ZTIi" type="_2734c" context="_1" location="f2:1054" file="f2" line="1054" extern="1" artificial="1"/> + <Variable id="_19" name="_ZTIt" type="_2734c" context="_1" location="f2:1054" file="f2" line="1054" extern="1" artificial="1"/> + <Variable id="_20" name="_ZTISs" type="_2736c" context="_1" location="f2:1054" file="f2" line="1054" extern="1" artificial="1"/> + <Variable id="_21" name="_ZTIN5boost6detail26lexical_stream_limited_srcIcNS0_17lexical_streambufIcEEEE" type="_2738c" context="_1" location="f2:593" file="f2" line="593" extern="1" artificial="1"/> + <Variable id="_22" name="_ZTIN5boost6detail17lexical_streambufIcEE" type="_2738c" context="_1" location="f2:407" file="f2" line="407" extern="1" artificial="1"/> + <Variable id="_23" name="_ZTIN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEEE" type="_2738c" context="_1" location="f1:45" file="f1" line="45" extern="1" artificial="1"/> + <Variable id="_24" name="_ZTIN5boost10local_time21custom_time_zone_baseIcEE" type="_2738c" context="_1" location="f4:29" file="f4" line="29" extern="1" artificial="1"/> + <Variable id="_25" name="_ZTIN5boost10local_time20posix_time_zone_baseIcEE" type="_2738c" context="_1" location="f5:64" file="f5" line="64" extern="1" artificial="1"/> + <Variable id="_26" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_kday_rule_specEEE" type="_2738c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_27" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time19last_last_rule_specEEE" type="_2738c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_28" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time20first_last_rule_specEEE" type="_2738c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_29" name="_ZTIN5boost9date_time14time_zone_baseINS_10posix_time5ptimeEcEE" type="_2736c" context="_1" location="f7:34" file="f7" line="34" extern="1" artificial="1"/> + <Variable id="_30" name="_ZTIN5boost9date_time15bad_field_countE" type="_2738c" context="_1" location="f8:40" file="f8" line="40" extern="1" artificial="1"/> + <Variable id="_31" name="_ZTIN5boost9date_time19data_not_accessibleE" type="_2738c" context="_1" location="f8:28" file="f8" line="28" extern="1" artificial="1"/> + <Variable id="_32" name="_ZTISt13basic_fstreamIwSt11char_traitsIwEE" type="_2738c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> + <Variable id="_33" name="_ZTISt14basic_ofstreamIwSt11char_traitsIwEE" type="_2738c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> + <Variable id="_34" name="_ZTISt14basic_ifstreamIwSt11char_traitsIwEE" type="_2738c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> + <Variable id="_35" name="_ZTISt13basic_filebufIwSt11char_traitsIwEE" type="_2738c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> + <Variable id="_36" name="_ZTISt13basic_fstreamIcSt11char_traitsIcEE" type="_2738c" context="_1" location="f9:95" file="f9" line="95" extern="1" artificial="1"/> + <Variable id="_37" name="_ZTISt14basic_ofstreamIcSt11char_traitsIcEE" type="_2738c" context="_1" location="f9:92" file="f9" line="92" extern="1" artificial="1"/> + <Variable id="_38" name="_ZTISt14basic_ifstreamIcSt11char_traitsIcEE" type="_2738c" context="_1" location="f9:89" file="f9" line="89" extern="1" artificial="1"/> + <Variable id="_39" name="_ZTISt13basic_filebufIcSt11char_traitsIcEE" type="_2738c" context="_1" location="f9:86" file="f9" line="86" extern="1" artificial="1"/> + <Variable id="_40" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time22partial_date_rule_specEEE" type="_2738c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_41" name="_ZTIN5boost9date_time17day_calc_dst_ruleINS_10local_time18nth_last_rule_specEEE" type="_2738c" context="_1" location="f6:38" file="f6" line="38" extern="1" artificial="1"/> + <Variable id="_42" name="_ZTIN5boost9date_time17dst_day_calc_ruleINS_9gregorian4dateEEE" type="_2736c" context="_1" location="f6:18" file="f6" line="18" extern="1" artificial="1"/> + <Variable id="_43" name="_ZTIN5boost10local_time14bad_adjustmentE" type="_2738c" context="_1" location="f5:33" file="f5" line="33" extern="1" artificial="1"/> + <Variable id="_44" name="_ZTIN5boost10local_time10bad_offsetE" type="_2738c" context="_1" location="f5:28" file="f5" line="28" extern="1" artificial="1"/> + <Variable id="_45" name="_ZTIN5boost10local_time13dst_not_validE" type="_2738c" context="_1" location="f10:37" file="f10" line="37" extern="1" artificial="1"/> + <Variable id="_46" name="_ZTIN5boost10local_time18time_label_invalidE" type="_2738c" context="_1" location="f10:32" file="f10" line="32" extern="1" artificial="1"/> + <Variable id="_47" name="_ZTIN5boost10local_time16ambiguous_resultE" type="_2738c" context="_1" location="f10:26" file="f10" line="26" extern="1" artificial="1"/> + <Function id="_48" name="matherr" returns="_503" throw="" context="_1" location="f11:320" file="f11" line="320" extern="1"> + <Argument name="__exc" type="_2740" location="f11:320" file="f11" line="320"/> </Function> - <Struct id="_48" name="__exception" context="_1" mangled="11__exception" demangled="__exception" location="f11:284" file="f11" line="284" artificial="1" size="256" align="32" members="_2679 _2680 _2681 _2682 _2683 _2684 _2685 " bases=""/> - <Variable id="_49" name="_LIB_VERSION" type="_50" context="_1" location="f11:269" file="f11" line="269" extern="1"/> - <Enumeration id="_50" name="_LIB_VERSION_TYPE" context="_1" location="f11:264" file="f11" line="264" size="32" align="32"> + <Struct id="_49" name="__exception" context="_1" mangled="11__exception" demangled="__exception" location="f11:311" file="f11" line="311" artificial="1" size="256" align="32" members="_2741 _2742 _2743 _2744 _2745 _2746 _2747 " bases=""/> + <Variable id="_50" name="_LIB_VERSION" type="_51" context="_1" location="f11:296" file="f11" line="296" extern="1"/> + <Enumeration id="_51" name="_LIB_VERSION_TYPE" context="_1" location="f11:291" file="f11" line="291" size="32" align="32"> <EnumValue name="_IEEE_" init="-1"/> <EnumValue name="_SVID_" init="0"/> <EnumValue name="_XOPEN_" init="1"/> <EnumValue name="_POSIX_" init="2"/> <EnumValue name="_ISOC_" init="3"/> </Enumeration> - <Enumeration id="_51" name="._92" context="_1" location="f11:172" file="f11" line="172" artificial="1" size="32" align="32"> + <Enumeration id="_52" name="._104" context="_1" location="f11:199" file="f11" line="199" artificial="1" size="32" align="32"> <EnumValue name="FP_NAN" init="0"/> <EnumValue name="FP_INFINITE" init="1"/> <EnumValue name="FP_ZERO" init="2"/> <EnumValue name="FP_SUBNORMAL" init="3"/> <EnumValue name="FP_NORMAL" init="4"/> </Enumeration> - <Variable id="_52" name="signgam" type="_501" context="_1" location="f11:130" file="f11" line="130" extern="1"/> - <Function id="_53" name="__scalbl" returns="_482" throw="" context="_1" location="f12:360" file="f12" line="360" extern="1"> - <Argument name="__x" type="_482" location="f12:360" file="f12" line="360"/> - <Argument name="__n" type="_482" location="f12:360" file="f12" line="360"/> + <Variable id="_53" name="signgam" type="_503" context="_1" location="f11:157" file="f11" line="157" extern="1"/> + <Function id="_54" name="__scalbl" returns="_483" throw="" context="_1" location="f12:364" file="f12" line="364" extern="1"> + <Argument name="__x" type="_483" location="f12:364" file="f12" line="364"/> + <Argument name="__n" type="_483" location="f12:364" file="f12" line="364"/> </Function> - <Function id="_54" name="scalbl" returns="_482" throw="" context="_1" location="f12:360" file="f12" line="360" extern="1"> - <Argument name="__x" type="_482" location="f12:360" file="f12" line="360"/> - <Argument name="__n" type="_482" location="f12:360" file="f12" line="360"/> + <Function id="_55" name="scalbl" returns="_483" throw="" context="_1" location="f12:364" file="f12" line="364" extern="1"> + <Argument name="__x" type="_483" location="f12:364" file="f12" line="364"/> + <Argument name="__n" type="_483" location="f12:364" file="f12" line="364"/> </Function> - <Function id="_55" name="__fmal" returns="_482" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> - <Argument name="__x" type="_482" location="f12:355" file="f12" line="355"/> - <Argument name="__y" type="_482" location="f12:355" file="f12" line="355"/> - <Argument name="__z" type="_482" location="f12:355" file="f12" line="355"/> + <Function id="_56" name="__fmal" returns="_483" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> + <Argument name="__x" type="_483" location="f12:355" file="f12" line="355"/> + <Argument name="__y" type="_483" location="f12:355" file="f12" line="355"/> + <Argument name="__z" type="_483" location="f12:355" file="f12" line="355"/> </Function> - <Function id="_56" name="fmal" returns="_482" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> - <Argument name="__x" type="_482" location="f12:355" file="f12" line="355"/> - <Argument name="__y" type="_482" location="f12:355" file="f12" line="355"/> - <Argument name="__z" type="_482" location="f12:355" file="f12" line="355"/> + <Function id="_57" name="fmal" returns="_483" throw="" context="_1" location="f12:355" file="f12" line="355" extern="1"> + <Argument name="__x" type="_483" location="f12:355" file="f12" line="355"/> + <Argument name="__y" type="_483" location="f12:355" file="f12" line="355"/> + <Argument name="__z" type="_483" location="f12:355" file="f12" line="355"/> </Function> - <Function id="_57" name="__signbitl" returns="_501" throw="" context="_1" location="f12:351" file="f12" line="351" extern="1" attributes="const"> - <Argument name="__value" type="_482" location="f12:351" file="f12" line="351"/> + <Function id="_58" name="__signbitl" returns="_503" throw="" context="_1" location="f12:351" file="f12" line="351" extern="1" attributes="const"> + <Argument name="__value" type="_483" location="f12:351" file="f12" line="351"/> </Function> - <Function id="_58" name="__fpclassifyl" returns="_501" throw="" context="_1" location="f12:347" file="f12" line="347" extern="1" attributes="const"> - <Argument name="__value" type="_482" location="f12:347" file="f12" line="347"/> + <Function id="_59" name="__fpclassifyl" returns="_503" throw="" context="_1" location="f12:347" file="f12" line="347" extern="1" attributes="const"> + <Argument name="__value" type="_483" location="f12:347" file="f12" line="347"/> </Function> - <Function id="_59" name="__fminl" returns="_482" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> - <Argument name="__x" type="_482" location="f12:342" file="f12" line="342"/> - <Argument name="__y" type="_482" location="f12:342" file="f12" line="342"/> + <Function id="_60" name="__fminl" returns="_483" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> + <Argument name="__x" type="_483" location="f12:342" file="f12" line="342"/> + <Argument name="__y" type="_483" location="f12:342" file="f12" line="342"/> </Function> - <Function id="_60" name="fminl" returns="_482" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> - <Argument name="__x" type="_482" location="f12:342" file="f12" line="342"/> - <Argument name="__y" type="_482" location="f12:342" file="f12" line="342"/> + <Function id="_61" name="fminl" returns="_483" throw="" context="_1" location="f12:342" file="f12" line="342" extern="1"> + <Argument name="__x" type="_483" location="f12:342" file="f12" line="342"/> + <Argument name="__y" type="_483" location="f12:342" file="f12" line="342"/> </Function> - <Function id="_61" name="__fmaxl" returns="_482" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> - <Argument name="__x" type="_482" location="f12:339" file="f12" line="339"/> - <Argument name="__y" type="_482" location="f12:339" file="f12" line="339"/> + <Function id="_62" name="__fmaxl" returns="_483" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> + <Argument name="__x" type="_483" location="f12:339" file="f12" line="339"/> + <Argument name="__y" type="_483" location="f12:339" file="f12" line="339"/> </Function> - <Function id="_62" name="fmaxl" returns="_482" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> - <Argument name="__x" type="_482" location="f12:339" file="f12" line="339"/> - <Argument name="__y" type="_482" location="f12:339" file="f12" line="339"/> + <Function id="_63" name="fmaxl" returns="_483" throw="" context="_1" location="f12:339" file="f12" line="339" extern="1"> + <Argument name="__x" type="_483" location="f12:339" file="f12" line="339"/> + <Argument name="__y" type="_483" location="f12:339" file="f12" line="339"/> </Function> - <Function id="_63" name="__fdiml" returns="_482" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> - <Argument name="__x" type="_482" location="f12:336" file="f12" line="336"/> - <Argument name="__y" type="_482" location="f12:336" file="f12" line="336"/> + <Function id="_64" name="__fdiml" returns="_483" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> + <Argument name="__x" type="_483" location="f12:336" file="f12" line="336"/> + <Argument name="__y" type="_483" location="f12:336" file="f12" line="336"/> </Function> - <Function id="_64" name="fdiml" returns="_482" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> - <Argument name="__x" type="_482" location="f12:336" file="f12" line="336"/> - <Argument name="__y" type="_482" location="f12:336" file="f12" line="336"/> + <Function id="_65" name="fdiml" returns="_483" throw="" context="_1" location="f12:336" file="f12" line="336" extern="1"> + <Argument name="__x" type="_483" location="f12:336" file="f12" line="336"/> + <Argument name="__y" type="_483" location="f12:336" file="f12" line="336"/> </Function> - <Function id="_65" name="__llroundl" returns="_1249" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> - <Argument name="__x" type="_482" location="f12:332" file="f12" line="332"/> + <Function id="_66" name="__llroundl" returns="_1290" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> + <Argument name="__x" type="_483" location="f12:332" file="f12" line="332"/> </Function> - <Function id="_66" name="llroundl" returns="_1249" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> - <Argument name="__x" type="_482" location="f12:332" file="f12" line="332"/> + <Function id="_67" name="llroundl" returns="_1290" throw="" context="_1" location="f12:332" file="f12" line="332" extern="1"> + <Argument name="__x" type="_483" location="f12:332" file="f12" line="332"/> </Function> - <Function id="_67" name="__lroundl" returns="_1512" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> - <Argument name="__x" type="_482" location="f12:331" file="f12" line="331"/> + <Function id="_68" name="__lroundl" returns="_1553" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> + <Argument name="__x" type="_483" location="f12:331" file="f12" line="331"/> </Function> - <Function id="_68" name="lroundl" returns="_1512" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> - <Argument name="__x" type="_482" location="f12:331" file="f12" line="331"/> + <Function id="_69" name="lroundl" returns="_1553" throw="" context="_1" location="f12:331" file="f12" line="331" extern="1"> + <Argument name="__x" type="_483" location="f12:331" file="f12" line="331"/> </Function> - <Function id="_69" name="__llrintl" returns="_1249" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> - <Argument name="__x" type="_482" location="f12:327" file="f12" line="327"/> + <Function id="_70" name="__llrintl" returns="_1290" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> + <Argument name="__x" type="_483" location="f12:327" file="f12" line="327"/> </Function> - <Function id="_70" name="llrintl" returns="_1249" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> - <Argument name="__x" type="_482" location="f12:327" file="f12" line="327"/> + <Function id="_71" name="llrintl" returns="_1290" throw="" context="_1" location="f12:327" file="f12" line="327" extern="1"> + <Argument name="__x" type="_483" location="f12:327" file="f12" line="327"/> </Function> - <Function id="_71" name="__lrintl" returns="_1512" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> - <Argument name="__x" type="_482" location="f12:326" file="f12" line="326"/> + <Function id="_72" name="__lrintl" returns="_1553" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> + <Argument name="__x" type="_483" location="f12:326" file="f12" line="326"/> </Function> - <Function id="_72" name="lrintl" returns="_1512" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> - <Argument name="__x" type="_482" location="f12:326" file="f12" line="326"/> + <Function id="_73" name="lrintl" returns="_1553" throw="" context="_1" location="f12:326" file="f12" line="326" extern="1"> + <Argument name="__x" type="_483" location="f12:326" file="f12" line="326"/> </Function> - <Function id="_73" name="__remquol" returns="_482" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> - <Argument name="__x" type="_482" location="f12:319" file="f12" line="319"/> - <Argument name="__y" type="_482" location="f12:319" file="f12" line="319"/> - <Argument name="__quo" type="_2686" location="f12:319" file="f12" line="319"/> + <Function id="_74" name="__remquol" returns="_483" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> + <Argument name="__x" type="_483" location="f12:319" file="f12" line="319"/> + <Argument name="__y" type="_483" location="f12:319" file="f12" line="319"/> + <Argument name="__quo" type="_2748" location="f12:319" file="f12" line="319"/> </Function> - <Function id="_74" name="remquol" returns="_482" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> - <Argument name="__x" type="_482" location="f12:319" file="f12" line="319"/> - <Argument name="__y" type="_482" location="f12:319" file="f12" line="319"/> - <Argument name="__quo" type="_2686" location="f12:319" file="f12" line="319"/> + <Function id="_75" name="remquol" returns="_483" throw="" context="_1" location="f12:319" file="f12" line="319" extern="1"> + <Argument name="__x" type="_483" location="f12:319" file="f12" line="319"/> + <Argument name="__y" type="_483" location="f12:319" file="f12" line="319"/> + <Argument name="__quo" type="_2748" location="f12:319" file="f12" line="319"/> </Function> - <Function id="_75" name="__truncl" returns="_482" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> - <Argument name="__x" type="_482" location="f12:314" file="f12" line="314"/> + <Function id="_76" name="__truncl" returns="_483" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> + <Argument name="__x" type="_483" location="f12:314" file="f12" line="314"/> </Function> - <Function id="_76" name="truncl" returns="_482" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> - <Argument name="__x" type="_482" location="f12:314" file="f12" line="314"/> + <Function id="_77" name="truncl" returns="_483" throw="" context="_1" location="f12:314" file="f12" line="314" extern="1" attributes="const"> + <Argument name="__x" type="_483" location="f12:314" file="f12" line="314"/> </Function> - <Function id="_77" name="__roundl" returns="_482" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> - <Argument name="__x" type="_482" location="f12:310" file="f12" line="310"/> + <Function id="_78" name="__roundl" returns="_483" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> + <Argument name="__x" type="_483" location="f12:310" file="f12" line="310"/> </Function> - <Function id="_78" name="roundl" returns="_482" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> - <Argument name="__x" type="_482" location="f12:310" file="f12" line="310"/> + <Function id="_79" name="roundl" returns="_483" throw="" context="_1" location="f12:310" file="f12" line="310" extern="1" attributes="const"> + <Argument name="__x" type="_483" location="f12:310" file="f12" line="310"/> </Function> - <Function id="_79" name="__nearbyintl" returns="_482" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> - <Argument name="__x" type="_482" location="f12:306" file="f12" line="306"/> + <Function id="_80" name="__nearbyintl" returns="_483" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> + <Argument name="__x" type="_483" location="f12:306" file="f12" line="306"/> </Function> - <Function id="_80" name="nearbyintl" returns="_482" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> - <Argument name="__x" type="_482" location="f12:306" file="f12" line="306"/> + <Function id="_81" name="nearbyintl" returns="_483" throw="" context="_1" location="f12:306" file="f12" line="306" extern="1"> + <Argument name="__x" type="_483" location="f12:306" file="f12" line="306"/> </Function> - <Function id="_81" name="__scalblnl" returns="_482" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> - <Argument name="__x" type="_482" location="f12:302" file="f12" line="302"/> - <Argument name="__n" type="_1512" location="f12:302" file="f12" line="302"/> + <Function id="_82" name="__scalblnl" returns="_483" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> + <Argument name="__x" type="_483" location="f12:302" file="f12" line="302"/> + <Argument name="__n" type="_1553" location="f12:302" file="f12" line="302"/> </Function> - <Function id="_82" name="scalblnl" returns="_482" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> - <Argument name="__x" type="_482" location="f12:302" file="f12" line="302"/> - <Argument name="__n" type="_1512" location="f12:302" file="f12" line="302"/> + <Function id="_83" name="scalblnl" returns="_483" throw="" context="_1" location="f12:302" file="f12" line="302" extern="1"> + <Argument name="__x" type="_483" location="f12:302" file="f12" line="302"/> + <Argument name="__n" type="_1553" location="f12:302" file="f12" line="302"/> </Function> - <Function id="_83" name="__ilogbl" returns="_501" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> - <Argument name="__x" type="_482" location="f12:297" file="f12" line="297"/> + <Function id="_84" name="__ilogbl" returns="_503" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> + <Argument name="__x" type="_483" location="f12:297" file="f12" line="297"/> </Function> - <Function id="_84" name="ilogbl" returns="_501" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> - <Argument name="__x" type="_482" location="f12:297" file="f12" line="297"/> + <Function id="_85" name="ilogbl" returns="_503" throw="" context="_1" location="f12:297" file="f12" line="297" extern="1"> + <Argument name="__x" type="_483" location="f12:297" file="f12" line="297"/> </Function> - <Function id="_85" name="__scalbnl" returns="_482" throw="" context="_1" location="f12:293" file="f12" line="293" extern="1"> - <Argument name="__x" type="_482" location="f12:293" file="f12" line="293"/> - <Argument name="__n" type="_501" location="f12:293" file="f12" line="293"/> + <Function id="_86" name="__scalbnl" returns="_483" throw="" context="_1" location="f12:293" file="f12" line="293" extern="1"> + <Argument name="__x" type="_483" location="f12:293" file="f12" line="293"/> + <Argument name="__n" type="_503" location="f12:293" file="f12" line="293"/> </F... [truncated message content] |
From: <rom...@us...> - 2007-04-04 21:05:13
|
Revision: 968 http://svn.sourceforge.net/pygccxml/?rev=968&view=rev Author: roman_yakovenko Date: 2007-04-04 14:05:12 -0700 (Wed, 04 Apr 2007) Log Message: ----------- This commit should introduced neccessary functionality to implement "transfer ownership" Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp pyplusplus_dev/unittests/transfer_ownership_old_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2007-04-04 20:21:23 UTC (rev 967) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2007-04-04 21:05:12 UTC (rev 968) @@ -178,14 +178,17 @@ held_type = self._generated_held_type() if self.wrapper: - if not self.target_configuration.boost_python_has_wrapper_held_type \ - or self.declaration.require_self_reference: - args.append( algorithm.create_identifier( self, self.declaration.decl_string ) ) - if self.declaration.require_self_reference: - if not held_type: + if self.declaration.class_type == self.declaration.CLASS_TYPE.WRAPPER: + args.append( self.wrapper.full_name ) + else: + if not self.target_configuration.boost_python_has_wrapper_held_type \ + or self.declaration.require_self_reference: + args.append( algorithm.create_identifier( self, self.declaration.decl_string ) ) + if self.declaration.require_self_reference: + if not held_type: + args.append( self.wrapper.full_name ) + else: args.append( self.wrapper.full_name ) - else: - args.append( self.wrapper.full_name ) else: args.append( algorithm.create_identifier( self, self.declaration.decl_string ) ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2007-04-04 20:21:23 UTC (rev 967) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2007-04-04 21:05:12 UTC (rev 968) @@ -177,6 +177,12 @@ class class_t( class_common_details_t , scopedef_wrapper.scopedef_t , declarations.class_t): + + class CLASS_TYPE: + DEFAULT = 'default' + WRAPPER = 'wrapper' + ALL = ( DEFAULT, WRAPPER ) + def __init__(self, *arguments, **keywords): class_common_details_t.__init__( self ) declarations.class_t.__init__(self, *arguments, **keywords ) @@ -195,6 +201,7 @@ self._properties = [] self._redefined_funcs = None self._require_self_reference = False + self._class_type = self.CLASS_TYPE.DEFAULT def _get_redefine_operators( self ): return self._redefine_operators @@ -203,6 +210,14 @@ redefine_operators = property( _get_redefine_operators, _set_redefine_operators , doc="tells Py++ to redefine operators from base class in this class, False by default") + def _get_class_type(self): + return self._class_type + def _set_class_type(self, class_type): + self._class_type = class_type + class_type = property( _get_class_type, _set_class_type + , doc="set this value to CLASS_TYPE.WRAPPER, if you need to transfer ownership of" \ + "polymorphic class" ) + def _get_held_type(self): return self._held_type def _set_held_type(self, held_type): Modified: pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp 2007-04-04 20:21:23 UTC (rev 967) +++ pyplusplus_dev/unittests/data/transfer_ownership_to_be_exported.hpp 2007-04-04 21:05:12 UTC (rev 968) @@ -8,7 +8,7 @@ notify(); } protected: - virtual void notify(){}; + virtual void notify() = 0; }; struct do_nothing_t : event_t{ Modified: pyplusplus_dev/unittests/transfer_ownership_old_tester.py =================================================================== --- pyplusplus_dev/unittests/transfer_ownership_old_tester.py 2007-04-04 20:21:23 UTC (rev 967) +++ pyplusplus_dev/unittests/transfer_ownership_old_tester.py 2007-04-04 21:05:12 UTC (rev 968) @@ -11,26 +11,7 @@ from pyplusplus.module_builder import call_policies from pyplusplus import function_transformers as ft -decref_code = \ -""" -virtual ~%(cls)s(){ - Py_DECREF( boost::python::detail::wrapper_base_::get_owner(*this) ); -// if (this->m_pyobj) { -// Py_DECREF(this->m_pyobj); -// this->m_pyobj = 0; -// } -} -""" -incref_code = \ -""" -//if( !this->m_pyobj) { - //this->m_pyobj = boost::python::detail::wrapper_base_::get_owner(*this); - std::cout << "py owner id: " << (int)(boost::python::detail::wrapper_base_::get_owner(*this)); - //Py_INCREF(this->m_pyobj); -//} -""" - impl_conv_code = \ """ boost::python::implicitly_convertible< std::auto_ptr< %(from)s >, std::auto_ptr< %(to)s > >(); @@ -53,18 +34,9 @@ def customize( self, mb ): event_clss = mb.classes( lambda cls: cls.name in ( 'event_t', 'do_nothing_t' ) ) for cls in event_clss: - cls.require_self_reference = True - cls.set_constructors_body( 'Py_INCREF(self); std::cout<< "self: " << (int)(self) << "\\n" << (int)( boost::python::detail::wrapper_base_::get_owner(*this));' ) - cls.add_wrapper_code( decref_code % { 'cls' : cls.wrapper_alias } ) - #~ cls.add_wrapper_code( 'PyObject* m_pyobj;' ) - #~ cls.set_constructors_body( 'm_pyobj=0;' ) - cls.mem_fun( 'notify' ).add_override_precall_code( incref_code ) - #~ cls.mem_fun( 'notify' ).add_default_precall_code( incref_code ) - + cls.class_type = cls.CLASS_TYPE.WRAPPER cls.held_type = 'std::auto_ptr< %s >' % cls.wrapper_alias cls.add_registration_code( register_sptr % 'std::auto_ptr< %s >' % cls.decl_string, False ) - cls.add_registration_code( register_sptr % 'std::auto_ptr< %s >' % cls.wrapper_alias, False ) - #~ cls.held_type = 'std::auto_ptr< %s >' % cls.decl_string cls.add_registration_code( impl_conv_code % { 'from' : cls.wrapper_alias , 'to' : cls.decl_string } , False) @@ -95,6 +67,7 @@ def notify( self ): print 'notify' self.container.append( 1 ) + print '1 was append' print 'test started' notify_data = [] @@ -106,12 +79,12 @@ print 'event was shceduled' print 'event refcount: ', sys.getrefcount( event ) print 'simulator refcount: ', sys.getrefcount( simulator ) - #del event + #~ del event print 'event was deleted' event = simulator.get_event() print 'event was restored via saved reference in simulator: ', id( event ) print 'event refcount: ', sys.getrefcount( simulator.get_event() ) - #print 'call event.notify(): ', simulator.get_event().notify() + print 'call event.notify(): ', simulator.get_event().notify() print 'call simulator.run()' simulator.run() self.failUnless( notify_data[0] == 1 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-15 10:45:53
|
Revision: 987 http://svn.sourceforge.net/pygccxml/?rev=987&view=rev Author: roman_yakovenko Date: 2007-04-15 03:45:52 -0700 (Sun, 15 Apr 2007) Log Message: ----------- improving generate code - removing system include files, that could not be included Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-04-15 10:17:05 UTC (rev 986) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-04-15 10:45:52 UTC (rev 987) @@ -56,9 +56,13 @@ if self.extmodule.license: answer.append( self.extmodule.license.create() ) - answer.append( self.create_include_code( [class_creator] ) ) + creators = [class_creator] + if class_creator.wrapper: + creators.append( class_creator.wrapper ) + + answer.append( self.create_include_code( creators ) ) answer.append( '' ) - answer.append( self.create_namespaces_code( [class_creator] ) ) + answer.append( self.create_namespaces_code( creators ) ) if class_creator.wrapper: answer.append( class_creator.wrapper.create() ) Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-15 10:17:05 UTC (rev 986) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-15 10:45:52 UTC (rev 987) @@ -12,6 +12,7 @@ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators +from pyplusplus import code_repository #TODO: to add namespace_alias_t classes class multiple_files_t(writer.writer_t): @@ -143,16 +144,29 @@ def create_include_code( self, creators, head_headers=None, tail_headers=None ): answer = [] normalize = code_creators.include_directories_t.normalize + unique_headers = code_creators.code_creator_t.unique_headers + if head_headers: answer.extend( map( lambda header: '#include "%s"' % normalize( header ) , head_headers ) ) - # Include all 'global' include files... - includes = filter( lambda creator: isinstance( creator, code_creators.include_t ) - , self.extmodule.creators ) - answer.extend( map( lambda creator: creator.create(), includes ) ) - + dependend_on_headers = [] for creator in creators: + dependend_on_headers.extend( creator.get_system_headers( recursive=True ) ) + + dependend_on_headers = unique_headers( map( normalize, dependend_on_headers ) ) + + include_creators = filter( lambda creator: isinstance( creator, code_creators.include_t ) + , self.extmodule.creators ) + + for include_cc in include_creators: + if self.extmodule.is_system_header( include_cc.header ): + if include_cc.header in dependend_on_headers: + answer.append( include_cc.create() ) + else:# user header file - always include + answer.append( include_cc.create() ) + + for creator in creators: header = self.find_out_value_traits_header( creator ) if header: answer.append( '#include "%s"' % header ) Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2007-04-15 10:17:05 UTC (rev 986) +++ pyplusplus_dev/unittests/algorithms_tester.py 2007-04-15 10:45:52 UTC (rev 987) @@ -13,6 +13,7 @@ from pyplusplus import module_creator from pyplusplus import module_builder from pyplusplus import utils as pypp_utils +from pyplusplus import function_transformers as ft class indent_tester_t(unittest.TestCase): def test( self ): @@ -150,6 +151,15 @@ int m_dummy; struct x_nested{}; + + float* get_rate(){ + return 0; + } + + virtual void get_size( int& i, int& j ){ + i = 0; + j = 0; + } }; } """ @@ -168,7 +178,9 @@ mb.calldefs( 'get_opaque' ).call_policies \ = module_builder.call_policies.return_value_policy( module_builder.call_policies.return_opaque_pointer ) mb.class_( 'op_struct' ).exclude() - + mb.mem_fun( 'get_rate' ).call_policies \ + = module_builder.call_policies.return_value_policy( module_builder.call_policies.return_pointee_value ) + mb.mem_fun( 'get_size' ).add_transformation( ft.output(0) ) mb.build_code_creator('x_class_multi') mb.split_module( autoconfig.build_dir , [ mb.class_( '::tester::x' ) ] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-17 07:28:51
|
Revision: 995 http://svn.sourceforge.net/pygccxml/?rev=995&view=rev Author: roman_yakovenko Date: 2007-04-17 00:28:51 -0700 (Tue, 17 Apr 2007) Log Message: ----------- another set of improvements and optimizations related to include file treatment Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/convenience_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2007-04-17 07:16:21 UTC (rev 994) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2007-04-17 07:28:51 UTC (rev 995) @@ -4,7 +4,6 @@ # http://www.boost.org/LICENSE_1_0.txt) import os -import types import custom import license import include @@ -23,18 +22,8 @@ """Constructor. """ compound.compound_t.__init__(self) - self.__system_headers = [] - - def add_system_header( self, header ): - normalize = include_directories.include_directories_t.normalize - normalized_header = normalize( header ) - if normalized_header not in self.__system_headers: - self.__system_headers.append( normalized_header ) - - def is_system_header( self, header ): - normalize = include_directories.include_directories_t.normalize - return normalize( header ) in self.__system_headers - + self.__body = None + def _get_include_dirs(self): include_dirs = algorithm.creator_finder.find_by_class_instance( what=include_directories.include_directories_t @@ -62,19 +51,16 @@ return include_dirs.user_defined user_defined_directories = property( _get_user_defined_directories ) - def _get_body(self): - found = algorithm.creator_finder.find_by_class_instance( what=module_body.module_body_t + @property + def body(self): + """Return reference to L{module_body_t} code creator""" + if None is self.__body: + found = algorithm.creator_finder.find_by_class_instance( what=module_body.module_body_t , where=self.creators , recursive=False ) - if not found: - return None - else: - return found[0] - body = property( _get_body, - doc="""A module_body_t object or None. - @type: L{module_body_t} - """ - ) + if found: + self.__body = found[0] + return self.__body def _get_license( self ): if isinstance( self.creators[0], license.license_t ): @@ -107,22 +93,7 @@ return i else: return 0 - - def first_include_index(self): - """Return the children index of the first L{include_t} object. - An exception is raised when there is no include_t object among - the children creators. - - @returns: Children index - @rtype: int - """ - for i in range( len(self.creators) ): - if isinstance( self.creators[i], include.include_t ): - return i - else: - raise RuntimeError( "include_t creator has not been found." ) - def replace_included_headers( self, headers, leave_system_headers=True ): to_be_removed = [] for creator in self.creators: @@ -132,7 +103,7 @@ break for creator in to_be_removed: - if creator.header in self.__system_headers: + if creator.is_system: if not leave_system_headers: self.remove_creator( creator ) elif creator.is_user_defined: @@ -183,8 +154,9 @@ code = self.unindent(code) return os.linesep.join( includes ) + 2 * os.linesep + code + os.linesep - def add_include( self, header ): - self.adopt_include( include.include_t( header=header, user_defined=True ) ) + def add_include( self, header, user_defined=True, system=False ): + creator = include.include_t( header=header, user_defined=user_defined, system=system ) + self.adopt_include( creator ) def add_namespace_usage( self, namespace_name ): self.adopt_creator( namespace.namespace_using_t( namespace_name ) @@ -199,19 +171,5 @@ def adopt_declaration_creator( self, creator ): self.adopt_creator( creator, self.creators.index( self.body ) ) - def add_declaration_code( self, code, position ): - creator = custom.custom_text_t( code ) - last_include = self.last_include_index() - pos = max( last_include + 1, position ) - pos = min( pos, self.creators.index( self.body ) ) - self.adopt_creator( creator, pos ) - - - - - - - - - - + def add_declaration_code( self, code, position ): + self.adopt_declaration_creator( custom.custom_text_t( code ) ) Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-17 07:16:21 UTC (rev 994) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-17 07:28:51 UTC (rev 995) @@ -12,7 +12,6 @@ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators -from pyplusplus import code_repository #TODO: to add namespace_alias_t classes class multiple_files_t(writer.writer_t): @@ -44,6 +43,9 @@ self.write_main = write_main self.written_files = [] self.ref_count_creators = ( code_creators.opaque_type_registrator_t, ) + self.__predefined_include_creators \ + = filter( lambda creator: isinstance( creator, code_creators.include_t ) + , self.extmodule.creators ) def write_file( self, fpath, content ): self.written_files.append( fpath ) @@ -155,12 +157,9 @@ dependend_on_headers.extend( creator.get_system_headers( recursive=True ) ) dependend_on_headers = unique_headers( map( normalize, dependend_on_headers ) ) - - include_creators = filter( lambda creator: isinstance( creator, code_creators.include_t ) - , self.extmodule.creators ) - - for include_cc in include_creators: - if self.extmodule.is_system_header( include_cc.header ): + + for include_cc in self.__predefined_include_creators: + if include_cc.is_system: if include_cc.header in dependend_on_headers: answer.append( include_cc.create() ) else:# user header file - always include Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-04-17 07:16:21 UTC (rev 994) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-04-17 07:28:51 UTC (rev 995) @@ -47,10 +47,14 @@ def write_code_repository(self, dir): """creates files defined in L{code_repository} package""" + system_headers = self.extmodule.get_system_headers( recursive=True ) for cr in code_repository.all: - if self.__extmodule.is_system_header( cr.file_name ): + 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 ) @staticmethod def write_file( fpath, content ): """Write a source file. Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-04-17 07:16:21 UTC (rev 994) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2007-04-17 07:28:51 UTC (rev 995) @@ -299,11 +299,6 @@ creators.reverse() self.__module_body.adopt_creators( creators, 0 ) - def __include_header( self, header, system=False ): - self.__extmodule.adopt_include( code_creators.include_t( header ) ) - if system: - self.__extmodule.add_system_header( header ) - def create(self, decl_headers=None): """Create and return the module for the extension. @@ -325,14 +320,16 @@ creator.target_configuration = self.__target_configuration #last action. self._append_user_code() + + add_include = self.__extmodule.add_include #add system headers system_headers = self.__extmodule.get_system_headers( recursive=True, unique=True ) - map( lambda header: self.__include_header( header, system=True ) + map( lambda header: add_include( header, user_defined=False, system=True ) , system_headers ) #add user defined header files if decl_headers is None: decl_headers = declarations.declaration_files( self.__decls ) - map( lambda header: self.__include_header( header ) + map( lambda header: add_include( header, user_defined=False, system=False ) , decl_headers ) self.__dependencies_manager.inform_user() Modified: pyplusplus_dev/unittests/convenience_tester.py =================================================================== --- pyplusplus_dev/unittests/convenience_tester.py 2007-04-17 07:16:21 UTC (rev 994) +++ pyplusplus_dev/unittests/convenience_tester.py 2007-04-17 07:28:51 UTC (rev 995) @@ -24,8 +24,7 @@ mb.add_registration_code( 'bp::def( "ensure_int_sequence", &pyplusplus::convenience::ensure_uniform_sequence<int> );' ) mb.build_code_creator( self.EXTENSION_NAME ) - mb.code_creator.add_include( "__convenience.pypp.hpp" ) - mb.code_creator.add_system_header( code_repository.convenience.file_name ) + mb.code_creator.add_include( code_repository.convenience.file_name, system=True ) def run_tests(self, module): self.failIfRaisesAny( module.ensure_sequence, [1,2,3], -1 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-22 08:41:55
|
Revision: 1013 http://svn.sourceforge.net/pygccxml/?rev=1013&view=rev Author: roman_yakovenko Date: 2007-04-22 01:41:55 -0700 (Sun, 22 Apr 2007) Log Message: ----------- performance improvement - Py++ will store md5sum of the generated files and will compare against next time it will generate code. This save the need to load alll generated files from disk Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/__init__.py pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/file_writers/writer.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/unittests/algorithms_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/file_writers/md5sum_repository.py Modified: pyplusplus_dev/pyplusplus/file_writers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/__init__.py 2007-04-21 17:21:44 UTC (rev 1012) +++ pyplusplus_dev/pyplusplus/file_writers/__init__.py 2007-04-22 08:41:55 UTC (rev 1013) @@ -21,6 +21,8 @@ from single_file import single_file_t from multiple_files import multiple_files_t from class_multiple_files import class_multiple_files_t +from md5sum_repository import repository_t +from md5sum_repository import cached_repository_t def has_pypp_extenstion( fname ): """returns True if file has Py++ specific extension, otherwise False""" @@ -37,14 +39,14 @@ sf = single_file_t( data, file_path ) sf.write() -def write_multiple_files( extmodule, dir_path ): +def write_multiple_files( extmodule, dir_path, files_sum_repository=None ): """writes extmodule to multiple files""" - mfs = multiple_files_t( extmodule, dir_path ) + mfs = multiple_files_t( extmodule, dir_path, files_sum_repository, files_sum_repository=files_sum_repository ) mfs.write() return mfs.written_files -def write_class_multiple_files( extmodule, dir_path, huge_classes ): +def write_class_multiple_files( extmodule, dir_path, huge_classes, files_sum_repository ): """writes extmodule to multiple files and splits huge classes to few source files""" - mfs = class_multiple_files_t( extmodule, dir_path, huge_classes ) + mfs = class_multiple_files_t( extmodule, dir_path, huge_classes, files_sum_repository=files_sum_repository ) mfs.write() return mfs.written_files Modified: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-04-21 17:21:44 UTC (rev 1012) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2007-04-22 08:41:55 UTC (rev 1013) @@ -29,8 +29,16 @@ alias + _main h/cpp this class will contain main registration function. """ - def __init__(self, extmodule, directory_path, huge_classes, num_of_functions_per_file=20): - multiple_files.multiple_files_t.__init__(self, extmodule, directory_path) + def __init__( self + , extmodule + , directory_path + , huge_classes + , num_of_functions_per_file=20 + , files_sum_repository=None ): + multiple_files.multiple_files_t.__init__(self + , extmodule + , directory_path + , files_sum_repository=files_sum_repository) self.huge_classes = huge_classes self.num_of_functions_per_file = num_of_functions_per_file self.internal_splitters = [ Added: pyplusplus_dev/pyplusplus/file_writers/md5sum_repository.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/md5sum_repository.py (rev 0) +++ pyplusplus_dev/pyplusplus/file_writers/md5sum_repository.py 2007-04-22 08:41:55 UTC (rev 1013) @@ -0,0 +1,97 @@ +# Copyright 2004 Roman Yakovenko. +# Distributed under the Boost Software License, Version 1.0. (See +# accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +"""defines interface for repository of generated files hash""" + +import os +try: + from hashlib import md5 +except: + from md5 import new as md5 + + +def get_md5_text_value( text ): + m = md5() + m.update( text ) + return m.hexdigest() + +def get_md5_file_value( fpath ): + if not os.path.exists( fpath ): + return None #file does not exist + f = file( fpath, 'rb' ) + fcontent = f.read() + f.close() + return get_md5_text_value( fcontent ) + +class repository_t( object ): + def __init__( self ): + object.__init__( self ) + + def get_file_value( self, fpath ): + return NotImplementedError( self.__class__.__name__ ) + + def get_text_value( self, fpath ): + return NotImplementedError( self.__class__.__name__ ) + + def update_value( self, fpath, hash_value ): + return NotImplementedError( self.__class__.__name__ ) + + def save_values( self ): + return NotImplementedError( self.__class__.__name__ ) + +class dummy_repository_t( repository_t ): + def __init__( self ): + repository_t.__init__( self ) + + def get_file_value( self, fpath ): + return get_md5_file_value( fpath ) + + def get_text_value( self, text ): + return get_md5_text_value( text ) + + def update_value( self, fpath, hash_value ): + pass + + def save_values( self ): + pass + +class cached_repository_t( repository_t ): + separator = ' ' + hexdigest_len = 32 + hexdigest_separator_len = 33 + + def __init__( self, file_name ): + repository_t.__init__( self ) + self.__repository = {} + self.__repository_file = file_name + if os.path.exists( self.__repository_file ): + f = file( self.__repository_file, 'r' ) + for line in f: + if len(line) < self.hexdigest_separator_len: + continue + hexdigest = line[:self.hexdigest_len] + fname = line[self.hexdigest_separator_len:].rstrip() + self.__repository[ fname ] = hexdigest + f.close() + + def get_file_value( self, fpath ): + try: + return self.__repository[ fpath ] + except KeyError: + return None + + def get_text_value( self, text ): + return get_md5_text_value( text ) + + def update_value( self, fpath, hash_value ): + self.__repository[ fpath ] = hash_value + + def save_values( self ): + lines = [] + for fpath, hexdigest in self.__repository.iteritems(): + lines.append( '%s%s%s%s' % ( hexdigest, self.separator, fpath, os.linesep ) ) + f = file( self.__repository_file, 'w+' ) + f.writelines( lines ) + f.close() Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-21 17:21:44 UTC (rev 1012) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2007-04-22 08:41:55 UTC (rev 1013) @@ -22,7 +22,7 @@ HEADER_EXT = '.pypp.hpp' SOURCE_EXT = '.pypp.cpp' - def __init__(self, extmodule, directory_path, write_main=True): + def __init__(self, extmodule, directory_path, write_main=True, files_sum_repository=None): """Constructor. @param extmodule: The root of a code creator tree @@ -34,7 +34,7 @@ that calls all the registration methods. @type write_main: boolean """ - writer.writer_t.__init__(self, extmodule) + writer.writer_t.__init__( self, extmodule, files_sum_repository ) self.__directory_path = directory_path self.create_dir( directory_path ) self.include_creators = [] # List of include_t creators that contain the generated headers @@ -49,7 +49,7 @@ def write_file( self, fpath, content ): self.written_files.append( fpath ) - writer.writer_t.write_file( fpath, content ) + writer.writer_t.write_file( fpath, content, self.files_sum_repository ) def create_dir( self, directory_path ): """Create the output directory if it doesn't already exist. @@ -385,3 +385,4 @@ , self.include_creators ) main_cpp = os.path.join( self.directory_path, self.extmodule.body.name + '.main.cpp' ) self.write_file( main_cpp, self.extmodule.create() + os.linesep ) + self.files_sum_repository.save_values() Modified: pyplusplus_dev/pyplusplus/file_writers/writer.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-04-21 17:21:44 UTC (rev 1012) +++ pyplusplus_dev/pyplusplus/file_writers/writer.py 2007-04-22 08:41:55 UTC (rev 1013) @@ -10,6 +10,7 @@ from pyplusplus import _logging_ from pyplusplus import code_creators from pyplusplus import code_repository +import md5sum_repository class writer_t(object): """Base class for all module/code writers. @@ -21,17 +22,22 @@ """ logger = _logging_.loggers.file_writer - def __init__(self, extmodule): + def __init__(self, extmodule, files_sum_repository=None): object.__init__(self) self.__extmodule = extmodule - - - def _get_extmodule(self): + self.__files_sum_repository = files_sum_repository + if None is files_sum_repository: + self.__files_sum_repository = md5sum_repository.dummy_repository_t() + + @property + def extmodule(self): + """The root of the code creator tree ( code_creators.module_t )""" return self.__extmodule - extmodule = property( _get_extmodule, - doc="""The root of the code creator tree. - @type: module_t""") - + + @property + def files_sum_repository( self ): + return self.__files_sum_repository + def write(self): """ Main write method. Should be overridden by derived classes. """ raise NotImplementedError() @@ -57,7 +63,7 @@ self.write_file( os.path.join( dir, code_repository.named_tuple.file_name ) , code_repository.named_tuple.code ) @staticmethod - def write_file( fpath, content ): + def write_file( fpath, content, files_sum_repository=None ): """Write a source file. This method writes the string content into the specified file. @@ -82,22 +88,32 @@ fcontent_new.append( os.linesep ) #keep gcc happy fcontent_new = ''.join( fcontent_new ) - if os.path.exists( fpath ): + new_hash_value = None + if files_sum_repository: + new_hash_value = files_sum_repository.get_text_value( fcontent_new ) + curr_hash_value = files_sum_repository.get_file_value( fname ) + if new_hash_value == curr_hash_value: + writer_t.logger.debug( 'file was not changed( hash ) - done( %f seconds )' + % ( time.clock() - start_time ) ) + return + elif os.path.exists( fpath ): #small optimization to cut down compilation time f = file( fpath, 'rb' ) fcontent = f.read() f.close() if fcontent == fcontent_new: - writer_t.logger.debug( 'file was not changed - done( %f seconds )' + writer_t.logger.debug( 'file was not changed( content ) - done( %f seconds )' % ( time.clock() - start_time ) ) return else: - writer_t.logger.debug( 'file does not exist' ) + writer_t.logger.debug( 'file changed or it does not exist' ) writer_t.create_backup( fpath ) f = file( fpath, 'w+b' ) f.write( fcontent_new ) f.close() + 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 ): Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2007-04-21 17:21:44 UTC (rev 1012) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2007-04-22 08:41:55 UTC (rev 1013) @@ -303,7 +303,11 @@ self.__merge_user_code() file_writers.write_file( self.code_creator, file_name ) - def split_module(self, dir_name, huge_classes=None, on_unused_file_found=os.remove): + def split_module( self + , dir_name + , huge_classes=None + , on_unused_file_found=os.remove + , use_files_sum_repository=False): """ Writes module to multiple files @@ -314,13 +318,30 @@ @param on_unused_file_found: callable object that represents the action that should be taken on file, which is no more in use + + @use_files_sum_repository: Py++ can generate file, which will contain md5 sum of every generated file. + Next time you generate code, md5sum will be loaded from the file and compared. + This could speed-up code generation process by 10-15%. """ self.__merge_user_code() + + files_sum_repository = None + if use_files_sum_repository: + cache_file = os.path.join( dir_name, self.code_creator.body.name + '.md5.sum' ) + files_sum_repository = file_writers.cached_repository_t( cache_file ) + written_files = [] if None is huge_classes: - written_files = file_writers.write_multiple_files( self.code_creator, dir_name ) + written_files = file_writers.write_multiple_files( + self.code_creator + , dir_name + , files_sum_repository=files_sum_repository ) else: - written_files = file_writers.write_class_multiple_files( self.code_creator, dir_name, huge_classes ) + written_files = file_writers.write_class_multiple_files( + self.code_creator + , dir_name + , huge_classes + , files_sum_repository=files_sum_repository ) all_files = os.listdir( dir_name ) all_files = map( lambda fname: os.path.join( dir_name, fname ), all_files ) Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2007-04-21 17:21:44 UTC (rev 1012) +++ pyplusplus_dev/unittests/algorithms_tester.py 2007-04-22 08:41:55 UTC (rev 1013) @@ -184,7 +184,8 @@ mb.build_code_creator('x_class_multi') mb.split_module( autoconfig.build_dir , [ mb.class_( '::tester::x' ) ] - , on_unused_file_found=lambda fpath: fpath ) + , on_unused_file_found=lambda fpath: fpath + , use_files_sum_repository=True) class split_sequence_tester_t(unittest.TestCase): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-24 17:31:09
|
Revision: 1017 http://svn.sourceforge.net/pygccxml/?rev=1017&view=rev Author: roman_yakovenko Date: 2007-04-24 10:31:08 -0700 (Tue, 24 Apr 2007) Log Message: ----------- updating documentation Modified Paths: -------------- pygccxml_dev/docs/history/history.rest pygccxml_dev/pygccxml/__init__.py pyplusplus_dev/docs/documentation/functions/call_policies.rest pyplusplus_dev/docs/documentation/properties.rest pyplusplus_dev/docs/history/history.rest pyplusplus_dev/docs/pyplusplus.rest pyplusplus_dev/pyplusplus/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py Modified: pygccxml_dev/docs/history/history.rest =================================================================== --- pygccxml_dev/docs/history/history.rest 2007-04-23 17:15:08 UTC (rev 1016) +++ pygccxml_dev/docs/history/history.rest 2007-04-24 17:31:08 UTC (rev 1017) @@ -22,65 +22,69 @@ ------------- -Version 0.8.* +Version 0.9.0 ------------- -1. ``is_base_and_derived`` function was changed. The second argument could be +1. Performance was improved. `pygccxml`_ is now 30-50% faster. The improvement + was achieved by using `cElementTree`_ package, ``iterparse`` functionality, + instead of standard XML SAX API. If `cElementTree`_ package is not available, + the built-in XML SAX package is used. + +.. _`cElementTree` : http://effbot.org/zone/celementtree.htm + +2. ``is_base_and_derived`` function was changed. The second argument could be a tuple, which contains classes. Function returns ``True`` if at least one class derives from the base one. .. line separator -2. Class ``calldef_t`` has property - ``does_throw``. It describes +3. Class ``calldef_t`` has property - ``does_throw``. It describes whether the function throws any exception or not. .. line separator -3. Bug fixes: small bug was fixed in functionality that corrects GCC-XML reported +4. Bug fixes: small bug was fixed in functionality that corrects GCC-XML reported function default arguments. Reference to "enum" declaration extracted properly. Many thanks to Martin Preisler for reporting the bug. .. line separator -4. New type traits have been added: +5. New type traits have been added: + * ``is_std_ostream`` * ``is_std_wostream`` .. line separator - -5. C++ does not define implicit conversion between an integral type and ``void*``. - ``declarations.is_convertible`` type traitswas fixed. +6. C++ does not define implicit conversion between an integral type and ``void*``. + ``declarations.is_convertible`` type traits was fixed. + .. line separator -6. ``declarations.is_noncopyable`` type traits implementation was slightly changed. +7. ``declarations.is_noncopyable`` type traits implementation was slightly changed. Now it checks explicitly that class has: - + * default constructor * copy constructor * ``operator=`` * destructor - If all listed functions exists, than the algorithm returns ``False``, otherwise + If all listed functions exist, than the algorithm returns ``False``, otherwise it will continue to execute previous logic. - + .. line separator -7. ``declarations.class_declaration_t`` has new property - ``aliases``. This is +8. ``declarations.class_declaration_t`` has new property - ``aliases``. This is a list of all aliases to the class declaration. .. line separator - -8. The message of the exception, which is raised from ``declarations.mdecl_wrapper_t`` + +9. The message of the exception, which is raised from ``declarations.mdecl_wrapper_t`` class was improved and now clearly explains what the problem is. -.. line separator +.. line separator -9. Small improvment was done for ``parser.default_argument_patcher_t`` class. - ``enum`` extraction is done using functionality provided by type traits module. - - ------------- Version 0.8.5 ------------- Modified: pygccxml_dev/pygccxml/__init__.py =================================================================== --- pygccxml_dev/pygccxml/__init__.py 2007-04-23 17:15:08 UTC (rev 1016) +++ pygccxml_dev/pygccxml/__init__.py 2007-04-24 17:31:08 UTC (rev 1017) @@ -33,8 +33,8 @@ import pygccxml.parser as parser import pygccxml.utils as utils -#TODO: +#TODO: # 1. Write documentation for filtering functionality. # 2. Add "explicit" property for constructors -__version__ = '0.8.6' +__version__ = '0.9.0' Modified: pyplusplus_dev/docs/documentation/functions/call_policies.rest =================================================================== --- pyplusplus_dev/docs/documentation/functions/call_policies.rest 2007-04-23 17:15:08 UTC (rev 1016) +++ pyplusplus_dev/docs/documentation/functions/call_policies.rest 2007-04-24 17:31:08 UTC (rev 1017) @@ -115,6 +115,10 @@ * return type is ``T&``, for member ``operator[]`` +* ``return_self`` + + This call policy will be used for ``operator=``. + --------------------- Missing call policies --------------------- @@ -181,6 +185,30 @@ Py++ defined call policies -------------------------- +custom_call_policies +-------------------- + +``custom_call_policies`` policies functionality was born to allow you to define +your own call polices and use them with same level of convenience as built-in ones. + +The usage is pretty simple: + +.. code-block:: Python + + from pyplusplus import module_builder + from pyplusplus.module_builder import call_policies + + mb = module_builder.module_builder_t( ... ) + mb.free_function( ... ).call_policies \ + = call_policies.custom_call_policies( your call policies code ) + + Optionally you can specify name of the header file, which should be included: + +.. code-block:: Python + + mb.free_function( ... ).call_policies \ + = call_policies.custom_call_policies( your call policies code, "xyz.hpp" ) + return_pointee_value -------------------- Modified: pyplusplus_dev/docs/documentation/properties.rest =================================================================== --- pyplusplus_dev/docs/documentation/properties.rest 2007-04-23 17:15:08 UTC (rev 1016) +++ pyplusplus_dev/docs/documentation/properties.rest 2007-04-24 17:31:08 UTC (rev 1017) @@ -153,6 +153,13 @@ It is also aware of few common prefixes for set\\get accessors: get, is, has, set, <<empty prefix for get accessor>>. +------------- +Documentation +------------- +You can use ``doc`` attribute to specify the property documentation. If you +don't, than `Py++`_ will construct documentation, which will describe from what +functions this property was built from. + .. _`Py++` : ./../pyplusplus.html .. _`Boost.Python`: http://www.boost.org/libs/python/doc/index.html .. _`Python`: http://www.python.org Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2007-04-23 17:15:08 UTC (rev 1016) +++ pyplusplus_dev/docs/history/history.rest 2007-04-24 17:31:08 UTC (rev 1017) @@ -35,37 +35,78 @@ ------------- -Version 0.8.* +Version 0.9.0 ------------- 1. Bug fixes: - - * Declaration of virtual functions that have an exception specification with + + * Declaration of virtual functions that have an exception specification with an empty throw was fixed. Now the exception specification is generated properly. Many thanks to Martin Preisler for reporting the bug. .. line-separator -2. Added exposing of copy constructor and ``operator=``. ``operator=`` is exposed - under "assign" name. +2. Added exposing of copy constructor, ``operator=`` and ``operator<<``. + * ``operator=`` is exposed under "assign" name + + * ``operator<<`` is exposed under "__str__" name + .. line-separator -3. Added new call policy - `as_tuple`_ +3. Added new call policies: + * `as_tuple`_ + + * `custom_call_policies`_ + + * `return_range`_ + .. _`as_tuple` : ../documentation/functions/call_policies.html#as-tuple +.. _`return_range`: ../documentation/functions/call_policies.html#custom-call-policies +.. _`custom_call_policies` : ../documentation/functions/call_policies.html#custom-call-policies -4. Added initial support for multi-module development. Now you can mark you declaration - as ``already_exposed``. "Py++" will not create code for it, but will +4. Added an initial support for multi-module development. Now you can mark you + declaration as ``already_exposed`` and `Py++`_ will do the rest. For more + information read `multi-module development guide`_. +.. _`multi-module development guide` : ../documentation/multi_module_development.html + .. line-separator 5. `input_c_buffer`_ - new functions transformation, which allows to pass a Python sequence to function, instead of pair of arguments: pointer to buffer and size. - + .. _`input_c_buffer` : ../documentation/functions/transformation/built_in/input_c_buffer.html +6. Added ability to control generated "include" directives. Now you can ask `Py++`_ + to include a header file, when it generates code for some declaration. For more + information refer to `inserting code guide`_. +.. _`inserting code guide` : ../documentation/inserting_code.html#header-files + +7. Code generation improvements: system header files ( Boost.Python or Py++ defined ) + will be included from the generated files only in case the generated code + depends on them. + +.. line-separator + +8. Performance improvements: Py++ runs 1.5 - 2 times faster, than the previous one. + +.. line-separator + +9. Added ability to add code before overriden and default function calls. + For more information refer to `member function API documentation`_. + +.. _`member function API documentation` : ../documentation/apidocs/pyplusplus.decl_wrappers.calldef_wrapper.member_function_t-class.html + +10. `Py++`_ will generate documentation for automatically constructed properties. + For more information refer to `properties guide`_ + +.. _`properties guide`: ../documentation/properties.html#documentation + +11. Added + ------------- Version 0.8.5 ------------- Modified: pyplusplus_dev/docs/pyplusplus.rest =================================================================== --- pyplusplus_dev/docs/pyplusplus.rest 2007-04-23 17:15:08 UTC (rev 1016) +++ pyplusplus_dev/docs/pyplusplus.rest 2007-04-24 17:31:08 UTC (rev 1017) @@ -126,13 +126,17 @@ Features list ------------- -* `Py++`_ support almost all features found in `Boost.Python`_ library +* `Py++`_ supports almost all features found in `Boost.Python`_ library +* Using `Py++`_ you can develop few extension modules simultaneously, especially + when they share the code. -* `Py++`_ generates code, which will help you to understand compiler generated - error messages +* `Py++`_ generates code, which will help you: + * to understand compiler generated error messages + * to minimize project built time + * `Py++`_ has few modes of writing code into files: * single file @@ -141,9 +145,6 @@ * multiple files, where single class code is split to few files -* `Py++`_ will save your compilation time - it will rewrite a file, only in case - of change - * You have full control over generated code. Your code could be inserted almost anywhere. Modified: pyplusplus_dev/pyplusplus/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/__init__.py 2007-04-23 17:15:08 UTC (rev 1016) +++ pyplusplus_dev/pyplusplus/__init__.py 2007-04-24 17:31:08 UTC (rev 1017) @@ -15,11 +15,11 @@ in the headers. You can then modify (decorate) this tree to customize the bindings. After that, a I{code creators} tree is created where each node represents a block of C++ source code. So you can change any piece of -code befor it is written to disk. As a last step, these source code blocks are -finally written into one or more C++ source files, which can then be compiled to +code befor it is written to disk. As a last step, these source code blocks are +finally written into one or more C++ source files, which can then be compiled to generate the final Python module. -If you are just starting with U{Py++<http://www.language-binding.net>}, +If you are just starting with U{Py++<http://www.language-binding.net>}, then consider to read documentation of L{module_builder} package. """ @@ -34,7 +34,7 @@ from _logging_ import multi_line_formatter_t -__version__ = '0.8.6' +__version__ = '0.9.0' #Known issues: #3. @@ -46,7 +46,7 @@ #~ > > In one header file you define class, in an other you #~ > > define function that takes #~ > > as argument shared_ptr to the class. -#~ > +#~ > #~ > You don't need to use a shared_ptr holder for that purpose. The #~ > *only* reason you'd ever want to use a share_ptr holder is if you #~ > expect people to wrap functions taking non-const references to these Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-04-23 17:15:08 UTC (rev 1016) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2007-04-24 17:31:08 UTC (rev 1017) @@ -98,21 +98,21 @@ def set_overridable( self, overridable ): self._overridable = overridable - + overridable = property( get_overridable, set_overridable , doc = get_overridable.__doc__ ) - @property + @property def non_overridable_reason( self ): """returns the reason the function could not be overriden""" return self._non_overridable_reason def mark_as_non_overridable( self, reason ): """mark this function as non-overridable - + Not all fucntions could be overrided from Python, for example virtual function that returns non const reference to a member variable. Py++ allows you to - mark these functions and provide and explanation to the user. + mark these functions and provide and explanation to the user. """ self.overridable = False self._non_overridable_reason = messages.W0000 % reason @@ -129,7 +129,7 @@ def add_transformation(self, *transformer_creators, **keywd): """add new function transformation. - transformer_creators - list of transformer creators, which should be applied on the function + transformer_creators - list of transformer creators, which should be applied on the function keywd - keyword arguments for L{function_transformation_t} class initialization """ self.transformations.append( ft.function_transformation_t( self, transformer_creators, **keywd ) ) @@ -167,31 +167,31 @@ return False base = declarations.remove_pointer( type_ ) return declarations.is_pointer( base ) - + def suspicious_type( type_ ): if not declarations.is_reference( type_ ): return False type_no_ref = declarations.remove_reference( type_ ) return not declarations.is_const( type_no_ref ) \ - and ( declarations.is_fundamental( type_no_ref ) + and ( declarations.is_fundamental( type_no_ref ) or declarations.is_enum( type_no_ref ) ) msgs = [] #TODO: functions that takes as argument pointer to pointer to smth, could not be exported #see http://www.boost.org/libs/python/doc/v2/faq.html#funcptr - + if len( self.arguments ) > calldef_t.BOOST_PYTHON_MAX_ARITY: msgs.append( messages.W1007 % ( calldef_t.BOOST_PYTHON_MAX_ARITY, len( self.arguments ) ) ) - + if self.transformations: #if user defined transformation, than I think it took care of the problems ft = self.transformations[0] if ft.alias == ft.unique_name: msgs.append( messages.W1044 % ft.alias ) return msgs - + if suspicious_type( self.return_type ) and None is self.call_policies: msgs.append( messages.W1008 ) - + if ( declarations.is_pointer( self.return_type ) or is_double_ptr( self.return_type ) ) \ and None is self.call_policies: msgs.append( messages.W1050 % str(self.return_type) ) @@ -204,7 +204,7 @@ if False == self.overridable: msgs.append( self._non_overridable_reason) - + problematics = algorithm.registration_order.select_problematics( self ) if problematics: tmp = [] @@ -223,19 +223,23 @@ self._default_precall_code = [] def add_override_precall_code(self, code): + """add code, which should be executed, before overrided member function call""" self._override_precall_code.append( code ) - + @property def override_precall_code(self): + """code, which should be executed, before overrided member function call""" return self._override_precall_code - + def add_default_precall_code(self, code): + """add code, which should be executed, before this member function call""" self._default_precall_code.append( code ) - + @property def default_precall_code(self): + """code, which should be executed, before this member function call""" return self._default_precall_code - + def get_use_overload_macro(self): return self._use_overload_macro def set_use_overload_macro(self, use_macro): @@ -249,14 +253,14 @@ and self.virtuality == declarations.VIRTUALITY_TYPES.NOT_VIRTUAL: return messages.W1011 return '' - + def _readme_impl( self ): msgs = super( member_function_t, self )._readme_impl() if self.does_throw == False \ and self.virtuality != declarations.VIRTUALITY_TYPES.NOT_VIRTUAL: msgs.append( messages.W1046 ) return msgs - + class constructor_t( declarations.constructor_t, calldef_t ): """defines a set of properties, that will instruct Py++ how to expose the constructor""" def __init__(self, *arguments, **keywords): @@ -321,7 +325,7 @@ """helps Py++ to deal with C++ operators""" inplace = [ '+=', '-=', '*=', '/=', '%=', '>>=', '<<=', '&=', '^=', '|=' ] comparison = [ '==', '!=', '<', '>', '<=', '>=' ] - non_member = [ '+', '-', '*', '/', '%', '&', '^', '|', ] + non_member = [ '+', '-', '*', '/', '%', '&', '^', '|', ] unary = [ '!', '~', '+', '-' ] all = inplace + comparison + non_member + unary @@ -334,7 +338,7 @@ return False if oper.symbol != '<<': return oper.symbol in operators_helper.all - + args_len = len( oper.arguments ) if isinstance( oper, declarations.member_operator_t ):# and args_len != 1: return False #Boost.Python does not support member operator<< :-( @@ -377,18 +381,18 @@ def add_override_precall_code(self, code): self._override_precall_code.append( code ) - + @property def override_precall_code(self): return self._override_precall_code - + def add_default_precall_code(self, code): self._default_precall_code.append( code ) - + @property def default_precall_code(self): return self._default_precall_code - + def _get_alias( self): alias = super( member_operator_t, self )._get_alias() if alias == self.name: @@ -493,7 +497,7 @@ calldef_t.__init__( self ) self._use_overload_macro = False self._declaration_code = [] - + def add_declaration_code( self, code ): """adds the code to the declaration section""" self.declaration_code.append( user_text.user_text_t( code ) ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2007-04-30 19:14:14
|
Revision: 1027 http://svn.sourceforge.net/pygccxml/?rev=1027&view=rev Author: roman_yakovenko Date: 2007-04-30 12:08:49 -0700 (Mon, 30 Apr 2007) Log Message: ----------- updating docs Modified Paths: -------------- pyplusplus_dev/announcement.txt pyplusplus_dev/docs/history/history.rest Modified: pyplusplus_dev/announcement.txt =================================================================== --- pyplusplus_dev/announcement.txt 2007-04-30 18:30:35 UTC (rev 1026) +++ pyplusplus_dev/announcement.txt 2007-04-30 19:08:49 UTC (rev 1027) @@ -1,11 +1,11 @@ Hello! -I'm pleased to announce the 0.8.5 release of Py++. +I'm pleased to announce the 0.8.5 release of Py++. What is Py++? ============= -Py++ is an object-oriented framework for creating a code generator for +Py++ is an object-oriented framework for creating a code generator for Boost.Python library. Where is Py++? @@ -18,38 +18,38 @@ What's new? =========== -Features +Features -------- -* Added "Function Transformation" feature: - http://language-binding.net/pyplusplus/documentation/functions/transformation/transformation.html +* Added exposing of copy constructor, ``operator=`` and ``operator<<``. + * ``operator=`` is exposed under "assign" name + * ``operator<<`` is exposed under "__str__" name -* Added new functionality, which allows you to control messages and warnings: - http://language-binding.net/pyplusplus/documentation/feedback.html#how-to-disable-warning-s +* Added new call policies: + * as_tuple + * custom_call_policies + * return_range -* Adding new algorithm, which controls the registration order of the functions. - http://language-binding.net/pyplusplus/documentation/functions/registration_order.html - -* Added new "Py++" defined "return_pointee_value" call policy: - http://language-binding.net/pyplusplus/documentation/functions/call_policies.html#py-defined-call-policies - -* Opaque types are fully supported: - http://language-binding.net/pyplusplus/documentation/functions/call_policies.html#special-case +* Added an initial support for multi-module development. Now you can mark your + declarations as ``already_exposed`` and `Py++`_ will do the rest. +* `input_c_buffer`_ - new functions transformation, which allows to pass a Python + sequence to C++ function, instead of pair of arguments: pointer to buffer and size. -Small features --------------- +* Added ability to control generated "include" directives. Now you can ask Py++ + to include a header file, when it generates code for some declaration. -* It is possible to configure "Py++" to generate faster ( compilation time ) - code for indexing suite version 2. See API documentation. +* Code generation improvements: system header files (Boost.Python or Py++ defined) + will be included from the generated files only in case the generated code + depends on them. -* The algorithm, which finds all class properties was improved. Now it provides - a better way to control properties creation. A property that would hide another - exposed declaration will not be registered\\created. +* Performance: Py++ runs 1.5 - 2 times faster. -* Work around for "custom smart pointer as member variable" Boost.Python bug - was introduced. +* Py++ will generate documentation for automatically constructed properties. +* Added iteration functionality to Boost.Python Indexing Suite V2 ``std::map`` + and ``std::multimap`` containers. -For a more complete list, please see the news: + +For a more complete list, with links to documentation, please see the news: http://language-binding.net/pyplusplus/history/history.html Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2007-04-30 18:30:35 UTC (rev 1026) +++ pyplusplus_dev/docs/history/history.rest 2007-04-30 19:08:49 UTC (rev 1027) @@ -63,11 +63,11 @@ * `return_range`_ .. _`as_tuple` : ../documentation/functions/call_policies.html#as-tuple -.. _`return_range`: ../documentation/functions/call_policies.html#custom-call-policies +.. _`return_range`: ../documentation/functions/call_policies.html#return-range .. _`custom_call_policies` : ../documentation/functions/call_policies.html#custom-call-policies -4. Added an initial support for multi-module development. Now you can mark you - declaration as ``already_exposed`` and `Py++`_ will do the rest. For more +4. Added an initial support for multi-module development. Now you can mark your + declarations as ``already_exposed`` and `Py++`_ will do the rest. For more information read `multi-module development guide`_. .. _`multi-module development guide` : ../documentation/multi_module_development.html @@ -105,7 +105,8 @@ .. _`properties guide`: ../documentation/properties.html#documentation -11. Added iteration functionality to ``std::map`` and ``std::multimap`` containers. +11. Added iteration functionality to Boost.Python Indexing Suite V2 ``std::map`` + and ``std::multimap`` containers. ------------- Version 0.8.5 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |