summaryrefslogtreecommitdiff
path: root/Examples/test-suite/li_attribute_template.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/li_attribute_template.i')
-rw-r--r--Examples/test-suite/li_attribute_template.i110
1 files changed, 110 insertions, 0 deletions
diff --git a/Examples/test-suite/li_attribute_template.i b/Examples/test-suite/li_attribute_template.i
new file mode 100644
index 000000000..3d4c108ef
--- /dev/null
+++ b/Examples/test-suite/li_attribute_template.i
@@ -0,0 +1,110 @@
+%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);