1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
%module member_funcptr_galore
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) extra2;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) extra3;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) pp2;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) pp3;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) pp5;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) ccextra2;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) ccextra3;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) cc2;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) cc3;
%warnfilter(SWIGWARN_TYPEMAP_SWIGTYPELEAK_MSG) cc5;
%{
#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 <typename T> 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 area_const(Shape &ref, int & (FunkSpace::Funktions::*)(const int &, int) const) { return 0.0; } // Note: unnamed parameter
virtual double zyx(int (FunkSpace::Funktions::*)() const) { return 0.0; } // Note: unnamed parameter
virtual double abc(Thing<short> 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<short>, 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<short>, 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 do_op_const(Space::Shape *s, double (Space::Shape::*m)(void) const) {
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<short>, 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<short>, 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::*AREAPT_CONST)(Space::Shape &, int & (FunkSpace::Funktions::*)(const int &, int) const) = &Space::Shape::area_const;
%constant double (Space::Shape::*PERIMPT)(Thing<short>, 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<short>)) { return 0; }
%}
%inline %{
struct Funcs {
short FF(bool) { return 0; }
short CC(bool) const { return 0; }
};
class MemberFuncPtrs
{
public:
// member const function pointers, unnamed parameters
int aaa1(short (Funcs::* )(bool) const) const;
int aaa2(short (Funcs::* const *&)(bool) const) const;
int aaa3(short (Funcs::* *& )(bool) const) const;
int aaa4(short (Funcs::* *const& )(bool) const) const;
int aaa5(short (Funcs::* & )(bool) const) const;
int aaa6(short (Funcs::* const)(bool) const) const;
int aaa7(short (Funcs::* const&)(bool) const) const;
// member non-const function pointers, unnamed parameters
int bbb1(short (Funcs::* )(bool)) const;
int bbb2(short (Funcs::* const *&)(bool)) const;
int bbb3(short (Funcs::* *& )(bool)) const;
int bbb4(short (Funcs::* *const& )(bool)) const;
int bbb5(short (Funcs::* & )(bool)) const;
int bbb6(short (Funcs::* const)(bool)) const;
int bbb7(short (Funcs::* const&)(bool)) const;
// member const function pointers, named parameters
int ppp1(short (Funcs::* pp1)(bool) const) const;
int ppp2(short (Funcs::* const *& pp2)(bool) const) const;
int ppp3(short (Funcs::* *& pp3)(bool) const) const;
int ppp4(short (Funcs::* *const& pp4)(bool) const) const;
int ppp5(short (Funcs::* & pp5)(bool) const) const;
int ppp6(short (Funcs::* const pp6)(bool) const) const;
int ppp7(short (Funcs::* const& pp7)(bool) const) const;
// member non-const function pointers, named parameters
int qqq1(short (Funcs::* qq1)(bool)) const;
int qqq2(short (Funcs::* const *& qq2)(bool)) const;
int qqq3(short (Funcs::* *& qq3)(bool)) const;
int qqq4(short (Funcs::* *const& qq4)(bool)) const;
int qqq5(short (Funcs::* & qq5)(bool)) const;
int qqq6(short (Funcs::* const qq6)(bool)) const;
int qqq7(short (Funcs::* const& qq7)(bool)) const;
};
// member const function pointers, unnamed parameters
int MemberFuncPtrs::aaa1(short (Funcs::* )(bool) const) const { return 0; }
int MemberFuncPtrs::aaa2(short (Funcs::* const *&)(bool) const) const { return 0; }
int MemberFuncPtrs::aaa3(short (Funcs::* *& )(bool) const) const { return 0; }
int MemberFuncPtrs::aaa4(short (Funcs::* *const& )(bool) const) const { return 0; }
int MemberFuncPtrs::aaa5(short (Funcs::* & )(bool) const) const { return 0; }
int MemberFuncPtrs::aaa6(short (Funcs::* const)(bool) const) const { return 0; }
int MemberFuncPtrs::aaa7(short (Funcs::* const&)(bool) const) const { return 0; }
// member non-const function pointers, unnamed parameters
int MemberFuncPtrs::bbb1(short (Funcs::* )(bool)) const { return 0; }
int MemberFuncPtrs::bbb2(short (Funcs::* const *&)(bool)) const { return 0; }
int MemberFuncPtrs::bbb3(short (Funcs::* *& )(bool)) const { return 0; }
int MemberFuncPtrs::bbb4(short (Funcs::* *const& )(bool)) const { return 0; }
int MemberFuncPtrs::bbb5(short (Funcs::* & )(bool)) const { return 0; }
int MemberFuncPtrs::bbb6(short (Funcs::* const)(bool)) const { return 0; }
int MemberFuncPtrs::bbb7(short (Funcs::* const&)(bool)) const { return 0; }
// member const function pointers, named parameters
int MemberFuncPtrs::ppp1(short (Funcs::* pp1)(bool) const) const { return 0; }
int MemberFuncPtrs::ppp2(short (Funcs::* const *& pp2)(bool) const) const { return 0; }
int MemberFuncPtrs::ppp3(short (Funcs::* *& pp3)(bool) const) const { return 0; }
int MemberFuncPtrs::ppp4(short (Funcs::* *const& pp4)(bool) const) const { return 0; }
int MemberFuncPtrs::ppp5(short (Funcs::* & pp5)(bool) const) const { return 0; }
int MemberFuncPtrs::ppp6(short (Funcs::* const pp6)(bool) const) const { return 0; }
int MemberFuncPtrs::ppp7(short (Funcs::* const& pp7)(bool) const) const { return 0; }
// member non-const function pointers, named parameters
int MemberFuncPtrs::qqq1(short (Funcs::* qq1)(bool)) const { return 0; }
int MemberFuncPtrs::qqq2(short (Funcs::* const *& qq2)(bool)) const { return 0; }
int MemberFuncPtrs::qqq3(short (Funcs::* *& qq3)(bool)) const { return 0; }
int MemberFuncPtrs::qqq4(short (Funcs::* *const& qq4)(bool)) const { return 0; }
int MemberFuncPtrs::qqq5(short (Funcs::* & qq5)(bool)) const { return 0; }
int MemberFuncPtrs::qqq6(short (Funcs::* const qq6)(bool)) const { return 0; }
int MemberFuncPtrs::qqq7(short (Funcs::* const& qq7)(bool)) const { return 0; }
// member non-const function pointer variables
short (Funcs::* pp1)(bool) = &Funcs::FF;
short (Funcs::* const * extra2)(bool) = &pp1;
short (Funcs::* * extra3)(bool) = &pp1;
short (Funcs::* *const extra4)(bool) = &pp1;
short (Funcs::* const *& pp2)(bool) = extra2;
short (Funcs::* *& pp3)(bool) = extra3;
short (Funcs::* *const& pp4)(bool) = extra4;
short (Funcs::* & pp5)(bool) = pp1;
short (Funcs::* const pp6)(bool) = &Funcs::FF;
short (Funcs::* const& pp7)(bool) = pp1;
// member const function pointer variables
short (Funcs::* cc1)(bool) const = &Funcs::CC;
short (Funcs::* const * ccextra2)(bool) const = &cc1;
short (Funcs::* * ccextra3)(bool) const = &cc1;
short (Funcs::* *const ccextra4)(bool) const = &cc1;
short (Funcs::* const *& cc2)(bool) const = ccextra2;
short (Funcs::* *& cc3)(bool) const = ccextra3;
short (Funcs::* *const& cc4)(bool) const = ccextra4;
short (Funcs::* & cc5)(bool) const = cc1;
short (Funcs::* const cc6)(bool) const = &Funcs::CC;
short (Funcs::* const& cc7)(bool) const = cc1;
%}
|