mirror of https://github.com/swig/swig
107 lines
1.9 KiB
OpenEdge ABL
107 lines
1.9 KiB
OpenEdge ABL
%module callback
|
|
|
|
// Not specifying the callback name is only possible in Python.
|
|
#ifdef SWIGPYTHON
|
|
%callback(1) foo;
|
|
%callback(1) foof;
|
|
%callback(1) A::bar;
|
|
%callback(1) A::foom;
|
|
#else
|
|
%callback("%s") foo;
|
|
%callback("%s") foof;
|
|
%callback("%s") A::bar;
|
|
%callback("%s") A::foom;
|
|
#endif
|
|
%callback("%(uppercase)s_Cb_Ptr") foo_T; // this works in Python too
|
|
%callback("%s_cb") identity_finger;
|
|
|
|
%inline %{
|
|
|
|
int foo(int a) {
|
|
return a;
|
|
}
|
|
|
|
int foof(int a) {
|
|
return 3*a;
|
|
}
|
|
|
|
struct A
|
|
{
|
|
static int bar(int a) {
|
|
return 2*a;
|
|
}
|
|
|
|
int foom(int a)
|
|
{
|
|
return -a;
|
|
}
|
|
|
|
//friend int foof(int a);
|
|
};
|
|
|
|
|
|
extern "C" int foobar(int a, int (*pf)(int a)) {
|
|
return pf(a);
|
|
}
|
|
|
|
extern "C" int foobarm(int a, A ap, int (A::*pf)(int a)) {
|
|
return (ap.*pf)(a);
|
|
}
|
|
|
|
template <class T>
|
|
T foo_T(T a)
|
|
{
|
|
return a;
|
|
}
|
|
|
|
template <class T>
|
|
T foo_T(T a, T b)
|
|
{
|
|
return a + b;
|
|
}
|
|
|
|
|
|
template <class T>
|
|
T foobar_T(T a, T (*pf)(T a)) {
|
|
return pf(a);
|
|
}
|
|
|
|
#if defined(__SUNPRO_CC)
|
|
// workaround for: Error: Could not find a match for foobar_T<T>(int, extern "C" int(*)(int)).
|
|
extern "C" {
|
|
typedef int (*foobar_int_int)(int a);
|
|
typedef double (*foobar_double_double)(double a);
|
|
};
|
|
template <class T>
|
|
int foobar_T(int a, foobar_int_int pf) {
|
|
return pf(a);
|
|
}
|
|
template <class T>
|
|
double foobar_T(double a, foobar_double_double pf) {
|
|
return pf(a);
|
|
}
|
|
#endif
|
|
|
|
template <class T>
|
|
const T& ident(const T& x) {
|
|
return x;
|
|
}
|
|
|
|
// Test callbacks for enum types
|
|
typedef enum {One, Two, Three, Four, Five} finger;
|
|
typedef finger (*finger_finger)(finger);
|
|
finger identity_finger(finger f) { return f; }
|
|
finger apply_finger_cb(finger f, finger_finger cb) {
|
|
return cb(f);
|
|
}
|
|
|
|
%}
|
|
|
|
%template(foo_i) foo_T<int>;
|
|
%template(foobar_i) foobar_T<int>;
|
|
|
|
%template(foo_d) foo_T<double>;
|
|
%template(foobar_d) foobar_T<double>;
|
|
|
|
%template(ident_d) ident<double>;
|