mirror of https://github.com/swig/swig
258 lines
3.0 KiB
OpenEdge ABL
258 lines
3.0 KiB
OpenEdge ABL
%module valuewrapper_opaque
|
|
|
|
/*
|
|
* Opaque types
|
|
*/
|
|
|
|
#ifdef SWIGOCAML
|
|
%warnfilter(SWIGWARN_PARSE_KEYWORD) method;
|
|
#endif
|
|
|
|
%feature("valuewrapper") C;
|
|
class C;
|
|
|
|
%{
|
|
template<typename T> class TemplateClass {
|
|
public:
|
|
TemplateClass(T a) {}
|
|
};
|
|
|
|
struct B
|
|
{
|
|
};
|
|
|
|
class C
|
|
{
|
|
public:
|
|
C(int){}
|
|
};
|
|
%}
|
|
|
|
|
|
/*
|
|
* Hint swig that the Opaque type B don't need the value wrapper.
|
|
* This hint is only necessary in very very special cases.
|
|
*/
|
|
%feature("novaluewrapper") B;
|
|
class B;
|
|
|
|
/*
|
|
* Force swig to use the value wrapper, even when the class
|
|
* has a default constructor, in case you want to save a
|
|
* instance construction.
|
|
*
|
|
*/
|
|
%feature("valuewrapper") D;
|
|
class D;
|
|
|
|
|
|
%feature("valuewrapper") A;
|
|
class A;
|
|
|
|
%feature("valuewrapper") TemplateClass<A>;
|
|
%feature("valuewrapper") TemplateClass<C>;
|
|
template<class T> class TemplateClass;
|
|
|
|
%feature("valuewrapper") BB;
|
|
class BB;
|
|
|
|
|
|
%inline %{
|
|
|
|
struct A
|
|
{
|
|
A(int){}
|
|
};
|
|
|
|
class D {};
|
|
|
|
class Klass {};
|
|
|
|
|
|
TemplateClass<Klass> getKlass(Klass k) {
|
|
TemplateClass<Klass> t(k);
|
|
return t;
|
|
}
|
|
|
|
|
|
TemplateClass<A> getA(A a) {
|
|
TemplateClass<A> t(a);
|
|
return t;
|
|
}
|
|
|
|
|
|
TemplateClass<B> getA(B b) {
|
|
TemplateClass<B> t(b);
|
|
return t;
|
|
}
|
|
|
|
|
|
TemplateClass<C> getC(C a) {
|
|
TemplateClass<C> t(a);
|
|
return t;
|
|
}
|
|
|
|
|
|
TemplateClass<int> getInt(int a) {
|
|
TemplateClass<int> t(a);
|
|
return t;
|
|
}
|
|
|
|
A sgetA(A a) {
|
|
return a;
|
|
}
|
|
|
|
Klass sgetKlass(Klass a) {
|
|
return a;
|
|
}
|
|
|
|
template <class T>
|
|
struct auto_ptr
|
|
{
|
|
auto_ptr(T a){}
|
|
};
|
|
|
|
auto_ptr<A> getPtrA(auto_ptr<A> a) {
|
|
return a;
|
|
}
|
|
|
|
B getB(B a) {
|
|
return a;
|
|
}
|
|
|
|
D getD(D a) {
|
|
return a;
|
|
}
|
|
|
|
%}
|
|
|
|
%template() auto_ptr<A>;
|
|
|
|
|
|
/***** Another strange case, member var + opaque, bug #901706 ******/
|
|
%{
|
|
class BB {
|
|
friend class AA;
|
|
|
|
protected:
|
|
BB(int aa) { this->a = aa; };
|
|
BB() {};
|
|
|
|
int a;
|
|
};
|
|
%}
|
|
|
|
%inline %{
|
|
|
|
class AA {
|
|
public:
|
|
AA(){}
|
|
|
|
BB innerObj;
|
|
};
|
|
|
|
%}
|
|
|
|
%{
|
|
class Foobar
|
|
{
|
|
public:
|
|
Foobar()
|
|
{
|
|
}
|
|
|
|
char *foo_method()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
};
|
|
|
|
class Quux
|
|
{
|
|
public:
|
|
Quux()
|
|
{
|
|
}
|
|
|
|
Foobar method()
|
|
{
|
|
return Foobar();
|
|
}
|
|
|
|
};
|
|
%}
|
|
|
|
%feature("novaluewrapper") Foobar;
|
|
class Foobar;
|
|
|
|
|
|
class Quux {
|
|
public:
|
|
Quux();
|
|
|
|
Foobar method();
|
|
|
|
|
|
};
|
|
|
|
|
|
#if defined(SWIGPYTHON)
|
|
|
|
/*
|
|
This case can't be fixed by using the valuewrapper feature and the
|
|
old mechanismbut it works fine with the new mechanism
|
|
*/
|
|
|
|
%{
|
|
|
|
// Template primitive type, only visible in C++
|
|
template <class T>
|
|
struct Param
|
|
{
|
|
T val;
|
|
|
|
// This case is disabled by now
|
|
// Param(T v): val(v) {}
|
|
|
|
Param(T v = T()): val(v) {}
|
|
|
|
operator T() const { return val; }
|
|
};
|
|
|
|
%}
|
|
|
|
/*
|
|
Several languages have 'not 100% safe' typemaps,
|
|
where the following %applies don't work.
|
|
*/
|
|
%apply int { Param<int> };
|
|
%apply const int& { const Param<int>& };
|
|
|
|
%apply double { Param<double> };
|
|
%apply const double& { const Param<double>& };
|
|
|
|
%inline %{
|
|
|
|
template <class T>
|
|
T getv(const Param<T>& p)
|
|
{
|
|
return p.val;
|
|
}
|
|
|
|
template <class T>
|
|
Param<T> getp(const T& v)
|
|
{
|
|
return Param<T>(v);
|
|
}
|
|
|
|
%}
|
|
|
|
%template(getv_i) getv<int>;
|
|
%template(getp_i) getp<int>;
|
|
|
|
%template(getv_d) getv<double>;
|
|
%template(getp_d) getp<double>;
|
|
|
|
#endif
|