Hi,
I'm trying to implement the PyBindGen micro-benchmarks in cython-devel by
wrapping this source file:
http://bazaar.launchpad.net/~gjc/pybindgen/trunk/annotate/735/benchmarks/testapi.cc
http://bazaar.launchpad.net/~gjc/pybindgen/trunk/annotate/735/benchmarks/testapi.h
(I know, few Cython users would wrap code at that granularity, but that's
about the limit of what PyBindGen can handle.)
The API is basically this (I attached the two wrapper source files I wrote):
------------------
cdef extern from "testapi.h":
void func1()
double func2(double x, double y, double z)
cdef cppclass Multiplier:
Multiplier()
Multiplier(double factor)
void SetFactor()
void SetFactor(double f)
double GetFactor()
double Multiply(double value)
double call_virtual_from_cpp (Multiplier *obj, double value)
------------------
Cython parses this just fine - however, when I try to call the SetFactor
method in Cython code, I get this:
Error converting Pyrex file to C:
------------------------------------------------------------
...
def __dealloc__(self):
del self.multiplier
def SetFactor(self, f=None):
if f is None:
self.multiplier.SetFactor()
^
------------------------------------------------------------
.../pytestapi.pyx:18:37: Call with wrong number of arguments (expected 1,
got 0)
The exact error depends on the order in which I declare the two methods. It
seems that the last declaration wins. And Cython also doesn't complain
about the constructor call right two methods above, so that seems to have
worked.
Is this supposed to work for regular C++ methods?
Stefan
cimport testapi
cdef class Multiplier:
cdef testapi.Multiplier* multiplier
def __cinit__(self, factor=None):
if factor is None:
self.multiplier = testapi.Multiplier()
else:
self.multiplier = testapi.Multiplier(factor)
def __dealloc__(self):
del self.multiplier
def SetFactor(self, f=None):
if f is None:
self.multiplier.SetFactor()
else:
self.multiplier.SetFactor(f)
def GetFactor(self):
return self.multiplier.GetFactor()
def Multiply(self, double value):
return self.multiplier.Multiply(value)
def func1():
testapi.func1()
def func2(double x, double y, double z):
return testapi.func2(x, y, z)
def call_virtual_from_cpp(testapi.Multiplier *obj, double value):
return testapi.call_virtual_from_cpp(obj, value)
// -*- Mode: C++; c-file-style: "stroustrup"; indent-tabs-mode:nil; -*-
#include "testapi.h"
void func1 (void)
{
}
double func2 (double x, double y, double z)
{
return x + y + z;
}
Multiplier::Multiplier ()
: m_factor (1.0)
{
}
Multiplier::Multiplier (double factor)
: m_factor (factor)
{
}
Multiplier::~Multiplier ()
{
}
double Multiplier::GetFactor () const
{
return m_factor;
}
void Multiplier::SetFactor (double f)
{
m_factor = f;
}
void Multiplier::SetFactor ()
{
m_factor = 1.0;
}
double
Multiplier::Multiply (double value) const
{
return value*m_factor;
}
double
call_virtual_from_cpp (Multiplier const *obj, double value)
{
return obj->Multiply (value);
}
// -*- Mode: C++; c-file-style: "stroustrup"; indent-tabs-mode:nil; -*-
#ifndef TESTAPI_H_
# define TESTAPI_H_
void func1 (void);
double func2 (double x, double y, double z);
class Multiplier
{
double m_factor;
public:
Multiplier ();
Multiplier (double factor);
virtual ~Multiplier ();
void SetFactor (double f);
void SetFactor (void);
double GetFactor () const;
virtual double Multiply (double value) const;
};
double call_virtual_from_cpp (Multiplier const *obj, double value);
#endif
cdef extern from "testapi.h":
void func1()
double func2(double x, double y, double z)
cdef cppclass Multiplier:
Multiplier()
Multiplier(double factor)
void SetFactor()
void SetFactor(double f)
double GetFactor()
double Multiply(double value)
double call_virtual_from_cpp (Multiplier *obj, double value)
_______________________________________________
Cython-dev mailing list
[email protected]
http://codespeak.net/mailman/listinfo/cython-dev