[pygccxml-commit] SF.net SVN: pygccxml: [388] pyplusplus_dev/unittests
Brought to you by:
mbaas,
roman_yakovenko
From: <rom...@us...> - 2006-08-09 06:07:07
|
Revision: 388 Author: roman_yakovenko Date: 2006-08-08 23:06:50 -0700 (Tue, 08 Aug 2006) ViewCVS: http://svn.sourceforge.net/pygccxml/?rev=388&view=rev Log Message: ----------- abstract classes could not have held_type Modified Paths: -------------- pyplusplus_dev/docs/documentation/architecture.rest pyplusplus_dev/pyplusplus/module_creator/creator.py pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.cpp pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.hpp pyplusplus_dev/unittests/smart_pointers_tester.py Modified: pyplusplus_dev/docs/documentation/architecture.rest =================================================================== --- pyplusplus_dev/docs/documentation/architecture.rest 2006-08-08 07:58:31 UTC (rev 387) +++ pyplusplus_dev/docs/documentation/architecture.rest 2006-08-09 06:06:50 UTC (rev 388) @@ -141,9 +141,79 @@ Code generation engine ---------------------- -Code generation for `boost.python`_ library is a difficult process. +Code generation for `boost.python`_ library is a difficult process. I don't know +what about you, but when I have to solve some complex task, I prefer to use +`divide and conquer`_ paradigm. There are 2 different problems code generation +engine should solve: +* What code should be created in order to export a declaration? + I mean what `boost.python`_ code should be generated if you want to export this + or that declaration. + + Code creators is the solution to this problem. + +* How it should be written to files? + + Remember, `pyplusplus`_ is targeting big projects. It can not generate all code + in one file - this will not work, not at all. + + Code creators and file writers provides solution to this problem. + + +.. _`divide and conquer` : http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm + + +Code creators +------------- + +Do you know how many ways exist to export member function? It is up to you to +find the answer to the question. Please consider next use cases: + +* function is non virtual, virtual or pure virtual + +* function is public, protected or private + +* function could be static + +* function could be an ``operator()`` or an ``operator[]`` + +As you see, there are a lot of use cases. How does code creators solves the +problem? There is almost a direct mapping between code creators and use cases. +Code creator knows what code should be generated, in order to export this or that +declaration. That is the only job of code creators. For example: + +* ``code_creators.enum_t`` generates code, that will export named enum + +* ``code_creators.indexing_suite2_t`` generates code, that will export stl container + +There are primary 2 kinds of code creators: declaration based and others. +Declaration based code creator creates code or part of it, that will export the +declaration. For example: in order to export virtual function, `pyplusplus`_ +creates 3 code creators: + +( I will reuse example from `boost.python`_ `tutorials`__.) + +.. __ : http://boost.org/libs/python/doc/tutorial/doc/html/python/exposing.html#python.virtual_functions_with_default_implementations + +1. ``BaseWrap::f`` + +2. ``BaseWrap::default_f`` + +3. ``f`` registration code + +Now when you understand, what code creator is, it is a time to move on - composite +code creator. Composite code creator is a creator, that contains other creators. +For example: ``code_creators.class_t`` or ``code_creators.module_t``. They embed +the code created by internal code creators within the code they create. + + + + + + + + .. _`pyplusplus` : ./../pyplusplus.html .. _`pygccxml` : ./../../pygccxml/pygccxml.html .. _`boost.python`: http://www.boost.org/libs/python/doc/index.html Modified: pyplusplus_dev/pyplusplus/module_creator/creator.py =================================================================== --- pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-08-08 07:58:31 UTC (rev 387) +++ pyplusplus_dev/pyplusplus/module_creator/creator.py 2006-08-09 06:06:50 UTC (rev 388) @@ -405,8 +405,9 @@ , recursive=True ) registrators_db = [] for creator in class_creators: - if None is creator.held_type: - creator.held_type = self.__types_db.create_holder( creator.declaration ) + if None is creator.held_type: + if not creator.declaration.is_abstract: + creator.held_type = self.__types_db.create_holder( creator.declaration ) registrators = self.__types_db.create_registrators( creator ) for r in registrators: if not self._is_registered_smart_pointer_creator( r, registrators_db ): Modified: pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.cpp =================================================================== --- pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.cpp 2006-08-08 07:58:31 UTC (rev 387) +++ pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.cpp 2006-08-09 06:06:50 UTC (rev 388) @@ -28,5 +28,17 @@ int const_ref_auto_base_value( const base_a_ptr& a ){ return a->get_base_value(); } int const_ref_shared_base_value( const base_s_ptr& a ){ return a->get_base_value(); } - + + +int ref_auto_some_value( base_a_ptr& a ){ return a->get_some_value(); } +int ref_shared_some_value( base_s_ptr& a ){ return a->get_some_value(); } + +int val_auto_some_value( base_a_ptr a ){ return a->get_some_value(); } +int val_shared_some_value( base_s_ptr a ){ return a->get_some_value(); } + +int const_ref_auto_some_value( const base_a_ptr& a ){ return a->get_some_value(); } +int const_ref_shared_some_value( const base_s_ptr& a ){ return a->get_some_value(); } + + + } Modified: pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.hpp =================================================================== --- pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.hpp 2006-08-08 07:58:31 UTC (rev 387) +++ pyplusplus_dev/unittests/data/smart_pointers_to_be_exported.hpp 2006-08-09 06:06:50 UTC (rev 388) @@ -13,13 +13,15 @@ struct base{ base() : base_value(19) {} int base_value; - virtual int get_base_value(){ return base_value; } + virtual int get_base_value(){ return base_value; } + virtual int get_some_value() = 0; }; struct data : base{ data() : value(11){} int value; - virtual int get_value(){ return value; } + virtual int get_value(){ return value; } + virtual int get_some_value(){ return 23; } }; typedef std::auto_ptr< base > base_a_ptr; @@ -48,7 +50,17 @@ int const_ref_auto_base_value( const base_a_ptr& a ); int const_ref_shared_base_value( const base_s_ptr& a ); - + +int ref_auto_some_value( base_a_ptr& a ); +int ref_shared_some_value( base_s_ptr& a ); + +int val_auto_some_value( base_a_ptr a ); +int val_shared_some_value( base_s_ptr a ); + +int const_ref_auto_some_value( const base_a_ptr& a ); +int const_ref_shared_some_value( const base_s_ptr& a ); + + } #endif//__smart_pointers_to_be_exported_hpp__ Modified: pyplusplus_dev/unittests/smart_pointers_tester.py =================================================================== --- pyplusplus_dev/unittests/smart_pointers_tester.py 2006-08-08 07:58:31 UTC (rev 387) +++ pyplusplus_dev/unittests/smart_pointers_tester.py 2006-08-09 06:06:50 UTC (rev 388) @@ -17,23 +17,42 @@ self , tester_t.EXTENSION_NAME , *args ) - + + def customize( self, mb ): + base = mb.class_( 'base' ) + #base.held_type = '' + + def create_py_derived( self, module ): + class py_derived_t( module.base ): + def __init__( self ): + module.base.__init__( self ) + + def get_some_value( self ): + return 28 + + return py_derived_t() + def run_tests( self, module): - da = module.create_auto() + da = module.create_auto() + py_derived = self.create_py_derived( module ) + self.failUnless( 11 == da.value ) ds = module.create_shared() self.failUnless( 11 == ds.value ) self.failUnless( 11 == module.ref_auto(da) ) - self.failUnless( 11 == module.ref_shared(ds) ) + self.failUnless( 11 == module.ref_shared(ds) ) + + #why? because in this case held type could not be set + #self.failUnless( 11 == module.ref_shared(py_derived) ) self.failUnless( 11 == module.val_auto(da) ) - self.failUnless( 11 == module.val_shared(ds) ) + self.failUnless( 11 == module.val_shared(ds) ) da = module.create_auto() self.failUnless( 11 == module.const_ref_auto(da) ) - self.failUnless( 11 == module.const_ref_shared(ds) ) + self.failUnless( 11 == module.const_ref_shared(ds) ) #TODO: find out why this fails #self.failUnless( 19 == module.ref_auto_base_value(da) ) @@ -42,13 +61,26 @@ da = module.create_auto() self.failUnless( 19 == module.const_ref_auto_base_value(da) ) - self.failUnless( 19 == module.const_ref_shared_base_value(ds) ) + self.failUnless( 19 == module.const_ref_shared_base_value(ds) ) + self.failUnless( 19 == module.const_ref_shared_base_value(py_derived) ) da = module.create_auto() self.failUnless( 19 == module.val_auto_base_value(da) ) - self.failUnless( 19 == module.val_shared_base_value(ds) ) - + self.failUnless( 19 == module.val_shared_base_value(ds) ) + self.failUnless( 19 == module.val_shared_base_value(py_derived) ) + + da = module.create_auto() + + self.failUnless( 23 == module.val_auto_some_value(da) ) + self.failUnless( 28 == module.val_shared_some_value(py_derived) ) + + da = module.create_auto() + + self.failUnless( 23 == module.const_ref_auto_some_value(da) ) + self.failUnless( 28 == module.const_ref_shared_some_value(py_derived) ) + + def create_suite(): suite = unittest.TestSuite() suite.addTest( unittest.makeSuite(tester_t)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |