Actually, I haven't had time to investigate it deeper yet, but it seems to be a pyplusplus's bug. I also haven't found anything relevant on the net, so here we go:

Test case:
class to be exposed (file a.h)

#include <boost/operators.hpp>

class A: boost::equality_comparable<A>
{
public:
        A(int a): a(a) {};

        bool operator==(A const & other) const
        {
                return this->a == other.a;
        }
private:
        int a;
};

generator used (gen.py):
from pyplusplus import module_builder

mb = module_builder.module_builder_t(files = ['a.h'])

mb.decl('alloca').exclude()

mb.build_code_creator( module_name = 'testA')
mb.write_module('testA.cpp')

file generated:
// This file has been generated by Py++.

#include "boost/python.hpp"

#include "a.h"

namespace bp = boost::python;

BOOST_PYTHON_MODULE(testA){
    { //::A
        typedef bp::class_< A > A_exposer_t;
A_exposer_t A_exposer = A_exposer_t( "A", bp::init< int >(( bp::arg("a") )) );
        bp::scope A_scope( A_exposer );
        bp::implicitly_convertible< int, A >();
        A_exposer.def( bp::self == bp::self );
        // OOPS! something is missing here
    }
}


C++ class test:
#include <iostream>
#include "a.h"

using namespace std;

int main()
{
        A a1(3);
        A a2(3);
        cout << "a1 == a2: " << (a1 == a2) << endl;
        cout << "a1 != a2: " << (a1 != a2) << endl;
        return 0;
}

C++ class test result:
a1 == a2: 1
a1 != a2: 0

python test:
>>> import testA
>>> a1 = testA.A(3)
>>> a2 = testA.A(3)
>>> a1 == a2
True
>>> a1 != a2
True # drat!


The reason: missing A_exposer.def( bp::self != bp::self ); in the generated 
code;


If any of you think it is easy to fix in pyplusplus (Roman, perhaps you're the one to know best?) I may try. I'm also considering a workaround of checking bases for all the classes and add missing "self != self" for all those which derive from equality_comparable;
Perhaps there is the same problem with less_than_comparable and others.


regards,
Kuba
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to