%module member_funcptr_galore %{ #if defined(__SUNPRO_CC) #pragma error_messages (off, badargtype2w) /* Formal argument ... is being passed extern "C" ... */ #pragma error_messages (off, wbadinit) /* Using extern "C" ... to initialize ... */ #pragma error_messages (off, wbadasg) /* Assigning extern "C" ... */ #endif %} %inline %{ namespace FunkSpace { struct Funktions { int addByValue(const int &a, int b) { return a+b; } int * addByPointer(const int &a, int b) { static int val; val = a+b; return &val; } int & addByReference(const int &a, int b) { static int val; val = a+b; return val; } }; } template struct Thing {}; namespace Space { class Shape { public: double x, y; double *z; void move(double dx, double dy); virtual double area(Shape &ref, int & (FunkSpace::Funktions::*d)(const int &, int)) { return 0.0; } virtual double abc(Thing ts, Thing< const Space::Shape * > tda[]) { return 0.0; } virtual ~Shape() {} }; } extern double do_op(Space::Shape *s, double (Space::Shape::*m)(void)); /* Functions that return member pointers */ extern double (Space::Shape::*areapt())(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)); extern double (Space::Shape::*abcpt())(Thing, Thing< const Space::Shape * > tda[]); /* Global variables that are member pointers */ extern double (Space::Shape::*areavar)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)); extern double (Space::Shape::*abcvar)(Thing, Thing< const Space::Shape * >[]); %} %{ void Space::Shape::move(double dx, double dy) { x += dx; y += dy; } double do_op(Space::Shape *s, double (Space::Shape::*m)(void)) { return (s->*m)(); } double (Space::Shape::*areapt(Space::Shape &ref, int & (FunkSpace::Funktions::*d)(const int &, int)))(Space::Shape &, int & (FunkSpace::Funktions::*d)(const int &, int)) { return &Space::Shape::area; } double (Space::Shape::*areapt())(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)) { return 0; } double (Space::Shape::*abcpt())(Thing, Thing< const Space::Shape * >[]) { return &Space::Shape::abc; } /* Member pointer variables */ double (Space::Shape::*areavar)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)) = &Space::Shape::area; double (Space::Shape::*abcvar)(Thing, Thing< const Space::Shape * >[]) = &Space::Shape::abc; %} /* Some constants */ %constant double (Space::Shape::*AREAPT)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int)) = &Space::Shape::area; %constant double (Space::Shape::*PERIMPT)(Thing, Thing< const Space::Shape * >[]) = &Space::Shape::abc; %constant double (Space::Shape::*NULLPT)(void) = 0; %inline %{ int call1(int (FunkSpace::Funktions::*d)(const int &, int), int a, int b) { FunkSpace::Funktions f; return (f.*d)(a, b); } int call2(int * (FunkSpace::Funktions::*d)(const int &, int), int a, int b) { FunkSpace::Funktions f; return *(f.*d)(a, b); } int call3(int & (FunkSpace::Funktions::*d)(const int &, int), int a, int b) { FunkSpace::Funktions f; return (f.*d)(a, b); } %} %constant int (FunkSpace::Funktions::*ADD_BY_VALUE)(const int &, int) = &FunkSpace::Funktions::addByValue; %constant int * (FunkSpace::Funktions::*ADD_BY_POINTER)(const int &, int) = &FunkSpace::Funktions::addByPointer; %constant int & (FunkSpace::Funktions::*ADD_BY_REFERENCE)(const int &, int) = &FunkSpace::Funktions::addByReference; %inline %{ // parameter that is a member pointer containing a function ptr, urgh :) int unreal1(double (Space::Shape::*memptr)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int))) { return 0; } int unreal2(double (Space::Shape::*memptr)(Thing)) { return 0; } %}