Merge branch 'diorcety-python_property'

* diorcety-python_property:
  Changes file entry for Python director property fix
  Python: Fix property access with director

Conflicts:
	CHANGES.current
This commit is contained in:
William S Fulton 2014-10-11 00:22:21 +01:00
commit 78b904764a
5 changed files with 181 additions and 3 deletions

View file

@ -172,6 +172,7 @@ CPP_TEST_CASES += \
director_abstract \
director_alternating \
director_basic \
director_property \
director_binary_string \
director_classes \
director_classic \

View file

@ -0,0 +1,151 @@
%module(directors="1") director_property
%warnfilter(SWIGWARN_TYPEMAP_THREAD_UNSAFE,SWIGWARN_TYPEMAP_DIRECTOROUT_PTR) MyClass::pmethod;
%{
#include <string>
class Foo {
private:
std::string a;
public:
virtual ~Foo() {}
virtual std::string ping() { return "Foo::ping()"; }
virtual std::string pong() { return "Foo::pong();" + ping(); }
virtual std::string getA() { return this->a; }
virtual void setA(std::string a) { this->a = a; }
static Foo* get_self(Foo *slf) {return slf;}
};
%}
%include <std_string.i>
%feature("director") Foo;
class Foo {
public:
virtual ~Foo();
virtual std::string ping();
virtual std::string pong();
virtual std::string getA();
virtual void setA(std::string a);
static Foo* get_self(Foo *slf);
};
%{
#include <complex>
%}
%feature("director") A;
// basic renaming
%rename(rg) A::gg;
%feature("nodirector") hi::A1::gg;
%inline %{
struct A{
A(std::complex<int> i, double d=0.0) {}
A(int i, bool j=false) {}
virtual ~A() {}
virtual int f(int i=0) {return i;}
virtual int gg(int i=0) {return i;}
};
namespace hi {
struct A1 : public A {
A1(std::complex<int> i, double d=0.0) : A(i, d) {}
A1(int i, bool j=false) : A(i, j) {}
virtual int ff(int i = 0) {return i;}
};
}
%}
%feature("director") MyClass;
%inline %{
typedef void VoidType;
struct Bar
{
int x;
Bar(int _x = 0) : x(_x)
{
}
};
class MyClass {
public:
MyClass(int a = 0)
{
}
virtual void method(VoidType *)
{
}
virtual ~MyClass()
{
}
virtual Bar vmethod(Bar b)
{
b.x += 13;
return b;
}
virtual Bar* pmethod(Bar *b)
{
b->x += 12;
return b;
}
Bar cmethod(const Bar &b)
{
return vmethod(b);
}
static MyClass *get_self(MyClass *c)
{
return c;
}
static Bar * call_pmethod(MyClass *myclass, Bar *b) {
return myclass->pmethod(b);
}
};
template<class T>
class MyClassT {
public:
MyClassT(int a = 0)
{
}
virtual void method(VoidType *)
{
}
virtual ~MyClassT()
{
}
};
%}
%template(MyClassT_i) MyClassT<int>;

View file

@ -0,0 +1,18 @@
import director_property
class PyFoo(director_property.Foo):
a = property(director_property.Foo.getA, director_property.Foo.setA)
def ping(self):
return "PyFoo::ping()"
foo = PyFoo()
foo.setA("BLABLA")
if foo.getA() != "BLABLA":
raise RuntimeError
foo.a = "BIBI"
if foo.a != "BIBI":
raise RuntimeError