blob: 174808c1e007eb42e986b6603cfb98df36fadeb6 [file] [log] [blame]
%module contract
%warnfilter(SWIGWARN_RUBY_MULTIPLE_INHERITANCE,
SWIGWARN_JAVA_MULTIPLE_INHERITANCE,
SWIGWARN_CSHARP_MULTIPLE_INHERITANCE,
SWIGWARN_COM_MULTIPLE_INHERITANCE,
SWIGWARN_PHP_MULTIPLE_INHERITANCE) C; /* Ruby, C#, Java, PHP multiple inheritance */
#ifdef SWIGCSHARP
%ignore B::bar; // otherwise get a warning: `C.bar' no suitable methods found to override
#endif
%contract test_preassert(int a, int b) {
require:
a > 0;
b > 0;
}
%contract test_postassert(int a) {
ensure:
test_postassert > 0;
}
%contract test_prepost(int a, int b) {
require:
a > 0;
ensure:
test_prepost > 0;
}
%inline %{
int test_preassert(int x, int y) {
if ((x > 0) && (y > 0)) return 1;
return 0;
}
int test_postassert(int x) {
return x;
}
int test_prepost(int x, int y) {
return x+y;
}
%}
/* Class tests */
%contract Foo::test_preassert(int x, int y) {
require:
x > 0;
y > 0;
}
%contract Foo::test_postassert(int a) {
ensure:
test_postassert > 0;
}
%contract Foo::test_prepost(int a, int b) {
require:
a > 0;
ensure:
test_prepost > 0;
}
%contract Foo::stest_prepost(int a, int b) {
require:
a > 0;
ensure:
stest_prepost > 0;
}
%contract Bar::test_prepost(int c, int d) {
require:
d > 0;
}
%inline %{
class Foo {
public:
virtual ~Foo() { }
virtual int test_preassert(int x, int y) {
if ((x > 0) && (y > 0)) return 1;
return 0;
}
virtual int test_postassert(int x) {
return x;
}
virtual int test_prepost(int x, int y) {
return x+y;
}
static int stest_prepost(int x, int y) {
return x+y;
}
};
class Bar : public Foo {
public:
virtual int test_prepost(int x, int y) {
return x+y;
}
};
%}
/* Multiple inheritance test */
%contract A::foo(int i, int j, int k, int l, int m) {
require:
i > 0;
j > 0;
ensure:
foo > 0;
}
%contract B::bar(int x, int y, int z, int w, int v) {
require:
w > 0;
v > 0;
ensure:
bar > 0;
}
%contract C::foo(int a, int b, int c, int d, int e) {
require:
c > 0;
d > 0;
ensure:
foo > 0;
}
%contract D::foo(int, int, int, int, int x) {
require:
x > 0;
}
%contract D::bar(int a, int b, int c, int, int) {
require:
a > 0;
b > 0;
c > 0;
}
%inline %{
class A {
public:
virtual ~A() {}
virtual int foo(int a, int b, int c, int d, int e) {
if ((a > 0) && (b > 0) && (c > 0) && (d > 0) && (e > 0)) {
return 1;
}
return 0;
}
};
class B {
public:
virtual ~B() {}
virtual int bar(int a, int b, int c, int d, int e) {
if ((a > 0) && (b > 0) && (c > 0) && (d > 0) && (e > 0)) {
return 1;
}
return 0;
}
};
class C : public A, public B {
public:
virtual int foo(int a, int b, int c, int d, int e) {
return A::foo(a,b,c,d,e);
}
virtual int bar(int a, int b, int c, int d, int e) {
return B::bar(a,b,c,d,e);
}
};
class D : public C {
public:
virtual int foo(int a, int b, int c, int d, int e) {
return C::foo(a,b,c,d,e);
}
virtual int bar(int a, int b, int c, int d, int e) {
return C::bar(a,b,c,d,e);
}
};
%}
%extend E {
%contract manipulate_i(int i) {
require:
i <= $self->m_i;
}
}
%inline %{
struct E {
int m_i;
void manipulate_i(int i) {
}
};
%}
// Namespace
%{
namespace myNames {
class myClass
{
public:
myClass(int i) {}
};
}
%}
namespace myNames {
%contract myClass::myClass( int i ) {
require:
i > 0;
}
class myClass
{
public:
myClass(int i) {}
};
}