mirror of https://github.com/swig/swig
111 lines
2.2 KiB
OpenEdge ABL
111 lines
2.2 KiB
OpenEdge ABL
%module li_attribute_template
|
|
|
|
%include <exception.i>
|
|
|
|
//#define SWIG_ATTRIBUTE_TEMPLATE
|
|
%include <attribute.i>
|
|
%include <std_string.i>
|
|
|
|
%inline
|
|
{
|
|
class Foo {
|
|
public:
|
|
Foo( int _value ) { value = _value; }
|
|
int value;
|
|
};
|
|
|
|
template< class T1, class T2>
|
|
struct pair{
|
|
pair( T1 t1, T2 t2 ):
|
|
first(t1), second(t2) {;}
|
|
|
|
T1 first;
|
|
T2 second;
|
|
};
|
|
|
|
template< class T1, class T2>
|
|
struct C
|
|
{
|
|
C(int a, int b, int c) :
|
|
a(a), b(b), c(c), d(a), _e(b),
|
|
_f(a,b), _g(b,c)
|
|
{
|
|
|
|
/*
|
|
_f.first = a;
|
|
_f.second = b;
|
|
|
|
_g.first = b;
|
|
_g.second = c;
|
|
*/
|
|
|
|
}
|
|
|
|
int get_value() const
|
|
{
|
|
return a;
|
|
}
|
|
|
|
void set_value(int aa)
|
|
{
|
|
a = aa;
|
|
}
|
|
|
|
/* only one ref method */
|
|
int& get_ref()
|
|
{
|
|
return b;
|
|
}
|
|
|
|
Foo get_class_value() const { return d; }
|
|
void set_class_value( Foo foo) { d = foo; }
|
|
|
|
const Foo& get_class_ref() const { return _e; }
|
|
void set_class_ref( const Foo& foo ) { _e = foo; }
|
|
|
|
pair<T1,T2> get_template_value() const { return _f; }
|
|
void set_template_value( const pair<T1,T2> f ) { _f = f; }
|
|
|
|
const pair<T1,T2>& get_template_ref() const { return _g; }
|
|
void set_template_ref( const pair<T1,T2>& g ) { _g = g; }
|
|
|
|
std::string get_string() { return str; }
|
|
void set_string(std::string other) { str = other; }
|
|
|
|
private:
|
|
int a;
|
|
int b;
|
|
int c;
|
|
Foo d;
|
|
Foo _e;
|
|
pair<T1,T2> _f;
|
|
pair<T1,T2> _g;
|
|
|
|
std::string str;
|
|
};
|
|
|
|
}
|
|
|
|
%define %instantiate_C( T1, T2 )
|
|
%template (pair_ ## T1 ## T2 ) pair<T1,T2>;
|
|
// Primitive types
|
|
%attribute( %arg(C<T1,T2>), int, a, get_value, set_value );
|
|
%attributeref( %arg(C<T1,T2>), int, b, get_ref );
|
|
|
|
// Strings
|
|
%attributestring(%arg(C<T1,T2>), std::string, str, get_string, set_string);
|
|
|
|
// Class types
|
|
%attributeval( %arg(C<T1,T2>), Foo, d, get_class_value, set_class_value );
|
|
%attribute2( %arg(C<T1,T2>), Foo, e, get_class_ref, set_class_ref );
|
|
|
|
// Moderately templated types
|
|
%attributeval( %arg(C<T1,T2>), %arg(pair<T1,T2>), f, get_template_value, set_template_value );
|
|
%attribute2( %arg(C<T1,T2>), %arg(pair<T1,T2>), g, get_template_ref, set_template_ref );
|
|
|
|
%template (C ## T1 ## T2) C<T1,T2>;
|
|
%enddef
|
|
|
|
|
|
%instantiate_C(int,int);
|