summaryrefslogtreecommitdiff
path: root/Examples/test-suite/default_args.i
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/test-suite/default_args.i')
-rw-r--r--Examples/test-suite/default_args.i243
1 files changed, 243 insertions, 0 deletions
diff --git a/Examples/test-suite/default_args.i b/Examples/test-suite/default_args.i
new file mode 100644
index 0000000..839d28e
--- /dev/null
+++ b/Examples/test-suite/default_args.i
@@ -0,0 +1,243 @@
+// Lots of tests for methods with default parameters / default arguments
+
+%module default_args
+
+%{
+#if defined(_MSC_VER)
+ #pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
+#endif
+%}
+
+%include <std_string.i>
+
+%inline %{
+ #include <string>
+
+ // Anonymous arguments
+ int anonymous(int = 7771);
+ int anonymous(int x) { return x; }
+
+ // Bug [548272] Default arguments
+ bool booltest(bool x = true) { return x; }
+
+ // scoped enums
+ enum flavor { BITTER, SWEET };
+ class EnumClass {
+ public:
+ enum speed { FAST, SLOW };
+ // Note: default values should be EnumClass::FAST and SWEET
+ bool blah(speed s = FAST, flavor f = SWEET) { return (s == FAST && f == SWEET); };
+ };
+
+ // casts
+ const char * casts1(const char *m = (const char *) NULL) {
+ char *ret = NULL;
+ if (m) {
+ ret = new char[strlen(m)+1];
+ strcpy(ret, m);
+ }
+ return ret;
+ }
+ const char * casts2(const char *m = (const char *) "Hello") {
+ char *ret = NULL;
+ if (m) {
+ ret = new char[strlen(m)+1];
+ strcpy(ret, m);
+ }
+ return ret;
+ }
+
+ // char
+ char chartest1(char c = 'x') { return c; }
+ char chartest2(char c = '\0') { return c; }
+
+ // namespaces
+ namespace AType {
+ enum AType { NoType };
+ }
+ void dummy(AType::AType aType = AType::NoType) {}
+ namespace A {
+ namespace B {
+ int CONST_NUM = 10;
+ }
+ int afunction(int i = B::CONST_NUM) { return i; }
+ }
+
+ // references
+ int reftest1(const int &x = 42) { return x; }
+ std::string reftest2(const std::string &x = "hello") { return x; }
+
+ // enum scope
+ class Tree {
+ public:
+ enum types {Oak, Fir, Cedar};
+ void chops(enum types type) {}
+ void test(int x = Oak + Fir + Cedar) {}
+ };
+ enum Tree::types chops(enum Tree::types type) { return type; }
+
+%}
+
+// Rename a class member
+%rename(bar2) Foo::bar;
+%rename(newname) Foo::oldname(int x = 1234);
+%ignore Foo::Foo(int x, int y = 0, int z = 0);
+%ignore Foo::meth(int x, int y = 0, int z = 0);
+%rename(renamed3arg) Foo::renameme(int x, double d) const;
+%rename(renamed2arg) Foo::renameme(int x) const;
+%rename(renamed1arg) Foo::renameme() const;
+
+%inline %{
+
+ // Define a class
+ class Foo {
+ public:
+ static int bar;
+ static int spam;
+
+ Foo(){}
+
+ Foo(int x, int y = 0, int z = 0){}
+
+ void meth(int x, int y = 0, int z = 0){}
+
+ // Use a renamed member as a default argument. SWIG has to resolve
+ // bar to Foo::bar and not Foo::spam. SWIG-1.3.11 got this wrong.
+ // (Different default parameter wrapping in SWIG-1.3.23 ensures SWIG doesn't have to resolve these symbols).
+ void method1(int x = bar) {}
+
+ // Use unrenamed member as default
+ void method2(int x = spam) {}
+
+ // test the method itself being renamed
+ void oldname(int x = 1234) {}
+ void renameme(int x = 1234, double d=123.4) const {}
+ };
+ int Foo::bar = 1;
+ int Foo::spam = 2;
+%}
+
+
+// tests valuewrapper
+%feature("compactdefaultargs") MyClass2::set;
+%inline %{
+ enum MyType { Val1, Val2 };
+
+ class MyClass1
+ {
+ public:
+ MyClass1(MyType myType) {}
+ };
+
+ class MyClass2
+ {
+ public :
+ void set(MyClass1 cl1 = Val1) {}
+ // This could have been written : set(MyClass1 cl1 = MyClass1(Val1))
+ // But it works in C++ since there is a "conversion" constructor in MyClass1.
+ void set2(MyClass1 cl1 = Val1) {}
+ };
+%}
+
+
+// Default parameters with exception specifications
+%inline %{
+void exceptionspec(int a = -1) throw (int, const char*) {
+ if (a == -1)
+ throw "ciao";
+ else
+ throw a;
+}
+struct Except {
+ Except(bool throwException, int a = -1) throw (int) {
+ if (throwException)
+ throw a;
+ }
+ void exspec(int a = 0) throw (int, const char*) {
+ ::exceptionspec(a);
+ }
+};
+%}
+
+// Default parameters in static class methods
+#ifdef SWIGPYTHON
+%rename(staticMethod) staticmethod;
+#endif
+
+%inline %{
+namespace SpaceName {
+ struct Statics {
+ static int staticmethod(int a=10, int b=20, int c=30) { return a+b+c; }
+ };
+}
+%}
+
+
+// Tests which could never be wrapped prior to changes in default argument wrapping implemented in SWIG-1.3.23:
+%inline %{
+class Tricky {
+ static int getDefault() { return 500; }
+ enum { privatevalue = 200 };
+ static const char charvalue;
+public:
+ int privatedefault(int val = privatevalue) { return val; }
+ int protectedint(int val = intvalue) { return val; }
+ double protecteddouble(double val = doublevalue) { return val; }
+ int functiondefault(int val = Tricky::getDefault()) { return val; }
+ char contrived(const char *c = &charvalue) { return *c; }
+protected:
+ static const int intvalue = 2000;
+ static const double doublevalue;
+};
+const char Tricky::charvalue = 'X';
+const double Tricky::doublevalue = 987.654;
+
+
+// tests default argument which is a constructor call within namespace
+// also tests default constructor (from defaulted parameter)
+namespace Space {
+struct Klass {
+ int val;
+ Klass(int val = -1) : val(val) {}
+};
+Klass constructorcall(const Klass& k = Klass()) { return k; }
+
+}
+%}
+
+%{
+struct ConstMethods {
+ int coo(double d = 0.0) { return 10; }
+ int coo(double d = 0.0) const { return 20; }
+};
+%}
+
+// const methods
+// runtime test needed to check that the const method is called
+struct ConstMethods {
+ int coo(double d = 0.0) const;
+};
+
+
+
+// Default args with C linkage
+%inline
+%{
+ extern "C" double cfunc1(double x,double p = 1) {
+ return(x+p);
+ }
+
+ extern "C" {
+ double cfunc2(double x,double p = 2) {
+ return(x+p);
+ }
+
+ double cfunc3(double x,double p = 3) {
+ return(x+p);
+ }
+
+ typedef struct Pointf {
+ double x,y;
+ } Pointf;
+ }
+%}