1 module testdll;
2 
3 // the names are prefixed with `test_dll` so as to not clash in python
4 
5 string testdll_foo() {
6     return "20 Monkey";
7 }
8 
9 // this won't get wrapped
10 string testdll_foo(int i) {
11     import std.conv: text;
12     return text(i);
13 }
14 
15 string testdll_bar(int i) {
16     if (i > 10) {
17         return "It's greater than 10!";
18     } else {
19         return "It's less than 10!";
20     }
21 }
22 
23 
24 auto testdll_baz(int i = 10, string s = "moo") {
25     import std.typecons: tuple;
26     return tuple(i, s);
27 }
28 
29 
30 class TestDllFoo {
31     int m_i;
32     this() { }
33     this(int i) {
34         m_i = i;
35     }
36     this(int i, int j) {
37         m_i = i + j;
38     }
39     string foo() {
40         import std.format: format;
41         return format("Foo.foo(): i = %s", m_i);
42     }
43     int length() { return 10; }
44     int opSlice(long i1, long i2) {
45         return 12;
46     }
47     int opIndex(int x, int y) {
48         return x + y;
49     }
50     TestDllFoo opBinary(string op)(TestDllFoo f) if(op == "+")
51     {
52         return new TestDllFoo(m_i + f.m_i);
53     }
54 
55     struct Range {
56         int i = 0;
57 
58         @property bool empty() {
59             return i >= 10;
60         }
61         @property int front() {
62             return i+1;
63         }
64         void popFront() {
65             i++;
66         }
67     }
68 
69     Range opSlice() {
70         return Range();
71     }
72     @property int i() { return m_i; }
73     @property void i(int j) { m_i = j; }
74     void a() {}
75     void b() {}
76     void c() {}
77     void d() {}
78     void e() {}
79     void f() {}
80     void g() {}
81     void h() {}
82     void j() {}
83     void k() {}
84     void l() {}
85     void m() {}
86     void n() {}
87     void o() {}
88     void p() {}
89     void q() {}
90     void r() {}
91     void s() {}
92     void t() {}
93     void u() {}
94     void v() {}
95     void w() {}
96     void x() {}
97     void y() {}
98     void z() {}
99 
100     override string toString() {
101         import std.conv: text;
102         return text("TestDllFoo(", m_i, ")");
103     }
104 }
105 
106 void delegate() func_test() {
107     import std.stdio: writeln;
108     return { writeln("Delegate works!"); };
109 }
110 
111 string dg_test(string delegate() dg) {
112     return dg();
113 }
114 
115 class TestDllBar {
116     int[] m_a;
117     this() { }
118     this(int[] i ...) { m_a = i; }
119 }
120 
121 struct TestDllStruct {
122     int i;
123     char[] s;
124 }
125 
126 TestDllFoo testdll_spam(TestDllFoo f) {
127     f.foo();
128     auto g = new TestDllFoo(f.i + 10);
129     return g;
130 }
131 
132 void testdll_throws() {
133     throw new Exception("Yay! An exception!");
134 }