[C++-sig] indexing suite and py++

Roman Yakovenko roman.yakovenko at gmail.com
Thu Apr 16 08:00:06 CEST 2009


2009/4/13 Michał Nowotka <mmmnow at gmail.com>:
> Ok, but now I want to run all test included.

Okey.

> First of all I can't do it because of an error:
>
> Traceback (most recent call last):
>  File "/home/mnowotka/pygccxml/pyplusplus_dev/unittests/test_all.py",
> line 113, in <module>
>    import indexing_suites_v2_bug_tester
>  File "/home/mnowotka/pygccxml/pyplusplus_dev/unittests/indexing_suites_v2_bug_tester.py",
> line 14, in <module>
>    import dl
> ImportError: No module named dl
> As far I know, this was a bug in python on x86_64 enviroments. Is
> there any way around this dependency?

I guess so. Python-Ogre project, was built and used in such
environment and it doesn't have such problem.

> Secondly, when I exclude indexing_suites_v2_bug test I can see that
> not all the other tests were completed successfully:
>
> !  test (custom_smart_ptr_classes_tester.tester_t)  -  FAIL

This one should fail. I need to free some time to investigate it.

> !  test (deepcopy_tester.tester_t)  -  FAIL

I would like to see the error. Basically that test checks that
exception is raised in "copy.deepcopy" function.

> !  test (virtual_inheritance_tester.tester_t)  -  ERROR

The test is very simple, it checks that Py++ generates the right code.
It is interesting to see the error.

> Does it mean smart pointers and virtual inheritance is not supported
> under linux? Are there any workarounds?

No, it doesn't. The only conclusion you can do right now: Py++ tests
are broken on your platform and need some investigation.

> And finally another use case. Consider following code:
>
> #include <utility> //here is std::pair defined
>
> class I
> {
> public:
>        I(int a, int b)
>        {
>           pair_.first = a;
>           pair_.second = b;
>        }
>        std::pair<int, int> pair_;
>
> int compute(){return pair_.first + pair_.second;}
> };
>
> After parsing it Py++ produces warning:
>
> WARNING: std::pair<int, int> [struct]
>> execution error W1040: The declaration is unexposed, but there are other
>> declarations, which refer to it. This could cause "no to_python converter
>> found" run time error. Declarations:   I::pair_ [variable]
>
> I don't understand it because indexing suite v2 can handle vectors,
> sets, deques etc. so why pair is here an exception?

Well, code generation process is about "special case" treatment.
Please open ticket on SourceForge, so I could add this functionality
before next release.

>  There is pair.hpp
> file in indexing_suite directory so I guess this package can work with
> std::pair. Even if I add following lines
> (IMO completely useless in this case):
>
> namespace pyplusplus{
>
>     namespace aliases{
>
>
>        typedef std::pair< std::string, int > PairOfStringInt;
>        void instantiate( PairOfStringInt psi){}
>        typedef std::pair< std::string, double > PairOfStringDouble;
>        void instantiate( PairOfStringDouble psd){}
>
>
>
>     }
>  }
>
> or:
>
> int a = sizeof(std::pair< std::string, int >);
> int b = sizeof(std::pair< std::string, double >);
>
> I still get this warning.
>
> I also read this discussion:
> http://sourceforge.net/tracker/index.php?func=detail&aid=1991168&group_id=118209&atid=684318
>
> but adding these lines:
> mb.class_('PairOfStringInt').include()
> mb.class_('PairOfStringDouble').include()
>
> or:
> mb.class_('std::pair< std::string, int >').include()
> mb.class_('std::pair< std::string, double >').include()
>
> doesn't solve the problem and generate error:
>
> pygccxml.declarations.matcher.declaration_not_found_t: Unable to find
> declaration.  matcher: [(decl type==class_t) and (name==std::pair<
> std::string, double >)]
>
> so how should I modify the code to get std::pair exposed?


I committed new test:
http://pygccxml.svn.sourceforge.net/viewvc/pygccxml?view=rev

Basically, I suggest you to read the following article:
http://language-binding.net/pygccxml/query_interface.html

The short version: if you cant select the desired class, than check it
name first and than use it:

mb = module_builder_t( ... )
pair = mb.classes( lambda cls: cls.name.startswith( 'pair' ) )
for p in pair:
    print p.name

HTH



-- 
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/


More information about the Cplusplus-sig mailing list