Thread: [pygccxml-commit] SF.net SVN: pygccxml: [37] pyplusplus_dev/unittests
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-05-02 04:31:12
|
Revision: 37 Author: roman_yakovenko Date: 2006-05-01 21:31:00 -0700 (Mon, 01 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=37&view=rev Log Message: ----------- adding new tester for protected functions Modified Paths: -------------- pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/protected_to_be_exported.hpp pyplusplus_dev/unittests/protected_tester.py Added: pyplusplus_dev/unittests/data/protected_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/protected_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/protected_to_be_exported.hpp 2006-05-02 04:31:00 UTC (rev 37) @@ -0,0 +1,34 @@ +// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef __protected_to_be_exported_hpp__ +#define __protected_to_be_exported_hpp__ + +namespace protected_{ + +struct protected_t{ +protected: + int get_1(){ return 1; } +}; + +struct protected_s_t{ +protected: + static int get_2(){ return 2; } +}; + + +struct protected_v_t{ +protected: + virtual int get_i(){ return 10; } +}; + +struct protected_v_derived_t : public protected_v_t{ +}; + +} + +#endif//__protected_to_be_exported_hpp__ + + Added: pyplusplus_dev/unittests/protected_tester.py =================================================================== --- pyplusplus_dev/unittests/protected_tester.py (rev 0) +++ pyplusplus_dev/unittests/protected_tester.py 2006-05-02 04:31:00 UTC (rev 37) @@ -0,0 +1,74 @@ +# 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 pygccxml import declarations + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'protected' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb ): + mb.classes().always_expose_using_scope = True + mb.calldefs().create_with_signature = True + + def create_protected_s_derived_no_override( self, module ): + class derived(module.protected_v_t): + def __init__( self ): + module.protected_v_t.__init__( self ) + return derived() + + def create_protected_s_derived( self, module ): + class derived(module.protected_v_t): + def __init__( self ): + module.protected_v_t.__init__( self ) + + def get_i(self): + return 20 + #todo: fix it + #return super( derived, self ).get_i() * 2 + + return derived() + + + def run_tests(self, module): + protected = module.protected_t() + self.failUnless( protected.get_1() == 1 ) + + protected_s = module.protected_s_t() + self.failUnless( protected_s.get_2() == 2 ) + self.failUnless( module.protected_s_t.get_2() == 2 ) + + protected_v = module.protected_v_t() + self.failUnless( protected_v.get_i() == 10 ) + + protected_v_no_override = self.create_protected_s_derived_no_override( module ) + self.failUnless( protected_v_no_override.get_i() == 10 ) + + protected_v_override = self.create_protected_s_derived( module ) + self.failUnless( protected_v_override.get_i() == 20 ) + + protected_v_d = module.protected_v_derived_t() + self.failUnless( protected_v_d.get_i() == 10 ) + + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() \ No newline at end of file Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-05-02 04:29:42 UTC (rev 36) +++ pyplusplus_dev/unittests/test_all.py 2006-05-02 04:31:00 UTC (rev 37) @@ -49,6 +49,7 @@ import pointer_as_arg_tester import factory_tester import private_assign_tester +import protected_tester def create_suite(times): testers = [ @@ -94,7 +95,8 @@ , optional_bug_tester , pointer_as_arg_tester , factory_tester - , private_assign_tester + , private_assign_tester + , protected_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-14 07:46:02
|
Revision: 83 Author: roman_yakovenko Date: 2006-05-14 00:45:53 -0700 (Sun, 14 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=83&view=rev Log Message: ----------- adding exception specification to function-wrappers Added Paths: ----------- pyplusplus_dev/unittests/data/mem_fun_with_exception_to_be_exported.hpp pyplusplus_dev/unittests/mem_fun_with_exception_tester.py Added: pyplusplus_dev/unittests/data/mem_fun_with_exception_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/mem_fun_with_exception_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/mem_fun_with_exception_to_be_exported.hpp 2006-05-14 07:45:53 UTC (rev 83) @@ -0,0 +1,23 @@ +// 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 __mem_fun_with_exception_to_be_exported_hpp__ +#define __mem_fun_with_exception_to_be_exported_hpp__ + +#include <exception> + +namespace mem_fun_with_exception{ + +struct data_t{ +public: + virtual void do_nothing() throw( std::exception ) + {} +}; + +} + +#endif//__mem_fun_with_exception_to_be_exported_hpp__ + + Added: pyplusplus_dev/unittests/mem_fun_with_exception_tester.py =================================================================== --- pyplusplus_dev/unittests/mem_fun_with_exception_tester.py (rev 0) +++ pyplusplus_dev/unittests/mem_fun_with_exception_tester.py 2006-05-14 07:45:53 UTC (rev 83) @@ -0,0 +1,38 @@ +# 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 pygccxml import declarations + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'mem_fun_with_exception' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + mb.calldefs().create_with_signature = True + + def run_tests(self, module): + d = module.data_t() + d.do_nothing() + + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-23 06:31:34
|
Revision: 151 Author: roman_yakovenko Date: 2006-05-22 23:31:16 -0700 (Mon, 22 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=151&view=rev Log Message: ----------- adding vector indexing suite support - unit test Added Paths: ----------- pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites_tester.py Property Changed: ---------------- pyplusplus_dev/unittests/temp/ Added: pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp 2006-05-23 06:31:16 UTC (rev 151) @@ -0,0 +1,39 @@ +// 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 __indexing_suites_to_be_exported_hpp__ +#define __indexing_suites_to_be_exported_hpp__ + +#include <vector> + +namespace indexing_suites { + +struct item_t{ + item_t() : value( -1 ){} + + bool operator==(item_t const& item) const { + return value == item.value; + } + + bool operator!=(item_t const& item) const { + return value != item.value; + } + + int value; +}; + + +inline item_t get_value( const std::vector<item_t>& vec, unsigned int index ){ + return vec.at(index); +} + +inline void set_value( std::vector<item_t>& vec, unsigned int index, item_t value ){ + vec.at(index); + vec[index] = value; +} + +} + +#endif//__indexing_suites_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/indexing_suites_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites_tester.py (rev 0) +++ pyplusplus_dev/unittests/indexing_suites_tester.py 2006-05-23 06:31:16 UTC (rev 151) @@ -0,0 +1,43 @@ +# 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 module_builder + + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'indexing_suites' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, generator): + item_cls = generator.class_( 'item_t' ) + item_cls.indexing_suites.append( module_builder.vector_indexing_suite_t( 'items_t' ) ) + + def run_tests( self, module): + items = module.items_t() + item = module.item_t() + item.value = 1977 + items.append( item ) + self.failUnless( module.get_value( items, 0 ).value == 1977 ) + self.failUnless( len( items ) == 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() Property changes on: pyplusplus_dev/unittests/temp ___________________________________________________________________ Name: svn:ignore - internal_classes.dll member_functions.dll member_variables.dll module_body.dll namespaces.dll noncopyable.dll operators.dll operators_bug.dll optional.dll optional_bug.dll pointer_as_arg.dll pointer_to_function_as_argument.dll private_assign.dll recursive.dll regression1.dll regression2.dll regression3.dll smart_pointers.dll special_operators.dll statics.dll temprorary_variable.dll unnamed_enums.dll user_text.dll abstract.cpp~ call_policies.cpp~ casting.cpp~ class_order2.cpp~ class_order3.cpp~ class_order4.cpp~ class_order.cpp~ classes.cpp~ enums.cpp~ factory.cpp~ finalizables.cpp~ free_functions.cpp~ free_operators.cpp~ global_variables.cpp~ index_operator.cpp~ internal_classes.cpp~ member_functions.cpp~ member_variables.cpp~ noncopyable.cpp~ operators_bug.cpp~ optional.cpp~ optional_bug.cpp~ pointer_as_arg.cpp~ pointer_to_function_as_argument.cpp~ private_assign.cpp~ recursive.cpp~ regression1.cpp~ regression2.cpp~ regression3.cpp~ smart_pointers.cpp~ special_operators.cpp~ statics.cpp~ temprorary_variable.cpp~ unnamed_enums.cpp~ user_text.cpp~ abstract.exp call_policies.exp casting.exp class_order2.exp class_order3.exp class_order4.exp class_order.exp classes.exp enums.exp factory.exp finalizables.exp free_function_ignore_bug.exp free_functions.exp free_operators.exp global_variables.exp index_operator.exp internal_classes.exp member_functions.exp member_variables.exp module_body.exp namespaces.exp noncopyable.exp operators.exp operators_bug.exp optional.exp optional_bug.exp pointer_as_arg.exp pointer_to_function_as_argument.exp private_assign.exp recursive.exp regression1.exp regression2.exp regression3.exp smart_pointers.exp special_operators.exp statics.exp temprorary_variable.exp unnamed_enums.exp user_text.exp abstract.lib call_policies.lib casting.lib class_order2.lib class_order3.lib class_order4.lib class_order.lib classes.lib enums.lib factory.lib finalizables.lib free_function_ignore_bug.lib free_functions.lib free_operators.lib global_variables.lib index_operator.lib internal_classes.lib member_functions.lib member_variables.lib module_body.lib namespaces.lib noncopyable.lib operators.lib operators_bug.lib optional.lib optional_bug.lib pointer_as_arg.lib pointer_to_function_as_argument.lib private_assign.lib recursive.lib regression1.lib regression2.lib regression3.lib smart_pointers.lib special_operators.lib statics.lib temprorary_variable.lib unnamed_enums.lib user_text.lib abstract.obj call_policies.obj casting.obj class_order2.obj class_order3.obj class_order4.obj class_order.obj classes.obj enums.obj factory.obj finalizables.obj free_function_ignore_bug.obj free_functions.obj free_operators.obj global_variables.obj index_operator.obj internal_classes.obj member_functions.obj member_variables.obj module_body.obj namespaces.obj noncopyable.obj operators.obj operators_bug.obj optional.obj optional_bug.obj pointer_as_arg.obj pointer_to_function_as_argument.obj private_assign.obj recursive.obj regression1.obj regression2.obj regression3.obj smart_pointers.obj special_operators.obj statics.obj temprorary_variable.obj unnamed_enums.obj user_text.obj abstract.scons call_policies.scons casting.scons class_order2.scons class_order3.scons class_order4.scons class_order.scons classes.scons enums.scons factory.scons finalizables.scons free_function_ignore_bug.scons free_functions.scons free_operators.scons global_variables.scons index_operator.scons internal_classes.scons member_functions.scons member_variables.scons module_body.scons namespaces.scons noncopyable.scons operators.scons operators_bug.scons optional.scons optional_bug.scons pointer_as_arg.scons pointer_to_function_as_argument.scons private_assign.scons recursive.scons regression1.scons regression2.scons regression3.scons smart_pointers.scons special_operators.scons statics.scons temprorary_variable.scons unnamed_enums.scons user_text.scons abstract.dll call_policies.dll casting.dll class_order2.dll class_order3.dll class_order4.dll class_order.dll classes.dll enums.dll factory.dll finalizables.dll free_function_ignore_bug.dll free_functions.dll free_operators.dll global_variables.dll index_operator.dll .sconsign.dblite __array_1.pypp.hpp classes.cpp enums.cpp free_functions.cpp module_body.cpp namespaces.cpp unnamed_enums.cpp abstract.cpp call_policies.cpp casting.cpp class_order.cpp class_order2.cpp class_order3.cpp class_order4.cpp factory.cpp finalizables.cpp free_function_ignore_bug.cpp free_operators.cpp global_variables.cpp index_operator.cpp internal_classes.cpp member_functions.cpp member_variables.cpp noncopyable.cpp operators.cpp operators_bug.cpp optional.cpp optional_bug.cpp pointer_as_arg.cpp pointer_to_function_as_argument.cpp private_assign.cpp protected.cpp recursive.cpp regression1.cpp regression2.cpp regression3.cpp smart_pointers.cpp special_operators.cpp statics.cpp temprorary_variable.cpp user_text.cpp protected.dll protected.exp protected.lib protected.obj protected.scons + internal_classes.dll member_functions.dll member_variables.dll module_body.dll namespaces.dll noncopyable.dll operators.dll operators_bug.dll optional.dll optional_bug.dll pointer_as_arg.dll pointer_to_function_as_argument.dll private_assign.dll recursive.dll regression1.dll regression2.dll regression3.dll smart_pointers.dll special_operators.dll statics.dll temprorary_variable.dll unnamed_enums.dll user_text.dll abstract.cpp~ call_policies.cpp~ casting.cpp~ class_order2.cpp~ class_order3.cpp~ class_order4.cpp~ class_order.cpp~ classes.cpp~ enums.cpp~ factory.cpp~ finalizables.cpp~ free_functions.cpp~ free_operators.cpp~ global_variables.cpp~ index_operator.cpp~ internal_classes.cpp~ member_functions.cpp~ member_variables.cpp~ noncopyable.cpp~ operators_bug.cpp~ optional.cpp~ optional_bug.cpp~ pointer_as_arg.cpp~ pointer_to_function_as_argument.cpp~ private_assign.cpp~ recursive.cpp~ regression1.cpp~ regression2.cpp~ regression3.cpp~ smart_pointers.cpp~ special_operators.cpp~ statics.cpp~ temprorary_variable.cpp~ unnamed_enums.cpp~ user_text.cpp~ abstract.exp call_policies.exp casting.exp class_order2.exp class_order3.exp class_order4.exp class_order.exp classes.exp enums.exp factory.exp finalizables.exp free_function_ignore_bug.exp free_functions.exp free_operators.exp global_variables.exp index_operator.exp internal_classes.exp member_functions.exp member_variables.exp module_body.exp namespaces.exp noncopyable.exp operators.exp operators_bug.exp optional.exp optional_bug.exp pointer_as_arg.exp pointer_to_function_as_argument.exp private_assign.exp recursive.exp regression1.exp regression2.exp regression3.exp smart_pointers.exp special_operators.exp statics.exp temprorary_variable.exp unnamed_enums.exp user_text.exp abstract.lib call_policies.lib casting.lib class_order2.lib class_order3.lib class_order4.lib class_order.lib classes.lib enums.lib factory.lib finalizables.lib free_function_ignore_bug.lib free_functions.lib free_operators.lib global_variables.lib index_operator.lib internal_classes.lib member_functions.lib member_variables.lib module_body.lib namespaces.lib noncopyable.lib operators.lib operators_bug.lib optional.lib optional_bug.lib pointer_as_arg.lib pointer_to_function_as_argument.lib private_assign.lib recursive.lib regression1.lib regression2.lib regression3.lib smart_pointers.lib special_operators.lib statics.lib temprorary_variable.lib unnamed_enums.lib user_text.lib abstract.obj call_policies.obj casting.obj class_order2.obj class_order3.obj class_order4.obj class_order.obj classes.obj enums.obj factory.obj finalizables.obj free_function_ignore_bug.obj free_functions.obj free_operators.obj global_variables.obj index_operator.obj internal_classes.obj member_functions.obj member_variables.obj module_body.obj namespaces.obj noncopyable.obj operators.obj operators_bug.obj optional.obj optional_bug.obj pointer_as_arg.obj pointer_to_function_as_argument.obj private_assign.obj recursive.obj regression1.obj regression2.obj regression3.obj smart_pointers.obj special_operators.obj statics.obj temprorary_variable.obj unnamed_enums.obj user_text.obj abstract.scons call_policies.scons casting.scons class_order2.scons class_order3.scons class_order4.scons class_order.scons classes.scons enums.scons factory.scons finalizables.scons free_function_ignore_bug.scons free_functions.scons free_operators.scons global_variables.scons index_operator.scons internal_classes.scons member_functions.scons member_variables.scons module_body.scons namespaces.scons noncopyable.scons operators.scons operators_bug.scons optional.scons optional_bug.scons pointer_as_arg.scons pointer_to_function_as_argument.scons private_assign.scons recursive.scons regression1.scons regression2.scons regression3.scons smart_pointers.scons special_operators.scons statics.scons temprorary_variable.scons unnamed_enums.scons user_text.scons abstract.dll call_policies.dll casting.dll class_order2.dll class_order3.dll class_order4.dll class_order.dll classes.dll enums.dll factory.dll finalizables.dll free_function_ignore_bug.dll free_functions.dll free_operators.dll global_variables.dll index_operator.dll .sconsign.dblite __array_1.pypp.hpp classes.cpp enums.cpp free_functions.cpp module_body.cpp namespaces.cpp unnamed_enums.cpp abstract.cpp call_policies.cpp casting.cpp class_order.cpp class_order2.cpp class_order3.cpp class_order4.cpp factory.cpp finalizables.cpp free_function_ignore_bug.cpp free_operators.cpp global_variables.cpp index_operator.cpp internal_classes.cpp member_functions.cpp member_variables.cpp noncopyable.cpp operators.cpp operators_bug.cpp optional.cpp optional_bug.cpp pointer_as_arg.cpp pointer_to_function_as_argument.cpp private_assign.cpp protected.cpp recursive.cpp regression1.cpp regression2.cpp regression3.cpp smart_pointers.cpp special_operators.cpp statics.cpp temprorary_variable.cpp user_text.cpp protected.dll protected.exp protected.lib protected.obj protected.scons indexing_suites.cpp indexing_suites.cpp~ indexing_suites.dll indexing_suites.exp indexing_suites.lib indexing_suites.obj indexing_suites.scons This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-23 06:55:45
|
Revision: 152 Author: roman_yakovenko Date: 2006-05-22 23:55:34 -0700 (Mon, 22 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=152&view=rev Log Message: ----------- adding vector indexing suite support Modified Paths: -------------- pyplusplus_dev/docs/history/history.rest pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2006-05-23 06:31:16 UTC (rev 151) +++ pyplusplus_dev/docs/history/history.rest 2006-05-23 06:55:34 UTC (rev 152) @@ -25,6 +25,8 @@ 5. Member variables, that are pointers exported correctly. +6. Adding experimental support for ``vector_indexing_suite``. + ------------- Version 0.7.0 ------------- Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-05-23 06:31:16 UTC (rev 151) +++ pyplusplus_dev/unittests/test_all.py 2006-05-23 06:55:34 UTC (rev 152) @@ -50,6 +50,7 @@ import factory_tester import private_assign_tester import protected_tester +import indexing_suites_tester def create_suite(times): testers = [ @@ -97,6 +98,7 @@ , factory_tester , private_assign_tester , protected_tester + , indexing_suites_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-23 20:19:26
|
Revision: 157 Author: roman_yakovenko Date: 2006-05-23 13:19:16 -0700 (Tue, 23 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=157&view=rev Log Message: ----------- fixing bug with hierarchy level 3 - adding unit tests Modified Paths: -------------- pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/hierarchy3_to_be_exported.hpp pyplusplus_dev/unittests/hierarchy3_tester.py Property Changed: ---------------- pyplusplus_dev/unittests/data/ Property changes on: pyplusplus_dev/unittests/data ___________________________________________________________________ Name: svn:ignore - *.obj + *.obj call_policies_to_be_exported.os Added: pyplusplus_dev/unittests/data/hierarchy3_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/hierarchy3_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/hierarchy3_to_be_exported.hpp 2006-05-23 20:19:16 UTC (rev 157) @@ -0,0 +1,24 @@ +// 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 __hierarchy3_to_be_exported_hpp__ +#define __hierarchy3_to_be_exported_hpp__ + +namespace hierarchy3{ + +struct grandpa_t{ + virtual int gp_pure(int i) = 0; +}; + +struct father_t : public grandpa_t{ + virtual int gp_pure(int i){ return i; } +}; + +struct son_t : public father_t +{}; + +} + +#endif//__hierarchy3_to_be_exported_hpp__ Added: pyplusplus_dev/unittests/hierarchy3_tester.py =================================================================== --- pyplusplus_dev/unittests/hierarchy3_tester.py (rev 0) +++ pyplusplus_dev/unittests/hierarchy3_tester.py 2006-05-23 20:19:16 UTC (rev 157) @@ -0,0 +1,44 @@ +# 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 pygccxml import declarations +from pyplusplus import code_creators + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'hierarchy3' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb ): + mb.build_code_creator( 'hierarchy3' ) + find = code_creators.creator_finder.find_by_declaration_single + matcher = declarations.match_declaration_t( name='son_t' + , type=declarations.class_t) + found = find( matcher, mb.code_creator.body.creators ) + self.failUnless( found ) + self.failUnless( not found.wrapper ) + self.failUnless( 0 == len( found.creators ) ) + + def run_tests(self, module): + pass + +def create_suite(): + suite = unittest.TestSuite() + suite.addTest( unittest.makeSuite(tester_t)) + return suite + +def run_suite(): + unittest.TextTestRunner(verbosity=2).run( create_suite() ) + +if __name__ == "__main__": + run_suite() \ No newline at end of file Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-05-23 19:48:13 UTC (rev 156) +++ pyplusplus_dev/unittests/test_all.py 2006-05-23 20:19:16 UTC (rev 157) @@ -50,7 +50,8 @@ import factory_tester import private_assign_tester import protected_tester -import indexing_suites_tester +import indexing_suites_tester +import hierarchy3_tester def create_suite(times): testers = [ @@ -98,7 +99,8 @@ , factory_tester , private_assign_tester , protected_tester - , indexing_suites_tester + , indexing_suites_tester + , hierarchy3_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-24 12:36:37
|
Revision: 160 Author: roman_yakovenko Date: 2006-05-24 05:36:11 -0700 (Wed, 24 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=160&view=rev Log Message: ----------- implementing first draft of member variable references Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/member_variables_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-05-23 21:11:16 UTC (rev 159) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-05-24 12:36:11 UTC (rev 160) @@ -464,7 +464,7 @@ indent = declaration_based.declaration_based_t.indent GET_TEMPLATE = os.linesep.join([ - 'static %(type)s get_%(name)s(%(class_type)s& inst) {' + 'static %(type)s get_%(name)s( %(class_type)s& inst ) {' , indent( 'return inst.%(name)s;' ) , '}' , '' @@ -488,10 +488,18 @@ def _get_class_inst_type( self ): return declarations.declarated_t( self.declaration.parent ) + + def _get_exported_var_type( self ): + type_ = declarations.remove_reference( self.declaration.type ) + type_ = declarations.remove_const( type_ ) + if declarations.is_fundamental( type_ ) or declarations.is_enum( type_ ): + return type_ + else: + return self.declaration.type def _get_getter_type(self): return declarations.free_function_type_t( - return_type=self.declaration.type + return_type=self._get_exported_var_type() , arguments_types=[ self._get_class_inst_type() ] ) getter_type = property( _get_getter_type ) @@ -501,19 +509,26 @@ def _get_setter_type(self): return declarations.free_function_type_t( - return_type=self.declaration.type - , arguments_types=[ self._get_class_inst_type(), self.declaration.type ] ) + return_type=declarations.void_t() + , arguments_types=[ self._get_class_inst_type(), self._get_exported_var_type() ] ) setter_type = property( _get_setter_type ) - def _get_has_setter( self ): - return not declarations.is_const( self.declaration.type ) + def _get_has_setter( self ): + if declarations.is_fundamental( self._get_exported_var_type() ): + return True + elif declarations.is_enum( self._get_exported_var_type() ): + return True + elif declarations.is_const( declarations.remove_reference( self.declaration.type ) ): + return False + else: + return True has_setter = property( _get_has_setter ) def _create_impl(self): answer = [] cls_type = algorithm.create_identifier( self, self.declaration.parent.decl_string ) - substitutions = dict( type=self.declaration.type.decl_string + substitutions = dict( type=self._get_exported_var_type().decl_string , class_type=cls_type , name=self.declaration.name ) answer.append( self.GET_TEMPLATE % substitutions ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-05-23 21:11:16 UTC (rev 159) +++ pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.py 2006-05-24 12:36:11 UTC (rev 160) @@ -9,8 +9,26 @@ class variable_t(decl_wrapper.decl_wrapper_t, declarations.variable_t): def __init__(self, *arguments, **keywords): declarations.variable_t.__init__(self, *arguments, **keywords ) - decl_wrapper.decl_wrapper_t.__init__( self ) - + decl_wrapper.decl_wrapper_t.__init__( self ) + self._call_policies = None + + def _get_call_policies( self ): + return self._call_policies + def _set_call_policies( self, call_policies ): + self._call_policies = call_policies + + __call_policies_doc__ = \ + """There are usecase, when exporting member variable forces pyplusplus to + create accessors functions. Sometime, those functions requires call policies. + To be more specific: when you export member variable that has reference or + pointer type, you need to tell boost.python library how to manage object + life-time. In all cases, pyplusplus will give reasonable default value. I am + sure, that there are use cases, when you need to change it. You should use this + property to change it. + """ + call_policies = property( _get_call_policies, _set_call_policies + , doc=__call_policies_doc__ ) + def _exportable_impl( self ): if not isinstance( self.parent, declarations.class_t ): return '' Modified: pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-05-23 21:11:16 UTC (rev 159) +++ pyplusplus_dev/pyplusplus/module_creator/call_policies_resolver.py 2006-05-24 12:36:11 UTC (rev 160) @@ -11,7 +11,7 @@ def __init__( self ): object.__init__( self ) - def __call__(self, calldef): + def __call__(self, decl): raise NotImplementedError() class default_policy_resolver_t(resolver_t): @@ -31,7 +31,9 @@ return None def __call__(self, calldef): - assert isinstance( calldef, declarations.calldef_t ) + if not isinstance( calldef, declarations.calldef_t ): + return None + if not isinstance( calldef, declarations.constructor_t ): return self._resolve_by_type( calldef.return_type ) else: @@ -45,7 +47,9 @@ resolver_t.__init__( self ) def __call__( self, calldef ): - assert isinstance( calldef, declarations.calldef_t ) + if not isinstance( calldef, declarations.calldef_t ): + return None + if isinstance( calldef, declarations.constructor_t ): return None return_type = declarations.remove_alias( calldef.return_type ) @@ -63,7 +67,9 @@ = declarations.pointer_t( declarations.const_t( declarations.wchar_t() ) ) def __call__(self, calldef): - assert isinstance( calldef, declarations.calldef_t ) + if not isinstance( calldef, declarations.calldef_t ): + return None + if isinstance( calldef, declarations.constructor_t ): return None @@ -82,6 +88,9 @@ resolver_t.__init__( self ) def __call__(self, calldef): + if not isinstance( calldef, declarations.calldef_t ): + return None + if not isinstance( calldef, declarations.member_operator_t ): return None @@ -98,7 +107,29 @@ return decl_wrappers.return_value_policy( decl_wrappers.copy_non_const_reference ) else: return decl_wrappers.return_internal_reference() - + +class variable_accessors_resolver_t( resolver_t ): + def __init__( self ): + resolver_t.__init__( self ) + + def __init__( self, variable ): + if not isinstance( variable, declarations.variable_t ): + return None + + if not declarations.is_reference( variable.type ): + return None + + no_ref = declarations.remove_reference( self.declaration.type ) + base_type = declarations.remove_const( no_ref ) + if declarations.is_fundamental( base_type ) or declarations.is_enum( base_type ): + #the relevant code creator will generate code, that will return this member variable + #by value + return decl_wrappers.default_call_policies() + + + return self.declaration.type + + class built_in_resolver_t(resolver_t): def __init__( self, config=None): resolver_t.__init__( self ) Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-23 21:11:16 UTC (rev 159) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-05-24 12:36:11 UTC (rev 160) @@ -251,8 +251,8 @@ return True if declarations.is_pointer( member.type ): return True - #if declarations.is_reference( member.type ): - #return True + if declarations.is_reference( member.type ): + return True if declarations.is_array( member.type ): return True if isinstance( member, declarations.class_t ): @@ -663,9 +663,9 @@ elif declarations.is_pointer( self.curr_decl.type ): wrapper = code_creators.member_variable_wrapper_t( variable=self.curr_decl ) maker = code_creators.member_variable_t( variable=self.curr_decl, wrapper=wrapper ) - #elif declarations.is_reference( self.curr_decl.type ): - #wrapper = code_creators.mem_var_ref_wrapper_t( variable=self.curr_decl ) - #maker = code_creators.mem_var_ref_t( variable=self.curr_decl, wrapper=wrapper ) + elif declarations.is_reference( self.curr_decl.type ): + wrapper = code_creators.mem_var_ref_wrapper_t( variable=self.curr_decl ) + maker = code_creators.mem_var_ref_t( variable=self.curr_decl, wrapper=wrapper ) else: maker = code_creators.member_variable_t( variable=self.curr_decl ) if wrapper: Modified: pyplusplus_dev/unittests/member_variables_tester.py =================================================================== --- pyplusplus_dev/unittests/member_variables_tester.py 2006-05-23 21:11:16 UTC (rev 159) +++ pyplusplus_dev/unittests/member_variables_tester.py 2006-05-24 12:36:11 UTC (rev 160) @@ -18,7 +18,8 @@ , *args ) def customize(self, mb ): - mb.variable( 'prefered_color' ).alias = 'PreferedColor' + mb.variable( 'prefered_color' ).alias = 'PreferedColor' + mb.classes().always_expose_using_scope = True def change_default_color( self, module ): module.point.default_color = module.point.color.blue This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-05-30 21:12:34
|
Revision: 186 Author: roman_yakovenko Date: 2006-05-30 14:12:23 -0700 (Tue, 30 May 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=186&view=rev Log Message: ----------- adding use case for default arguments, that are same as the class under registration Added Paths: ----------- pyplusplus_dev/unittests/data/vector3_to_be_exported.cpp pyplusplus_dev/unittests/data/vector3_to_be_exported.hpp pyplusplus_dev/unittests/vector3_tester.py Added: pyplusplus_dev/unittests/data/vector3_to_be_exported.cpp =================================================================== --- pyplusplus_dev/unittests/data/vector3_to_be_exported.cpp (rev 0) +++ pyplusplus_dev/unittests/data/vector3_to_be_exported.cpp 2006-05-30 21:12:23 UTC (rev 186) @@ -0,0 +1,14 @@ +// 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 "vector3_to_be_exported.hpp" + +namespace vector3{ + +const Vector3 Vector3::ZERO = Vector3( 0,0,0); + +}//statics + + Added: pyplusplus_dev/unittests/data/vector3_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/vector3_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/vector3_to_be_exported.hpp 2006-05-30 21:12:23 UTC (rev 186) @@ -0,0 +1,306 @@ +// 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 __vector3_to_be_exported_hpp__ +#define __vector3_to_be_exported_hpp__ + +namespace vector3{ + +class Vector3 +{ +public: + union { + struct { + float x, y, z; + }; + float val[3]; + }; + +public: + inline Vector3() + { + } + + inline Vector3( const float fX, const float fY, const float fZ ) + : x( fX ), y( fY ), z( fZ ) + { + } + + inline explicit Vector3( const float afCoordinate[3] ) + : x( afCoordinate[0] ), + y( afCoordinate[1] ), + z( afCoordinate[2] ) + { + } + + inline explicit Vector3( const int afCoordinate[3] ) + { + x = (float)afCoordinate[0]; + y = (float)afCoordinate[1]; + z = (float)afCoordinate[2]; + } + + inline explicit Vector3( float* const r ) + : x( r[0] ), y( r[1] ), z( r[2] ) + { + } + + inline explicit Vector3( const float scaler ) + : x( scaler ) + , y( scaler ) + , z( scaler ) + { + } + + + inline Vector3( const Vector3& rkVector ) + : x( rkVector.x ), y( rkVector.y ), z( rkVector.z ) + { + } + + inline float operator [] ( const unsigned int i ) const + { + return *(&x+i); + } + + inline float& operator [] ( const unsigned int i ) + { + return *(&x+i); + } + + /** Assigns the value of the other vector. + @param + rkVector The other vector + */ + inline Vector3& operator = ( const Vector3& rkVector ) + { + x = rkVector.x; + y = rkVector.y; + z = rkVector.z; + + return *this; + } + + inline Vector3& operator = ( const float fScaler ) + { + x = fScaler; + y = fScaler; + z = fScaler; + + return *this; + } + + inline bool operator == ( const Vector3& rkVector ) const + { + return ( x == rkVector.x && y == rkVector.y && z == rkVector.z ); + } + + inline bool operator != ( const Vector3& rkVector ) const + { + return ( x != rkVector.x || y != rkVector.y || z != rkVector.z ); + } + + // arithmetic operations + inline Vector3 operator + ( const Vector3& rkVector ) const + { + Vector3 kSum; + + kSum.x = x + rkVector.x; + kSum.y = y + rkVector.y; + kSum.z = z + rkVector.z; + + return kSum; + } + + inline Vector3 operator - ( const Vector3& rkVector ) const + { + Vector3 kDiff; + + kDiff.x = x - rkVector.x; + kDiff.y = y - rkVector.y; + kDiff.z = z - rkVector.z; + + return kDiff; + } + + inline Vector3 operator * ( const float fScalar ) const + { + Vector3 kProd; + + kProd.x = fScalar*x; + kProd.y = fScalar*y; + kProd.z = fScalar*z; + + return kProd; + } + + inline Vector3 operator * ( const Vector3& rhs) const + { + Vector3 kProd; + + kProd.x = rhs.x * x; + kProd.y = rhs.y * y; + kProd.z = rhs.z * z; + + return kProd; + } + + inline Vector3 operator / ( const float fScalar ) const + { + Vector3 kDiv; + + float fInv = 1.0 / fScalar; + kDiv.x = x * fInv; + kDiv.y = y * fInv; + kDiv.z = z * fInv; + + return kDiv; + } + + inline Vector3 operator / ( const Vector3& rhs) const + { + Vector3 kDiv; + + kDiv.x = x / rhs.x; + kDiv.y = y / rhs.y; + kDiv.z = z / rhs.z; + + return kDiv; + } + + + inline Vector3 operator - () const + { + Vector3 kNeg; + + kNeg.x = -x; + kNeg.y = -y; + kNeg.z = -z; + + return kNeg; + } + + // overloaded operators to help Vector3 + inline friend Vector3 operator * ( const float fScalar, const Vector3& rkVector ) + { + Vector3 kProd; + + kProd.x = fScalar * rkVector.x; + kProd.y = fScalar * rkVector.y; + kProd.z = fScalar * rkVector.z; + + return kProd; + } + + inline friend Vector3 operator + (const Vector3& lhs, const float rhs) + { + Vector3 ret(rhs); + return ret += lhs; + } + + inline friend Vector3 operator + (const float lhs, const Vector3& rhs) + { + Vector3 ret(lhs); + return ret += rhs; + } + + inline friend Vector3 operator - (const Vector3& lhs, const float rhs) + { + return lhs - Vector3(rhs); + } + + inline friend Vector3 operator - (const float lhs, const Vector3& rhs) + { + Vector3 ret(lhs); + return ret -= rhs; + } + + // arithmetic updates + inline Vector3& operator += ( const Vector3& rkVector ) + { + x += rkVector.x; + y += rkVector.y; + z += rkVector.z; + + return *this; + } + + inline Vector3& operator += ( const float fScalar ) + { + x += fScalar; + y += fScalar; + z += fScalar; + return *this; + } + + inline Vector3& operator -= ( const Vector3& rkVector ) + { + x -= rkVector.x; + y -= rkVector.y; + z -= rkVector.z; + + return *this; + } + + inline Vector3& operator -= ( const float fScalar ) + { + x -= fScalar; + y -= fScalar; + z -= fScalar; + return *this; + } + + inline Vector3& operator *= ( const float fScalar ) + { + x *= fScalar; + y *= fScalar; + z *= fScalar; + return *this; + } + + inline Vector3& operator *= ( const Vector3& rkVector ) + { + x *= rkVector.x; + y *= rkVector.y; + z *= rkVector.z; + + return *this; + } + + inline Vector3& operator /= ( const float fScalar ) + { + float fInv = 1.0 / fScalar; + + x *= fInv; + y *= fInv; + z *= fInv; + + return *this; + } + + inline Vector3& operator /= ( const Vector3& rkVector ) + { + x /= rkVector.x; + y /= rkVector.y; + z /= rkVector.z; + + return *this; + } + + inline float squaredLength () const + { + return x * x + y * y + z * z; + } + + void do_smth( const Vector3& x = ZERO ){} + // special points + static const Vector3 ZERO; + +}; + + +} + +#endif//__class_order_to_be_exported_hpp__ \ No newline at end of file Added: pyplusplus_dev/unittests/vector3_tester.py =================================================================== --- pyplusplus_dev/unittests/vector3_tester.py (rev 0) +++ pyplusplus_dev/unittests/vector3_tester.py 2006-05-30 21:12:23 UTC (rev 186) @@ -0,0 +1,42 @@ +# 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 + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'vector3' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + vec3 = mb.class_( 'Vector3' ) + mb.calldefs().use_keywords = False + vec3.add_code( 'add_property( "val", &vector3::Vector3::val)' ) + vec3.add_code( 'add_property( "x", &vector3::Vector3::x)' ) + vec3.add_code( 'add_property( "y", &vector3::Vector3::y)' ) + vec3.add_code( 'add_property( "z", &vector3::Vector3::z)' ) + + + def run_tests( self, module): + v3 = module.Vector3() + +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...> - 2006-06-02 18:21:22
|
Revision: 195 Author: roman_yakovenko Date: 2006-06-02 11:18:33 -0700 (Fri, 02 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=195&view=rev Log Message: ----------- excluding functions, that takes array as argument updating docs Modified Paths: -------------- pyplusplus_dev/docs/call_wrapper_policies/introduction.rest pyplusplus_dev/docs/comparisons/pyste.rest pyplusplus_dev/docs/examples/boost/boost.rest pyplusplus_dev/docs/examples/easybmp/easybmp.rest pyplusplus_dev/docs/history/history.rest pyplusplus_dev/docs/tutorials/module_builder/module_builder.rest pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml pyplusplus_dev/examples/pyboost_dev/rational_example.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/docs/call_wrapper_policies/introduction.rest =================================================================== --- pyplusplus_dev/docs/call_wrapper_policies/introduction.rest 2006-06-02 18:17:50 UTC (rev 194) +++ pyplusplus_dev/docs/call_wrapper_policies/introduction.rest 2006-06-02 18:18:33 UTC (rev 195) @@ -26,6 +26,8 @@ `pyplusplus`_ to generate right wrapper. Also, it will be possible to create a custom policies. +This document describes what is *going to be implemented*. + -------- Analysis -------- @@ -50,9 +52,9 @@ Variable names -------------- -I think it should be possible to apply few |cwp| on a single function. -The main, ( read unresolved ) issue, is management of variable names within -function-wrapper. I see next problems, that we should solve, before proceeding +I think it should be possible to apply few |cwp| on a single function. +The main, ( read unresolved ) issue, is management of variable names within +function-wrapper. I see next problems, that we should solve, before proceeding to implementation: 1. To share variable name, between different pieces of code. @@ -198,7 +200,7 @@ - size of array is some global/local variable - - ize of array is returned by invocation some function + - size of array is returned by invocation some function status as exception Modified: pyplusplus_dev/docs/comparisons/pyste.rest =================================================================== --- pyplusplus_dev/docs/comparisons/pyste.rest 2006-06-02 18:17:50 UTC (rev 194) +++ pyplusplus_dev/docs/comparisons/pyste.rest 2006-06-02 18:18:33 UTC (rev 195) @@ -8,54 +8,54 @@ What is `pyplusplus`_? ---------------------- -.. include:: ../definition.rest +.. include:: ../definition.rest ----------------- What is `Pyste`_? ----------------- -`Pyste`_ is a `boost.python`_ code generator. The user specifies the classes and -functions to be exported using a simple interface file, which following the -`boost.python`_'s philosophy, is simple `Python`_ code. `Pyste`_ then uses -`GCC-XML`_ to parse all the headers and extract the necessary information to +`Pyste`_ is a `boost.python`_ code generator. The user specifies the classes and +functions to be exported using a simple interface file, which following the +`boost.python`_'s philosophy, is simple `Python`_ code. `Pyste`_ then uses +`GCC-XML`_ to parse all the headers and extract the necessary information to automatically generate C++ code. -------- Preamble -------- -If you are reading this document, I can assume that you know what `boost.python`_, -`Pyste`_ and `pyplusplus`_ are. This document compares `Pyste`_ and `pyplusplus`_. +If you are reading this document, I can assume that you know what `boost.python`_, +`Pyste`_ and `pyplusplus`_ are. This document compares `Pyste`_ and `pyplusplus`_. I am going to compare: * user interface - + * design - + * dependencies - + * features list: - + * supported `boost.python`_ components - + * nice features -I did not develop `Pyste`_, so it is possible I made few mistakes in my -analyzes. If you identify one, please report it. I will try to fix it, as quick -as possible. In the past, I created bindings to few projects using `Pyste`_. -Code, generated by `Pyste`_, was pretty good and gave me a good start both with -my projects and with `boost.python`_ library. As for me, there are 2 main +I did not develop `Pyste`_, so it is possible I made few mistakes in my +analyzes. If you identify one, please report it. I will try to fix it, as quick +as possible. In the past, I created bindings to few projects using `Pyste`_. +Code, generated by `Pyste`_, was pretty good and gave me a good start both with +my projects and with `boost.python`_ library. As for me, there are 2 main problems with `Pyste`_: - 1. It is time consuming operation to maintain `Pyste`_ scripts in a big, + 1. It is time consuming operation to maintain `Pyste`_ scripts in a big, dynamic project. - + 2. It is very difficult to customize generated code. I will provide few examples later. I tried to fix `Pyste`_. At first, I developed `pygccxml`_ and tried to replace -relevant `Pyste`_ functionality. I did not like the result. After this, I dropped -the idea to fix `Pyste`_ and decided to develop new code generator - `pyplusplus`_. +relevant `Pyste`_ functionality. I did not like the result. After this, I dropped +the idea to fix `Pyste`_ and decided to develop new code generator - `pyplusplus`_. Later you will find few points, that explains, why I decided not to fix `Pyste`_. Have a nice reading. @@ -67,33 +67,33 @@ Pyste ----- -Carefully read `Pyste`_ definition - +Carefully read `Pyste`_ definition - - "... The user specifies the classes and functions to be exported using a simple - interface file, which following the `boost.python`_'s philosophy, is simple + "... The user specifies the classes and functions to be exported using a simple + interface file, which following the `boost.python`_'s philosophy, is simple `Python`_ code. ..." - -Simple interface file is an advantage and a disadvantage at the same time. The -advantage is obvious: it is easy to start to use. The disadvantage is less + +Simple interface file is an advantage and a disadvantage at the same time. The +advantage is obvious: it is easy to start to use. The disadvantage is less obvious - you can not work on whole exported library at once. - 1. Try to exclude all functions, that nth argument has some specific type. - + 1. Try to exclude all functions, that nth argument has some specific type. + 2. Try to exclude\\leave all classes, that belongs to some namespace. - + 3. Maintenance. Every time you add new file\\class to your project you should modify\\create `Pyste`_ interface files. 4. Try to set call policies to functions based on some detail\\fact. - -First and second example could be solved, but it is neither easy, nor obvious. -You should understand `Pyste`_ implementation details. Third example is solvable -if you are lucky and ready to write few `Python`_\\shell scripts. - "... AllFromHeader is broken in some cases. Until it is fixed, use at you own - risk. ..." +First and second example could be solved, but it is neither easy, nor obvious. +You should understand `Pyste`_ implementation details. Third example is solvable +if you are lucky and ready to write few `Python`_\\shell scripts. + "... AllFromHeader is broken in some cases. Until it is fixed, use at you own + risk. ..." + ---`Pyste`_ documentation. I have more examples, but I think you've got the idea. @@ -101,30 +101,30 @@ pyplusplus ---------- -`pyplusplus`_ has 2 user interfaces: +`pyplusplus`_ has 2 user interfaces: 1. GUI - small and simple graphic user interface, that does not request from user any knowledge about `boost.python`_ or `pyplusplus`_. You can see its `screenshot`_. - + 2. API - object-oriented framework, that helps you to create code generator, that suites your needs. `pyplusplus`_ framework consists 3 packages: - + 1. Code creators package. The only responsibility of classes in this - package is to create code. Those classes do not care where code is - going to be written. Neither they care about the order of generated - code. - + package is to create code. Those classes do not care where code is + going to be written. Neither they care about the order of generated + code. + 2. Module creator package. This is code creators factory. Classes in this package analyze C++ declarations and creates relevant code creators. - + 3. File writers package. This package contains classes that write generated code to file(s). -The good news: it is very easy to evaluate `pyplusplus`_, using GUI. The bad +The good news: it is very easy to evaluate `pyplusplus`_, using GUI. The bad news is that you should learn an other set of API's in order to complete your -task. It is not as awful as it sounds, but still there is some learning curve. - +task. It is not as awful as it sounds, but still there is some learning curve. + ------ Design ------ @@ -133,151 +133,151 @@ ----- `Pyste`_ design is not bad at all, but there were few mistakes made. First of all -current situation. There is a class hierarchy that represents C++ declarations -and types. There is *Exporter*'s hierarchy. There are 2 unrelated classes -*SingleCodeUnit* and *MultipleCodeUnit*. +current situation. There is a class hierarchy that represents C++ declarations +and types. There is *Exporter*'s hierarchy. There are 2 unrelated classes +*SingleCodeUnit* and *MultipleCodeUnit*. Class *Exporter* has few responsibilities: 1. to create code - + 2. to write code into code unit 3. to decide what, how and in which order declarations should be exported (excluded) - + Classes *SingleCodeUnit* and *MultipleCodeUnit* also has few responsibilities: 1. to write code into files - + 2. to control the order of written code - + pyplusplus ---------- -One of the biggest weaknesses of `Pyste`_ is a lack of good `GCC-XML`_ front-end -and this fact cause `Pyste`_ to generate not optimal code. I will prove this -later. In order to avoid such weakness, before I have created `pyplusplus`_, -I created `pygccxml`_. `pygccxml`_ is a stand alone project, that provides few -things: - +One of the biggest weaknesses of `Pyste`_ is a lack of good `GCC-XML`_ front-end +and this fact cause `Pyste`_ to generate not optimal code. I will prove this +later. In order to avoid such weakness, before I have created `pyplusplus`_, +I created `pygccxml`_. `pygccxml`_ is a stand alone project, that provides few +things: + * hierarchy of C++ declarations - + * hierarchy of C++ types - + * few parsing strategies: - + + all files will be parsed as it was one file that include all them - - + every file will be parsed alone, after this, duplicated declarations + + + every file will be parsed alone, after this, duplicated declarations and types will be removed `pygccxml`_ contributes in few ways to `pyplusplus`_: + `pyplusplus`_ has nothing to do with code parsing. Theoretically - an other back-end could be added to `pygccxml`_ without changing even one + an other back-end could be added to `pygccxml`_ without changing even one line of code within `pyplusplus`_. - + `pygccxml`_ has type traits. A lot of type traits algorithms from + + `pygccxml`_ has type traits. A lot of type traits algorithms from `boost.type_traits`_ library has been implemented. `pyplusplus`_ makes an extensive use of them: - + * identify "call policies" algorithm - + * code creator that generates body of "overridden" virtual functions: - :: + :: struct expensive_to_copy{...}; - - void do_smth( expensive_to_copy* x, const expensive_to_copy& y ){...} - + + void do_smth( expensive_to_copy* x, const expensive_to_copy& y ){...} + void do_smth(expensive_to_copy* x, const expensive_to_copy& y){ //Pyste generates next code //call_method< void >(self, "do_smth", x, y); //pyplusplus generates next code - *this->get_override("do_smth")( boost::python::ptr(x), boost::ref(y) ); + *this->get_override("do_smth")( boost::python::ptr(x), boost::ref(y) ); //------------------------------^^^^^^^^^^^^^^^^^^-----^^^^^^^^^^ } - - Do you see the difference? This is a prove to the point I made earlier: + + Do you see the difference? This is a prove to the point I made earlier: `Pyste`_ generates not optimal code. - - + Do you remember first 3 problems, I talked about? - 1. Try to exclude all functions, that nth argument has some specific type. - + + Do you remember first 3 problems, I talked about? + + 1. Try to exclude all functions, that nth argument has some specific type. + 2. Try to exclude\\leave all classes, that belongs to some namespace. - + 3. Maintenance. Every time you add new file\\class to your project you should modify\\create `Pyste`_ interface files. - They are solved by `pygccxml`_ package. Please take a look on `pygccxml`_ - `query intrface`__ documentation. - + They are solved by `pygccxml`_ package. Please take a look on `pygccxml`_ + `query interface`__ documentation. + .. __ : ./../../pygccxml/query_interface.html - + Now about mistakes. There is a gold rule: one class, one responsibility. `Pyste`_ breaks this rule. One more time *Exporter* class responsibilities: 1. to create code - + 2. to write code into code unit 3. to decide what, how and in which order declarations should be exported (excluded) What is wrong with this? In some places the logic of code generation is complex. -`Pyste`_ makes this situation worse. In order to understand my point try to see, +`Pyste`_ makes this situation worse. In order to understand my point try to see, what is going on, in "ClassExporter.py" file. Class *ClassExporter* knows everything about internal exporters, more over *ClassExporter* is responsible to -export all its base classes before it exports itself. This is just wrong. +export all its base classes before it exports itself. This is just wrong. `pyplusplus`_ implements better solution. `pyplusplus`_ has code creators class -hierarchy and factory, that creates those code creators based on given +hierarchy and factory, that creates those code creators based on given declarations. The questions like: - + * what should be the order of exporting declarations - - * could\\should the declaration be exported + * could \\ should the declaration be exported + * what are the call policies of the function - + * what is the class held type - + solved by the factory. The only thing that left to code creators is to create code. -By the way, it is not an easy task to fix this specific problem in `Pyste`_. -Serious re-factoring should be done. `pyplusplus`_ defines *compound_t* code -creator. *module_t*, *module_body_t*, *class_t* - are typical examples of -compound code creators. They do know few code creators, but that is all. +By the way, it is not an easy task to fix this specific problem in `Pyste`_. +Serious re-factoring should be done. `pyplusplus`_ defines *compound_t* code +creator. *module_t*, *module_body_t*, *class_t* - are typical examples of +compound code creators. They do know few code creators, but that is all. -An other weakness is a relationship between *Exporter*'s and code units. In -order to write code into code unit, *Exporter* should specify section name and -text. There are few problems with this. First of all, this tight coupling is -unnecessary. In order to add new *Exporter* you should understand the underlying -protocol and may be to modify code unit. Try to add *Exporter* that exposes -get\\set functions as property. It is not an easy task. An other problem, I see -here, is that code unit is some kind of *Exporter*. Code unit also creates code. -I did not fill good with this design. So I decided, that in `pyplusplus`_ code -should be created only by code creators. This decision simplifies a lot of +An other weakness is a relationship between *Exporter*'s and code units. In +order to write code into code unit, *Exporter* should specify section name and +text. There are few problems with this. First of all, this tight coupling is +unnecessary. In order to add new *Exporter* you should understand the underlying +protocol and may be to modify code unit. Try to add *Exporter* that exposes +get\\set functions as property. It is not an easy task. An other problem, I see +here, is that code unit is some kind of *Exporter*. Code unit also creates code. +I did not fill good with this design. So I decided, that in `pyplusplus`_ code +should be created only by code creators. This decision simplifies a lot of things: * code creators does not depend on file writers - + * file writers do not have to know all code creators - + * code creators set is not closed and could be extended - + * user can place custom code creator almost any where - + * code creators can take into account code that is going to be generated by other code creators. For example namespace aliases or include directives. - + * ... ------------ Dependencies ------------ -Both `Pyste`_ and `pyplusplus`_ introduce one external dependency. In order to +Both `Pyste`_ and `pyplusplus`_ introduce one external dependency. In order to parse XML `Pyste`_ uses `elementtree`_. On the other side `pyplusplus`_ depends on `pygccxml`_ project. @@ -288,71 +288,71 @@ version 0.8.0, does not implements next functionality, implemented by `Pyste`_: * *pow* operator - + * good documentation -Here you can find the complete features list of `pyplusplus`_. +Here you can find the complete features list of `pyplusplus`_. Features unique to `pyplusplus`_: * `pyplusplus`_ exposes protected member functions - + * `pyplusplus`_, in most cases, will automatically detect class held type - + * `pyplusplus`_ creates implicit conversion code for: - + + casting constructors - + + casting operators - + + smart pointers of derived and base class - + * class wrappers generated using `boost.python`_ wrapper class - - * operator() always exposed ( this is not the case with `Pyste`_ ) - + + * operator() always exposed ( this is not the case with `Pyste`_ ) + * operators defined in base class could be redefined/exposed in derived class - + * `pyplusplus`_ exposes bit fields member variables - + Nice features list ------------------ Both `Pyste`_ and `pyplusplus`_ generate working code. As we already saw in some -cases `pyplusplus`_ do better job. `pyplusplus`_ allows next customization on +cases `pyplusplus`_ do better job. `pyplusplus`_ allows next customization on generated code: - * To define std and user directories. *include_t* code creator will take + * To define std and user directories. *include_t* code creator will take those directories into account. - - * To define namespace alias. - :: - namespace dt = boost::date_time; + * To define namespace alias. + :: - All code, that is generated after this statement, will use ``dt`` instead of + namespace dt = boost::date_time; + + All code, that is generated after this statement, will use ``dt`` instead of ``boost::date_time``. This allows `pyplusplus`_ to create user friendly code. - + * Classes and functions support 2 modes of code generation. Example: - :: + :: struct world{ void set(std::string msg) { this->msg = msg; } std::string greet() { return msg; } std::string msg; }; - + First mode: - :: + :: class_<world>("world") .def("greet", &world::greet) .def("set", &world::set) ; - + Second mode: - :: + :: if( true ){ typedef class_<world> world_exposer_t; @@ -361,25 +361,25 @@ world_exposer.def( "greet", ( std::string ( world::* )() )( &world::greet ) ); world_exposer.def( "set", ( void ( world::* )(std::string) )( &world::set ) ); } - + Second mode is better then first, because: - + 1. It is easier to understand compilation error. - + 2. If in future a developer decide to create overload to some function, this code will continue to compile. - - * `pyplusplus`_ has small nice future - "license". User can specify the + + * `pyplusplus`_ has small nice future - "license". User can specify the license and it will appear in every generated file. - * `pyplusplus`_ allows user to define custom call policies resolver. See + * `pyplusplus`_ allows user to define custom call policies resolver. See boost.date_time example - * `pyplusplus`_ allows user to create custom code creators. See + * `pyplusplus`_ allows user to create custom code creators. See "custom_code_creator" example. - * real world examples: - + * real world examples: + + EasyBMP + boost.date_time @@ -392,27 +392,27 @@ If I were you I would choose `pyplusplus`_ to create bindings for your project. For very small projects or for educational reasons you may use `pyplusplus`_.GUI. -For big projects, you need flexibility and power of `pyplusplus`_. +For big projects, you need flexibility and power of `pyplusplus`_. ---- P.S. ---- -This comparison was a little unfair. First of all `Pyste`_ is no more under -active development\\support. Second, `Pyste`_ has been written 2 years ago and -had different goal. Next definitions will help you to understand the main +This comparison was a little unfair. First of all `Pyste`_ is no more under +active development\\support. Second, `Pyste`_ has been written 2 years ago and +had different goal. Next definitions will help you to understand the main difference between `Pyste`_ and `pyplusplus`_. `Pyste`_ - `Pyste`_ is `boost.python`_ code generator. - - `pyplusplus`_ - .. include:: ../definition.rest + `Pyste`_ is `boost.python`_ code generator. + `pyplusplus`_ + .. include:: ../definition.rest + `Pyste`_ and `pyplusplus`_ have been created to handle different tasks, hence -the difference in design, user interface and complexity. Bruno da Silva de -Oliveira, the `Pyste`_ author, understands the problems, I raised here. He -thought about them, long before I created `pyplusplus`_. But unfortunately, lack +the difference in design, user interface and complexity. Bruno da Silva de +Oliveira, the `Pyste`_ author, understands the problems, I raised here. He +thought about them, long before I created `pyplusplus`_. But unfortunately, lack of time and motivation prevents him to work on `Pyste`_. .. _`screenshot` : ./../tutorials/pyplusplus_demo.png Modified: pyplusplus_dev/docs/examples/boost/boost.rest =================================================================== --- pyplusplus_dev/docs/examples/boost/boost.rest 2006-06-02 18:17:50 UTC (rev 194) +++ pyplusplus_dev/docs/examples/boost/boost.rest 2006-06-02 18:18:33 UTC (rev 195) @@ -7,66 +7,66 @@ -------------- Introduction -------------- - -What is the `pyplusplus`_? --------------------------- - -.. include:: ./../../definition.rest - + +What is the `pyplusplus`_? +-------------------------- + +.. include:: ./../../definition.rest + What is the Boost? ------------------ -`Boost`_ is repository of free peer-reviewed portable C++ source libraries. - -`Boost`_ works on almost any modern operating system, including UNIX and Windows -variants. +`Boost`_ is repository of free peer-reviewed portable C++ source libraries. +`Boost`_ works on almost any modern operating system, including UNIX and Windows +variants. + Abstract -------- -`Boost`_ libraries have good interface, documentation and unit tests. -A lot of people contributed thier knowledge and expirience to those libraries. -Ten `Boost`_ libraries are already included in the `C++ Standards Committee's`_ -Library Technical Report ( `TR1`_ ) as a step toward becoming part of a future -C++ Standard. More Boost libraries are proposed for the upcoming `TR2`_. - -.. _`C++ Standards Committee's` : http://www.open-std.org/jtc1/sc22/wg21/ -.. _`TR1` : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1745.pdf -.. _`TR2` : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1810.html - - -I believe that `pyplusplus`_ is ready for hard work. It is quick, stable and -flexible. `pyplusplus`_ is a new tool and in my opinion I should prove its -usefulness. Using `pyplusplus`_, I exposed next libraries to Python: - - * `boost.date_time`_ - * `boost.crc`_ - * `boost.rational`_ - * `boost.random`_ - -There are few reasons I choose to expose those libraries. - -1. I used those libraries at my work. - -2. All those libraries have: +`Boost`_ libraries have good interface, documentation and unit tests. +A lot of people contributed their knowledge and experience to those libraries. +Ten `Boost`_ libraries are already included in the `C++ Standards Committee's`_ +Library Technical Report ( `TR1`_ ) as a step toward becoming part of a future +C++ Standard. More Boost libraries are proposed for the upcoming `TR2`_. +.. _`C++ Standards Committee's` : http://www.open-std.org/jtc1/sc22/wg21/ +.. _`TR1` : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1745.pdf +.. _`TR2` : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1810.html + + +I believe that `pyplusplus`_ is ready for hard work. It is quick, stable and +flexible. `pyplusplus`_ is a new tool and in my opinion I should prove its +usefulness. Using `pyplusplus`_, I exposed next libraries to Python: + + * `boost.date_time`_ + * `boost.crc`_ + * `boost.rational`_ + * `boost.random`_ + +There are few reasons I choose to expose those libraries. + +1. I used those libraries at my work. + +2. All those libraries have: + * good documentation * well defined interfaces - * clear concepts - * comprehensive unit tests - -3. I think, that Python is missing functionality provided by `boost.date_time`_ - and `boost.random`_ libraries. - -I spent different amount of time on each library. It took me one week, to expose -the `boost.date_time`_ library. I added few missing features to `pyplusplus`_, -polished the existing ones. Most of the time I spent translating tests from C++ -to `Python`_. It took me 3 days to expose all other libraries. - ---------------- -pyboost package ---------------- + * clear concepts + * comprehensive unit tests +3. I think, that Python is missing functionality provided by `boost.date_time`_ + and `boost.random`_ libraries. + +I spent different amount of time on each library. It took me one week, to expose +the `boost.date_time`_ library. I added few missing features to `pyplusplus`_, +polished the existing ones. Most of the time I spent translating tests from C++ +to `Python`_. It took me 3 days to expose all other libraries. + +--------------- +pyboost package +--------------- + Documentation ------------- Right now, pyboost package does not have a documentation. In my opinion it is @@ -76,48 +76,168 @@ Examples -------- +One picture worth thousends words. + random ~~~~~~ * C++ code: http://boost.org/libs/random/index.html - + * Python code: :: import time from pyboost import boost_random - | + + :: + rng = boost_random.mt19937( int( time.time() ) ) #setting initial seed six = boost_random.uniform_int(1,6) die = boost_random.variate_generator( rng, six ) - | + + :: + print die() +date_time +~~~~~~~~~ + +* C++ code: http://www.boost.org/doc/html/date_time/examples/general_usage_examples.html + +* Python code: + + :: + + import os + from pyboost import date_time + from pyboost.date_time import gregorian + from pyboost.date_time import posix_time + from pyboost.date_time import local_time + from pyboost.date_time import to_simple_string + + :: + + # + #Date programming + # + weekstart = gregorian.date(2002, date_time.Feb,1) + print 'weekstart: ', to_simple_string( weekstart ) + + :: + + weekend = weekstart + gregorian.weeks(1) + print 'weekend: ', to_simple_string( weekend ) + + :: + + today = gregorian.day_clock.local_day() + d2 = weekstart + gregorian.days(5) + if d2 >= today: #comparison operator + pass + + :: + + thisWeek = gregorian.date_period(today,d2) + if thisWeek.contains(today): + pass + + :: + + #date generator functions + d5 = gregorian.next_weekday(today, date_time.Sunday); #calculate Sunday following d4 + print 'd5: ', to_simple_string( d5 ) + + :: + + #US labor day is first Monday in Sept + first = gregorian.nth_day_of_the_week_in_month.first + labor_day = gregorian.nth_day_of_the_week_in_month(first, date_time.Monday, date_time.Sep) + #calculate a specific date for 2004 from functor + print 'labor day 2004: ', to_simple_string( labor_day.get_date(2004) ) + + :: + + # + #Time programming: + # + d = gregorian.date(2002,date_time.Feb,1)#an arbitrary date + t1 = posix_time.ptime(d, posix_time.hours(5) + posix_time.millisec(100)); #date + time of day offset + print 't1: ', to_simple_string( t1 ) + + :: + + t2 = t1 - posix_time.minutes(4) + posix_time.seconds(2) + print 't2: ', to_simple_string( t2 ) + + :: + + now = posix_time.second_clock.local_time(); #use the clock + print 'now: ', to_simple_string( now ) + today = now.date() #Get the date part out of the time + print 'today: ', to_simple_string( today ) + tomorrow = today + gregorian.date_duration(1) + print 'tomorrow: ', to_simple_string( tomorrow ) + + :: + + # + #Local time programming: + # + #setup some timezones for creating and adjusting times + #first time zone uses the time zone file for regional timezone definitions + tz_db = local_time.time_zone_database() + tz_db.load_from_file( os.path.join( date_time.__path__[0], "date_time_zonespec.csv") ) + nyc_tz = tz_db.time_zone_from_region("America/New_York") + #This timezone uses a posix time zone string definition to create a time zone + phx_tz = local_time.posix_time_zone("MST-07:00:00") + + :: + + #local departure time in phoenix is 11 pm on April 2 2005 + #Note that New York changes to daylight savings on Apr 3 at 2 am) + phx_departure = local_time.local_date_time( + gregorian.date(2005, date_time.Apr, 2) + , posix_time.hours(23) + , phx_tz + , local_time.local_date_time.NOT_DATE_TIME_ON_ERROR) + + :: + + flight_length = posix_time.hours(4) + posix_time.minutes(30) + phx_arrival = phx_departure + flight_length + #convert the phx time to a nyz time + nyc_arrival = phx_arrival.local_time_in(nyc_tz, posix_time.time_duration() ) + print "New York arrival: ", nyc_arrival.to_string() #//2005-Apr-03 06:30:00 EDT + + rational ~~~~~~~~ * C++ code: http://boost.org/libs/rational/rational_example.cpp * Python code: - + :: import unittest from pyboost import rational - - + + :: + half = rational.rational( 1, 2 ) one = rational.rational( 1 ) two = rational.rational( 2 ) - - + + :: + #Some basic checks assert half.numerator() == 1 assert half.denominator() == 2 assert float(half) == 0.5 - - + + :: + #Arithmetic assert half + half == one == 1 assert one - half == half @@ -137,14 +257,15 @@ import os import sys from pyboost import crc - - + + :: + if __name__ == '__main__': if sys.argv: files = sys.argv else: files = [ sys.executable ] - + try: result = crc.crc_32_type() for file_name in files: @@ -160,22 +281,22 @@ Download -------- -http://sourceforge.net/project/showfiles.php?group_id=118209. - - -.. _`boost.date_time` : http://boost.org/doc/html/date_time.html -.. _`boost.crc` : http://boost.org/libs/crc/index.html -.. _`boost.rational` : http://boost.org/libs/rational/index.html -.. _`boost.random` : http://boost.org/libs/random/index.html - +http://sourceforge.net/project/showfiles.php?group_id=118209. + +.. _`boost.date_time` : http://boost.org/doc/html/date_time.html +.. _`boost.crc` : http://boost.org/libs/crc/index.html +.. _`boost.rational` : http://boost.org/libs/rational/index.html +.. _`boost.random` : http://boost.org/libs/random/index.html + + .. _`environment.py`: http://cvs.sourceforge.net/viewcvs.py/pygccxml/source/pyplusplus/examples/py_easybmp/environment.py?view=markup .. _`sconstruct`: http://cvs.sourceforge.net/viewcvs.py/pygccxml/source/pyplusplus/examples/py_easybmp/sconstruct?view=markup .. _`Python`: http://www.python.org .. _`pygccxml`: http://www.language-binding.net/pygccxml/pygccxml.html .. _`boost.date_time`: http://boost.org/doc/html/date_time.html .. _`date_time`: http://boost.org/doc/html/date_time.html -.. _`boost`: http://www.boost.org +.. _`boost`: http://www.boost.org .. _`Boost`: http://www.boost.org .. _`boost.python`: http://www.boost.org/libs/python/doc/index.html .. _`boost.operators`: http://www.boost.org/ Modified: pyplusplus_dev/docs/examples/easybmp/easybmp.rest =================================================================== --- pyplusplus_dev/docs/examples/easybmp/easybmp.rest 2006-06-02 18:17:50 UTC (rev 194) +++ pyplusplus_dev/docs/examples/easybmp/easybmp.rest 2006-06-02 18:18:33 UTC (rev 195) @@ -11,35 +11,35 @@ What is EasyBMP? ------------------- -`EasyBMP`_ is a simple, cross-platform, open source (LGPL) C++ library designed -for easily reading, writing, and modifying Windows bitmap (BMP) image files. +`EasyBMP`_ is a simple, cross-platform, open source (LGPL) C++ library designed +for easily reading, writing, and modifying Windows bitmap (BMP) image files. In this example I am referring to version 0.70. What is `pyplusplus`_? ---------------------- -.. include:: ./../../definition.rest +.. include:: ./../../definition.rest ----------- Description ----------- -`pyplusplus`_ has been used to create `Python`_ bindings for `EasyBMP`_ -library. Before proceeding with this example, I should say, that I did not work -with `EasyBMP`_ at all. I have seen it's announcement on www.freshmeat.org site -and decided to test `pyplusplus`_ with "real world" project. It took me 30 -minutes to create full working python version of this library. This examples +`pyplusplus`_ has been used to create `Python`_ bindings for `EasyBMP`_ +library. Before proceeding with this example, I should say, that I did not work +with `EasyBMP`_ at all. I have seen it's announcement on www.freshmeat.org site +and decided to test `pyplusplus`_ with "real world" project. It took me 30 +minutes to create full working python version of this library. This examples consist few files and directories: 1. environment.py - contains different environment settings - 2. generate_code.py - contains source code needed to generate + 2. generate_code.py - contains source code needed to generate `boost.python`_ bindings for `EasyBMP`_ library. - + 3. sconstruct - build configuration file 4. generated - directory that contains all generated code and only it - + 5. unittests - directory that contains gray scale example from tutorials. C++ @@ -66,7 +66,7 @@ -------- http://sourceforge.net/project/showfiles.php?group_id=118209. - + .. _`pyplusplus` : ./../../pyplusplus.html .. _`environment.py`: http://cvs.sourceforge.net/viewcvs.py/pygccxml/source/pyplusplus/examples/py_easybmp/environment.py?view=markup .. _`sconstruct`: http://cvs.sourceforge.net/viewcvs.py/pygccxml/source/pyplusplus/examples/py_easybmp/sconstruct?view=markup Modified: pyplusplus_dev/docs/history/history.rest =================================================================== --- pyplusplus_dev/docs/history/history.rest 2006-06-02 18:17:50 UTC (rev 194) +++ pyplusplus_dev/docs/history/history.rest 2006-06-02 18:18:33 UTC (rev 195) @@ -3,74 +3,87 @@ ============================== .. contents:: Table of contents - -------------- -Version 0.8.0 -------------- - -1. `pyplusplus`_ "user guide" functionality has been improved. Now `pyplusplus`_ - can answer few questions: - - * why this declaration could not be exported - - * why this function could not be overriden from Python - -2. `pyplusplus`_ can suggest an alias for exported classes. - -3. Small redesign has been done - now it is much easier to understand and - maintain code creators, that creates code for C++ functions. - -4. Exception specification is taken into account, when `pyplusplus`_ exports - member functions. - -5. Member variables, that are pointers exported correctly. - + + +------------ +Contributors +------------ + +Thanks to all the people that have contributed patches, bug reports and suggestions: + + * My wife - Yulia + * John Pallister + * Matthias Baas + * Allen Bierbaum + * Lakin Wecker + +------------- +Version 0.8.0 +------------- + +1. `pyplusplus`_ "user guide" functionality has been improved. Now `pyplusplus`_ + can answer few questions: + + * why this declaration could not be exported + + * why this function could not be overriden from Python + +2. `pyplusplus`_ can suggest an alias for exported classes. + +3. Small redesign has been done - now it is much easier to understand and + maintain code creators, that creates code for C++ functions. + +4. Exception specification is taken into account, when `pyplusplus`_ exports + member functions. + +5. Member variables, that are pointers exported correctly. + 6. Adding experimental support for ``vector_indexing_suite``. -7. Bug fixes. - +7. Bug fixes. + ------------- Version 0.7.0 ------------- - -Many thanks to *Matthias Baas* and *Allen Bierbaum*! They contributed so much to -pyplusplus, especially Matthias: - - * New high level API: `pyplusplus`_ has simple and poweful API - - * Documentation: Matthias and Allen added a lot of documentation strings - - * Bug fixes and performance improvments +Many thanks to *Matthias Baas* and *Allen Bierbaum*! They contributed so much to +pyplusplus, especially Matthias: + + * New high level API: `pyplusplus`_ has simple and poweful API + + * Documentation: Matthias and Allen added a lot of documentation strings + + * Bug fixes and performance improvments + 1. New GUI features: - + * It is possible now to see XML generated by GCC-XML. - - * It is possible to use GUI as wizard. It will help you to start with + + * It is possible to use GUI as wizard. It will help you to start with pyplusplus, by generating pyplusplus code. 2. **Attention - non backward compatible change**. - ``module_creator.creator_t.__init__`` method has been changed. ``decls`` - argument could be interpreted as - + ``module_creator.creator_t.__init__`` method has been changed. ``decls`` + argument could be interpreted as + * list of all declaration to be exported - * list of top level declarations. ``creator_t`` should export all + * list of top level declarations. ``creator_t`` should export all declarations recursively. In order to clarify the use of ``decls`` argument new argument ``recursive`` has been added. By default new value of ``recursive`` is ``False``. - - Guide for users/upgraders: if use are exporting all declaration without - filtering, you should set ``recursive`` argument to ``True``. If you use - ``pygccxml.declarations.filtering.*`` functions, you have nothing to do. + Guide for users/upgraders: if use are exporting all declaration without + filtering, you should set ``recursive`` argument to ``True``. If you use + ``pygccxml.declarations.filtering.*`` functions, you have nothing to do. + Sorry for the inconvenience :-(. - + 3. Better split of extension module to files. From now next declarations will have dedicated file: - + * named enumerations, defined within namespace * unnamed enumerations and global variables * free functions @@ -79,63 +92,63 @@ one file, ``main.cpp``, to be very low. Also it is possible to implement solution, where ``main.cpp`` file does not contain templates instanitations at all. - + 4. Only constant casting operators could be used with ``implicitly_convertible``. This bug has been fixed. - + 5. Bug exporting non copyable class has been fixed. 6. Small bug fix - from now file with identical content will not be overwritten. - -7. Boost.Python ``optional`` is now supported and used when a constructor has a - a default argument. - -8. `pyplusplus`_ now generates correct code for hierarchy of abstract classes: - :: - - struct abstract1{ - virtual void do_smth() = 0; - } - - struct abstract2 : public abstract1{ - virtual void do_smth_else() = 0; - } - - struct concrete : public abstract2{ - virtual void do_smth(){}; - virtual void do_smth_else(){}; - } - -9. Logging functionality has been added - -10. New packages ``module_builder``, ``decl_wrappers`` and ``_logging_`` has - been added. - -11. ... - -http://boost.org/libs/python/doc/v2/init.html#optional-spec +7. Boost.Python ``optional`` is now supported and used when a constructor has a + a default argument. + +8. `pyplusplus`_ now generates correct code for hierarchy of abstract classes: + :: + + struct abstract1{ + virtual void do_smth() = 0; + } + + struct abstract2 : public abstract1{ + virtual void do_smth_else() = 0; + } + + struct concrete : public abstract2{ + virtual void do_smth(){}; + virtual void do_smth_else(){}; + } + +9. Logging functionality has been added + +10. New packages ``module_builder``, ``decl_wrappers`` and ``_logging_`` has + been added. + +11. ... + +http://boost.org/libs/python/doc/v2/init.html#optional-spec + ------------- Version 0.6.0 ------------- 1. Code repository has been introduced. This repository contains classes - and functions that will help users to export different C++ classes and + and functions that will help users to export different C++ classes and declarations. Right now this repository contains two classes: - + * *array_1_t* - + * *const_array_1_t* - Those classes helps to export static, single dimension arrays. - -2. Code generation has been improved. + Those classes helps to export static, single dimension arrays. -3. Code generation speed has been improved. +2. Code generation has been improved. -4. If you have Niall Douglas *void\** patch, then you can enjoy from +3. Code generation speed has been improved. + +4. If you have Niall Douglas *void\** patch, then you can enjoy from automatically set call policies. - + 5. Bit fields can be accessed from Python 6. Creating custom code creater example has been added. Modified: pyplusplus_dev/docs/tutorials/module_builder/module_builder.rest =================================================================== --- pyplusplus_dev/docs/tutorials/module_builder/module_builder.rest 2006-06-02 18:17:50 UTC (rev 194) +++ pyplusplus_dev/docs/tutorials/module_builder/module_builder.rest 2006-06-02 18:18:33 UTC (rev 195) @@ -40,7 +40,7 @@ module_builder_t.__init__ ------------------------- -First of all, what is needed in order to creates an instance of the class? +First of all, what is needed in order to create an instance of the class? ``module_builder_t.__init__`` methods takes few arguments: 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 2006-06-02 18:17:50 UTC (rev 194) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml 2006-06-02 18:18:33 UTC (rev 195) @@ -1,57 +1,57 @@ <?xml version="1.0"?> <GCC_XML cvs_revision="1.112"> - <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 _482 _483 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _501 _502 _503 _504 _505 _506 _508 _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 _621 _622 _623 _624 _625 _626 _627 _628 _629 _630 _631 _632 _633 _634 _635 _636 _638 _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 _766 _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 _819 _820 _821 _823 _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 _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 _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 _1106 _1108 _1110 _1111 _1112 _1113 _1114 _1115 _1116 _1117 _1118 _1119 _1120 _1121 _1122 _1123 _1124 _1125 _1126 _1127 _1128 _1129 _1130 _1131 _1132 _1133 _1135 _1134 _1137 _1139 _1141 _1143 _1144 _1145 _1146 _1147 _1148 _1149 _1150 _1151 _1152 _1153 _1155 _1156 _1157 _1158 _1160 _1161 _1163 _1164 _1166 _1167 _1169 _1171 _1173 _1175 _1177 _1179 _1181 _1183 _1185 _1186 _1187 _1188 _1189 _1190 _1191 _1105 _1107 _765 _1192 _1194 _1195 _1193 _1196 _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 _1241 _1242 _1243 _1244 _1245 _1247 _1249 _1250 _1251 _1252 _1253 _1255 _1256 _1257 _1258 _1260 _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 _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 _1478 _1479 _1480 _1481 _1482 _1483 _1484 _1485 _1486 _1487 _1488 _1489 _1491 _1490 _1492 _1493 _818 _1494 _1495 _1496 _1497 _1499 _1498 _1501 _1502 _1503 _1504 _1505 _1506 _1507 _1508 _1509 _1510 _1512 _1513 _1514 _1515 _1516 _1517 _1518 _1519 _1520 _1521 _1522 _1523 _1525 _1524 _1526 _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 _1562 _1563 _1564 _1565 _1566 _1567 _1568 _1569 _1570 _1571 _1573 _1574 _1575 _1576 _1577 _1578 _1579 _1580 _1581 _1582 _1583 _1584 _1585 _1586 _1587 _1588 _1589 _1590 _1591 _1592 _1593 _1594 _1561 _1595 _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 " mangled="_Z2::" demangled="::"/> - <Namespace id="_2" name="std" context="_1" members="_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 _1900 _1901 _1906 _1907 _1920 _1921 _1926 _1927 _1932 _1933 _1934 _1935 _1936 _1937 _1938 _1939 _1940 _1941 _1942 _1956 _1957 _1958 _1959 _1960 _1961 _1962 _1963 _1964 _1965 _1968 _1973 _1974 _1975 _1976 _1981 _1982 _1983 _1984 _1987 _1988 _1989 _1990 _1991 _1992 _1993 _1994 _1995 _1996 _1997 _2006 _2007 _2008 _2039 _2048 _2049 _2050 _2051 _2052 _2053 _2054 _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 _2100 _2101 _2142 _2143 _2144 _2162 _2163 _2203 _2205 _2206 _2207 _2268 _2281 _2290 _2307 _2308 _2313 _2315 _2316 _2317 _2324 _2325 _2326 _2449 _2450 _2451 _2452 _2453 _2454 _2455 _2456 _2457 _2459 _2461 _2463 _2465 _2467 _2469 _2471 _2473 _2475 _2477 _2479 _2481 _2483 _2485 _2487 _2489 _2491 _2493 _2495 _2497 _2499 _2501 _2503 _2505 _2507 _2509 _2510 _2515 _2516 _2517 _2518 _2519 _2520 _2521 _2522 _2523 _2524 _2525 _2526 _2527 _2528 _2530 _2531 _2532 _2533 _2534 _2535 _2536 _2537 _2538 _2540 _2542 _2561 _2562 _2563 _2564 _2565 _2566 _2567 _2568 _2569 _2632 _2633 _2634 _2635 _2636 _2637 _2638 _2647 _2648 _2649 " 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.hppWwecHb" returns="_1154" 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.hppWwecHb" returns="_1154" context="_1" location="f0:131" file="f0" line="131" endline="131"/> + <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 _482 _483 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _501 _502 _503 _504 _505 _506 _508 _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 _621 _622 _623 _624 _625 _626 _627 _628 _629 _630 _631 _632 _633 _634 _635 _636 _638 _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 _72... [truncated message content] |
From: <rom...@us...> - 2006-06-07 20:11:39
|
Revision: 209 Author: roman_yakovenko Date: 2006-06-05 02:35:05 -0700 (Mon, 05 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=209&view=rev Log Message: ----------- exception translator - just an idea Added Paths: ----------- pyplusplus_dev/unittests/cppexceptions_tester.py pyplusplus_dev/unittests/data/cppexceptions_to_be_exported.hpp Added: pyplusplus_dev/unittests/cppexceptions_tester.py =================================================================== --- pyplusplus_dev/unittests/cppexceptions_tester.py (rev 0) +++ pyplusplus_dev/unittests/cppexceptions_tester.py 2006-06-05 09:35:05 UTC (rev 209) @@ -0,0 +1,70 @@ +# 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 + +TRANSLATE_CODE = \ +""" +void translate(boost::python::object py_class, cppexceptions::custom_exception_t const& e){ + std::cout << "I am here"; + boost::python::object py_custom_exception = py_class(e); + boost::python::object type = py_custom_exception.attr( "__class__" ); + PyErr_SetObject( type.ptr(), py_custom_exception.ptr() ); +} + +""" + +REGISTER_CODE = \ +""" + boost::python::object py_class = custom_exception_t_exposer; + boost::python::register_exception_translator<cppexceptions::custom_exception_t>( + boost::bind( &translate, py_class, _2 ) ); + +""" + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'cppexceptions' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize( self, mb ): + mb.class_( 'custom_exception_t' ).add_code( REGISTER_CODE, False) + mb.build_code_creator( tester_t.EXTENSION_NAME ) + + mb.code_creator.add_include( "boost/bind.hpp" ) + mb.code_creator.add_include( "iostream" ) + translate = code_creators.custom_text_t( TRANSLATE_CODE ) + mb.code_creator.adopt_creator( translate, -1 ) + + def run_tests( self, module): + custom_exception_t = module.custom_exception_t + bases = list( custom_exception_t.__bases__ ) + [RuntimeError] + custom_exception_t.__bases__ = tuple( bases ) + custom_exception_t.__str__ = custom_exception_t.what + try: + module.throw_custom_exception() + except RuntimeError, error: + self.failUnless( str(error) == "profe of concept" ) + + + +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() Added: pyplusplus_dev/unittests/data/cppexceptions_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/cppexceptions_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/cppexceptions_to_be_exported.hpp 2006-06-05 09:35:05 UTC (rev 209) @@ -0,0 +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 __cppexceptions_to_be_exported_hpp__ +#define __cppexceptions_to_be_exported_hpp__ + +#include <string> + +namespace cppexceptions{ + +struct custom_exception_t{ + custom_exception_t( const std::string& error ) + : m_error( error ) + {} + + const std::string& what() const{ + return m_error; + } + +private: + const std::string m_error; +}; + +inline void throw_custom_exception(){ + throw custom_exception_t( "profe of concept" ); +} + +} + +#endif//__cppexceptions_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...> - 2006-06-17 18:12:06
|
Revision: 221 Author: roman_yakovenko Date: 2006-06-17 11:11:32 -0700 (Sat, 17 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=221&view=rev Log Message: ----------- adding indexing suite - first release Modified Paths: -------------- pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite.py pyplusplus_dev/pyplusplus/module_builder/__init__.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/pyplusplus/module_creator/types_database.py pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites_tester.py Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-06-17 18:11:32 UTC (rev 221) @@ -138,13 +138,22 @@ for operator in [ '>', '>=', '<=', '<', '-' ]: ptime.add_code( 'def( bp::self %s bp::self )' % operator ) - def beautify_code( self, mb ): + def beautify_code( self, mb ): + + def is_vector_of_strings( decl ): + if not declarations.vector_traits.is_vector( decl ): + return False + return declarations.is_std_string( declarations.vector_traits.value_type(decl) ) + + str_vec = mb.class_( is_vector_of_strings ) + str_vec.alias = "strings" + extmodule = mb.code_creator extmodule.add_namespace_usage( 'boost' ) extmodule.add_namespace_usage( 'boost::date_time' ) for full_ns_name, alias in customization_data.ns_aliases.items(): extmodule.add_namespace_alias( alias, full_ns_name ) - + def customize_extmodule( self, mb ): extmodule = mb.code_creator #beautifying include code generation 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 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/include/date_time.pypp.xml 2006-06-17 18:11:32 UTC (rev 221) @@ -2,8 +2,8 @@ <GCC_XML cvs_revision="1.112"> <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 _482 _483 _484 _485 _486 _487 _488 _489 _490 _491 _492 _493 _494 _495 _496 _497 _498 _499 _501 _502 _503 _504 _505 _506 _508 _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 _621 _622 _623 _624 _625 _626 _627 _628 _629 _630 _631 _632 _633 _634 _635 _636 _638 _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 _766 _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 _819 _820 _821 _823 _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 _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 _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 _1106 _1108 _1110 _1111 _1112 _1113 _1114 _1115 _1116 _1117 _1118 _1119 _1120 _1121 _1122 _1123 _1124 _1125 _1126 _1127 _1128 _1129 _1130 _1131 _1132 _1133 _1135 _1134 _1137 _1139 _1141 _1143 _1144 _1145 _1146 _1147 _1148 _1149 _1150 _1151 _1152 _1153 _1155 _1156 _1157 _1158 _1160 _1161 _1163 _1164 _1166 _1167 _1169 _1171 _1173 _1175 _1177 _1179 _1181 _1183 _1185 _1186 _1187 _1188 _1189 _1190 _1191 _1105 _1107 _765 _1192 _1194 _1195 _1193 _1196 _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 _1241 _1242 _1243 _1244 _1245 _1247 _1249 _1250 _1251 _1252 _1253 _1255 _1256 _1257 _1258 _1260 _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 _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 _1478 _1479 _1480 _1481 _1482 _1483 _1484 _1485 _1486 _1487 _1488 _1489 _1491 _1490 _1492 _1493 _818 _1494 _1495 _1496 _1497 _1499 _1498 _1501 _1502 _1503 _1504 _1505 _1506 _1507 _1508 _1509 _1510 _1512 _1513 _1514 _1515 _1516 _1517 _1518 _1519 _1520 _1521 _1522 _1523 _1525 _1524 _1526 _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 _1562 _1563 _1564 _1565 _1566 _1567 _1568 _1569 _1570 _1571 _1573 _1574 _1575 _1576 _1577 _1578 _1579 _1580 _1581 _1582 _1583 _1584 _1585 _1586 _1587 _1588 _1589 _1590 _1591 _1592 _1593 _1594 _1561 _1595 _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 " mangled="_Z2::" demangled="::"/> <Namespace id="_2" name="std" context="_1" members="_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 _1896 _1897 _1898 _1899 _1900 _1901 _1906 _1907 _1912 _1913 _1926 _1927 _1932 _1933 _1938 _1939 _1940 _1941 _1942 _1943 _1944 _1945 _1946 _1947 _1948 _1962 _1963 _1964 _1965 _1966 _1967 _1968 _1969 _1970 _1971 _1974 _1979 _1980 _1981 _1982 _1987 _1988 _1989 _1990 _1993 _1994 _1995 _1996 _1997 _1998 _1999 _2000 _2001 _2002 _2003 _2012 _2013 _2014 _2045 _2054 _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 _2106 _2107 _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.hppB25SPb" returns="_1154" 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.hppB25SPb" returns="_1154" context="_1" location="f0:131" file="f0" line="131" endline="131"/> + <Function id="_3" name="_GLOBAL__D__home_roman_pygccxml_sources_sources_pyplusplus_dev_examples_pyboost_dev_dev_date_time_include_date_time.pypp.hpp5J35cd" returns="_1154" 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.hpp5J35cd" returns="_1154" context="_1" location="f0:131" file="f0" line="131" endline="131"/> <Variable id="_5" name="_ZGVN5boost9date_time10date_facetINS_9gregorian4dateEcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE" type="_1248" context="_1" location="f1:372" file="f1" line="372" artificial="1"/> <Function id="_6" name="__static_initialization_and_destruction_0" returns="_1154" 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="_500" location="f0:131" file="f0" line="131"/> Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-17 18:11:32 UTC (rev 221) @@ -88,6 +88,7 @@ from class_declaration import class_t from class_declaration import class_wrapper_t +from class_declaration import class_declaration_t from instruction import instruction_t Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-17 18:11:32 UTC (rev 221) @@ -12,10 +12,71 @@ import smart_pointers import declaration_based import array_1_registrator -import indexing_suites import member_variable from pygccxml import declarations +class class_declaration_t( scoped.scoped_t ): + def __init__(self, class_inst, parent=None ): + scoped.scoped_t.__init__( self + , parent=parent + , declaration=class_inst ) + + def _generate_class_definition(self): + class_identifier = algorithm.create_identifier( self, '::boost::python::class_' ) + return declarations.templates.join( class_identifier, [self.decl_identifier] ) + + def _generate_code_no_scope(self): + result = [] + result.append( self._generate_class_definition() ) + for x in self.creators: + code = x.create() + tmpl = '%s.%s' + if self.is_comment( code ): + tmpl = '%s%s' + result.append( self.indent( tmpl % ( os.linesep, code ) ) ) + result.append( ';' ) + return ''.join( result ) + + def _get_class_var_name(self): + return self.alias + '_exposer' + class_var_name = property( _get_class_var_name ) + + def _generate_code_with_scope(self): + result = [] + scope_var_name = self.alias + '_scope' + typedef_name = self.class_var_name + '_t' + result.append( 'typedef ' + self._generate_class_definition() + ' ' + typedef_name + ';') + result.append( typedef_name + ' ' + self.class_var_name ) + result[-1] = result[-1] + ' = '+ typedef_name + '();' + + result.append( algorithm.create_identifier( self, '::boost::python::scope' ) ) + result[-1] = result[-1] + ' ' + scope_var_name + result[-1] = result[-1] + '( %s );' % self.class_var_name + + for x in self.creators: + if not ( x is used_init ): + if self._should_creator_be_exported_under_scope( x ): + result.append( x.create() ) + elif isinstance( x, custom.custom_t ) and x.works_on_instance == False: + result.append( '%s;' % x.create() ) + else: + result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) + + code = os.linesep.join( result ) + + result = [ 'if( true ){' ] + result.append( self.indent( code ) ) + result.append( '}' ) + + return os.linesep.join( result ) + + def _create_impl(self): + if self.declaration.always_expose_using_scope: + return self._generate_code_with_scope() + else: + return self._generate_code_no_scope() + + class class_t( scoped.scoped_t ): """ Creates boost.python code that needed to export a class @@ -146,6 +207,8 @@ used_init = inits[0] result.append( ", " ) result.append( used_init.create_init_code() ) + elif self.declaration.indexing_suite: + pass #in this case all constructors are exposed by indexing suite else:#it is possible to class to have public accessed constructor #that could not be exported by boost.python library #for example constructor takes as argument pointer to function @@ -187,9 +250,6 @@ if isinstance( inst, array_1_registrator.array_1_registrator_t ): return True - if isinstance( inst, indexing_suites.indexing_suite_t ): - return True - if isinstance( inst, member_variable.mem_var_ref_t ): return True Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-17 18:11:32 UTC (rev 221) @@ -5,26 +5,22 @@ import os import types -import scoped -import custom -import calldef import algorithm -import smart_pointers -import declaration_based -import array_1_registrator +import code_creator from pygccxml import declarations -class indexing_suite_t( scoped.scoped_t ): - def __init__(self, class_inst, suite_configuration, parent=None ): - scoped.scoped_t.__init__( self - , parent=parent - , declaration=class_inst ) - self._suite_configuration = suite_configuration +class indexing_suite_t( code_creator.code_creator_t ): + def __init__(self, parent=None ): + code_creator.code_creator_t.__init__( self, parent=parent ) - def _get_suite_configuration( self ): - return self._suite_configuration - suite_configuration = property( _get_suite_configuration ) + def _get_configuration( self ): + return self.parent.declaration.indexing_suite + configuration = property( _get_configuration ) + def _get_container( self ): + return self.parent.declaration + container = property( _get_container ) + class vector_indexing_suite_t( indexing_suite_t ): """ Creates boost.python code that needed to export a vector of some class @@ -33,39 +29,24 @@ # .def(vector_indexing_suite<std::vector<X> >()) #; - def __init__(self, class_inst, suite_configuration, parent=None ): - indexing_suite_t.__init__( self - , class_inst=class_inst - , suite_configuration=suite_configuration - , parent=parent ) + def __init__(self, parent=None ): + indexing_suite_t.__init__( self, parent=parent ) def _create_indexing_suite_declaration( self ): vector_indexing_suite = algorithm.create_identifier( self, 'boost::python::vector_indexing_suite' ) - container_identifier = algorithm.create_identifier( self, self.suite_configuration.container ) - container = declarations.templates.join( container_identifier, [ self.decl_identifier ] ) - args = [container] - if self.suite_configuration.derived_policies: - if self.suite_configuration.no_proxy: + args = [ self.container.decl_string ] + if self.configuration.derived_policies: + if self.configuration.no_proxy: args.append( 'true' ) else: args.append( 'false' ) - args.append( self.suite_configuration.derived_policies ) + args.append( self.configuration.derived_policies ) else: - if self.suite_configuration.no_proxy: + if self.configuration.no_proxy: args.append( 'true' ) return declarations.templates.join( vector_indexing_suite, args ) - def _create_class_declaration( self ): - class_ = algorithm.create_identifier( self, 'boost::python::class_' ) - container_identifier = algorithm.create_identifier( self, self.suite_configuration.container ) - container = declarations.templates.join( container_identifier, [ self.decl_identifier ] ) - return declarations.templates.join( class_, [ container ] ) - def _create_impl(self): - result = [] - result.append( self._create_class_declaration() + '("%s")' % self.suite_configuration.name ) - result.append( self.indent( ".def( %s() )" % self._create_indexing_suite_declaration() ) ) - result.append( ';' ) - return os.linesep.join( result ) - + return "def( %s() )" % self._create_indexing_suite_declaration() + \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/decl_wrappers/__init__.py 2006-06-17 18:11:32 UTC (rev 221) @@ -44,7 +44,6 @@ from calldef_wrapper import free_function_t from calldef_wrapper import free_operator_t -from class_wrapper import vector_indexing_suite_t from class_wrapper import class_declaration_t from class_wrapper import class_t @@ -58,8 +57,6 @@ from scopedef_wrapper import scopedef_t - - from pygccxml import declarations from call_policies import call_policy_t @@ -89,6 +86,10 @@ from user_text import user_text_t from user_text import class_user_text_t +from indexing_suite import indexing_suite_t +from indexing_suite import vector_suite_t + + class dwfactory_t( declarations.decl_factory_t ): """ declarations factory class Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-17 18:11:32 UTC (rev 221) @@ -3,24 +3,37 @@ # accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) +import user_text import decl_wrapper import scopedef_wrapper from pygccxml import declarations -import user_text +import indexing_suite as container_suites + + +def guess_indexing_suite( class_ ): + if declarations.vector_traits.is_vector( class_ ): + return container_suites.vector_suite_t( class_ ) -class vector_indexing_suite_t( object ): - def __init__( self, name, container='std::vector', no_proxy=False, derived_policies='' ): - object.__init__( self ) - self.name = name - self.container = container - self.no_proxy = no_proxy - self.derived_policies = derived_policies - +#this will only be exported if indexing suite is not None and only when needed class class_declaration_t(decl_wrapper.decl_wrapper_t, declarations.class_declaration_t): def __init__(self, *arguments, **keywords): declarations.class_declaration_t.__init__(self, *arguments, **keywords ) decl_wrapper.decl_wrapper_t.__init__( self ) + self._always_expose_using_scope = False + self._indexing_suite = None + def _get_always_expose_using_scope( self ): + 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 ) + + def _get_indexing_suite( self ): + if self._indexing_suite is None: + self._indexing_suite = guess_indexing_suite( self ) + return self._indexing_suite + indexing_suite = property( _get_indexing_suite ) + class class_t(scopedef_wrapper.scopedef_t, declarations.class_t): def __init__(self, *arguments, **keywords): declarations.class_t.__init__(self, *arguments, **keywords ) @@ -33,7 +46,7 @@ self._wrapper_alias = self._generate_valid_name() + "_wrapper" self._user_code = [] self._wrapper_user_code = [] - self._indexing_suites = [] + self._indexing_suite = None def _get_always_expose_using_scope( self ): return self._always_expose_using_scope @@ -89,11 +102,11 @@ self._wrapper_user_code = value wrapper_user_code = property( _get_wrapper_user_code, _set_wrapper_user_code ) - def _get_indexing_suites( self ): - return self._indexing_suites - def _set_indexing_suites( self, value ): - self._indexing_suites = value - indexing_suites = property( _get_indexing_suites, _set_indexing_suites ) + def _get_indexing_suite( self ): + if self._indexing_suite is None: + self._indexing_suite = guess_indexing_suite( self ) + return self._indexing_suite + indexing_suite = property( _get_indexing_suite ) def add_code( self, code, works_on_instance=True ): """works_on_instance: If true, the custom code can be applied directly to obj inst. Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite.py 2006-06-17 18:11:32 UTC (rev 221) @@ -17,23 +17,47 @@ # 5. shared_ptr class indexing_suite_t( object ): - def __init__( self, no_proxy=None, derived_policies=None ): + def __init__( self, container_class, no_proxy=None, derived_policies=None ): object.__init__( self ) self.__no_proxy = no_proxy self.__derived_policies = None + self.__container_class = container_class + def _get_container_class( self ): + return self.__container_class + container_class = property( _get_container_class ) + def value_type(self): raise NotImplementedError() def _get_no_proxy( self ): if self.__no_proxy is None: value_type = self.value_type() - if declaration.is_fundamental( value_type ): + if declarations.is_fundamental( value_type ) \ + or declarations.is_enum( value_type ) \ + or declarations.is_std_string( value_type ) \ + or declarations.is_std_wstring( value_type ) \ + or declarations.smart_pointer_traits.is_smart_pointer( value_type ): self.__no_proxy = True - elif declarations.is_enum( value_type ): - self.__no_proxy = True + else: + self.__no_proxy = False + return self.__no_proxy + def _set_no_proxy( self, no_proxy ): + self.__no_proxy = no_proxy + + no_proxy = property( _get_no_proxy, _set_no_proxy ) - - - \ No newline at end of file + def _get_derived_policies( self ): + return self.__derived_policies + def _set_derived_policied( self, derived_policies ): + self.__derived_policies = derived_policies + derived_policies = property( _get_derived_policies, _set_derived_policied ) + + +class vector_suite_t( indexing_suite_t ): + def __init__( self, cls ): + indexing_suite_t.__init__( self, cls ) + + def value_type( self ): + return declarations.vector_traits.value_type( self.container_class ) Modified: pyplusplus_dev/pyplusplus/module_builder/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/module_builder/__init__.py 2006-06-17 18:11:32 UTC (rev 221) @@ -43,8 +43,6 @@ from pyplusplus.decl_wrappers import variable_t from pyplusplus.decl_wrappers import scopedef_t -from pyplusplus.decl_wrappers import vector_indexing_suite_t - from pyplusplus.decl_wrappers import print_declarations import call_policies Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-17 18:11:32 UTC (rev 221) @@ -352,6 +352,20 @@ else: pass + def _treat_indexing_suite( self ): + if self.__types_db.used_vectors: + header = "boost/python/suite/indexing/vector_indexing_suite.hpp" + self.__extmodule.add_system_header( header ) + self.__extmodule.add_include( header=header ) + for cls in self.__types_db.used_vectors: + cls_creator = None + if isinstance( cls, declarations.class_t ): + cls_creator = code_creators.class_t( class_inst=cls ) + else: + cls_creator = code_creators.class_declaration_t( class_inst=cls ) + cls_creator.adopt_creator( code_creators.vector_indexing_suite_t() ) + self.__module_body.adopt_creator( cls_creator ) + def create(self, decl_headers=None): """Create and return the module for the extension. @@ -372,6 +386,7 @@ for operator in self.__free_operators: self._adopt_free_operator( operator ) self._treat_smart_pointers() + self._treat_indexing_suite() for creator in code_creators.make_flatten( self.__extmodule ): creator.target_configuration = self.__target_configuration #last action. @@ -382,16 +397,10 @@ for cls in self.__decls: if not isinstance( cls, decl_wrappers.class_t ): continue - if cls.indexing_suites: - self.__extmodule.add_system_header( "boost/python/suite/indexing/vector_indexing_suite.hpp" ) - include = code_creators.include_t( header="boost/python/suite/indexing/vector_indexing_suite.hpp" ) - self.__extmodule.adopt_include(include) - break for fn in declarations.declaration_files( self.__decls ): include = code_creators.include_t( header=fn ) self.__extmodule.adopt_include(include) - def guess_functions_code_creators( self ): maker_cls = None fwrapper_cls = None @@ -544,14 +553,7 @@ def visit_class_declaration(self ): pass - - def register_indexing_suites(self, class_decl, class_code_creator): - for suite in class_decl.indexing_suites: - assert isinstance( suite, decl_wrappers.vector_indexing_suite_t ) - creator = code_creators.vector_indexing_suite_t( class_inst=class_decl - , suite_configuration=suite ) - class_code_creator.adopt_creator( creator ) - + def visit_class(self ): if self.curr_decl.ignore: return @@ -608,8 +610,6 @@ self.curr_decl = temp_curr_decl self.curr_code_creator = temp_curr_parent - self.register_indexing_suites( self.curr_decl, self.curr_code_creator ) - def visit_enumeration(self): if self.curr_decl.ignore: return Modified: pyplusplus_dev/pyplusplus/module_creator/types_database.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-06-17 18:11:32 UTC (rev 221) @@ -16,7 +16,8 @@ self.__smart_ptrs = [ 'shared_ptr', 'auto_ptr' ] self.__fundamental_strs = declarations.FUNDAMENTAL_TYPES.keys() self.__normalize_data = [ ',', '<', '>', '*', '&', '(', ')', '::' ] - + self.__used_vectors = set() + def update( self, decl ): if isinstance( decl, declarations.calldef_t ): if not isinstance( decl, declarations.constructor_t ): @@ -45,8 +46,21 @@ answer = answer.replace( data + ' ', data ) answer = answer.replace( ' ' + data, data ) return answer.replace( ' ', ' ' ) + + def _update_containers_db( self, type ): + #will return True is type was treated + type = declarations.remove_alias( type ) + type = declarations.remove_pointer( type ) + type = declarations.remove_reference( type ) + may_be_vector = declarations.vector_traits.declaration_or_none( type ) + if not ( None is may_be_vector ): + self.__used_vectors.add( may_be_vector ) + return True + return False def _update_db( self, db, type_ ): + if self._update_containers_db( type_ ): + return decl_string = self._normalize( declarations.base_type( type_ ).decl_string ) if not templates.is_instantiation( decl_string ): return @@ -138,3 +152,7 @@ for db in dbs: self._print_single_db( db ) + def _get_used_vectors( self ): + return self.__used_vectors + used_vectors = property( _get_used_vectors ) + Modified: pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/unittests/data/indexing_suites_to_be_exported.hpp 2006-06-17 18:11:32 UTC (rev 221) @@ -24,6 +24,8 @@ int value; }; + +typedef std::vector<item_t> items_t; inline item_t get_value( const std::vector<item_t>& vec, unsigned int index ){ return vec.at(index); @@ -34,6 +36,9 @@ vec[index] = value; } +typedef std::vector<int> ivector; +ivector empty_ivector(){ return ivector(); } + } #endif//__indexing_suites_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/indexing_suites_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites_tester.py 2006-06-17 18:09:21 UTC (rev 220) +++ pyplusplus_dev/unittests/indexing_suites_tester.py 2006-06-17 18:11:32 UTC (rev 221) @@ -7,6 +7,7 @@ import sys import unittest import fundamental_tester_base +from pygccxml import declarations from pyplusplus import module_builder @@ -18,10 +19,20 @@ self , tester_t.EXTENSION_NAME , *args ) + + @staticmethod + def matcher( item, decl ): + if not declarations.vector_traits.is_vector( decl ): + return False + value_type = declarations.vector_traits.value_type(decl) + if item is value_type: + return True + return False def customize(self, generator): - item_cls = generator.class_( 'item_t' ) - item_cls.indexing_suites.append( module_builder.vector_indexing_suite_t( 'items_t' ) ) + item = generator.class_( 'item_t' ) + items = generator.class_( lambda decl: self.matcher( item, decl ) ) + items.alias = "items_t" def run_tests( self, module): items = module.items_t() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-18 17:31:22
|
Revision: 228 Author: roman_yakovenko Date: 2006-06-18 10:31:12 -0700 (Sun, 18 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=228&view=rev Log Message: ----------- adding test for default args Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/filters.py pyplusplus_dev/unittests/test_all.py Modified: pygccxml_dev/pygccxml/declarations/filters.py =================================================================== --- pygccxml_dev/pygccxml/declarations/filters.py 2006-06-18 13:33:59 UTC (rev 227) +++ pygccxml_dev/pygccxml/declarations/filters.py 2006-06-18 17:31:12 UTC (rev 228) @@ -202,8 +202,6 @@ if not isinstance( decl, self.decl_type ): return False if not None is self.name: - if 'SubMeshLodGeometryLink' in decl.decl_string: - i = 0 if not self.check_name( decl ): return False if not None is self.header_dir and decl.location: Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-06-18 13:33:59 UTC (rev 227) +++ pyplusplus_dev/unittests/test_all.py 2006-06-18 17:31:12 UTC (rev 228) @@ -53,6 +53,7 @@ import indexing_suites_tester import hierarchy3_tester import vector3_tester +import default_args_tester def create_suite(times): testers = [ @@ -102,7 +103,8 @@ , protected_tester , indexing_suites_tester , hierarchy3_tester - , vector3_tester + , vector3_tester + , default_args_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-25 10:40:50
|
Revision: 248 Author: roman_yakovenko Date: 2006-06-25 03:40:38 -0700 (Sun, 25 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=248&view=rev Log Message: ----------- removing precompiled_header_t code creator Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/include.py pyplusplus_dev/pyplusplus/code_creators/module.py pyplusplus_dev/unittests/module_properties_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-25 05:33:28 UTC (rev 247) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-25 10:40:38 UTC (rev 248) @@ -31,8 +31,7 @@ from module_body import module_body_t -from include import include_t -from include import precompiled_header_t +from include import include_t from unnamed_enum import unnamed_enum_t Modified: pyplusplus_dev/pyplusplus/code_creators/include.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/include.py 2006-06-25 05:33:28 UTC (rev 247) +++ pyplusplus_dev/pyplusplus/code_creators/include.py 2006-06-25 10:40:38 UTC (rev 248) @@ -38,22 +38,3 @@ return '#include <%s>' % normalize_header else: return '#include "%s"' % normalize_header - -class precompiled_header_t(include_t): - """ - Creates C++ code for precompiled header include directive - """ - - def __init__( self, header, parent=None ): - include_t.__init__(self, header, parent) - - def _create_impl(self): - answer = [ include_t._create_impl(self) ] - answer.append( '#ifdef _MSC_VER' ) - answer.append( self.indent( '#pragma hdrstop' ) ) - answer.append( '#endif //_MSC_VER' ) - return os.linesep.join( answer ) - - - - \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/code_creators/module.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/module.py 2006-06-25 05:33:28 UTC (rev 247) +++ pyplusplus_dev/pyplusplus/code_creators/module.py 2006-06-25 10:40:38 UTC (rev 248) @@ -148,34 +148,6 @@ """ self.adopt_creator( include_creator, self.last_include_index() + 1 ) - def _get_precompiled_header(self): - first_include = self.creators[ self.first_include_index() ] - if isinstance( first_include, include.precompiled_header_t ): - return first_include - else: - return None - - def _set_precompiled_header(self, precompiled_header): - assert isinstance( precompiled_header, types.StringTypes ) \ - or isinstance( precompiled_header, include.precompiled_header_t ) - - if not isinstance(precompiled_header, include.precompiled_header_t): - precompiled_header = include.precompiled_header_t( precompiled_header ) - #from here I deal with precompiled_header_t instance - - include_starts = self.first_include_index() - first_include = self.creators[ include_starts ] - if isinstance( first_include, include.precompiled_header_t ): - self.remove_creator( first_include ) - self.adopt_creator( precompiled_header, include_starts ) - - includes = filter( lambda creator: isinstance( creator, include.include_t ) - , self.creators[include_starts+1:] ) - for include_ in includes: - if include_.header == first_include.header: - self.remove_creator( include_ ) - precompiled_header = property( _get_precompiled_header, _set_precompiled_header ) - def do_include_dirs_optimization(self): include_dirs = self._get_include_dirs() includes = filter( lambda creator: isinstance( creator, include.include_t ) Modified: pyplusplus_dev/unittests/module_properties_tester.py =================================================================== --- pyplusplus_dev/unittests/module_properties_tester.py 2006-06-25 05:33:28 UTC (rev 247) +++ pyplusplus_dev/unittests/module_properties_tester.py 2006-06-25 10:40:38 UTC (rev 248) @@ -14,16 +14,16 @@ def __init__(self, *args ): unittest.TestCase.__init__(self, *args) - def test_precompiled_header(self): - extmodule = module_creator.create( [], 'X' ) - self.failUnless( not extmodule.precompiled_header ) - extmodule.precompiled_header = 'boost/python.hpp' - self.failUnless( isinstance( extmodule.precompiled_header - , code_creators.precompiled_header_t ) ) - extmodule.precompiled_header \ - = code_creators.precompiled_header_t( 'boost/date_time.hpp' ) - self.failUnless( isinstance( extmodule.precompiled_header - , code_creators.precompiled_header_t ) ) + #~ def test_precompiled_header(self): + #~ extmodule = module_creator.create( [], 'X' ) + #~ self.failUnless( not extmodule.precompiled_header ) + #~ extmodule.precompiled_header = 'boost/python.hpp' + #~ self.failUnless( isinstance( extmodule.precompiled_header + #~ , code_creators.precompiled_header_t ) ) + #~ extmodule.precompiled_header \ + #~ = code_creators.precompiled_header_t( 'boost/date_time.hpp' ) + #~ self.failUnless( isinstance( extmodule.precompiled_header + #~ , code_creators.precompiled_header_t ) ) 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...> - 2006-06-28 09:16:57
|
Revision: 259 Author: roman_yakovenko Date: 2006-06-28 02:16:40 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=259&view=rev Log Message: ----------- adding unit test for indexing suite 2 Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/module_creator/types_database.py pyplusplus_dev/unittests/fundamental_tester_base.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp pyplusplus_dev/unittests/indexing_suites2_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 08:45:46 UTC (rev 258) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 09:16:40 UTC (rev 259) @@ -58,6 +58,9 @@ def _get_container_traits( self ): return self._get_container_traits() container_traits = property( _get_container_traits ) + + def value_type( self ): + return self.__container_traits.value_type( self.container_class ) def _get_call_policies( self ): #TODO find out call policies Modified: pyplusplus_dev/pyplusplus/module_creator/types_database.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-06-28 08:45:46 UTC (rev 258) +++ pyplusplus_dev/pyplusplus/module_creator/types_database.py 2006-06-28 09:16:40 UTC (rev 259) @@ -65,7 +65,7 @@ return False try: - #checking whether value_type could be extracted + #checking whether value_type could be extracted container_cls.indexing_suite.value_type() except RuntimeError, error: msg = 'WARNING: pyplusplus found "%s" instantiation declaration, ' % container_cls.name Added: pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/indexing_suites2_to_be_exported.hpp 2006-06-28 09:16:40 UTC (rev 259) @@ -0,0 +1,44 @@ +// 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 __indexing_suites2_to_be_exported_hpp__ +#define __indexing_suites2_to_be_exported_hpp__ + +#include <vector> + +namespace indexing_suites2 { + +//~ struct item_t{ + //~ item_t() : value( -1 ){} + + //~ bool operator==(item_t const& item) const { + //~ return value == item.value; + //~ } + + //~ bool operator!=(item_t const& item) const { + //~ return value != item.value; + //~ } + + //~ int value; +//~ }; + + +//~ typedef std::vector<item_t> items_t; + +//~ inline item_t get_value( const std::vector<item_t>& vec, unsigned int index ){ + //~ return vec.at(index); +//~ } + +//~ inline void set_value( std::vector<item_t>& vec, unsigned int index, item_t value ){ + //~ vec.at(index); + //~ vec[index] = value; +//~ } + +typedef std::vector<int> ivector; +ivector empty_ivector(){ return ivector(); } + +} + +#endif//__indexing_suites2_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2006-06-28 08:45:46 UTC (rev 258) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2006-06-28 09:16:40 UTC (rev 259) @@ -17,7 +17,7 @@ class fundamental_tester_base_t( unittest.TestCase ): SUFFIX_TO_BE_EXPORTED = '_to_be_exported.hpp' - def __init__(self, module_name, *args ): + def __init__(self, module_name, indexing_suite_version=1, *args ): unittest.TestCase.__init__(self, *args) self.__module_name = module_name self.__to_be_exported_header \ @@ -28,7 +28,8 @@ , self.__module_name + '.cpp' ) self.__generated_scons_file_name = os.path.join( autoconfig.build_dir , self.__module_name + '.scons' ) - + self.__indexing_suite_version = indexing_suite_version + def failIfRaisesAny(self, callableObj, *args, **kwargs): try: callableObj(*args, **kwargs) @@ -53,7 +54,8 @@ mb = module_builder.module_builder_t( [self.__to_be_exported_header] , gccxml_path=autoconfig.gccxml.executable , include_paths=[autoconfig.boost.include] - , undefine_symbols=['__MINGW32__'] ) + , undefine_symbols=['__MINGW32__'] + , indexing_suite_version=self.__indexing_suite_version) self.customize( mb ) if not mb.has_code_creator(): mb.build_code_creator( self.__module_name ) Added: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py (rev 0) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2006-06-28 09:16:40 UTC (rev 259) @@ -0,0 +1,56 @@ +# 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 pygccxml import declarations +from pyplusplus import module_builder + + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'indexing_suites2' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , 2 + , *args ) + + #~ @staticmethod + #~ def matcher( item, decl ): + #~ if not declarations.vector_traits.is_my_case( decl ): + #~ return False + #~ value_type = declarations.vector_traits.value_type(decl) + #~ if item is value_type: + #~ return True + #~ return False + + #~ def customize(self, generator): + #~ item = generator.class_( 'item_t' ) + #~ items = generator.class_( lambda decl: self.matcher( item, decl ) ) + #~ items.alias = "items_t" + + def run_tests( self, module): + iv = module.ivector() + #~ items = module.items_t() + #~ item = module.item_t() + #~ item.value = 1977 + #~ items.append( item ) + #~ self.failUnless( module.get_value( items, 0 ).value == 1977 ) + #~ self.failUnless( len( items ) == 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/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-06-28 08:45:46 UTC (rev 258) +++ pyplusplus_dev/unittests/test_all.py 2006-06-28 09:16:40 UTC (rev 259) @@ -52,7 +52,8 @@ import factory_tester import private_assign_tester import protected_tester -import indexing_suites_tester +import indexing_suites_tester +import indexing_suites2_tester import hierarchy3_tester import vector3_tester import default_args_tester @@ -109,6 +110,7 @@ , default_args_tester , abstract_classes_tester , classes_tester + , indexing_suites2_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-28 09:49:26
|
Revision: 258 Author: roman_yakovenko Date: 2006-06-28 01:45:46 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=258&view=rev Log Message: ----------- one more step towards indexing suite 2 Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/__init__.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/pyplusplus/code_creators/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/code_creators/__init__.py 2006-06-28 08:45:46 UTC (rev 258) @@ -106,3 +106,4 @@ from array_1_registrator import array_1_registrator_t from indexing_suites import indexing_suite1_t +from indexing_suites import indexing_suite2_t Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 08:45:46 UTC (rev 258) @@ -13,6 +13,7 @@ import declaration_based import array_1_registrator import member_variable +import indexing_suites from pygccxml import declarations class class_declaration_t( scoped.scoped_t ): @@ -64,9 +65,9 @@ code = os.linesep.join( result ) - result = [ 'if( true ){' ] + result = [ '{ //scope begin' ] result.append( self.indent( code ) ) - result.append( '}' ) + result.append( '} //scope end' ) return os.linesep.join( result ) @@ -239,6 +240,8 @@ return ''.join( result ) def _should_creator_be_exported_under_scope(self, inst ): + if isinstance( inst, ( indexing_suites.indexing_suite1_t, indexing_suites.indexing_suite2_t ) ): + return False if isinstance( inst, declaration_based.declaration_based_t ) \ and isinstance( inst.declaration , ( declarations.enumeration_t, declarations.class_t ) ): @@ -290,9 +293,9 @@ code = os.linesep.join( result ) - result = [ 'if( true ){' ] + result = [ '{ //scope begin' ] result.append( self.indent( code ) ) - result.append( '}' ) + result.append( '} //scope end' ) return os.linesep.join( result ) Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 08:45:46 UTC (rev 258) @@ -10,16 +10,16 @@ import declaration_based from pygccxml import declarations -class indexing_suite1_t( code_creator.code_creator_t ): - def __init__(self, parent=None ): - code_creator.code_creator_t.__init__( self, parent=parent ) +class indexing_suite1_t( declaration_based.declaration_based_t ): + def __init__(self, container, parent=None ): + declaration_based.declaration_based_t.__init__( self, declaration=container, parent=parent ) def _get_configuration( self ): - return self.parent.declaration.indexing_suite + return self.declaration.indexing_suite configuration = property( _get_configuration ) def _get_container( self ): - return self.parent.declaration + return self.declaration container = property( _get_container ) def guess_suite_name( self ): @@ -46,20 +46,14 @@ return "def( %s() )" % self._create_suite_declaration() -#class indexing_suite2_t( code_creator.code_creator_t ): - #class value_traits_t( declaration_based_t ): - #def __init__( self, container_class, parent=None ): - #declaration_based_t.__init__( declaration=container_class, parent=parent ) +class indexing_suite2_t( declaration_based.declaration_based_t ): + def __init__(self, container, parent=None ): + declaration_based.declaration_based_t.__init__( self, declaration=container, parent=parent ) + + def _get_configuration( self ): + return self.declaration.indexing_suite + configuration = property( _get_configuration ) - #def _create_impl( self - - #def __init__(self, parent=None ): - #code_creator.code_creator_t.__init__( self, parent=parent ) - - #def _get_configuration( self ): - #return self.parent.declaration.indexing_suite - #configuration = property( _get_configuration ) - - #def _get_container( self ): - #return self.parent.declaration - #container = property( _get_container ) + def _create_impl( self ): + container_suite = algorithm.create_identifier(self, "::boost::python::indexing::container_suite" ) + return "def( %s< %s >() )" % ( container_suite, self.decl_identifier ) \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/decl_wrappers/class_wrapper.py 2006-06-28 08:45:46 UTC (rev 258) @@ -7,7 +7,7 @@ import decl_wrapper import scopedef_wrapper from pygccxml import declarations -import indexing_suite as isuite1 +import indexing_suite1 as isuite1 import indexing_suite2 as isuite2 class class_common_impl_details_t( object ): @@ -27,7 +27,11 @@ indexing_suite_version = property( _get_indexing_suite_version, _set_indexing_suite_version ) def _get_always_expose_using_scope( self ): - return self._always_expose_using_scope + #I am almost sure this logic should be moved to code_creators + if isinstance( self.indexing_suite, isuite2.indexing_suite2_t ) \ + and ( self.indexing_suite.disable_methods or self.indexing_suite.disabled_methods_groups ): + return True + 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 ) @@ -91,12 +95,6 @@ self._null_constructor_body = '' self._copy_constructor_body = '' - def _get_always_expose_using_scope( self ): - 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 ) - def _get_redefine_operators( self ): return self._redefine_operators def _set_redefine_operators( self, new_value ): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 08:45:46 UTC (rev 258) @@ -4,30 +4,53 @@ # http://www.boost.org/LICENSE_1_0.txt) from pygccxml import declarations -#NoProxy -#By default indexed elements have Python reference semantics and are returned by -#proxy. This can be disabled by supplying true in the NoProxy template parameter. -#When we want to disable is: -#1. We deal with immutable objects: -# 1. fundamental types -# 2. enum type -# 3. std::[w]string -# 4. std::complex -# 5. shared_ptr +""" +method_len +method_iter +method_getitem +method_getitem_slice +method_index +method_contains +method_count +method_has_key +method_setitem +method_setitem_slice +method_delitem +method_delitem_slice +method_reverse +method_append +method_insert +method_extend +method_sort +slice_methods = method_getitem_slice | method_setitem_slice | method_delitem_slice +search_methods = method_index | method_contains | method_count | method_has_key +reorder_methods = method_sort | method_reverse +insert_methods = method_append | method_insert | method_extend +""" + + class indexing_suite2_t( object ): + METHODS = ( 'len', 'iter', 'getitem', 'getitem_slice', 'index', 'contains' + , 'count', 'has_key', 'setitem', 'setitem_slice', 'delitem' + , 'delitem_slice', 'reverse', 'append', 'insert', 'extend', 'sort' ) + + METHOD_GROUPS = { + 'slice_methods' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) + , 'search_methods' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) + , 'reorder_methods' : ( 'method_sort', 'method_reverse' ) + , 'insert_methods' : ( 'method_append', 'method_insert', 'method_extend' ) + } + def __init__( self, container_class, container_traits ): object.__init__( self ) self.__call_policies = None self.__container_class = container_class self.__container_traits = container_traits - self.__disable_len = None - self.__disable_slices = None - self.__disable_search = None - self.__disable_reorder = None - self.__disable_extend = None - self.__disable_insert = None - + self._disabled_methods = set() + self._disabled_groups = set() + self._default_applied = False + def _get_container_class( self ): return self.__container_class container_class = property( _get_container_class ) @@ -43,46 +66,42 @@ self.__call_policies = call_policies call_policies = property( _get_call_policies, _set_call_policies ) - def _get_disable_len( self ): - return self.__disable_len - def _set_disable_len( self, value ): - self.__disable_len = value - disable_len = property( _get_disable_len, _set_disable_len ) + def __apply_defaults_if_needed( self ): + if self._default_applied: + return + self._default_applied = True + #find out what operators are supported by value_type and + #then configure the _disable_[methods|groups] + pass + + def disable_method( self, method_name ): + assert method_name in self.METHODS + self.__apply_defaults_if_needed() + self._disabled_methods.add( method_name ) + + def enable_method( self, method_name ): + assert method_name in self.METHODS + self.__apply_defaults_if_needed() + if method_name in self._disabled_methods: + self._disabled_methods.remove( method_name ) - def _get_disable_slices( self ): - return self.__disable_slices - def _set_disable_slices( self, value ): - self.__disable_slices = value - disable_slices = property( _get_disable_slices, _set_disable_slices ) + def _get_disabled_methods( self ): + self.__apply_defaults_if_needed() + return self._disabled_methods + disable_methods = property( _get_disabled_methods ) + + def disable_methods_group( self, group_name ): + assert group_name in self.METHOD_GROUPS + self.__apply_defaults_if_needed() + self._disabled_groups.add( group_name ) + + def enable_methods_group( self, group_name ): + assert group_name in self.METHOD_GROUPS + self.__apply_defaults_if_needed() + if group_name in self._disabled_groups: + self._disabled_groups.remove( group_name ) - def _get_disable_search( self ): #need operator== - if None is self.__disable_search: - value_type = self.container_traits.value_type( self.container_class ) - if not declarations.has_public_equal( value_type ): - self.__disable_search = True - return self.__disable_search - def _set_disable_search( self, value ): - self.__disable_search = value - disable_search = property( _get_disable_search, _set_disable_search ) - - def _get_disable_reorder( self ): #need operator< - if None is self.__disable_reorder: - value_type = self.container_traits.value_type( self.container_class ) - if not declarations.has_public_less( value_type ): - self.__disable_reorder = True - return self.__disable_reorder - def _set_disable_reorder( self, value ): - self.__disable_reorder = value - disable_reorder = property( _get_disable_reorder, _set_disable_reorder ) - - def _get_disable_extend( self ): - return self.__disable_extend - def _set_disable_extend( self, value ): - self.__disable_extend = value - disable_extend = property( _get_disable_extend, _set_disable_extend ) - - def _get_disable_insert( self ): - return self.__disable_insert - def _set_disable_insert( self, value ): - self.__disable_insert = value - disable_insert = property( _get_disable_insert, _set_disable_insert ) + def _get_disabled_methods_groups( self ): + self.__apply_defaults_if_needed() + return self._disabled_groups + disabled_methods_groups = property( _get_disabled_methods_groups ) \ No newline at end of file Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 08:45:46 UTC (rev 258) @@ -370,28 +370,49 @@ return #supported container : [ header file, is already used ] + isuite1 = { 'vector<' : [ "boost/python/suite/indexing/vector_indexing_suite.hpp", False ] , 'map<' : [ "boost/python/suite/indexing/map_indexing_suite.hpp", False ] } + #include <boost/python/suite/indexing/vector.hpp> + + container_suite_header_was_used = False + container_suite_header = "boost/python/suite/indexing/container_suite.hpp" + isuite2 = { + 'vector<' : [ "boost/python/suite/indexing/vector.hpp", False ] + } + for cls in self.__types_db.used_containers: container_name = cls.name.split( '<' )[0] + '<' + + if isinstance( cls.indexing_suite, decl_wrappers.indexing_suite1_t ): + isuite = isuite1 + else: + isuite = isuite2 + if not isuite1.has_key( container_name ): continue #not supported - if not cls.name.startswith( 'vector<') and not cls.name.startswith( 'map<'): - continue - if not isuite1[ container_name ][1]: + if isuite is isuite2 and not container_suite_header_was_used: + container_suite_header_was_used = True + self.__extmodule.add_system_header( container_suite_header ) + self.__extmodule.add_include( container_suite_header ) + + if not isuite[ container_name ][1]: isuite1[ container_name ][1] = True - self.__extmodule.add_system_header( isuite1[ container_name ][0] ) - self.__extmodule.add_include( header=isuite1[ container_name ][0] ) + self.__extmodule.add_system_header( isuite[ container_name ][0] ) + self.__extmodule.add_include( header=isuite[ container_name ][0] ) cls_creator = create_cls_cc( cls ) - value_type = cls.indexing_suite.value_type() - if declarations.is_class( value_type ) and not declarations.has_public_equal( value_type ): - cls_creator.adopt_creator( create_explanation( cls ) ) - cls_creator.adopt_creator( code_creators.indexing_suite1_t() ) + if isuite is isuite1: + value_type = cls.indexing_suite.value_type() + if declarations.is_class( value_type ) and not declarations.has_public_equal( value_type ): + cls_creator.adopt_creator( create_explanation( cls ) ) + cls_creator.adopt_creator( code_creators.indexing_suite1_t(cls) ) + else: + cls_creator.adopt_creator( code_creators.indexing_suite2_t(cls) ) self.__module_body.adopt_creator( cls_creator ) def create(self, decl_headers=None): Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-06-28 05:28:23 UTC (rev 257) +++ pyplusplus_dev/unittests/test_all.py 2006-06-28 08:45:46 UTC (rev 258) @@ -4,7 +4,9 @@ # http://www.boost.org/LICENSE_1_0.txt) import sys import unittest - + +import classes_tester +import abstract_classes_tester import algorithms_tester import module_body_tester import enums_tester @@ -105,6 +107,8 @@ , hierarchy3_tester , vector3_tester , default_args_tester + , abstract_classes_tester + , classes_tester ] main_suite = unittest.TestSuite() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-28 14:32:55
|
Revision: 260 Author: roman_yakovenko Date: 2006-06-28 07:32:24 -0700 (Wed, 28 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=260&view=rev Log Message: ----------- Adding works_on_instance to base class of all code creators. This small refactoring was a must, in order to add indexing suite 2 functionality. Otherwise, the generated code could not be compiled. Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/code_creator.py pyplusplus_dev/pyplusplus/code_creators/custom.py pyplusplus_dev/pyplusplus/code_creators/enum.py pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/fundamental_tester_base.py pyplusplus_dev/unittests/indexing_suites2_tester.py pyplusplus_dev/unittests/test_all.py Modified: pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/array_1_registrator.py 2006-06-28 14:32:24 UTC (rev 260) @@ -18,6 +18,7 @@ code_creator.code_creator_t.__init__(self, parent=parent) self._array_type = array_type self._call_policies = self._guess_call_policies() + self.works_on_instance = False def _get_array_type( self ): return self._array_type Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-28 14:32:24 UTC (rev 260) @@ -6,14 +6,10 @@ import os import types import scoped -import custom import calldef import algorithm import smart_pointers import declaration_based -import array_1_registrator -import member_variable -import indexing_suites from pygccxml import declarations class class_declaration_t( scoped.scoped_t ): @@ -21,6 +17,7 @@ scoped.scoped_t.__init__( self , parent=parent , declaration=class_inst ) + self.works_on_instance = False def _generate_class_definition(self): class_identifier = algorithm.create_identifier( self, '::boost::python::class_' ) @@ -41,6 +38,12 @@ def _get_class_var_name(self): return self.alias + '_exposer' class_var_name = property( _get_class_var_name ) + + def is_exposed_using_scope(self): + if self.declaration.always_expose_using_scope: + return True + return bool( filter( lambda cc: not cc.works_on_instance, self.creators ) ) + def _generate_code_with_scope(self): result = [] @@ -54,14 +57,13 @@ result[-1] = result[-1] + ' ' + scope_var_name result[-1] = result[-1] + '( %s );' % self.class_var_name - for x in self.creators: - if not ( x is used_init ): - if self._should_creator_be_exported_under_scope( x ): - result.append( x.create() ) - elif isinstance( x, custom.custom_t ) and x.works_on_instance == False: - result.append( '%s;' % x.create() ) - else: - result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) + for x in creators: + if x is used_init: + continue + if not x.works_on_instance: + result.append( x.create() ) + else: + result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) code = os.linesep.join( result ) @@ -72,7 +74,7 @@ return os.linesep.join( result ) def _create_impl(self): - if self.declaration.always_expose_using_scope: + if self.is_exposed_using_scope: return self._generate_code_with_scope() else: return self._generate_code_no_scope() @@ -87,6 +89,7 @@ , parent=parent , declaration=class_inst ) self._wrapper = wrapper + self.works_on_instance = False def _get_wrapper( self ): return self._wrapper @@ -239,25 +242,6 @@ result.append( ';' ) return ''.join( result ) - def _should_creator_be_exported_under_scope(self, inst ): - if isinstance( inst, ( indexing_suites.indexing_suite1_t, indexing_suites.indexing_suite2_t ) ): - return False - if isinstance( inst, declaration_based.declaration_based_t ) \ - and isinstance( inst.declaration - , ( declarations.enumeration_t, declarations.class_t ) ): - return True - # If there is a custom text that won't apply as call on instance - if isinstance( inst, custom.custom_t ) and inst.works_on_instance == False: - return True - - if isinstance( inst, array_1_registrator.array_1_registrator_t ): - return True - - if isinstance( inst, member_variable.mem_var_ref_t ): - return True - - return False - def _get_class_var_name(self): return self.alias + '_exposer' class_var_name = property( _get_class_var_name ) @@ -283,13 +267,12 @@ creators = self.creators + self._get_base_operators(base_classes, base_creators) for x in creators: - if not ( x is used_init ): - if self._should_creator_be_exported_under_scope( x ): - result.append( x.create() ) - elif isinstance( x, custom.custom_t ) and x.works_on_instance == False: - result.append( '%s;' % x.create() ) - else: - result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) + if x is used_init: + continue + if not x.works_on_instance: + result.append( x.create() ) + else: + result.append( '%s.%s;' % ( self.class_var_name, x.create() ) ) code = os.linesep.join( result ) @@ -300,9 +283,9 @@ return os.linesep.join( result ) def is_exposed_using_scope(self): - scoped_exporters = filter( lambda x: self._should_creator_be_exported_under_scope( x ) - , self.creators ) - return bool( self.declaration.always_expose_using_scope or scoped_exporters ) + if self.declaration.always_expose_using_scope: + return True + return bool( filter( lambda cc: not cc.works_on_instance, self.creators ) ) def _create_impl(self): if self.is_exposed_using_scope(): Modified: pyplusplus_dev/pyplusplus/code_creators/code_creator.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/code_creator.py 2006-06-28 14:32:24 UTC (rev 260) @@ -34,7 +34,15 @@ assert isinstance( parent, code_creator_t ) self._parent = parent self._target_configuration = None + self._works_on_instance = True + + def _get_works_on_instance(self): + return self._works_on_instance + def _set_works_on_instance(self, works_on_instance): + self._works_on_instance = works_on_instance + works_on_instance = property( _get_works_on_instance, _set_works_on_instance ) + def _get_parent( self ): return self._parent def _set_parent( self, new_parent ): Modified: pyplusplus_dev/pyplusplus/code_creators/custom.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/custom.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/custom.py 2006-06-28 14:32:24 UTC (rev 260) @@ -12,13 +12,7 @@ Ex: ObjInst."CustomCode" """ code_creator.code_creator_t.__init__(self, parent) - self._works_on_instance = works_on_instance - - def _get_works_on_instance(self): - return self._works_on_instance - def _set_works_on_instance(self, works_on_instance): - self._works_on_instance = works_on_instance - works_on_instance = property( _get_works_on_instance, _set_works_on_instance ) + self.works_on_instance = works_on_instance def _create_impl(self): raise NotImplementedError() Modified: pyplusplus_dev/pyplusplus/code_creators/enum.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/enum.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/enum.py 2006-06-28 14:32:24 UTC (rev 260) @@ -15,6 +15,7 @@ declaration_based.declaration_based_t.__init__( self , parent=parent , declaration=enum) + self.works_on_instance = False def _get_value_aliases(self): return self.declaration.value_aliases Modified: pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/indexing_suites.py 2006-06-28 14:32:24 UTC (rev 260) @@ -49,11 +49,60 @@ class indexing_suite2_t( declaration_based.declaration_based_t ): def __init__(self, container, parent=None ): declaration_based.declaration_based_t.__init__( self, declaration=container, parent=parent ) + self.__method_mask_var_name = "methods_mask" + self.works_on_instance = not self.does_user_disable_methods() - def _get_configuration( self ): - return self.declaration.indexing_suite - configuration = property( _get_configuration ) - + def does_user_disable_methods( self ): + return bool( self.declaration.indexing_suite.disabled_methods_groups ) \ + or bool( self.declaration.indexing_suite.disable_methods ) + + def generate_algorithm_mask( self ): + indexing = algorithm.create_identifier(self, "::boost::python::indexing" ) + disable = [] + for group in self.declaration.indexing_suite.disabled_methods_groups: + group_id = algorithm.create_identifier(self, "::boost::python::indexing::%s_methods" % group ) + disable.append( group_id ) + for method in self.declaration.indexing_suite.disable_methods: + method_id = algorithm.create_identifier(self, "::boost::python::indexing::method_" + method ) + disable.append( method_id ) + answer = [ 'unsigned long const %s = ' % self.__method_mask_var_name ] + answer.append( algorithm.create_identifier(self, "::boost::python::indexing::all_methods" ) ) + answer.append( ' & ~' ) + if 1 == len ( disable ): + answer.append( disable[0] ) + else: + answer.append( '( ' ) + answer.append( ' | '.join( disable ) ) + answer.append( ' ) ' ) + answer.append( ';' ) + return ''.join( answer ) + def _create_impl( self ): - container_suite = algorithm.create_identifier(self, "::boost::python::indexing::container_suite" ) - return "def( %s< %s >() )" % ( container_suite, self.decl_identifier ) \ No newline at end of file + answer = [] + if self.does_user_disable_methods(): + answer.append( self.generate_algorithm_mask() ) + answer.append( os.linesep ) + if not self.works_on_instance: + answer.append( '%s.def( ' % self.parent.class_var_name) + else: + answer.append( 'def( ' ) + answer.append( algorithm.create_identifier(self, "::boost::python::indexing::container_suite" ) ) + answer.append( '< ' ) + answer.append( self.decl_identifier ) + if self.does_user_disable_methods(): + answer.append( self.PARAM_SEPARATOR ) + answer.append( self.__method_mask_var_name ) + answer.append( ' >' ) + if self.declaration.indexing_suite.call_policies: + answer.append( '::with_policies(%s)' + % self.declaration.indexing_suite.call_policies.create( self ) ) + else: + answer.append( '()' ) + answer.append( ' )' ) + if not self.works_on_instance: + answer.append( ';' ) + return ''.join( answer ) + + + + Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-06-28 14:32:24 UTC (rev 260) @@ -426,6 +426,7 @@ , wrapper=wrapper , parent=parent) self.param_sep = os.linesep + self.indent( self.PARAM_SEPARATOR, 2 ) + self.works_on_instance = False def _create_getter( self ): answer = ['def'] Modified: pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/smart_pointers.py 2006-06-28 14:32:24 UTC (rev 260) @@ -42,6 +42,7 @@ declaration_based.declaration_based_t.__init__( self, class_creator.declaration, parent ) self._smart_ptr = smart_ptr self._class_creator = class_creator + self.works_on_instance = False def _get_smart_ptr( self ): return self._smart_ptr @@ -76,6 +77,7 @@ declaration_based.declaration_based_t.__init__( self, source, parent ) self._target = target self._smart_ptr = smart_ptr + self.works_on_instance = False def _get_target(self): return self._target Modified: pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/code_creators/unnamed_enum.py 2006-06-28 14:32:24 UTC (rev 260) @@ -13,7 +13,8 @@ declaration_based.declaration_based_t.__init__( self , parent=parent , declaration=unnamed_enum) - + self.works_on_instance = False + def _get_value_aliases(self): return self.declaration.value_aliases def _set_value_aliases(self, value_aliases): Modified: pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/decl_wrappers/indexing_suite2.py 2006-06-28 14:32:24 UTC (rev 260) @@ -36,10 +36,10 @@ , 'delitem_slice', 'reverse', 'append', 'insert', 'extend', 'sort' ) METHOD_GROUPS = { - 'slice_methods' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) - , 'search_methods' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) - , 'reorder_methods' : ( 'method_sort', 'method_reverse' ) - , 'insert_methods' : ( 'method_append', 'method_insert', 'method_extend' ) + 'slice' : ( 'method_getitem_slice', 'method_setitem_slice', 'method_delitem_slice' ) + , 'search' : ( 'method_index', 'method_contains', 'method_count', 'method_has_key' ) + , 'reorder' : ( 'method_sort', 'method_reverse' ) + , 'insert' : ( 'method_append', 'method_insert', 'method_extend' ) } def __init__( self, container_class, container_traits ): Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-06-28 14:32:24 UTC (rev 260) @@ -358,7 +358,7 @@ def create_explanation(cls): msg = '//WARNING: the next line of code will not compile, because "%s" does not have operator== !' msg = msg % cls.indexing_suite.value_type().decl_string - return code_creators.custom_text_t( msg ) + return code_creators.custom_text_t( msg, False ) def create_cls_cc( cls ): if isinstance( cls, declarations.class_t ): Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2006-06-28 14:32:24 UTC (rev 260) @@ -17,7 +17,7 @@ class fundamental_tester_base_t( unittest.TestCase ): SUFFIX_TO_BE_EXPORTED = '_to_be_exported.hpp' - def __init__(self, module_name, indexing_suite_version=1, *args ): + def __init__(self, module_name, *args, **keywd ): unittest.TestCase.__init__(self, *args) self.__module_name = module_name self.__to_be_exported_header \ @@ -28,8 +28,9 @@ , self.__module_name + '.cpp' ) self.__generated_scons_file_name = os.path.join( autoconfig.build_dir , self.__module_name + '.scons' ) - self.__indexing_suite_version = indexing_suite_version + self.__indexing_suite_version = keywd.get( 'indexing_suite_version', 1 ) + def failIfRaisesAny(self, callableObj, *args, **kwargs): try: callableObj(*args, **kwargs) Modified: pyplusplus_dev/unittests/indexing_suites2_tester.py =================================================================== --- pyplusplus_dev/unittests/indexing_suites2_tester.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/unittests/indexing_suites2_tester.py 2006-06-28 14:32:24 UTC (rev 260) @@ -17,9 +17,9 @@ def __init__( self, *args ): fundamental_tester_base.fundamental_tester_base_t.__init__( self - , tester_t.EXTENSION_NAME - , 2 - , *args ) + , tester_t.EXTENSION_NAME + , indexing_suite_version=2 + , *args) #~ @staticmethod #~ def matcher( item, decl ): @@ -30,10 +30,12 @@ #~ return True #~ return False - #~ def customize(self, generator): - #~ item = generator.class_( 'item_t' ) - #~ items = generator.class_( lambda decl: self.matcher( item, decl ) ) - #~ items.alias = "items_t" + def customize(self, generator): + ivector = generator.global_ns.typedef( 'ivector' ) + ivector = declarations.remove_declarated( ivector.type ) + ivector.indexing_suite.disable_method( 'extend' ) + ivector.indexing_suite.disable_methods_group( 'reorder' ) + #ivector.indexing_suite.call_policies = module_builder.call_policies.default_call_policies() def run_tests( self, module): iv = module.ivector() Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-06-28 09:16:40 UTC (rev 259) +++ pyplusplus_dev/unittests/test_all.py 2006-06-28 14:32:24 UTC (rev 260) @@ -109,7 +109,6 @@ , vector3_tester , default_args_tester , abstract_classes_tester - , classes_tester , indexing_suites2_tester ] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-06-29 13:05:23
|
Revision: 268 Author: roman_yakovenko Date: 2006-06-29 06:05:12 -0700 (Thu, 29 Jun 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=268&view=rev Log Message: ----------- adding bug test case reported by Allen Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/unittests/data/unnamed_enums_to_be_exported.hpp pyplusplus_dev/unittests/unnamed_enums_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-29 12:02:08 UTC (rev 267) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-06-29 13:05:12 UTC (rev 268) @@ -49,7 +49,7 @@ typedef_name = self.class_var_name + '_t' result.append( 'typedef ' + self._generate_class_definition() + ' ' + typedef_name + ';') result.append( typedef_name + ' ' + self.class_var_name ) - result[-1] = result[-1] + ' = '+ typedef_name + '(%s);' % self.declaration.alias + result[-1] = result[-1] + ' = '+ typedef_name + '("%s");' % self.declaration.alias result.append( algorithm.create_identifier( self, '::boost::python::scope' ) ) result[-1] = result[-1] + ' ' + scope_var_name Modified: pyplusplus_dev/unittests/data/unnamed_enums_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/unnamed_enums_to_be_exported.hpp 2006-06-29 12:02:08 UTC (rev 267) +++ pyplusplus_dev/unittests/data/unnamed_enums_to_be_exported.hpp 2006-06-29 13:05:12 UTC (rev 268) @@ -9,6 +9,17 @@ namespace unnamed_enums{ enum{ OK=1, CANCEL=0 }; + +struct enum_holder_t{ + enum {ZERO=0, ONE=1, TWO=2 }; +}; + +struct enum_user_t{ + void do_smth1(unsigned param=enum_holder_t::ZERO){}; + void do_smth2(int param=enum_holder_t::ONE){}; + void do_smth3(char param=enum_holder_t::TWO){}; +}; + } Modified: pyplusplus_dev/unittests/unnamed_enums_tester.py =================================================================== --- pyplusplus_dev/unittests/unnamed_enums_tester.py 2006-06-29 12:02:08 UTC (rev 267) +++ pyplusplus_dev/unittests/unnamed_enums_tester.py 2006-06-29 13:05:12 UTC (rev 268) @@ -17,7 +17,14 @@ self , unnamed_enums_tester_t.EXTENSION_NAME , *args ) - + + def customize( self, mb ): + return + #for f in mb.class_( 'enum_user_t' ).member_functions(): + #for arg in f.arguments: + #if arg.default_value: + #arg.default_value = "%s(%s)" % ( arg.type.decl_string, arg.default_value ) + def run_tests(self, module): self.failUnless( module.OK == 1 ) self.failUnless( module.CANCEL == 0 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-02 18:48:56
|
Revision: 271 Author: roman_yakovenko Date: 2006-07-02 11:48:46 -0700 (Sun, 02 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=271&view=rev Log Message: ----------- fixing some bug in generated code for unnamed enums, that has been declared within class Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/unittests/unnamed_enums_tester.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-07-02 17:26:30 UTC (rev 270) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-07-02 18:48:46 UTC (rev 271) @@ -1,4 +1,4 @@ -# Copyright 2004 Roman Yakovenko. +# 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) @@ -54,7 +54,13 @@ result.append( '("%s")' % arg.name ) if self.declaration.use_default_arguments and arg.default_value: if not declarations.is_pointer( arg.type ) or arg.default_value != '0': - result.append( '=%s' % arg.default_value ) + arg_type_no_alias = declarations.remove_alias( arg.type ) + if declarations.is_fundamental( arg_type_no_alias ) \ + and declarations.is_integral( arg_type_no_alias ) \ + and not arg.default_value.startswith( arg_type_no_alias.decl_string ): + result.append( '=(%s)(%s)' % ( arg_type_no_alias.decl_string, arg.default_value ) ) + else: + result.append( '=%s' % arg.default_value ) else: result.append( '=%s()' % boost_obj ) result.append( ' )' ) Modified: pyplusplus_dev/unittests/unnamed_enums_tester.py =================================================================== --- pyplusplus_dev/unittests/unnamed_enums_tester.py 2006-07-02 17:26:30 UTC (rev 270) +++ pyplusplus_dev/unittests/unnamed_enums_tester.py 2006-07-02 18:48:46 UTC (rev 271) @@ -18,13 +18,6 @@ , unnamed_enums_tester_t.EXTENSION_NAME , *args ) - def customize( self, mb ): - return - #for f in mb.class_( 'enum_user_t' ).member_functions(): - #for arg in f.arguments: - #if arg.default_value: - #arg.default_value = "%s(%s)" % ( arg.type.decl_string, arg.default_value ) - def run_tests(self, module): self.failUnless( module.OK == 1 ) self.failUnless( module.CANCEL == 0 ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-11 07:25:48
|
Revision: 291 Author: roman_yakovenko Date: 2006-07-11 00:24:56 -0700 (Tue, 11 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=291&view=rev Log Message: ----------- adding different loggers for different functionality fixing some bug in generated code for member function, that belongs to template instantiated class Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/cpptypes.py pygccxml_dev/pygccxml/parser/source_reader.py pygccxml_dev/pygccxml/utils/__init__.py pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py pyplusplus_dev/examples/pyboost_dev/dev/rational/generate_code.py pyplusplus_dev/pyplusplus/_logging_/__init__.py pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/pyplusplus/decl_wrappers/variable_wrapper.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/pyplusplus/module_creator/types_database.py pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/unnamed_classes_to_be_exported.hpp pyplusplus_dev/unittests/unnamed_classes_tester.py Modified: pygccxml_dev/pygccxml/declarations/cpptypes.py =================================================================== --- pygccxml_dev/pygccxml/declarations/cpptypes.py 2006-07-10 19:12:24 UTC (rev 290) +++ pygccxml_dev/pygccxml/declarations/cpptypes.py 2006-07-11 07:24:56 UTC (rev 291) @@ -406,7 +406,8 @@ , [ arg.clone() for arg in self.arguments_types ] ) #TODO: create real typedef - def create_typedef( self, typedef_name): + def create_typedef( self, typedef_name, unused=None): + #unused argument simplifies user code return free_function_type_t.TYPEDEF_NAME_TEMPLATE % { 'typedef_name' : typedef_name , 'return_type' : self.return_type.decl_string @@ -438,7 +439,7 @@ ,doc="reference to parent L{class<declaration_t>}" ) #TODO: create real typedef - def create_typedef( self, typedef_name): + def create_typedef( self, typedef_name, class_alias=None): """ creates typedef to the function type @@ -447,11 +448,13 @@ """ has_const_str = '' if self.has_const: - has_const_str = 'const' + has_const_str = 'const' + if None is class_alias: + class_alias = self.class_inst.decl_string return member_function_type_t.TYPEDEF_NAME_TEMPLATE % { 'typedef_name' : typedef_name , 'return_type' : self.return_type.decl_string - , 'class' : self.class_inst.decl_string + , 'class' : class_alias , 'arguments' : ','.join( map( lambda x: x.decl_string, self.arguments_types ) ) , 'has_const' : has_const_str } Modified: pygccxml_dev/pygccxml/parser/source_reader.py =================================================================== --- pygccxml_dev/pygccxml/parser/source_reader.py 2006-07-10 19:12:24 UTC (rev 290) +++ pygccxml_dev/pygccxml/parser/source_reader.py 2006-07-11 07:24:56 UTC (rev 291) @@ -1,335 +1,335 @@ -# 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 config -import pygccxml.utils -import linker -import scanner -import declarations_cache -import patcher -from pygccxml.declarations import * -from pygccxml import utils - -class gccxml_runtime_error_t( RuntimeError ): - def __init__( self, msg ): - RuntimeError.__init__( self, msg ) - - -def bind_aliases( decls ): - """ - This function binds between class and it's typedefs. - - @param decls: list of all declarations - @type all_classes: list of L{declaration_t} items - - @return: None - """ - visited = set() - for decl in decls: - if not isinstance( decl, typedef_t ): - continue - type_ = remove_alias( decl.type ) - if not isinstance( type_, declarated_t ): - continue - cls_inst = type_.declaration - if not isinstance( cls_inst, class_t ): - continue - if id( cls_inst ) not in visited: - visited.add( id( cls_inst ) ) - del cls_inst.aliases[:] - cls_inst.aliases.append( decl ) - -class source_reader_t: - """ - This class reads C++ source code and returns declarations tree. - - This class is the only class that have an intime knowledge about GCC-XML. - It has only one responsibility: it calls GCC-XML with a source file specified - by user and creates declarations tree. The implementation of this class is split - to 2 classes: - - 1. L{scanner_t} - this class scans the "XML" file, generated by GCC-XML and - creates `pygccxml`_ declarations and types classes. After the xml file has - been processed declarations and type class instances keeps references to - each other using GCC-XML generated id's. - - 2. L{linker_t} - this class contains logic for replacing GCC-XML generated - ids with references to declarations or type class instances. - """ - def __init__( self, config, cache=None, decl_factory=None ): - """ - @param config: instance of L{config_t} class, that contains GCC-XML - configuration - @type config: L{config_t} - - @param cache: reference to cache object, that will be updated after - file has been parsed. - @param cache: instance of class, that derives from {cache_base_t} - - @param decl_factory: declarations factory, if not given default - declarations factory L{decl_factory_t} will be used +# 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 config +import pygccxml.utils +import linker +import scanner +import declarations_cache +import patcher +from pygccxml.declarations import * +from pygccxml import utils + +class gccxml_runtime_error_t( RuntimeError ): + def __init__( self, msg ): + RuntimeError.__init__( self, msg ) + + +def bind_aliases( decls ): + """ + This function binds between class and it's typedefs. + + @param decls: list of all declarations + @type all_classes: list of L{declaration_t} items + + @return: None + """ + visited = set() + for decl in decls: + if not isinstance( decl, typedef_t ): + continue + type_ = remove_alias( decl.type ) + if not isinstance( type_, declarated_t ): + continue + cls_inst = type_.declaration + if not isinstance( cls_inst, class_t ): + continue + if id( cls_inst ) not in visited: + visited.add( id( cls_inst ) ) + del cls_inst.aliases[:] + cls_inst.aliases.append( decl ) + +class source_reader_t: + """ + This class reads C++ source code and returns declarations tree. + + This class is the only class that have an intime knowledge about GCC-XML. + It has only one responsibility: it calls GCC-XML with a source file specified + by user and creates declarations tree. The implementation of this class is split + to 2 classes: + + 1. L{scanner_t} - this class scans the "XML" file, generated by GCC-XML and + creates `pygccxml`_ declarations and types classes. After the xml file has + been processed declarations and type class instances keeps references to + each other using GCC-XML generated id's. + + 2. L{linker_t} - this class contains logic for replacing GCC-XML generated + ids with references to declarations or type class instances. + """ + def __init__( self, config, cache=None, decl_factory=None ): """ - self.logger = utils.loggers.gccxml - self.__search_directories = [] - self.__config = config - self.__search_directories.append( config.working_directory ) - self.__search_directories.extend( config.include_paths ) - if not cache: - cache = declarations_cache.dummy_cache_t() - self.__dcache = cache - self.__raise_on_wrong_settings() - self.__decl_factory = decl_factory - if not decl_factory: - self.__decl_factory = decl_factory_t() - - def __raise_on_wrong_settings(self): - if not os.path.isfile( self.__config.gccxml_path ): - if sys.platform == 'win32': - gccxml_name = 'gccxml' + '.exe' - environment_var_delimiter = ';' - elif sys.platform == 'linux2' or sys.platform == 'darwin': - gccxml_name = 'gccxml' - environment_var_delimiter = ':' - else: - raise RuntimeError( 'unable to find out location of gccxml' ) - may_be_gccxml = os.path.join( self.__config.gccxml_path, gccxml_name ) - if os.path.isfile( may_be_gccxml ): - self.__config.gccxml_path = may_be_gccxml - else: - for path in os.environ['PATH'].split( environment_var_delimiter ): - gccxml_path = os.path.join( path, gccxml_name ) - if os.path.isfile( gccxml_path ): - self.__config.gccxml_path = gccxml_path - break - else: - msg = 'gccxml_path("%s") should exists or to be a valid file name.' \ - % self.__config.gccxml_path - raise RuntimeError( msg ) - if not os.path.isdir( self.__config.working_directory ): - msg = 'working_directory("%s") should exists or to be a valid directory name.' \ - % self.__config.working_directory - raise RuntimeError( msg ) - for include_path in self.__config.include_paths: - if not os.path.isdir( include_path ): - msg = 'include path "%s" should exists or to be a valid directory name.' \ - % include_path - raise RuntimeError( msg ) - - def __create_command_line(self, file, xmlfile): - assert isinstance( self.__config, config.config_t ) - #returns - cmd = [] - #first is gccxml executable - if 'win32' in sys.platform: - cmd.append( '"%s"' % os.path.normpath( self.__config.gccxml_path ) ) - else: - cmd.append( '%s' % os.path.normpath( self.__config.gccxml_path ) ) - # Add all cflags passed - if self.__config.cflags != "": - cmd.append(" %s "%self.__config.cflags) - #second all additional includes directories - cmd.append( ''.join( [' -I"%s"' % search_dir for search_dir in self.__search_directories] ) ) - #third all additional defined symbols - cmd.append( ''.join( [' -D"%s"' % defined_symbol for defined_symbol in self.__config.define_symbols] ) ) - cmd.append( ''.join( [' -U"%s"' % undefined_symbol for undefined_symbol in self.__config.undefine_symbols] ) ) - #fourth source file - cmd.append( '"%s"' % file ) - #five destination file - cmd.append( '-fxml="%s"' % xmlfile ) - if self.__config.start_with_declarations: - cmd.append( '-fxml-start="%s"' % ','.join( self.__config.start_with_declarations ) ) - - cmd_line = ' '.join(cmd) - if 'win32' in sys.platform : - cmd_line = '"%s"' % cmd_line - self.logger.info( 'gccxml cmd: %s' % cmd_line ) - return cmd_line - - def create_xml_file( self, header, destination=None ): - """ - This function will return the file name of the file, created by GCC-XML - for "header" file. If destination_file_path is not None, then this file - path will be used and returned. - - @param header: path to source file, that should be parsed - @type header: str - - @param destination: if given, will be used as target file/path for - GCC-XML generated file. - @type destination: str - - @return: path to GCC-XML generated file - """ - gccxml_file = destination - # If file specified, remove it to start else create new file name - if gccxml_file: - pygccxml.utils.remove_file_no_raise( gccxml_file ) - else: - gccxml_file = pygccxml.utils.create_temp_file_name( suffix='.xml' ) - try: - ffname = header - if not os.path.isabs( ffname ): - ffname = self.__file_full_name(header) - command_line = self.__create_command_line( ffname, gccxml_file ) - input_, output = os.popen4( command_line ) - input_.close() - gccxml_reports = [] - while True: - data = output.readline() - gccxml_reports.append( data ) - if not data: - break - exit_status = output.close() - gccxml_msg = ''.join(gccxml_reports) - if self.__config.ignore_gccxml_output: - if not os.path.isfile(gccxml_file): - raise gccxml_runtime_error_t( "Error occured while running GCC-XML: %s status:%s" % (gccxml_msg, exit_status) ) - else: - if gccxml_msg or exit_status or not os.path.isfile(gccxml_file): - raise gccxml_runtime_error_t( "Error occured while running GCC-XML: %s" % gccxml_msg ) - except Exception, error: - pygccxml.utils.remove_file_no_raise( gccxml_file ) - raise error - return gccxml_file - - def create_xml_file_from_string( self, content, destination=None ): - """ - Creates XML file from text. - - @param content: C++ source code - @type content: str - - @param destination: file name for GCC-XML generated file - @type destination: str - - @return: returns file name of GCC-XML generated file - """ - header_file = pygccxml.utils.create_temp_file_name( suffix='.h' ) - gccxml_file = None - try: - header_file_obj = file(header_file, 'w+') - header_file_obj.write( content ) - header_file_obj.close() - gccxml_file = self.create_xml_file( header_file, destination ) - finally: - pygccxml.utils.remove_file_no_raise( header_file ) - return gccxml_file - - def read_file(self, source_file): - """ - Reads C++ source file and returns declarations tree - - @param source_file: path to C++ source file - @type source_file: str - """ - declarations, types = None, None - gccxml_file = '' - try: - ffname = self.__file_full_name(source_file) - self.logger.debug( "Reading source file: [%s]." % ffname ) - declarations = self.__dcache.cached_value( ffname, self.__config ) - if not declarations: - self.logger.debug( "File has not been found in cache, parsing..." ) - gccxml_file = self.create_xml_file( ffname ) - declarations, files = self.__parse_gccxml_created_file( gccxml_file ) - self.__dcache.update( ffname, self.__config, declarations, files ) - else: - self.logger.debug( "File has not been changed, reading declarations from cache." ) - except Exception, error: - if gccxml_file: - pygccxml.utils.remove_file_no_raise( gccxml_file ) - raise error - if gccxml_file: - pygccxml.utils.remove_file_no_raise( gccxml_file ) - return declarations - - def read_xml_file(self, gccxml_created_file): - """ - Reads GCC-XML generated XML file. - - @param gccxml_created_file: path to GCC-XML generated file - @type gccxml_created_file: str - - @return: declarations tree - """ - self.logger.debug( "Reading xml file: [%s]" % gccxml_created_file ) - - declarations, files = self.__parse_gccxml_created_file( gccxml_created_file ) - return declarations - - def read_string(self, content): - """ - Reads Python string, that contains valid C++ code, and returns - declarations tree. - """ - header_file = pygccxml.utils.create_temp_file_name( suffix='.h' ) - header_file_obj = file(header_file, 'w+') - header_file_obj.write( content ) - header_file_obj.close() - declarations = None - try: - declarations = self.read_file( header_file ) - except Exception, error: - pygccxml.utils.remove_file_no_raise( header_file ) - raise error - pygccxml.utils.remove_file_no_raise( header_file ) - return declarations - - def __file_full_name( self, file ): - if os.path.isfile( file ): - return file - for path in self.__search_directories: - file_path = os.path.join( path, file ) - if os.path.isfile( file_path ): - return file_path - raise RuntimeError( "pygccxml error: file '%s' does not exist" % file ) - - def __produce_full_file( self, file_path ): - if os.path.isabs( file_path ): - return file_path - try: - abs_file_path = os.path.realpath( os.path.join( self.__config.working_directory, file_path ) ) - if os.path.exists( abs_file_path ): - return os.path.normpath( abs_file_path ) - return file_path - except Exception: - return file_path - - def __parse_gccxml_created_file( self, gccxml_file ): - scanner_ = scanner.scanner_t( gccxml_file, self.__decl_factory ) - scanner_.read() - decls = scanner_.declarations() - types = scanner_.types() - files = {} - for file_id, file_path in scanner_.files().items(): - files[file_id] = self.__produce_full_file(file_path) - linker_ = linker.linker_t( decls=decls - , types=types - , access=scanner_.access() - , membership=scanner_.members() - , files=files ) - for type_ in list( types.itervalues() ): - #I need this copy because internaly linker change types collection - linker_.instance = type_ - apply_visitor( linker_, type_ ) - for decl in decls.itervalues(): - linker_.instance = decl - apply_visitor( linker_, decl ) - bind_aliases( decls.itervalues() ) - decls = filter( lambda inst: isinstance(inst, declaration_t) and not inst.parent, decls.itervalues() ) - #some times gccxml report typedefs defined in no namespace - #it happens for example in next situation - #template< typename X> - #void ddd(){ typedef typename X::Y YY;} - decls = filter( lambda inst: isinstance( inst, namespace_t ), decls ) - decls = patcher.patch_it( decls ) - decls_all = make_flatten( decls ) - for decl in decls_all: - if decl.location: - decl.location.file_name = self.__produce_full_file( decl.location.file_name ) - return ( decls, files.values() ) - + @param config: instance of L{config_t} class, that contains GCC-XML + configuration + @type config: L{config_t} + + @param cache: reference to cache object, that will be updated after + file has been parsed. + @param cache: instance of class, that derives from {cache_base_t} + + @param decl_factory: declarations factory, if not given default + declarations factory L{decl_factory_t} will be used + """ + self.logger = utils.loggers.gccxml + self.__search_directories = [] + self.__config = config + self.__search_directories.append( config.working_directory ) + self.__search_directories.extend( config.include_paths ) + if not cache: + cache = declarations_cache.dummy_cache_t() + self.__dcache = cache + self.__raise_on_wrong_settings() + self.__decl_factory = decl_factory + if not decl_factory: + self.__decl_factory = decl_factory_t() + + def __raise_on_wrong_settings(self): + if not os.path.isfile( self.__config.gccxml_path ): + if sys.platform == 'win32': + gccxml_name = 'gccxml' + '.exe' + environment_var_delimiter = ';' + elif sys.platform == 'linux2' or sys.platform == 'darwin': + gccxml_name = 'gccxml' + environment_var_delimiter = ':' + else: + raise RuntimeError( 'unable to find out location of gccxml' ) + may_be_gccxml = os.path.join( self.__config.gccxml_path, gccxml_name ) + if os.path.isfile( may_be_gccxml ): + self.__config.gccxml_path = may_be_gccxml + else: + for path in os.environ['PATH'].split( environment_var_delimiter ): + gccxml_path = os.path.join( path, gccxml_name ) + if os.path.isfile( gccxml_path ): + self.__config.gccxml_path = gccxml_path + break + else: + msg = 'gccxml_path("%s") should exists or to be a valid file name.' \ + % self.__config.gccxml_path + raise RuntimeError( msg ) + if not os.path.isdir( self.__config.working_directory ): + msg = 'working_directory("%s") should exists or to be a valid directory name.' \ + % self.__config.working_directory + raise RuntimeError( msg ) + for include_path in self.__config.include_paths: + if not os.path.isdir( include_path ): + msg = 'include path "%s" should exists or to be a valid directory name.' \ + % include_path + raise RuntimeError( msg ) + + def __create_command_line(self, file, xmlfile): + assert isinstance( self.__config, config.config_t ) + #returns + cmd = [] + #first is gccxml executable + if 'win32' in sys.platform: + cmd.append( '"%s"' % os.path.normpath( self.__config.gccxml_path ) ) + else: + cmd.append( '%s' % os.path.normpath( self.__config.gccxml_path ) ) + # Add all cflags passed + if self.__config.cflags != "": + cmd.append(" %s "%self.__config.cflags) + #second all additional includes directories + cmd.append( ''.join( [' -I"%s"' % search_dir for search_dir in self.__search_directories] ) ) + #third all additional defined symbols + cmd.append( ''.join( [' -D"%s"' % defined_symbol for defined_symbol in self.__config.define_symbols] ) ) + cmd.append( ''.join( [' -U"%s"' % undefined_symbol for undefined_symbol in self.__config.undefine_symbols] ) ) + #fourth source file + cmd.append( '"%s"' % file ) + #five destination file + cmd.append( '-fxml="%s"' % xmlfile ) + if self.__config.start_with_declarations: + cmd.append( '-fxml-start="%s"' % ','.join( self.__config.start_with_declarations ) ) + + cmd_line = ' '.join(cmd) + if 'win32' in sys.platform : + cmd_line = '"%s"' % cmd_line + self.logger.info( 'gccxml cmd: %s' % cmd_line ) + return cmd_line + + def create_xml_file( self, header, destination=None ): + """ + This function will return the file name of the file, created by GCC-XML + for "header" file. If destination_file_path is not None, then this file + path will be used and returned. + + @param header: path to source file, that should be parsed + @type header: str + + @param destination: if given, will be used as target file/path for + GCC-XML generated file. + @type destination: str + + @return: path to GCC-XML generated file + """ + gccxml_file = destination + # If file specified, remove it to start else create new file name + if gccxml_file: + pygccxml.utils.remove_file_no_raise( gccxml_file ) + else: + gccxml_file = pygccxml.utils.create_temp_file_name( suffix='.xml' ) + try: + ffname = header + if not os.path.isabs( ffname ): + ffname = self.__file_full_name(header) + command_line = self.__create_command_line( ffname, gccxml_file ) + input_, output = os.popen4( command_line ) + input_.close() + gccxml_reports = [] + while True: + data = output.readline() + gccxml_reports.append( data ) + if not data: + break + exit_status = output.close() + gccxml_msg = ''.join(gccxml_reports) + if self.__config.ignore_gccxml_output: + if not os.path.isfile(gccxml_file): + raise gccxml_runtime_error_t( "Error occured while running GCC-XML: %s status:%s" % (gccxml_msg, exit_status) ) + else: + if gccxml_msg or exit_status or not os.path.isfile(gccxml_file): + raise gccxml_runtime_error_t( "Error occured while running GCC-XML: %s" % gccxml_msg ) + except Exception, error: + pygccxml.utils.remove_file_no_raise( gccxml_file ) + raise error + return gccxml_file + + def create_xml_file_from_string( self, content, destination=None ): + """ + Creates XML file from text. + + @param content: C++ source code + @type content: str + + @param destination: file name for GCC-XML generated file + @type destination: str + + @return: returns file name of GCC-XML generated file + """ + header_file = pygccxml.utils.create_temp_file_name( suffix='.h' ) + gccxml_file = None + try: + header_file_obj = file(header_file, 'w+') + header_file_obj.write( content ) + header_file_obj.close() + gccxml_file = self.create_xml_file( header_file, destination ) + finally: + pygccxml.utils.remove_file_no_raise( header_file ) + return gccxml_file + + def read_file(self, source_file): + """ + Reads C++ source file and returns declarations tree + + @param source_file: path to C++ source file + @type source_file: str + """ + declarations, types = None, None + gccxml_file = '' + try: + ffname = self.__file_full_name(source_file) + self.logger.debug( "Reading source file: [%s]." % ffname ) + declarations = self.__dcache.cached_value( ffname, self.__config ) + if not declarations: + self.logger.debug( "File has not been found in cache, parsing..." ) + gccxml_file = self.create_xml_file( ffname ) + declarations, files = self.__parse_gccxml_created_file( gccxml_file ) + self.__dcache.update( ffname, self.__config, declarations, files ) + else: + self.logger.debug( "File has not been changed, reading declarations from cache." ) + except Exception, error: + if gccxml_file: + pygccxml.utils.remove_file_no_raise( gccxml_file ) + raise error + if gccxml_file: + pygccxml.utils.remove_file_no_raise( gccxml_file ) + return declarations + + def read_xml_file(self, gccxml_created_file): + """ + Reads GCC-XML generated XML file. + + @param gccxml_created_file: path to GCC-XML generated file + @type gccxml_created_file: str + + @return: declarations tree + """ + self.logger.debug( "Reading xml file: [%s]" % gccxml_created_file ) + + declarations, files = self.__parse_gccxml_created_file( gccxml_created_file ) + return declarations + + def read_string(self, content): + """ + Reads Python string, that contains valid C++ code, and returns + declarations tree. + """ + header_file = pygccxml.utils.create_temp_file_name( suffix='.h' ) + header_file_obj = file(header_file, 'w+') + header_file_obj.write( content ) + header_file_obj.close() + declarations = None + try: + declarations = self.read_file( header_file ) + except Exception, error: + pygccxml.utils.remove_file_no_raise( header_file ) + raise error + pygccxml.utils.remove_file_no_raise( header_file ) + return declarations + + def __file_full_name( self, file ): + if os.path.isfile( file ): + return file + for path in self.__search_directories: + file_path = os.path.join( path, file ) + if os.path.isfile( file_path ): + return file_path + raise RuntimeError( "pygccxml error: file '%s' does not exist" % file ) + + def __produce_full_file( self, file_path ): + if os.path.isabs( file_path ): + return file_path + try: + abs_file_path = os.path.realpath( os.path.join( self.__config.working_directory, file_path ) ) + if os.path.exists( abs_file_path ): + return os.path.normpath( abs_file_path ) + return file_path + except Exception: + return file_path + + def __parse_gccxml_created_file( self, gccxml_file ): + scanner_ = scanner.scanner_t( gccxml_file, self.__decl_factory ) + scanner_.read() + decls = scanner_.declarations() + types = scanner_.types() + files = {} + for file_id, file_path in scanner_.files().items(): + files[file_id] = self.__produce_full_file(file_path) + linker_ = linker.linker_t( decls=decls + , types=types + , access=scanner_.access() + , membership=scanner_.members() + , files=files ) + for type_ in list( types.itervalues() ): + #I need this copy because internaly linker change types collection + linker_.instance = type_ + apply_visitor( linker_, type_ ) + for decl in decls.itervalues(): + linker_.instance = decl + apply_visitor( linker_, decl ) + bind_aliases( decls.itervalues() ) + decls = filter( lambda inst: isinstance(inst, declaration_t) and not inst.parent, decls.itervalues() ) + #some times gccxml report typedefs defined in no namespace + #it happens for example in next situation + #template< typename X> + #void ddd(){ typedef typename X::Y YY;} + decls = filter( lambda inst: isinstance( inst, namespace_t ), decls ) + decls = patcher.patch_it( decls ) + decls_all = make_flatten( decls ) + for decl in decls_all: + if decl.location: + decl.location.file_name = self.__produce_full_file( decl.location.file_name ) + return ( decls, files.values() ) + Modified: pygccxml_dev/pygccxml/utils/__init__.py =================================================================== --- pygccxml_dev/pygccxml/utils/__init__.py 2006-07-10 19:12:24 UTC (rev 290) +++ pygccxml_dev/pygccxml/utils/__init__.py 2006-07-11 07:24:56 UTC (rev 291) @@ -9,7 +9,7 @@ import tempfile def _create_logger_( name ): - logger = logging.getLogger('name') + logger = logging.getLogger(name) __handler = logging.StreamHandler(sys.stdout) __handler.setFormatter( logging.Formatter( '%(levelname)s %(message)s' ) ) logger.addHandler(__handler) @@ -17,10 +17,11 @@ return logger class loggers: - root = _create_logger_( 'pygccxml' ) gccxml = _create_logger_( 'pygccxml.gccxml' ) queries_engine = _create_logger_( 'pygccxml.queries_engine' ) declarations_cache = _create_logger_( 'pygccxml.declarations_cache' ) + #root logger exists for configuration purpose only + root = logging.getLogger( 'pygccxml' ) all = [ root, gccxml, queries_engine, declarations_cache ] def remove_file_no_raise(file_name ): Modified: pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py 2006-07-10 19:12:24 UTC (rev 290) +++ pyplusplus_dev/examples/pyboost_dev/dev/boost_random/generate_code.py 2006-07-11 07:24:56 UTC (rev 291) @@ -1,162 +1,161 @@ -#! /usr/bin/python -# 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 time -import logging -import random_settings -from pygccxml import parser -from pyplusplus import module_builder -from pyplusplus.module_builder import call_policies - - -LICENSE = """// Copyright 2004 Roman Yakovenko. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -""" - -class code_generator_t(object): - def __init__(self): - module_builder.set_logger_level( logging.INFO ) - self.__file = os.path.join( random_settings.working_dir, 'random_export.hpp' ) - self.__mb = module_builder.module_builder_t( - [ parser.create_cached_source_fc( - self.__file - , os.path.join( random_settings.generated_files_dir, 'random.xml' ) ) ] - , gccxml_path=random_settings.gccxml.executable +#! /usr/bin/python +# 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 time +import logging +import random_settings +from pygccxml import parser +from pyplusplus import module_builder +from pyplusplus.module_builder import call_policies + + +LICENSE = """// Copyright 2004 Roman Yakovenko. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +""" + +class code_generator_t(object): + def __init__(self): + self.__file = os.path.join( random_settings.working_dir, 'random_export.hpp' ) + self.__mb = module_builder.module_builder_t( + [ parser.create_cached_source_fc( + self.__file + , os.path.join( random_settings.generated_files_dir, 'random.xml' ) ) ] + , gccxml_path=random_settings.gccxml.executable , include_paths=[random_settings.boost.include] - , define_symbols=random_settings.defined_symbols + , define_symbols=random_settings.defined_symbols , undefine_symbols=random_settings.undefined_symbols , indexing_suite_version=2) - self.generators = [ "ecuyer1988" - , "hellekalek1995" - , "kreutzer1986" - , "lagged_fibonacci1279" - , "lagged_fibonacci19937" - , "lagged_fibonacci2281" - , "lagged_fibonacci23209" - , "lagged_fibonacci3217" - , "lagged_fibonacci4423" - , "lagged_fibonacci44497" - , "lagged_fibonacci607" - , "lagged_fibonacci9689" - , "minstd_rand" - , "minstd_rand0" - , "mt11213b" - , "mt19937" - , "ranlux3" - , "ranlux3_01" - , "ranlux4" - , "ranlux4_01" - , "ranlux64_3_01" - , "ranlux64_4_01" - , "taus88" ] - - self.no_min_max = [ 'py_cauchy_distribution' - , 'py_bernoulli_distribution' - , 'py_binomial_distribution' - , 'py_poisson_distribution' - , 'py_normal_distribution' - , 'py_gamma_distribution' - , 'py_triangle_distribution' - , 'py_uniform_on_sphere' - , 'py_exponential_distribution' - , 'py_geometric_distribution' - , 'py_lognormal_distribution' - ] - - def typedef2class( self, scope, name ): - typedef = scope.typedef( name ) - return typedef.type.declaration - + self.generators = [ "ecuyer1988" + , "hellekalek1995" + , "kreutzer1986" + , "lagged_fibonacci1279" + , "lagged_fibonacci19937" + , "lagged_fibonacci2281" + , "lagged_fibonacci23209" + , "lagged_fibonacci3217" + , "lagged_fibonacci4423" + , "lagged_fibonacci44497" + , "lagged_fibonacci607" + , "lagged_fibonacci9689" + , "minstd_rand" + , "minstd_rand0" + , "mt11213b" + , "mt19937" + , "ranlux3" + , "ranlux3_01" + , "ranlux4" + , "ranlux4_01" + , "ranlux64_3_01" + , "ranlux64_4_01" + , "taus88" ] + + self.no_min_max = [ 'py_cauchy_distribution' + , 'py_bernoulli_distribution' + , 'py_binomial_distribution' + , 'py_poisson_distribution' + , 'py_normal_distribution' + , 'py_gamma_distribution' + , 'py_triangle_distribution' + , 'py_uniform_on_sphere' + , 'py_exponential_distribution' + , 'py_geometric_distribution' + , 'py_lognormal_distribution' + ] + + def typedef2class( self, scope, name ): + typedef = scope.typedef( name ) + return typedef.type.declaration + def filter_declarations(self ): - self.__mb.global_ns.exclude() - boost_ns = self.__mb.global_ns.namespace( 'boost', recursive=False ) - for name in self.generators: - gen_cls = self.typedef2class( boost_ns, name ) - gen_cls.include() - #TODO: find out why compiler complains - gen_cls.member_functions( 'seed' ).create_with_signature = True - - pyimpl_ns = boost_ns.namespace( 'pyimpl' ) - helpers = pyimpl_ns.classes( lambda decl: decl.name.startswith( 'py_') ) - helpers.include() - for helper in helpers: - distrib_cls = self.typedef2class( helper, "distribution" ) - distrib_cls.include() - var_gen_typedefs = helper.typedefs( lambda decl: decl.name.startswith( 'variate_generator_' ) ) - for var_gen_typedef in var_gen_typedefs: - var_gen_cls = var_gen_typedef.type.declaration - var_gen_cls.include() - var_gen_cls.member_operators( symbol='()' ).create_with_signature = True - if helper.name in self.no_min_max: - var_gen_cls.member_function( 'max' ).exclude() - var_gen_cls.member_function( 'min' ).exclude() - - ecuyer1988 = self.typedef2class( boost_ns, 'ecuyer1988' ) - ecuyer1988.member_function( 'seed', arg_types=[None, None] ).exclude() - - def prepare_declarations( self ): - boost_ns = self.__mb.namespace( 'boost' ) - for name in self.generators: - gen_cls = self.typedef2class( boost_ns, name ) - gen_cls.alias = name - - pyimpl_ns = boost_ns.namespace( 'pyimpl' ) - helpers = pyimpl_ns.classes( lambda decl: decl.name.startswith( 'py_') ) - for helper in helpers: - distrib_cls = self.typedef2class( helper, "distribution" ) - distrib_cls.alias = helper.name[3:] #py_ - var_gen_typedefs = helper.typedefs( lambda decl: decl.name.startswith( 'variate_generator_' ) ) - for var_gen_typedef in var_gen_typedefs: - var_gen_cls = var_gen_typedef.type.declaration - var_gen_cls.alias = var_gen_typedef.name + '__' + distrib_cls.alias - - self.set_call_policies() - - def set_call_policies( self ): - boost_ns = self.__mb.namespace( 'boost' ) - engine_funcs = boost_ns.member_functions( name="engine" - , function=lambda decl: not decl.has_const ) - engine_funcs.call_policies = call_policies.return_internal_reference() - - distribution_funcs = boost_ns.member_functions( name="distribution" - , function=lambda decl: not decl.has_const ) - distribution_funcs.call_policies = call_policies.return_internal_reference() - - def customize_extmodule( self ): + self.__mb.global_ns.exclude() + boost_ns = self.__mb.global_ns.namespace( 'boost', recursive=False ) + for name in self.generators: + gen_cls = self.typedef2class( boost_ns, name ) + gen_cls.include() + #TODO: find out why compiler complains + gen_cls.member_functions( 'seed' ).create_with_signature = True + + pyimpl_ns = boost_ns.namespace( 'pyimpl' ) + helpers = pyimpl_ns.classes( lambda decl: decl.name.startswith( 'py_') ) + helpers.include() + for helper in helpers: + distrib_cls = self.typedef2class( helper, "distribution" ) + distrib_cls.include() + var_gen_typedefs = helper.typedefs( lambda decl: decl.name.startswith( 'variate_generator_' ) ) + for var_gen_typedef in var_gen_typedefs: + var_gen_cls = var_gen_typedef.type.declaration + var_gen_cls.include() + var_gen_cls.member_operators( symbol='()' ).create_with_signature = True + if helper.name in self.no_min_max: + var_gen_cls.member_function( 'max' ).exclude() + var_gen_cls.member_function( 'min' ).exclude() + + ecuyer1988 = self.typedef2class( boost_ns, 'ecuyer1988' ) + ecuyer1988.member_function( 'seed', arg_types=[None, None] ).exclude() + + def prepare_declarations( self ): + boost_ns = self.__mb.namespace( 'boost' ) + for name in self.generators: + gen_cls = self.typedef2class( boost_ns, name ) + gen_cls.alias = name + + pyimpl_ns = boost_ns.namespace( 'pyimpl' ) + helpers = pyimpl_ns.classes( lambda decl: decl.name.startswith( 'py_') ) + for helper in helpers: + distrib_cls = self.typedef2class( helper, "distribution" ) + distrib_cls.alias = helper.name[3:] #py_ + var_gen_typedefs = helper.typedefs( lambda decl: decl.name.startswith( 'variate_generator_' ) ) + for var_gen_typedef in var_gen_typedefs: + var_gen_cls = var_gen_typedef.type.declaration + var_gen_cls.alias = var_gen_typedef.name + '__' + distrib_cls.alias + + self.set_call_policies() + + def set_call_policies( self ): + boost_ns = self.__mb.namespace( 'boost' ) + engine_funcs = boost_ns.member_functions( name="engine" + , function=lambda decl: not decl.has_const ) + engine_funcs.call_policies = call_policies.return_internal_reference() + + distribution_funcs = boost_ns.member_functions( name="distribution" + , function=lambda decl: not decl.has_const ) + distribution_funcs.call_policies = call_policies.return_internal_reference() + + def customize_extmodule( self ): global LICENSE - extmodule = self.__mb.code_creator - extmodule.license = LICENSE - extmodule.user_defined_directories.append( random_settings.boost.include ) - extmodule.user_defined_directories.append( random_settings.working_dir ) - extmodule.user_defined_directories.append( random_settings.generated_files_dir ) - extmodule.precompiled_header = 'boost/python.hpp' - extmodule.replace_included_headers( ['boost/random.hpp', 'boost/nondet_random.hpp', 'random_export.hpp' ] ) - - def write_files( self ): - self.__mb.split_module( random_settings.generated_files_dir ) - - def create(self): - start_time = time.clock() + extmodule = self.__mb.code_creator + extmodule.license = LICENSE + extmodule.user_defined_directories.append( random_settings.boost.include ) + extmodule.user_defined_directories.append( random_settings.working_dir ) + extmodule.user_defined_directories.append( random_settings.generated_files_dir ) + extmodule.precompiled_header = 'boost/python.hpp' + extmodule.replace_included_headers( ['boost/random.hpp', 'boost/nondet_random.hpp', 'random_export.hpp' ] ) + + def write_files( self ): + self.__mb.split_module( random_settings.generated_files_dir ) + + def create(self): + start_time = time.clock() self.filter_declarations() - self.prepare_declarations() - self.__mb.build_code_creator( random_settings.module_name ) - - self.customize_extmodule() - self.write_files( ) - print 'time taken : ', time.clock() - start_time, ' seconds' - -def export(): - cg = code_generator_t() - cg.create() - -if __name__ == '__main__': - export() - print 'done' - - + self.prepare_declarations() + self.__mb.build_code_creator( random_settings.module_name ) + + self.customize_extmodule() + self.write_files( ) + print 'time taken : ', time.clock() - start_time, ' seconds' + +def export(): + cg = code_generator_t() + cg.create() + +if __name__ == '__main__': + export() + print 'done' + + Modified: pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py 2006-07-10 19:12:24 UTC (rev 290) +++ pyplusplus_dev/examples/pyboost_dev/dev/crc/generate_code.py 2006-07-11 07:24:56 UTC (rev 291) @@ -21,7 +21,6 @@ class code_generator_t(object): def __init__(self): - module_builder.set_logger_level( logging.INFO ) self.__file = os.path.join( crc_settings.working_dir, 'crc_export.hpp' ) self.__mb = module_builder.module_builder_t( @@ -31,7 +30,8 @@ , gccxml_path=crc_settings.gccxml.executable , include_paths=[crc_settings.boost.include] , define_symbols=crc_settings.defined_symbols - , undefine_symbols=crc_settings.undefined_symbols) + , undefine_symbols=crc_settings.undefined_symbols + , indexing_suite_version=2) def filter_declarations(self ): self.__mb.global_ns.exclude() Modified: pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-07-10 19:12:24 UTC (rev 290) +++ pyplusplus_dev/examples/pyboost_dev/dev/date_time/generate_code.py 2006-07-11 07:24:56 UTC (rev 291) @@ -18,7 +18,6 @@ class code_generator_t(object): def __init__(self): - module_builder.set_logger_level( logging.INFO ) self.__file = os.path.join( date_time_settings.date_time_pypp_include, 'date_time.pypp.hpp' ) def _create_xml_file( self ): Modified: pyplusplus_dev/examples/pyboost_dev/dev/rational/generate_code.py =================================================================== --- pyplusplus_dev/examples/pyboost_dev/dev/rational/generate_code.py 2006-07-10 19:12:24 UTC (rev 290) +++ pyplusplus_dev/examples/pyboost_dev/dev/rational/generate_code.py 2006-07-11 07:24:56 UTC (rev 291) @@ -22,9 +22,7 @@ #TODO: for some reason unary - was not exported class code_generator_t(object): - def __init__(self): - module_builder.set_logger_level( logging.INFO ) - + def __init__(self): self.__file = os.path.join( rational_settings.working_dir, 'rational_export.hpp' ) self.__mb = module_builder.module_builder_t( @@ -35,7 +33,8 @@ , include_paths=[rational_settings.boost.include] , define_symbols=rational_settings.defined_symbols , undefine_symbols=rational_settings.undefined_symbols - , optimize_queries=False ) + , optimize_queries=False + , indexing_suite_version=2 ) for f_decl in self.__mb.free_functions(): f_decl.alias = f_decl.name Modified: pyplusplus_dev/pyplusplus/_logging_/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/_logging_/__init__.py 2006-07-10 19:12:24 UTC (rev 290) +++ pyplusplus_dev/pyplusplus/_logging_/__init__.py 2006-07-11 07:24:56 UTC (rev 291) @@ -11,9 +11,19 @@ import sys import logging - -logger = logging.getLogger('pyplusplus') -__handler = logging.StreamHandler(sys.stdout) -__handler.setFormatter( logging.Formatter('%(message)s') ) -logger.addHandler(__handler) -logger.setLevel(logging.DEBUG) \ No newline at end of file + +def _create_logger_( name ): + logger = logging.getLogger(name) + __handler = logging.StreamHandler(sys.stdout) + __handler.setFormatter( logging.Formatter( '%(levelname)s %(message)s' ) ) + logger.addHandler(__handler) + logger.setLevel(logging.INFO) + return logger + +class loggers: + file_writer = _create_logger_( 'pyplusplus.file_writer' ) + declarations = _create_logger_( 'pyplusplus.declarations' ) + module_builder = _create_logger_( 'pyplusplus.module_builder' ) + #root logger exists for configuration purpose only + root = logging.getLogger( 'pyplusplus' ) + all = [ root, file_writer, module_builder ] Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-07-10 19:12:24 UTC (rev 290) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-07-11 07:24:56 UTC (rev 291) @@ -78,15 +78,24 @@ def _get_function_type_alias( self ): return 'function_ptr_t' function_type_alias = property( _get_function_type_alias ) - - def create_function_type_alias_code( self ): + + def _get_exported_class_alias( self ): + return 'exported_class_t' + exported_class_alias = property( _get_exported_class_alias ) + + def create_function_type_alias_code( self, exported_class_alias=None ): raise NotImplementedError() def _create_impl( self ): result = [] - if False == self.works_on_instance: - result.append( self.create_function_type_alias_code() ) + if False == self.works_on_instance: + exported_class_alias = None + if declarations.templates.is_instantiation( self.declaration.parent.name ): + exported_class_alias = self.exported_class_alias + result.append( 'typedef %s %s;' % ( self.parent.decl_identifier, exported_class_alias ) ) + result.append( os.linesep ) + result.append( self.create_function_type_alias_code(exported_class_alias) ) result.append( os.linesep * 2 ) result.append( self.create_def_code() + '( ' ) @@ -190,7 +199,7 @@ def create_def_code( self ): return self.def_identifier() - def create_function_type_alias_code( self ): + def create_function_type_alias_code( self, exported_class_alias=None ): return 'typedef ' + self.declaration.function_type().create_typedef( self.function_type_alias ) + ';' def create_function_ref_code(self, use_function_alias=False): @@ -208,8 +217,9 @@ def __init__( self, function ): calldef_t.__init__( self, function=function ) - def create_function_type_alias_code( self ): - return 'typedef ' + self.declaration.function_type().create_typedef( self.function_type_alias ) + ';' + def create_function_type_alias_code( self, exported_class_alias=None ): + ftype = self.declaration.function_type() + return 'typedef %s;' % ftype.create_typedef( self.function_type_alias, exported_class_alias ) def create_function_ref_code(self, use_function_alias=False): if use_function_alias: @@ -227,8 +237,9 @@ def __init__( self, function, wrapper ): calldef_t.__init__( self, function=function, wrapper=wrapper ) - def create_function_type_alias_code( self ): - return 'typedef ' + self.declaration.function_type().create_typedef( self.function_type_alias ) + ';' + def create_function_type_alias_code( self, exported_class_alias=None ): + ftype = self.declaration.function_type() + return 'typedef %s;' % ftype.create_typedef( self.function_type_alias, exported_class_alias ) def create_function_ref_code(self, use_function_alias=False): if use_function_alias: @@ -295,12 +306,15 @@ calldef_t.__init__( self, function=function, wrapper=wrapper ) self.default_function_type_alias = 'default_' + self.function_type_alias - def create_function_type_alias_code( self ): - result = [] - result.append( 'typedef ' + self.declaration.function_type().create_typedef( self.function_type_alias ) + ';' ) + def create_function_type_alias_code( self, exported_class_alias=None ): + result = [] + + ftype = self.declaration.function_type() + result.append( 'typedef %s;' % ftype.create_typedef( self.function_type_alias, exported_class_alias ) ) if self.wrapper: - result.append( os.linesep ) - result.append( 'typedef ' + self.wrapper.function_type().create_typedef( self.default_function_type_alias ) + ';' ) + result.append( os.linesep ) + ftype = self.wrapper.function_type() + result.append( 'typedef %s;' % ftype.create_typedef( self.default_function_type_alias ) ) return ''.join( result ) def create_function_ref_code(self, use_function_alias=False): @@ -413,8 +427,9 @@ def __init__( self, function, wrapper ): calldef_t.__init__( self, function=function, wrapper=wrapper ) - def create_function_type_alias_code( self ): - return 'typedef ' + self.wrapper.function_type().create_typedef( self.function_type_alias ) + ';' + def create_function_type_alias_code( self, exported_class_alias=None ): + ftype = self.wrapper.function_type() + return 'typedef ' + ftype.create_typedef( self.function_type_alias ) + ';' def create_function_ref_code(self, use_function_alias=False): if use_function_alias: @@ -484,8 +499,9 @@ def __init__( self, function, wrapper ): calldef_t.__init__( self, function=function, wrapper=wrapper ) - def create_function_type_alias_code( self ): - return 'typedef ' + self.wrapper.function_type().create_typedef( self.function_type_alias ) + ';' + def create_function_type_alias_code( self, exported_class_alias=None ): + ftype = self.wrapper.function_type() + return 'typedef %s;' % ftype.create_typedef( self.function_type_alias ) def create_function_ref_code(self, use_function_alias=False): if use_function_alias: @@ -546,8 +562,9 @@ def __init__( self, function, wrapper ): calldef_t.__init__( self, function=function, wrapper=wrapper ) - def create_function_type_alias_code( self ): - return 'typedef ' + self.wrapper.function_type().create_typedef( self.function_type_alias ) + ';' + def create_function_type_alias_code( self, exported_class_alias=None ): + ftype = self.wrapper.function_type() + return 'typedef %s;' % ftype.create_typedef( self.function_type_alias ) def create_function_ref_code(self, use_function_alias=False): if use_function_alias: @@ -622,8 +639,9 @@ def __init__( self, function, wrapper ): calldef_t.__init__( self, function=function, wrapper=wrapper ) - def create_function_type_alias_code( self ): - return 'typedef ' + self.wrapper.function_type().create_typedef( self.function_type_alias ) + ';' + def create_function_type_alias_code( self, exported_class_alias=None ): + ftype = self.wrapper.function_type() + return 'typedef %s;' % ftype.create_typedef( self.function_type_alias ) def create_function_ref_code(self, use_function_alias=False): if use_function_alias: Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-07-10 19:12:24 UTC (rev 290) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-07-11 07:24:56 UTC (rev 291) @@ -6,7 +6,6 @@ import os import decl_wrapper from pygccxml import declarations -from pyplusplus import _logging_ ##May be in future I will enable this functionality again, right now it seems ##that this is useless ##def is_finalizable(self): @@ -104,7 +103,7 @@ msg = "Function '%s' with more then 10 arguments( %d ). " msg = msg + " You should adjest BOOST_PYTHON_MAX_ARITY" msg = msg + " For more information see: http://mail.python.org/pipermail/c++-sig/2002-June/001554.html" - _logging_.logger.info( msg % ( self.decl_string, len( self.arguments ) ) ) + self.logger.info( msg % ( self.decl_string, len( self.arguments ) ) ) all_type... [truncated message content] |
From: <rom...@us...> - 2006-07-17 18:18:38
|
Revision: 308 Author: roman_yakovenko Date: 2006-07-17 11:18:24 -0700 (Mon, 17 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=308&view=rev Log Message: ----------- adding documentation to generated code Modified Paths: -------------- pyplusplus_dev/pyplusplus/code_creators/calldef.py pyplusplus_dev/pyplusplus/code_creators/class_declaration.py pyplusplus_dev/pyplusplus/code_creators/declaration_based.py pyplusplus_dev/pyplusplus/code_creators/member_variable.py pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py pyplusplus_dev/unittests/fundamental_tester_base.py Modified: pyplusplus_dev/pyplusplus/code_creators/calldef.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-07-17 14:03:30 UTC (rev 307) +++ pyplusplus_dev/pyplusplus/code_creators/calldef.py 2006-07-17 18:18:24 UTC (rev 308) @@ -71,7 +71,10 @@ return '%s.def' % self.parent.class_var_name else: return 'def' - + + def create_doc(self): + return self.documentation + def create_function_ref_code( self, use_function_alias=False ): raise NotImplementedError() @@ -100,8 +103,8 @@ result.append( self.create_def_code() + '( ' ) result.append( os.linesep + self.indent( '"%s"' % self.alias ) ) + result.append( self.param_sep() ) - result.append( self.create_function_ref_code( not self.works_on_instance ) ) if self.declaration.use_keywords: @@ -114,6 +117,11 @@ else: result.append( os.linesep + self.indent( '/* undefined call policies */', 2 ) ) + doc = self.create_doc() + if doc: + result.append( self.param_sep() ) + result.append( doc ) + result.append( ' )' ) if not self.works_on_instance: result.append( ';' ) @@ -316,6 +324,9 @@ ftype = self.wrapper.function_type() result.append( 'typedef %s;' % ftype.create_typedef( self.default_function_type_alias ) ) return ''.join( result ) + + def create_doc(self): + return None def create_function_ref_code(self, use_function_alias=False): result = [] @@ -817,10 +828,16 @@ init_identifier = algorithm.create_identifier( self, '::boost::python::init' ) args = [ self._generate_definition_args() ] answer = [ '%s' % declarations.templates.join( init_identifier, args ) ] + answer.append( '(' ) + keywords_args = None if self.declaration.use_keywords: - answer.append( '(%s)' % self.keywords_args() ) - else: - answer.append( '()' ) + keywords_args = self.keywords_args() + answer.append( '%s' % keywords_args ) + if self.documentation: + if keywords_args: + answer.append( ', ' ) + answer.append( self.documentation ) + answer.append( ')' ) if self.declaration.call_policies: answer.append('[%s]' % self.declaration.call_policies.create( self ) ) #I think it better not to print next line @@ -1063,7 +1080,7 @@ self._call_policies = None def _create_impl(self): - template = 'def( "%(function_name)s", &%(class_name)s::operator %(destination_type)s %(call_policies)s )' + template = 'def( "%(function_name)s", &%(class_name)s::operator %(destination_type)s %(call_policies)s%(doc)s )' class_name = algorithm.create_identifier( self , declarations.full_name( self.declaration.parent ) ) @@ -1071,11 +1088,16 @@ policies = '/*, undefined call policies */' if self.declaration.call_policies: policies = ',' + self.declaration.call_policies.create( self ) - + + doc = '' + if self.documentation: + doc = ', %s' % self.documentation + return template % { 'function_name' : self.declaration.alias , 'class_name' : class_name , 'destination_type' : self.declaration.return_type.decl_string , 'call_policies' : policies + , 'doc' : doc } class casting_constructor_t( declaration_based.declaration_based_t ): Modified: pyplusplus_dev/pyplusplus/code_creators/class_declaration.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-07-17 14:03:30 UTC (rev 307) +++ pyplusplus_dev/pyplusplus/code_creators/class_declaration.py 2006-07-17 18:18:24 UTC (rev 308) @@ -190,6 +190,8 @@ result = [] result.append( '(' ) result.append( ' "%s"' % self.alias ) + if self.documentation: + result.append( ', %s' % self.documentation ) used_init = None inits = filter( lambda x: isinstance( x, calldef.constructor_t ), self.creators ) if ( self.declaration.is_abstract \ Modified: pyplusplus_dev/pyplusplus/code_creators/declaration_based.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2006-07-17 14:03:30 UTC (rev 307) +++ pyplusplus_dev/pyplusplus/code_creators/declaration_based.py 2006-07-17 18:18:24 UTC (rev 308) @@ -37,7 +37,6 @@ def _get_alias(self): return self.declaration.alias - def _set_alias(self, alias): self.declaration.alias = alias alias = property( _get_alias, _set_alias ) @@ -45,4 +44,9 @@ def _get_decl_identifier( self ): return algorithm.create_identifier( self, self.declaration.decl_string ) decl_identifier = property( _get_decl_identifier ) - \ No newline at end of file + + @property + def documentation( self ): + if None is self.declaration.documentation: + return '' + return self.declaration.documentation Modified: pyplusplus_dev/pyplusplus/code_creators/member_variable.py =================================================================== --- pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-07-17 14:03:30 UTC (rev 307) +++ pyplusplus_dev/pyplusplus/code_creators/member_variable.py 2006-07-17 18:18:24 UTC (rev 308) @@ -36,9 +36,12 @@ #> On Wednesday, 19. April 2006 23:05, Ralf W. Grosse-Kunstleve wrote: #> .add_property("p", make_function(&A::get_p, return_value_policy<reference_existing_object>())) def _generate_for_pointer( self ): + doc = '' #static property does not support documentation if self.declaration.type_qualifiers.has_static: add_property = 'add_static_property' else: + if self.documentation: + doc = self.documentation add_property = 'add_property' answer = [ add_property ] answer.append( '( ' ) @@ -66,6 +69,9 @@ , 'setter_type' : self.wrapper.setter_type , 'wfname' : self.wrapper.setter_full_name , 'call_pol' : call_pol } ) + if doc: + answer.append( self.PARAM_SEPARATOR ) + answer.append( doc ) answer.append( ' ) ' ) code = ''.join( answer ) @@ -80,18 +86,21 @@ def _generate_for_none_pointer( self ): tmpl = None if self.declaration.type_qualifiers.has_static: - tmpl = '%(access)s( "%(alias)s", %(name)s )' + tmpl = '%(access)s( "%(alias)s", %(name)s%(doc)s )' else: - tmpl = '%(access)s( "%(alias)s", &%(name)s )' + tmpl = '%(access)s( "%(alias)s", &%(name)s%(doc)s )' access = 'def_readwrite' if self.is_read_only(): access = 'def_readonly' - + doc = '' + if self.documentation: + doc = ', %s' % self.documentation result = tmpl % { 'access' : access , 'alias' : self.alias - , 'name' : algorithm.create_identifier( self, self.declaration.decl_string ) } + , 'name' : algorithm.create_identifier( self, self.declaration.decl_string ) + , 'doc' : doc } return result @@ -232,9 +241,12 @@ member_variable_base_t.__init__( self, variable=variable, wrapper=wrapper ) def _create_impl( self ): + doc = '' if self.declaration.type_qualifiers.has_static: add_property = 'add_static_property' else: + if self.documentation: + doc = self.documentation add_property = 'add_property' answer = [ add_property ] answer.append( '( ' ) @@ -247,6 +259,9 @@ answer.append( self.PARAM_SEPARATOR ) answer.append( '(%s)(&%s)' % ( self.wrapper.setter_type, self.wrapper.setter_full_name ) ) + if doc: + answer.append( self.PARAM_SEPARATOR ) + answer.append( doc ) answer.append( ' ) ' ) code = ''.join( answer ) @@ -327,9 +342,12 @@ def _create_impl( self ): assert isinstance( self.wrapper, array_mv_wrapper_t ) + doc = '' if self.declaration.type_qualifiers.has_static: answer = [ 'add_static_property' ] else: + if self.documentation: + doc = self.documentation answer = [ 'add_property' ] answer.append( '( ' ) answer.append('"%s"' % self.declaration.name ) @@ -344,6 +362,9 @@ temp.append( call_policies.with_custodian_and_ward_postcall( 0, 1 ).create(self) ) temp.append( ' )' ) answer.append( ''.join( temp ) ) + if doc: + answer.append( self.PARAM_SEPARATOR ) + answer.append( doc ) answer.append( ' );' ) return ''.join( answer ) @@ -423,6 +444,9 @@ answer.append( self.declaration.getter_call_policies.create( self ) ) else: answer.append( os.linesep + self.indent( '/* undefined call policies */', 2 ) ) + if self.documentation: + answer.append( self.param_sep ) + answer.append( self.documentation ) answer.append( ' )' ) return ''.join( answer ) Modified: pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2006-07-17 14:03:30 UTC (rev 307) +++ pyplusplus_dev/pyplusplus/decl_wrappers/decl_wrapper.py 2006-07-17 18:18:24 UTC (rev 308) @@ -34,11 +34,20 @@ self._ignore = False self._exportable = None self._exportable_reason = None + self._documentation = None @property def logger( self ): return _logging_.loggers.declarations - + + def _get_documentation( self ): + return self._documentation + + def _set_documentation( self, value ): + self._documentation = value + documentation = property( _get_documentation, _set_documentation + , doc="Using this property you can set documentatio of exported declaration." ) + def _generate_valid_name(self, name=None): if name == None: name = self.name Modified: pyplusplus_dev/unittests/fundamental_tester_base.py =================================================================== --- pyplusplus_dev/unittests/fundamental_tester_base.py 2006-07-17 14:03:30 UTC (rev 307) +++ pyplusplus_dev/unittests/fundamental_tester_base.py 2006-07-17 18:18:24 UTC (rev 308) @@ -57,6 +57,8 @@ , include_paths=[autoconfig.boost.include] , undefine_symbols=['__MINGW32__'] , indexing_suite_version=self.__indexing_suite_version) + for decl in mb.decls(): + decl.documentation = '"documentation"' self.customize( mb ) if not mb.has_code_creator(): mb.build_code_creator( self.__module_name ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-20 17:50:47
|
Revision: 332 Author: roman_yakovenko Date: 2006-07-20 10:50:37 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=332&view=rev Log Message: ----------- fixing warning report Modified Paths: -------------- pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/member_functions_tester.py Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-07-20 15:25:23 UTC (rev 331) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-07-20 17:50:37 UTC (rev 332) @@ -132,39 +132,44 @@ def _prepare_decls( self, decls, doc_extractor ): global DO_NOT_REPORT_MSGS + decls = declarations.make_flatten( decls ) + + for decl in decls: + if decl.ignore: + continue + + if doc_extractor and decl.exportable: + decl.documentation = doc_extractor( decl ) + + readme = decl.readme() + if not readme: + continue + #Now we should print what py++ has to say to user + full_name = declarations.full_name( decl ) + if not decl.name: + full_name = full_name + '::{unnamed}' + + if not decl.exportable: + reason = readme[0] + if reason in DO_NOT_REPORT_MSGS: + continue + readme = readme[1:] + msg = [ 'Declaration "%s" could not be exported.' % full_name ] + msg.append( reason.replace( os.linesep, os.linesep + '\t' ) ) + self.decl_logger.warn( os.linesep.join( msg ) ) + + for msg in readme: + self.decl_logger.warn( 'Declaration "%s": %s' % ( full_name, msg ) ) + #leave only declarations defined under namespace, but remove namespaces decls = filter( lambda x: not isinstance( x, declarations.namespace_t ) \ and isinstance( x.parent, declarations.namespace_t ) , decls ) - #leave only decls that user wants to export - decls = filter( lambda x: not x.ignore, decls ) - - for decl in decls: - if doc_extractor and decl.exportable: - decl.documentation = doc_extractor( decl ) - - readme = decl.readme() - if not readme: - continue - #Now we should print what py++ has to say to user - full_name = declarations.full_name( decl ) - if not decl.name: - full_name = full_name + '::{unnamed}' - - if not decl.exportable: - reason = readme[0] - if reason in DO_NOT_REPORT_MSGS: - continue - readme = readme[1:] - msg = [ 'Declaration "%s" could not be exported.' % full_name ] - msg.append( reason.replace( os.linesep, os.linesep + '\t' ) ) - self.decl_logger.warn( os.linesep.join( msg ) ) - - for msg in readme: - self.decl_logger.warn( 'Declaration "%s": %s' % ( full_name, msg ) ) - - return filter( lambda x: x.exportable, decls ) + #leave only decls that user wants to export and that could be exported + decls = filter( lambda x: x.ignore == False and x.exportable == True, decls ) + + return decls def _reorder_decls(self, decls ): classes = filter( lambda x: isinstance( x, declarations.class_t ) Modified: pyplusplus_dev/unittests/member_functions_tester.py =================================================================== --- pyplusplus_dev/unittests/member_functions_tester.py 2006-07-20 15:25:23 UTC (rev 331) +++ pyplusplus_dev/unittests/member_functions_tester.py 2006-07-20 17:50:37 UTC (rev 332) @@ -32,6 +32,7 @@ mb.classes( lambda decl: decl.name in names ).always_expose_using_scope = True #will reporoduce bug mb.class_('callable_t').always_expose_using_scope = True + mb.BOOST_PYTHON_MAX_ARITY = 1 def create_test_class_inst(self, class_ ): class tester_impl_t( class_ ): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-23 13:26:14
|
Revision: 335 Author: roman_yakovenko Date: 2006-07-23 06:25:56 -0700 (Sun, 23 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=335&view=rev Log Message: ----------- adding initial support for huge classes Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/__init__.py pyplusplus_dev/pyplusplus/file_writers/multiple_files.py pyplusplus_dev/pyplusplus/module_builder/builder.py pyplusplus_dev/unittests/algorithms_tester.py Added Paths: ----------- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py Modified: pyplusplus_dev/pyplusplus/file_writers/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/__init__.py 2006-07-23 06:02:19 UTC (rev 334) +++ pyplusplus_dev/pyplusplus/file_writers/__init__.py 2006-07-23 13:25:56 UTC (rev 335) @@ -18,7 +18,8 @@ import types from writer import writer_t from single_file import single_file_t -from multiple_files import multiple_files_t +from multiple_files import multiple_files_t +from class_multiple_files import class_multiple_files_t def write_file( data, file_path ): if isinstance( data, types.StringTypes ): @@ -29,4 +30,8 @@ def write_multiple_files( extmodule, dir_path ): mfs = multiple_files_t( extmodule, dir_path ) - mfs.write() \ No newline at end of file + mfs.write() + +def write_class_multiple_files( extmodule, dir_path, huge_classes ): + mfs = class_multiple_files_t( extmodule, dir_path, huge_classes ) + mfs.write() \ No newline at end of file Added: pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py (rev 0) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-23 13:25:56 UTC (rev 335) @@ -0,0 +1,178 @@ +# 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 writer +import multiple_files +from sets import Set as set +from pygccxml import declarations +from pyplusplus import decl_wrappers +from pyplusplus import code_creators + +#TODO: to add namespace_alias_t classes +class class_multiple_files_t(multiple_files.multiple_files_t): + """ + This class will split code, generated for huge classes, to few files. + Next strategy will be used: + 1. New directory with class alias name will be created. + 2. pyplusplus will generate + wrapper header - header that will contain code generated for class wrappers + classes h/cpp - will contain registration code for internal classes + memfun h/cpp - will contain registration code for member functions + + alias + _main h/cpp this class will contain main registration function. + """ + + def __init__(self, extmodule, directory_path, huge_classes): + multiple_files.multiple_files_t.__init__(self, extmodule, directory_path) + self.huge_classes = huge_classes + self.internal_splitters = [ + self.split_internal_enums + , self.split_internal_unnamed_enums + #, self.split_internal_member_functions + , self.split_internal_classes + #, self.split_internal_member_variables + ] + + def split_class_impl( self, class_creator): + function_name = 'register_%s_class' % class_creator.alias + file_path = os.path.join( self.directory_path, class_creator.alias ) + # Write the .h file... + header_name = file_path + self.HEADER_EXT + self.write_file( header_name + , self.create_header( class_creator.alias + , self.create_function_code( function_name ) ) ) + class_wrapper = None + decl_creators = None + if isinstance( class_creator, code_creators.class_t ) and class_creator.wrapper: + class_wrapper = class_creator.wrapper + decl_creators = [ class_creator.wrapper ] + # Write the .cpp file... + cpp_code = self.create_source( class_creator.alias + , function_name + , [class_creator] + , decl_creators ) + self.write_file( file_path + self.SOURCE_EXT, cpp_code ) + if class_wrapper: + # The wrapper has already been written above, so replace the create() + # method with a new 'method' that just returns an empty string because + # this method is later called again for the main source file. + class_wrapper.create = lambda: '' + # Replace the create() method so that only the register() method is called + # (this is called later for the main source file). + class_creator.create = lambda: function_name +'();' + self.__include_creators.append( code_creators.include_t( header_name ) ) + self.split_header_names.append(header_name) + self.split_method_names.append(function_name) + + def write_wrapper( self, class_creator ): + code = '' + if class_creator.wrapper: + code = class_creator.wrapper.create() + class_creator.wrapper.create = lambda: '' + + wrapper_code = self.create_header( class_creator.alias + '_wrapper', code ) + header_file = os.path.join( self.directory_path, class_creator.alias, 'wrapper' + self.HEADER_EXT ) + self.write_file( header_file, wrapper_code ) + + def split_internal_creators( self, class_creator, creators, pattern ): + file_path = os.path.join( self.directory_path + , class_creator.alias + , pattern ) + + function_name = 'register_%s_%s' % ( class_creator.alias, pattern ) + + self.write_file( file_path + self.HEADER_EXT + , self.create_header( pattern, self.create_function_code( function_name ) ) ) + + self.write_file( file_path + self.SOURCE_EXT + , self.create_source( pattern + , function_name + , creators )) + for index, creator in enumerate( creators ): + if 0 == index: + creator.create = lambda: function_name + '();' + else: + creator.create = lambda: '' + + def split_internal_enums( self, class_creator ): + """Write all enumerations into a separate .h/.cpp file. + """ + enums_creators = filter( lambda x: isinstance(x, code_creators.enum_t ) + , class_creator.creators ) + self.split_internal_creators( class_creator, enums_creators, 'enums' ) + return 'enums' + + def split_internal_unnamed_enums( self, class_creator ): + creators = filter( lambda x: isinstance(x, code_creators.unnamed_enum_t ) + , class_creator.creators ) + self.split_internal_creators( class_creator, creators, 'unnamed_enums' ) + return 'unnamed_enums' + + def split_internal_member_functions( self, class_creator ): + creators = filter( lambda x: isinstance(x, code_creators.mem_fun_t ) + , class_creator.creators ) + self.split_internal_creators( class_creator, creators, 'memfuns' ) + return 'memfuns' + + def split_internal_classes( self, class_creator ): + class_types = ( code_creators.class_t, code_creators.class_declaration_t ) + creators = filter( lambda x: isinstance(x, class_types ), class_creator.creators ) + self.split_internal_creators( class_creator, creators, 'classes' ) + return 'classes' + + def split_internal_member_variables( self, class_creator ): + creators = filter( lambda x: isinstance(x, code_creators.member_variable_base_t) + , class_creator.creators ) + self.split_internal_creators( class_creator, creators, 'memvars' ) + return 'memvars' + + def split_class_impl( self, class_creator): + if not class_creator.declaration in self.huge_classes: + return super( class_multiple_files_t, self ).split_class_impl( class_creator ) + + extmodule = class_creator.top_parent + + self.create_dir( os.path.join( self.directory_path, class_creator.alias ) ) + + function_name = 'register_%s_class' % class_creator.alias + file_path = os.path.join( self.directory_path, class_creator.alias ) + # Write the .h file... + header_name = file_path + self.HEADER_EXT + self.write_file( header_name + , self.create_header( class_creator.alias + , self.create_function_code( function_name ) ) ) + + self.write_wrapper( class_creator ) + wrapper_include = code_creators.include_t( os.path.join( class_creator.alias, 'wrapper' + self.HEADER_EXT ) ) + + extmodule.adopt_include( wrapper_include ) + + include_creators = [ wrapper_include ] + splitter_includes = [] + for splitter in self.internal_splitters: + pattern = splitter( class_creator ) + include_creator = code_creators.include_t( os.path.join( class_creator.alias, pattern + self.HEADER_EXT ) ) + splitter_includes.append( include_creator ) + + for creator in splitter_includes: + extmodule.adopt_include( creator ) + + # Write the .cpp file... + cpp_code = self.create_source( class_creator.alias + , function_name + , [class_creator] ) + + self.write_file( file_path + self.SOURCE_EXT, cpp_code ) + + extmodule.remove_creator( wrapper_include ) + for creator in splitter_includes: + extmodule.remove_creator( creator ) + # Replace the create() method so that only the register() method is called + # (this is called later for the main source file). + class_creator.create = lambda: function_name +'();' + self.include_creators.append( code_creators.include_t( header_name ) ) + self.split_header_names.append(header_name) + self.split_method_names.append(function_name) Modified: pyplusplus_dev/pyplusplus/file_writers/multiple_files.py =================================================================== --- pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-07-23 06:02:19 UTC (rev 334) +++ pyplusplus_dev/pyplusplus/file_writers/multiple_files.py 2006-07-23 13:25:56 UTC (rev 335) @@ -29,19 +29,19 @@ """ writer.writer_t.__init__(self, extmodule) self.__directory_path = directory_path - self._create_dir() - self.__include_creators = [] # List of include_t creators that contain the generated headers + self.create_dir( directory_path ) + self.include_creators = [] # List of include_t creators that contain the generated headers self.split_header_names = [] # List of include file names for split files self.split_method_names = [] # List of methods from the split files - def _create_dir( self ): + def create_dir( self, directory_path ): """Create the output directory if it doesn't already exist. """ - if os.path.exists( self.__directory_path ) and not os.path.isdir(self.__directory_path): + if os.path.exists( directory_path ) and not os.path.isdir(directory_path): raise RuntimeError( 'directory_path should contain path to directory.' ) - if not os.path.exists( self.__directory_path ): - os.makedirs( self.__directory_path ) + if not os.path.exists( directory_path ): + os.makedirs( directory_path ) def _get_directory_path(self): return self.__directory_path @@ -181,7 +181,7 @@ # Replace the create() method so that only the register() method is called # (this is called later for the main source file). class_creator.create = lambda: function_name +'();' - self.__include_creators.append( code_creators.include_t( header_name ) ) + self.include_creators.append( code_creators.include_t( header_name ) ) self.split_header_names.append(header_name) self.split_method_names.append(function_name) @@ -246,7 +246,7 @@ self.extmodule.body.adopt_creator( code_creators.custom_text_t( function_name + '();' ) , registrator_pos) - self.__include_creators.append( code_creators.include_t( header_name ) ) + self.include_creators.append( code_creators.include_t( header_name ) ) self.split_header_names.append(header_name) self.split_method_names.append(function_name) @@ -304,8 +304,8 @@ self.split_free_functions() if write_main: - self.__include_creators.sort( cmp=lambda ic1, ic2: cmp( ic1.header, ic2.header ) ) + self.include_creators.sort( cmp=lambda ic1, ic2: cmp( ic1.header, ic2.header ) ) map( lambda creator: self.extmodule.adopt_include( creator ) - , self.__include_creators ) + , 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 ) Modified: pyplusplus_dev/pyplusplus/module_builder/builder.py =================================================================== --- pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-07-23 06:02:19 UTC (rev 334) +++ pyplusplus_dev/pyplusplus/module_builder/builder.py 2006-07-23 13:25:56 UTC (rev 335) @@ -235,14 +235,19 @@ """ file_writers.write_file( self.code_creator, file_name ) - def split_module(self, dir_name): + def split_module(self, dir_name, huge_classes=None): """ Writes module to multiple files @param dir_name: directory name - @type dir_name: string - """ - file_writers.write_multiple_files( self.code_creator, dir_name ) + @type dir_name: string + + @param huge_classes: list that contains reference to classes, that should be split + """ + if None is huge_classes: + file_writers.write_multiple_files( self.code_creator, dir_name ) + else: + file_writers.write_class_multiple_files( self.code_creator, dir_name, huge_classes ) #select decl(s) interfaces def decl( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-07-23 06:02:19 UTC (rev 334) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-07-23 13:25:56 UTC (rev 335) @@ -99,15 +99,44 @@ mem_funs = arr.calldefs( 'x', arg_types=[None,None] ) for x in mem_funs: self.failUnless( x.exportable == False ) + +class class_multiple_files_tester_t(unittest.TestCase): + CLASS_DEF = \ + """ + namespace tester{ + struct X{ + enum EColor{ red, blue }; + enum EFruit{ apple, orange }; + + X(){} + X( int ){} + + void do_nothing(){} + + int do_somghing(){ return 1; } + + int m_dummy; + }; + } + """ + def test(self): + mb = module_builder.module_builder_t( + [ module_builder.create_text_fc( self.CLASS_DEF ) ] + , gccxml_path=autoconfig.gccxml.executable ) + mb.namespace( name='::tester' ).include() + mb.build_code_creator('dummy') + mb.split_module( autoconfig.build_dir, [ mb.class_( '::tester::X' ) ] ) def create_suite(): suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(class_organizer_tester_t)) - suite.addTest( unittest.makeSuite(indent_tester_t)) - suite.addTest( unittest.makeSuite(make_flatten_tester_t)) - suite.addTest( unittest.makeSuite(creator_finder_tester_t)) - suite.addTest( unittest.makeSuite(exclude_function_with_array_arg_tester_t)) + #~ suite.addTest( unittest.makeSuite(class_organizer_tester_t)) + #~ suite.addTest( unittest.makeSuite(indent_tester_t)) + #~ suite.addTest( unittest.makeSuite(make_flatten_tester_t)) + #~ suite.addTest( unittest.makeSuite(creator_finder_tester_t)) + #~ suite.addTest( unittest.makeSuite(exclude_function_with_array_arg_tester_t)) + suite.addTest( unittest.makeSuite(class_multiple_files_tester_t)) + return suite def run_suite(): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-24 09:07:11
|
Revision: 338 Author: roman_yakovenko Date: 2006-07-24 02:06:59 -0700 (Mon, 24 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=338&view=rev Log Message: ----------- fixing bug reported by Matthias suspicious_type( type_ ) will not check self.return_type any more Modified Paths: -------------- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/unittests/algorithms_tester.py Modified: pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py =================================================================== --- pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-07-23 19:58:46 UTC (rev 337) +++ pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py 2006-07-24 09:06:59 UTC (rev 338) @@ -122,7 +122,7 @@ def _readme_impl( self ): def suspicious_type( type_ ): - if not declarations.is_reference( self.return_type ): + if not declarations.is_reference( type_ ): return False type_no_ref = declarations.remove_reference( type_ ) return not declarations.is_const( type_no_ref ) \ Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-07-23 19:58:46 UTC (rev 337) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-07-24 09:06:59 UTC (rev 338) @@ -107,7 +107,7 @@ int do_smth(int); typedef int Int; struct data_t{ - int operator--(); + data_t& operator--(int a); }; } """ @@ -119,7 +119,7 @@ fun = xxx.calldef( 'do_smth' ) self.failUnless( fun.readme() == [] ) minus_minus = xxx.operator( symbol='--' ) - self.failUnless( 1 == len( minus_minus.readme() ) ) + self.failUnless( 1 == len( minus_minus.readme() ), os.linesep.join( minus_minus.readme() ) ) class class_multiple_files_tester_t(unittest.TestCase): CLASS_DEF = \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-27 22:34:49
|
Revision: 353 Author: roman_yakovenko Date: 2006-07-27 02:56:53 -0700 (Thu, 27 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=353&view=rev Log Message: ----------- huge classes functionality has been implemented! Modified Paths: -------------- pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py pyplusplus_dev/pyplusplus/utils/__init__.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 2006-07-27 07:18:46 UTC (rev 352) +++ pyplusplus_dev/pyplusplus/file_writers/class_multiple_files.py 2006-07-27 09:56:53 UTC (rev 353) @@ -10,6 +10,7 @@ from pygccxml import declarations from pyplusplus import decl_wrappers from pyplusplus import code_creators +from pyplusplus import utils as pypp_utils #TODO: to add namespace_alias_t classes class class_multiple_files_t(multiple_files.multiple_files_t): @@ -25,9 +26,10 @@ alias + _main h/cpp this class will contain main registration function. """ - def __init__(self, extmodule, directory_path, huge_classes): + def __init__(self, extmodule, directory_path, huge_classes, num_of_functions_per_file=25): multiple_files.multiple_files_t.__init__(self, extmodule, directory_path) self.huge_classes = huge_classes + self.num_of_functions_per_file = num_of_functions_per_file self.internal_splitters = [ self.split_internal_enums , self.split_internal_unnamed_enums @@ -160,10 +162,21 @@ def split_internal_calldefs( self, class_creator, calldef_types, pattern ): creators = filter( lambda x: isinstance(x, calldef_types ), class_creator.creators ) - for creator in creators: - creator.works_on_instance = False - self.split_internal_creators( class_creator, creators, pattern ) - return pattern + grouped_creators = pypp_utils.split_sequence( creators, self.num_of_functions_per_file ) + if len( grouped_creators ) == 1: + for creator in creators: + creator.works_on_instance = False + self.split_internal_creators( class_creator, creators, pattern ) + return pattern + else: + patterns = [] + for index, group in enumerate( grouped_creators ): + pattern_tmp = pattern + str( index ) + patterns.append( pattern_tmp ) + for creator in group: + creator.works_on_instance = False + self.split_internal_creators( class_creator, group, pattern_tmp ) + return patterns def split_internal_memfuns( self, class_creator ): calldef_types = ( code_creators.mem_fun_t ) @@ -221,8 +234,14 @@ tail_headers = [] for splitter in self.internal_splitters: pattern = splitter( class_creator ) - tail_headers.append( os.path.join( class_creator.alias, pattern + self.HEADER_EXT ) ) - + if not pattern: + continue + if isinstance( pattern, str ): + tail_headers.append( os.path.join( class_creator.alias, pattern + self.HEADER_EXT ) ) + else: + assert( isinstance( pattern, list ) ) + for p in pattern: + tail_headers.append( os.path.join( class_creator.alias, p + self.HEADER_EXT ) ) #writting source file source_code = [] if self.extmodule.license: Modified: pyplusplus_dev/pyplusplus/utils/__init__.py =================================================================== --- pyplusplus_dev/pyplusplus/utils/__init__.py 2006-07-27 07:18:46 UTC (rev 352) +++ pyplusplus_dev/pyplusplus/utils/__init__.py 2006-07-27 09:56:53 UTC (rev 353) @@ -7,7 +7,7 @@ This module is a collection of unrelated algorithms, that works on code creators tree. """ - +import math from pygccxml import declarations from pyplusplus import code_creators @@ -38,6 +38,18 @@ for creator in creators: creator.parent.remove_creator( creator ) exclude = staticmethod( exclude ) - - - \ No newline at end of file + + +def split_sequence(seq, bucket_size): + #split sequence to buclets, where every will contain maximum bucket_size items + seq_len = len( seq ) + if seq_len <= bucket_size: + return [ seq ] + buckets = [] + num_of_buckets = int( math.ceil( float( seq_len ) / bucket_size ) ) + for i in range(num_of_buckets): + from_ = i * bucket_size + to = min( ( i + 1) * bucket_size, seq_len ) + buckets.append( seq[ from_ : to ] ) + return buckets + \ No newline at end of file Modified: pyplusplus_dev/unittests/algorithms_tester.py =================================================================== --- pyplusplus_dev/unittests/algorithms_tester.py 2006-07-27 07:18:46 UTC (rev 352) +++ pyplusplus_dev/unittests/algorithms_tester.py 2006-07-27 09:56:53 UTC (rev 353) @@ -13,6 +13,7 @@ from pyplusplus import code_creators from pyplusplus import module_creator from pyplusplus import module_builder +from pyplusplus import utils as pypp_utils class indent_tester_t(unittest.TestCase): def test( self ): @@ -147,6 +148,16 @@ mb.namespace( name='::tester' ).include() mb.build_code_creator('dummy') mb.split_module( autoconfig.build_dir, [ mb.class_( '::tester::X' ) ] ) + + +class split_sequence_tester_t(unittest.TestCase): + def test(self): + seq = [ 1,2,3 ] + split = pypp_utils.split_sequence + self.failUnless( [[1],[2],[3]] == split( seq, 1 ) ) + self.failUnless( [[1,2],[3]] == split( seq, 2 ) ) + self.failUnless( [[1,2,3]] == split( seq, 3 ) ) + self.failUnless( [[1,2,3]] == split( seq, 4 ) ) def create_suite(): suite = unittest.TestSuite() @@ -157,6 +168,7 @@ suite.addTest( unittest.makeSuite(exclude_function_with_array_arg_tester_t)) suite.addTest( unittest.makeSuite(class_multiple_files_tester_t)) suite.addTest( unittest.makeSuite(readme_tester_t)) + suite.addTest( unittest.makeSuite(split_sequence_tester_t)) return suite This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <al...@us...> - 2006-07-29 12:39:28
|
Revision: 362 Author: allenb Date: 2006-07-29 05:36:51 -0700 (Sat, 29 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=362&view=rev Log Message: ----------- Fix spelling error Modified Paths: -------------- pyplusplus_dev/unittests/test_all.py Added Paths: ----------- pyplusplus_dev/unittests/data/temporary_variable_to_be_exported.hpp pyplusplus_dev/unittests/temporary_variable_tester.py Removed Paths: ------------- pyplusplus_dev/unittests/data/temprorary_variable_to_be_exported.hpp pyplusplus_dev/unittests/temprorary_variable_tester.py Copied: pyplusplus_dev/unittests/data/temporary_variable_to_be_exported.hpp (from rev 361, pyplusplus_dev/unittests/data/temprorary_variable_to_be_exported.hpp) =================================================================== --- pyplusplus_dev/unittests/data/temporary_variable_to_be_exported.hpp (rev 0) +++ pyplusplus_dev/unittests/data/temporary_variable_to_be_exported.hpp 2006-07-29 12:36:51 UTC (rev 362) @@ -0,0 +1,90 @@ +// 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 __temporary_variable_to_be_exported_hpp__ +#define __temporary_variable_to_be_exported_hpp__ + +#include <string> + +namespace temporary_variables{ + +struct named_item_t{ + + named_item_t() : m_name( "no name" ) {} + + virtual const + std::string& name() const + { return m_name; } + +private: + std::string m_name; +}; + +const std::string& get_name( const named_item_t& ni ){ + return ni.name(); +} + +struct pure_virtual_t{ + virtual const std::string& name() const = 0; + virtual std::string& name_ref() = 0; +}; + + +const std::string& get_name( const pure_virtual_t& ni ){ + return ni.name(); +} + +std::string& get_name_ref( pure_virtual_t& ni ){ + return ni.name_ref(); +} + + +struct virtual_t{ + + virtual_t() : m_name( "no name" ){} + virtual const std::string& name() const { return m_name; } + virtual std::string& name_ref() { return m_name; } + +protected: + + virtual const std::string& name_protected() const { return m_name; } + +private: + + virtual const std::string& name_private() const { return m_name; } + +public: + + std::string m_name; +}; + +struct virtual2_t{ + virtual2_t() : m_name( "no name" ){} +protected: + + virtual const std::string& name_protected_pure() const = 0; + virtual const std::string& name_protected() const { return m_name; } + +private: + + virtual const std::string& name_private_pure() const = 0; + virtual const std::string& name_private() const { return m_name; } + +public: + + std::string m_name; +}; + +const std::string& get_name( const virtual_t& ni ){ + return ni.name(); +} + +std::string& get_name_ref( virtual_t& ni ){ + return ni.name_ref(); +} + +} + +#endif//__temporary_variable_to_be_exported_hpp__ Deleted: pyplusplus_dev/unittests/data/temprorary_variable_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/temprorary_variable_to_be_exported.hpp 2006-07-29 11:58:39 UTC (rev 361) +++ pyplusplus_dev/unittests/data/temprorary_variable_to_be_exported.hpp 2006-07-29 12:36:51 UTC (rev 362) @@ -1,90 +0,0 @@ -// 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 __temprorary_variable_to_be_exported_hpp__ -#define __temprorary_variable_to_be_exported_hpp__ - -#include <string> - -namespace temprorary_variables{ - -struct named_item_t{ - - named_item_t() : m_name( "no name" ) {} - - virtual const - std::string& name() const - { return m_name; } - -private: - std::string m_name; -}; - -const std::string& get_name( const named_item_t& ni ){ - return ni.name(); -} - -struct pure_virtual_t{ - virtual const std::string& name() const = 0; - virtual std::string& name_ref() = 0; -}; - - -const std::string& get_name( const pure_virtual_t& ni ){ - return ni.name(); -} - -std::string& get_name_ref( pure_virtual_t& ni ){ - return ni.name_ref(); -} - - -struct virtual_t{ - - virtual_t() : m_name( "no name" ){} - virtual const std::string& name() const { return m_name; } - virtual std::string& name_ref() { return m_name; } - -protected: - - virtual const std::string& name_protected() const { return m_name; } - -private: - - virtual const std::string& name_private() const { return m_name; } - -public: - - std::string m_name; -}; - -struct virtual2_t{ - virtual2_t() : m_name( "no name" ){} -protected: - - virtual const std::string& name_protected_pure() const = 0; - virtual const std::string& name_protected() const { return m_name; } - -private: - - virtual const std::string& name_private_pure() const = 0; - virtual const std::string& name_private() const { return m_name; } - -public: - - std::string m_name; -}; - -const std::string& get_name( const virtual_t& ni ){ - return ni.name(); -} - -std::string& get_name_ref( virtual_t& ni ){ - return ni.name_ref(); -} - -} - -#endif//__temprorary_variable_to_be_exported_hpp__ Copied: pyplusplus_dev/unittests/temporary_variable_tester.py (from rev 361, pyplusplus_dev/unittests/temprorary_variable_tester.py) =================================================================== --- pyplusplus_dev/unittests/temporary_variable_tester.py (rev 0) +++ pyplusplus_dev/unittests/temporary_variable_tester.py 2006-07-29 12:36:51 UTC (rev 362) @@ -0,0 +1,78 @@ +# 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 module_builder + +class tester_t(fundamental_tester_base.fundamental_tester_base_t): + EXTENSION_NAME = 'temporary_variable' + + def __init__( self, *args ): + fundamental_tester_base.fundamental_tester_base_t.__init__( + self + , tester_t.EXTENSION_NAME + , *args ) + + def customize(self, mb): + functions = mb.calldefs( lambda decl: not decl.call_policies + and 'name' in decl.alias ) + functions.call_policies \ + = module_builder.call_policies.return_value_policy( module_builder.call_policies.copy_non_const_reference ) + + def _create_derived_from_named_item(self, extmodule): + class apple_t( extmodule.named_item_t ): + def __init__( self ): + extmodule.named_item_t.__init__( self ) + def name( self ): #this function will be never called + return "apple" + return apple_t() + + def _create_derived_from_pure_virtual(self, extmodule): + class python_pure_virtual_t( extmodule.pure_virtual_t ): + def __init__( self ): + extmodule.pure_virtual_t.__init__( self ) + def name( self ): #this function will be never called + return "name" + def name_ref( self ): #this function will be never called + return "name_ref" + return python_pure_virtual_t() + + def _create_derived_from_virtual(self, extmodule): + class python_virtual_t( extmodule.virtual_t ): + def __init__( self ): + extmodule.virtual_t.__init__( self ) + def name( self ): #this function will be never called + return "name" + def name_ref( self ): #this function will be never called + return "name_ref" + return python_virtual_t() + + def run_tests(self, extmodule): + apple = self._create_derived_from_named_item( extmodule ) + self.failUnless( extmodule.get_name( apple ) == 'no name' ) + pv = self._create_derived_from_pure_virtual( extmodule ) + + self.failIfNotRaisesAny( extmodule.get_name, pv ) + self.failIfNotRaisesAny( extmodule.get_name_ref, pv ) + + virtual = self._create_derived_from_virtual( extmodule ) + self.failUnless( extmodule.get_name( virtual ) == 'no name' ) + self.failUnless( extmodule.get_name_ref( virtual ) == 'no name' ) + + +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() Deleted: pyplusplus_dev/unittests/temprorary_variable_tester.py =================================================================== --- pyplusplus_dev/unittests/temprorary_variable_tester.py 2006-07-29 11:58:39 UTC (rev 361) +++ pyplusplus_dev/unittests/temprorary_variable_tester.py 2006-07-29 12:36:51 UTC (rev 362) @@ -1,78 +0,0 @@ -# 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 module_builder - -class tester_t(fundamental_tester_base.fundamental_tester_base_t): - EXTENSION_NAME = 'temprorary_variable' - - def __init__( self, *args ): - fundamental_tester_base.fundamental_tester_base_t.__init__( - self - , tester_t.EXTENSION_NAME - , *args ) - - def customize(self, mb): - functions = mb.calldefs( lambda decl: not decl.call_policies - and 'name' in decl.alias ) - functions.call_policies \ - = module_builder.call_policies.return_value_policy( module_builder.call_policies.copy_non_const_reference ) - - def _create_derived_from_named_item(self, extmodule): - class apple_t( extmodule.named_item_t ): - def __init__( self ): - extmodule.named_item_t.__init__( self ) - def name( self ): #this function will be never called - return "apple" - return apple_t() - - def _create_derived_from_pure_virtual(self, extmodule): - class python_pure_virtual_t( extmodule.pure_virtual_t ): - def __init__( self ): - extmodule.pure_virtual_t.__init__( self ) - def name( self ): #this function will be never called - return "name" - def name_ref( self ): #this function will be never called - return "name_ref" - return python_pure_virtual_t() - - def _create_derived_from_virtual(self, extmodule): - class python_virtual_t( extmodule.virtual_t ): - def __init__( self ): - extmodule.virtual_t.__init__( self ) - def name( self ): #this function will be never called - return "name" - def name_ref( self ): #this function will be never called - return "name_ref" - return python_virtual_t() - - def run_tests(self, extmodule): - apple = self._create_derived_from_named_item( extmodule ) - self.failUnless( extmodule.get_name( apple ) == 'no name' ) - pv = self._create_derived_from_pure_virtual( extmodule ) - - self.failIfNotRaisesAny( extmodule.get_name, pv ) - self.failIfNotRaisesAny( extmodule.get_name_ref, pv ) - - virtual = self._create_derived_from_virtual( extmodule ) - self.failUnless( extmodule.get_name( virtual ) == 'no name' ) - self.failUnless( extmodule.get_name_ref( virtual ) == 'no name' ) - - -def create_suite(): - suite = unittest.TestSuite() - suite.addTest( unittest.makeSuite(tester_t)) - return suite - -def run_suite(): - unittest.TextTestRunner(verbosity=2).run( create_suite() ) - -if __name__ == "__main__": - run_suite() \ No newline at end of file Modified: pyplusplus_dev/unittests/test_all.py =================================================================== --- pyplusplus_dev/unittests/test_all.py 2006-07-29 11:58:39 UTC (rev 361) +++ pyplusplus_dev/unittests/test_all.py 2006-07-29 12:36:51 UTC (rev 362) @@ -32,7 +32,7 @@ import special_operators_tester import module_properties_tester import internal_classes_tester -import temprorary_variable_tester +import temporary_variable_tester import recursive_tester import class_order_tester import class_order2_tester @@ -85,7 +85,7 @@ , special_operators_tester , module_properties_tester , internal_classes_tester - , temprorary_variable_tester + , temporary_variable_tester , recursive_tester , class_order_tester , noncopyable_tester @@ -133,4 +133,4 @@ print str( error ) print 'first argument should be integer, it says how many times to run tests.' - run_suite(times) \ No newline at end of file + run_suite(times) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rom...@us...> - 2006-07-30 08:12:22
|
Revision: 366 Author: roman_yakovenko Date: 2006-07-30 01:12:03 -0700 (Sun, 30 Jul 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=366&view=rev Log Message: ----------- adding new functionality. It is possible now to pass operator symbol as a name to query functions Modified Paths: -------------- pygccxml_dev/pygccxml/declarations/namespace.py pygccxml_dev/pygccxml/declarations/scopedef.py pygccxml_dev/unittests/data/core_cache.hpp pyplusplus_dev/pyplusplus/decl_wrappers/calldef_wrapper.py pyplusplus_dev/unittests/data/operators_to_be_exported.hpp pyplusplus_dev/unittests/operators_tester.py Modified: pygccxml_dev/pygccxml/declarations/namespace.py =================================================================== --- pygccxml_dev/pygccxml/declarations/namespace.py 2006-07-30 07:53:27 UTC (rev 365) +++ pygccxml_dev/pygccxml/declarations/namespace.py 2006-07-30 08:12:03 UTC (rev 366) @@ -95,7 +95,7 @@ def free_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): return self._find_single( scopedef.scopedef_t._impl_matchers[ namespace_t.free_operator ] - , name=name + , name=self._build_operator_name( name, function, symbol ) , symbol=symbol , function=function , decl_type=self._impl_decl_types[ namespace_t.free_operator ] @@ -107,7 +107,7 @@ def free_operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): return self._find_multiple( scopedef.scopedef_t._impl_matchers[ namespace_t.free_operator ] - , name=name + , name=self._build_operator_name( name, function, symbol ) , symbol=symbol , function=function , decl_type=self._impl_decl_types[ namespace_t.free_operator ] Modified: pygccxml_dev/pygccxml/declarations/scopedef.py =================================================================== --- pygccxml_dev/pygccxml/declarations/scopedef.py 2006-07-30 07:53:27 UTC (rev 365) +++ pygccxml_dev/pygccxml/declarations/scopedef.py 2006-07-30 08:12:03 UTC (rev 366) @@ -1,554 +1,564 @@ -# 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 base class for L{namespace_t} and L{class_t} classes -""" - -import time -import algorithm -import filtering -import declaration -import mdecl_wrapper -from pygccxml import utils -import matcher as matcher_module - -class scopedef_t( declaration.declaration_t ): - """Base class for L{namespace_t} and L{class_t} classes. - - This is the base class for all declaration classes that may have - children nodes. The children can be accessed via the C{declarations} - property. - - Also this class provides "get/select/find" interface. Using this class you - can get instance or instances of internal declaration(s). - - You can find declaration(s) using next criteria: - 1. name - declaration name, could be full qualified name - 2. header_dir - directory, to which belongs file, that the declaration was declarated in. - header_dir should be absolute path. - 3. header_file - file that the declaration was declarated in. - 4. function - user ( your ) custom criteria. The interesting thing is that - this function will be joined with other arguments ( criteria ). - 5. recursive - the search declaration range, if True will be search in - internal declarations too. - - Every "select" API you can invoke and pass as first argument at declaration - name or function. This class will find out correctly what argument represents. - - Example:: - ns - referrers to global namespace - ns.member_function( "do_something ) - will return reference to member - function named "do_something". If there is no such function exception - will be raised. If there is more then one function exception will be - raised too. - - Example 2:: - ns - referers to global namespace - do_smths = ns.member_functions( "do_something ) - will return instance - of L{mdecl_wrapper_t} object. This object allows you few things: - - 1. To iterate on selected declarations - 2. To set some property to desired value using one line of code only: - do_smths.call_policies = x - 3. To call some function on every instance using one line of code: - do_smths.exclude() - - Pay attention: you can not use "get" functions or properties. - """ - - RECURSIVE_DEFAULT = True - ALLOW_EMPTY_MDECL_WRAPPER = False - - _impl_matchers = {} #this class variable is used to prevent recursive imports - _impl_decl_types = {} #this class variable is used to prevent recursive imports - _impl_all_decl_types = [] #this class variable is used to prevent recursive imports - - def __init__( self, name='', parent=''): - declaration.declaration_t.__init__( self, name, parent ) - - self._optimized = False - self._type2decls = {} - self._type2name2decls = {} - self._type2decls_nr = {} - self._type2name2decls_nr = {} - self._all_decls = None +# 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 base class for L{namespace_t} and L{class_t} classes +""" + +import time +import algorithm +import filtering +import declaration +import mdecl_wrapper +from pygccxml import utils +import matcher as matcher_module + +class scopedef_t( declaration.declaration_t ): + """Base class for L{namespace_t} and L{class_t} classes. + + This is the base class for all declaration classes that may have + children nodes. The children can be accessed via the C{declarations} + property. + + Also this class provides "get/select/find" interface. Using this class you + can get instance or instances of internal declaration(s). + + You can find declaration(s) using next criteria: + 1. name - declaration name, could be full qualified name + 2. header_dir - directory, to which belongs file, that the declaration was declarated in. + header_dir should be absolute path. + 3. header_file - file that the declaration was declarated in. + 4. function - user ( your ) custom criteria. The interesting thing is that + this function will be joined with other arguments ( criteria ). + 5. recursive - the search declaration range, if True will be search in + internal declarations too. + + Every "select" API you can invoke and pass as first argument at declaration + name or function. This class will find out correctly what argument represents. + + Example:: + ns - referrers to global namespace + ns.member_function( "do_something ) - will return reference to member + function named "do_something". If there is no such function exception + will be raised. If there is more then one function exception will be + raised too. + + Example 2:: + ns - referers to global namespace + do_smths = ns.member_functions( "do_something ) - will return instance + of L{mdecl_wrapper_t} object. This object allows you few things: + + 1. To iterate on selected declarations + 2. To set some property to desired value using one line of code only: + do_smths.call_policies = x + 3. To call some function on every instance using one line of code: + do_smths.exclude() + + Pay attention: you can not use "get" functions or properties. + """ + + RECURSIVE_DEFAULT = True + ALLOW_EMPTY_MDECL_WRAPPER = False + + _impl_matchers = {} #this class variable is used to prevent recursive imports + _impl_decl_types = {} #this class variable is used to prevent recursive imports + _impl_all_decl_types = [] #this class variable is used to prevent recursive imports + + def __init__( self, name='', parent=''): + declaration.declaration_t.__init__( self, name, parent ) + + self._optimized = False + self._type2decls = {} + self._type2name2decls = {} + self._type2decls_nr = {} + self._type2name2decls_nr = {} + self._all_decls = None + def _get_logger( self ): return utils.loggers.queries_engine _logger = property( _get_logger ) - - def _get__cmp__scope_items(self): - raise NotImplementedError() - - def _get__cmp__items(self): - items = [ self._sorted_list( self.declarations ) ] - items.extend( self._get__cmp__scope_items() ) - return items - - def __eq__(self, other): - if not declaration.declaration_t.__eq__( self, other ): - return False - return self._sorted_list( self.declarations[:] ) \ - == other._sorted_list( other.declarations[:] ) - - def _get_declarations_impl(self): - raise NotImplementedError() - - def _get_declarations(self): - return self._get_declarations_impl() - declarations = property( _get_declarations, - doc="""A list of children declarations. - @type: list of L{declaration_t} - """) - - def remove_declaration( self, decl ): - raise NotImplementedError() - - - def __decl_types( self, decl ): - types = [] - bases = list( decl.__class__.__bases__ ) - visited = set() - if 'pygccxml' in decl.__class__.__module__: - types.append( decl.__class__ ) - while bases: - base = bases.pop() - if base is declaration.declaration_t: - continue - if base in visited: - continue - if 'pygccxml' not in base.__module__: - continue - types.append( base ) - bases.extend( base.__bases__ ) - return types - - def clear_optimizer(self): - """Cleans query optimizer state""" - self._optimized = False - self._type2decls = {} - self._type2name2decls = {} - self._type2decls_nr = {} - self._type2name2decls_nr = {} - self._all_decls = None - - map( lambda decl: decl.clear_optimizer() - , filter( lambda decl: isinstance( decl, scopedef_t ) - , self.declarations ) ) - - def init_optimizer(self): - """Initializes query optimizer state. - There are 4 internals hash tables: - 1. from type to declarations - 2. from type to declarations for non-recursive queries - 3. from type to name to declarations - 4. from type to name to declarations for non-recursive queries - - Almost every query includes declaration type information. Also very - common query is to search some declaration(s) by name or full name. - Those hashtables allows to search declaration very quick. - """ - if self.name == '::': - self._logger.debug( "preparing data structures for query optimizer - started" ) - start_time = time.clock() - - self.clear_optimizer() - - for dtype in scopedef_t._impl_all_decl_types: - self._type2decls[ dtype ] = [] - self._type2decls_nr[ dtype ] = [] - self._type2name2decls[ dtype ] = {} - self._type2name2decls_nr[ dtype ] = {} - - self._all_decls = algorithm.make_flatten( self.declarations ) - for decl in self._all_decls: - types = self.__decl_types( decl ) - for type_ in types: - self._type2decls[ type_ ].append( decl ) - name2decls = self._type2name2decls[ type_ ] - if not name2decls.has_key( decl.name ): - name2decls[ decl.name ] = [] - name2decls[ decl.name ].append( decl ) - if self is decl.parent: - self._type2decls_nr[ type_ ].append( decl ) - name2decls_nr = self._type2name2decls_nr[ type_ ] - if not name2decls_nr.has_key( decl.name ): - name2decls_nr[ decl.name ] = [] - name2decls_nr[ decl.name ].append( decl ) - - map( lambda decl: decl.init_optimizer() - , filter( lambda decl: isinstance( decl, scopedef_t ), self.declarations ) ) - if self.name == '::': - self._logger.debug( "preparing data structures for query optimizer - done( %f seconds ). " - % ( time.clock() - start_time ) ) - self._optimized = True - - - def __normalize_args( self, **keywds ): - if callable( keywds['name'] ) and None is keywds['function']: - keywds['function'] = keywds['name'] - keywds['name'] = None - return keywds - - def __findout_recursive( self, **keywds ): - if None is keywds[ 'recursive' ]: - return self.RECURSIVE_DEFAULT - else: - return keywds[ 'recursive' ] - - def __findout_allow_empty( self, **keywds ): - if None is keywds[ 'allow_empty' ]: - return self.ALLOW_EMPTY_MDECL_WRAPPER - else: - return keywds[ 'allow_empty' ] - - def __findout_decl_type( self, match_class, **keywds ): - if keywds.has_key( 'decl_type' ): - return keywds['decl_type'] - - matcher_args = keywds.copy() - del matcher_args['function'] - del matcher_args['recursive'] - if matcher_args.has_key('allow_empty'): - del matcher_args['allow_empty'] - - - matcher = match_class( **matcher_args ) - if matcher.decl_type: - return matcher.decl_type - return None - - def __create_matcher( self, match_class, **keywds ): - matcher_args = keywds.copy() - del matcher_args['function'] - del matcher_args['recursive'] - if matcher_args.has_key('allow_empty'): - del matcher_args['allow_empty'] - - matcher = match_class( **matcher_args ) - if keywds['function']: - self._logger.debug( 'running query: %s and <user defined function>' % str( matcher ) ) - return lambda decl: matcher( decl ) and keywds['function'](decl) - else: - self._logger.debug( 'running query: %s' % str( matcher ) ) - return matcher - - def __findout_range( self, name, decl_type, recursive ): - if not self._optimized: - self._logger.debug( 'running non optimized query - optimization has not been done' ) - decls = self.declarations - if recursive: - decls = algorithm.make_flatten( self.declarations ) - return decls - - if name and decl_type: - matcher = scopedef_t._impl_matchers[ scopedef_t.decl ]( name=name ) - if matcher.is_full_name(): - name = matcher.decl_name_only - if recursive: - self._logger.debug( 'query has been optimized on type and name' ) - if self._type2name2decls[decl_type].has_key( name ): - return self._type2name2decls[decl_type][name] - else: - return [] - else: - self._logger.debug( 'non recursive query has been optimized on type and name' ) - if self._type2name2decls_nr[decl_type].has_key( name ): - return self._type2name2decls_nr[decl_type][name] - else: - return [] - elif decl_type: - if recursive: - self._logger.debug( 'query has been optimized on type' ) - return self._type2decls[ decl_type ] - else: - self._logger.debug( 'non recursive query has been optimized on type' ) - return self._type2decls_nr[ decl_type ] - else: - if recursive: - self._logger.debug( 'query has not been optimized ( hint: query does not contain type and/or name )' ) - return self._all_decls - else: - self._logger.debug( 'non recursive query has not been optimized ( hint: query does not contain type and/or name )' ) - return self.declarations - - def _find_single( self, match_class, **keywds ): - self._logger.debug( 'find single query execution - started' ) - start_time = time.clock() - norm_keywds = self.__normalize_args( **keywds ) - matcher = self.__create_matcher( match_class, **norm_keywds ) - dtype = self.__findout_decl_type( match_class, **norm_keywds ) - recursive_ = self.__findout_recursive( **norm_keywds ) - decls = self.__findout_range( norm_keywds['name'], dtype, recursive_ ) - found = matcher_module.matcher.get_single( matcher, decls, False ) - self._logger.debug( 'find single query execution - done( %f seconds )' % ( time.clock() - start_time ) ) - return found - - def _find_multiple( self, match_class, **keywds ): - self._logger.debug( 'find all query execution - started' ) - start_time = time.clock() - norm_keywds = self.__normalize_args( **keywds ) - matcher = self.__create_matcher( match_class, **norm_keywds ) - dtype = self.__findout_decl_type( match_class, **norm_keywds ) - recursive_ = self.__findout_recursive( **norm_keywds ) - allow_empty = self.__findout_allow_empty( **norm_keywds ) - decls = self.__findout_range( norm_keywds['name'], dtype, recursive_ ) - found = matcher_module.matcher.find( matcher, decls, False ) - mfound = mdecl_wrapper.mdecl_wrapper_t( found ) - self._logger.debug( '%d declaration(s) that match query' % len(mfound) ) - self._logger.debug( 'find single query execution - done( %f seconds )' - % ( time.clock() - start_time ) ) - if not mfound and not allow_empty: - raise RuntimeError( "Multi declaration query returned 0 declarations." ) - return mfound - - - def decl( self, name=None, function=None, decl_type=None, header_dir=None, header_file=None, recursive=None ): - """Finds any declaration by criteria. Please see L{scopedef_t} for full explanation.""" - return self._find_single( self._impl_matchers[ scopedef_t.decl ] - , name=name - , function=function - , decl_type=decl_type - , header_dir=header_dir - , header_file=header_file - , recursive=recursive) - - def decls( self, name=None, function=None, decl_type=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.decl ] - , name=name - , function=function - , decl_type=decl_type - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def class_( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.class_ ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.class_ ] - , header_dir=header_dir - , header_file=header_file - , recursive=recursive) - - def classes( self, name=None, function=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.class_ ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.class_ ] - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def variable( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.variable ] - , name=name - , function=function - , type=type - , header_dir=header_dir - , header_file=header_file - , recursive=recursive) - - def variables( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.variable ] - , name=name - , function=function - , type=type - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def calldef( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.calldef ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.calldef ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive ) - - def calldefs( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.calldef ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.calldef ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.operator ] - , name=name - , symbol=symbol - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.operator ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive ) - - def operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.operator ] - , name=name - , symbol=symbol - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.operator ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def member_function( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.member_function ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.member_function ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive ) - - def member_functions( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.member_function ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.member_function ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def constructor( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.constructor ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.constructor ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive ) - - def constructors( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.constructor ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.constructor ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def member_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.member_operator ] - , name=name - , symbol=symbol - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.member_operator ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive ) - - def member_operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.member_operator ] - , name=name - , symbol=symbol - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.member_operator ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def casting_operator( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.casting_operator ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.casting_operator ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive ) - - def casting_operators( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.casting_operator ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.casting_operator ] - , return_type=return_type - , arg_types=arg_types - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - - def enumeration( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): - return self._find_single( self._impl_matchers[ scopedef_t.enumeration ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.enumeration ] - , header_dir=header_dir - , header_file=header_file - , recursive=recursive) - #adding small aliase - enum = enumeration - - def enumerations( self, name=None, function=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.enumeration ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.enumeration ] - , header_dir=header_dir - , header_file=header_file - , recursive=recursive - , allow_empty=allow_empty) - #adding small aliase - enums = enumerations - - def typedef( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): - """Finds any declaration by criteria. Please see L{scopedef_t} for full explanation.""" - return self._find_single( self._impl_matchers[ scopedef_t.typedef ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.typedef ] - , header_dir=header_dir - , header_file=header_file - , recursive=recursive) - - def typedefs( self, name=None, function=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): - return self._find_multiple( self._impl_matchers[ scopedef_t.typedef ] - , name=name - , function=function - , decl_type=self._impl_decl_types[ scopedef_t.typedef ] - , header_dir=header_dir - , header_file=header_file - , recursive=recursive + + def _get__cmp__scope_items(self): + raise NotImplementedError() + + def _get__cmp__items(self): + items = [ self._sorted_list( self.declarations ) ] + items.extend( self._get__cmp__scope_items() ) + return items + + def __eq__(self, other): + if not declaration.declaration_t.__eq__( self, other ): + return False + return self._sorted_list( self.declarations[:] ) \ + == other._sorted_list( other.declarations[:] ) + + def _get_declarations_impl(self): + raise NotImplementedError() + + def _get_declarations(self): + return self._get_declarations_impl() + declarations = property( _get_declarations, + doc="""A list of children declarations. + @type: list of L{declaration_t} + """) + + def remove_declaration( self, decl ): + raise NotImplementedError() + + + def __decl_types( self, decl ): + types = [] + bases = list( decl.__class__.__bases__ ) + visited = set() + if 'pygccxml' in decl.__class__.__module__: + types.append( decl.__class__ ) + while bases: + base = bases.pop() + if base is declaration.declaration_t: + continue + if base in visited: + continue + if 'pygccxml' not in base.__module__: + continue + types.append( base ) + bases.extend( base.__bases__ ) + return types + + def clear_optimizer(self): + """Cleans query optimizer state""" + self._optimized = False + self._type2decls = {} + self._type2name2decls = {} + self._type2decls_nr = {} + self._type2name2decls_nr = {} + self._all_decls = None + + map( lambda decl: decl.clear_optimizer() + , filter( lambda decl: isinstance( decl, scopedef_t ) + , self.declarations ) ) + + def init_optimizer(self): + """Initializes query optimizer state. + There are 4 internals hash tables: + 1. from type to declarations + 2. from type to declarations for non-recursive queries + 3. from type to name to declarations + 4. from type to name to declarations for non-recursive queries + + Almost every query includes declaration type information. Also very + common query is to search some declaration(s) by name or full name. + Those hashtables allows to search declaration very quick. + """ + if self.name == '::': + self._logger.debug( "preparing data structures for query optimizer - started" ) + start_time = time.clock() + + self.clear_optimizer() + + for dtype in scopedef_t._impl_all_decl_types: + self._type2decls[ dtype ] = [] + self._type2decls_nr[ dtype ] = [] + self._type2name2decls[ dtype ] = {} + self._type2name2decls_nr[ dtype ] = {} + + self._all_decls = algorithm.make_flatten( self.declarations ) + for decl in self._all_decls: + types = self.__decl_types( decl ) + for type_ in types: + self._type2decls[ type_ ].append( decl ) + name2decls = self._type2name2decls[ type_ ] + if not name2decls.has_key( decl.name ): + name2decls[ decl.name ] = [] + name2decls[ decl.name ].append( decl ) + if self is decl.parent: + self._type2decls_nr[ type_ ].append( decl ) + name2decls_nr = self._type2name2decls_nr[ type_ ] + if not name2decls_nr.has_key( decl.name ): + name2decls_nr[ decl.name ] = [] + name2decls_nr[ decl.name ].append( decl ) + + map( lambda decl: decl.init_optimizer() + , filter( lambda decl: isinstance( decl, scopedef_t ), self.declarations ) ) + if self.name == '::': + self._logger.debug( "preparing data structures for query optimizer - done( %f seconds ). " + % ( time.clock() - start_time ) ) + self._optimized = True + + def _build_operator_name( self, name, function, symbol ): + if callable( name ) and None is function: + name = None + if name: + if not 'operator' in name: + name = 'operator' + name + return name + elif symbol: + return 'operator' + symbol + return name #both name and symbol are None + + + def __normalize_args( self, **keywds ): + if callable( keywds['name'] ) and None is keywds['function']: + keywds['function'] = keywds['name'] + keywds['name'] = None + return keywds + + def __findout_recursive( self, **keywds ): + if None is keywds[ 'recursive' ]: + return self.RECURSIVE_DEFAULT + else: + return keywds[ 'recursive' ] + + def __findout_allow_empty( self, **keywds ): + if None is keywds[ 'allow_empty' ]: + return self.ALLOW_EMPTY_MDECL_WRAPPER + else: + return keywds[ 'allow_empty' ] + + def __findout_decl_type( self, match_class, **keywds ): + if keywds.has_key( 'decl_type' ): + return keywds['decl_type'] + + matcher_args = keywds.copy() + del matcher_args['function'] + del matcher_args['recursive'] + if matcher_args.has_key('allow_empty'): + del matcher_args['allow_empty'] + + + matcher = match_class( **matcher_args ) + if matcher.decl_type: + return matcher.decl_type + return None + + def __create_matcher( self, match_class, **keywds ): + matcher_args = keywds.copy() + del matcher_args['function'] + del matcher_args['recursive'] + if matcher_args.has_key('allow_empty'): + del matcher_args['allow_empty'] + + matcher = match_class( **matcher_args ) + if keywds['function']: + self._logger.debug( 'running query: %s and <user defined function>' % str( matcher ) ) + return lambda decl: matcher( decl ) and keywds['function'](decl) + else: + self._logger.debug( 'running query: %s' % str( matcher ) ) + return matcher + + def __findout_range( self, name, decl_type, recursive ): + if not self._optimized: + self._logger.debug( 'running non optimized query - optimization has not been done' ) + decls = self.declarations + if recursive: + decls = algorithm.make_flatten( self.declarations ) + return decls + + if name and decl_type: + matcher = scopedef_t._impl_matchers[ scopedef_t.decl ]( name=name ) + if matcher.is_full_name(): + name = matcher.decl_name_only + if recursive: + self._logger.debug( 'query has been optimized on type and name' ) + if self._type2name2decls[decl_type].has_key( name ): + return self._type2name2decls[decl_type][name] + else: + return [] + else: + self._logger.debug( 'non recursive query has been optimized on type and name' ) + if self._type2name2decls_nr[decl_type].has_key( name ): + return self._type2name2decls_nr[decl_type][name] + else: + return [] + elif decl_type: + if recursive: + self._logger.debug( 'query has been optimized on type' ) + return self._type2decls[ decl_type ] + else: + self._logger.debug( 'non recursive query has been optimized on type' ) + return self._type2decls_nr[ decl_type ] + else: + if recursive: + self._logger.debug( 'query has not been optimized ( hint: query does not contain type and/or name )' ) + return self._all_decls + else: + self._logger.debug( 'non recursive query has not been optimized ( hint: query does not contain type and/or name )' ) + return self.declarations + + def _find_single( self, match_class, **keywds ): + self._logger.debug( 'find single query execution - started' ) + start_time = time.clock() + norm_keywds = self.__normalize_args( **keywds ) + matcher = self.__create_matcher( match_class, **norm_keywds ) + dtype = self.__findout_decl_type( match_class, **norm_keywds ) + recursive_ = self.__findout_recursive( **norm_keywds ) + decls = self.__findout_range( norm_keywds['name'], dtype, recursive_ ) + found = matcher_module.matcher.get_single( matcher, decls, False ) + self._logger.debug( 'find single query execution - done( %f seconds )' % ( time.clock() - start_time ) ) + return found + + def _find_multiple( self, match_class, **keywds ): + self._logger.debug( 'find all query execution - started' ) + start_time = time.clock() + norm_keywds = self.__normalize_args( **keywds ) + matcher = self.__create_matcher( match_class, **norm_keywds ) + dtype = self.__findout_decl_type( match_class, **norm_keywds ) + recursive_ = self.__findout_recursive( **norm_keywds ) + allow_empty = self.__findout_allow_empty( **norm_keywds ) + decls = self.__findout_range( norm_keywds['name'], dtype, recursive_ ) + found = matcher_module.matcher.find( matcher, decls, False ) + mfound = mdecl_wrapper.mdecl_wrapper_t( found ) + self._logger.debug( '%d declaration(s) that match query' % len(mfound) ) + self._logger.debug( 'find single query execution - done( %f seconds )' + % ( time.clock() - start_time ) ) + if not mfound and not allow_empty: + raise RuntimeError( "Multi declaration query returned 0 declarations." ) + return mfound + + def decl( self, name=None, function=None, decl_type=None, header_dir=None, header_file=None, recursive=None ): + """Finds any declaration by criteria. Please see L{scopedef_t} for full explanation.""" + return self._find_single( self._impl_matchers[ scopedef_t.decl ] + , name=name + , function=function + , decl_type=decl_type + , header_dir=header_dir + , header_file=header_file + , recursive=recursive) + + def decls( self, name=None, function=None, decl_type=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.decl ] + , name=name + , function=function + , decl_type=decl_type + , header_dir=header_dir + , header_file=header_file + , recursive=recursive , allow_empty=allow_empty) + def class_( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.class_ ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.class_ ] + , header_dir=header_dir + , header_file=header_file + , recursive=recursive) + + def classes( self, name=None, function=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.class_ ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.class_ ] + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def variable( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.variable ] + , name=name + , function=function + , type=type + , header_dir=header_dir + , header_file=header_file + , recursive=recursive) + + def variables( self, name=None, function=None, type=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.variable ] + , name=name + , function=function + , type=type + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def calldef( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.calldef ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.calldef ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive ) + + def calldefs( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.calldef ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.calldef ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.operator ] + , name=self._build_operator_name( name, function, symbol ) + , symbol=symbol + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.operator ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive ) + + def operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, decl_type=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.operator ] + , name=self._build_operator_name( name, function, symbol ) + , symbol=symbol + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.operator ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def member_function( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.member_function ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.member_function ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive ) + + def member_functions( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.member_function ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.member_function ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def constructor( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.constructor ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.constructor ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive ) + + def constructors( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.constructor ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.constructor ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def member_operator( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.member_operator ] + , name=self._build_operator_name( name, function, symbol ) + , symbol=symbol + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.member_operator ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive ) + + def member_operators( self, name=None, function=None, symbol=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.member_operator ] + , name=self._build_operator_name( name, function, symbol ) + , symbol=symbol + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.member_operator ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def casting_operator( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.casting_operator ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.casting_operator ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive ) + + def casting_operators( self, name=None, function=None, return_type=None, arg_types=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.casting_operator ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.casting_operator ] + , return_type=return_type + , arg_types=arg_types + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + + def enumeration( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): + return self._find_single( self._impl_matchers[ scopedef_t.enumeration ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.enumeration ] + , header_dir=header_dir + , header_file=header_file + , recursive=recursive) + #adding small aliase + enum = enumeration + + def enumerations( self, name=None, function=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.enumeration ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.enumeration ] + , header_dir=header_dir + , header_file=header_file + , recursive=recursive + , allow_empty=allow_empty) + #adding small aliase + enums = enumerations + + def typedef( self, name=None, function=None, header_dir=None, header_file=None, recursive=None ): + """Finds any declaration by criteria. Please see L{scopedef_t} for full explanation.""" + return self._find_single( self._impl_matchers[ scopedef_t.typedef ] + , name=name + , function=function + , decl_type=self._impl_decl_types[ scopedef_t.typedef ] + , header_dir=header_dir + , header_file=header_file + , recursive=recursive) + + def typedefs( self, name=None, function=None, header_dir=None, header_file=None, recursive=None, allow_empty=None ): + return self._find_multiple( self._impl_matchers[ scopedef_t.typedef ] + , name=name + , function=function + ... [truncated message content] |