1 // This testcase checks whether SWIG produces the correct wrappers for strongly typed enums.
2
3 %module cpp11_strongly_typed_enumerations
4
5 %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) Class1::Struct1;
6 %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) Class2::Struct1;
7
8 /* Forward declarations (illegally accepted by SWIG - oh well!) */
9 enum Enum1 : short;
10 enum Enum3;
11 enum ;
12 enum : unsigned short;
13
14 %inline %{
15 enum class Enum1 {
16 Val1,
17 Val2,
18 Val3 = 13,
19 Val4,
20 Val5a = 13,
21 Val6a
22 };
23
24 enum class Enum2 : short {
25 Val1,
26 Val2,
27 Val3 = 23,
28 Val4,
29 Val5b = 23,
30 Val6b
31 };
32 %}
33
34 // SWIG should fail this one
35 enum Enum2 : unsigned short; // Illegal in C++11, because Enum2 was previously declared with a different type.
36
37 %inline %{
38 /* Forward declarations. */
39 enum Enum4 : unsigned int; // Legal in C++11.
40 enum class Enum5; // Legal in C++11, because enum class declarations have a default type of "int".
41 enum class Enum6 : unsigned int; // Legal C++11.
42
43 enum Enum4 : unsigned int {
44 Val1, Val2, Val3 = 43, Val4
45 };
46
47 enum class Enum5 {
48 Val1, Val2, Val3 = 53, Val4
49 };
50
51 enum class Enum6 : unsigned int {
52 Val1, Val2, Val3 = 63, Val4
53 };
54
55 typedef enum class Enum7 : unsigned int {
56 Val1, Val2, Val3 = 73, Val4
57 } Enum7td;
58
59 // enum inherits from non-primitive type
60 enum class Enum8 : size_t {
61 Val1, Val2, Val3 = 83, Val4
62 };
63
64 template <typename T> struct TType {
65 typedef T type_name;
66 };
67
68 enum class Enum10 : TType<int>::type_name {
69 Val1, Val2, Val3 = 103, Val4
70 };
71
72 // forward declaration, no definition of enum
73 enum class Enum11 : int;
74 struct UseEnum11 {
75 Enum11 myenum11;
76 };
77
78 class Class1
79 {
80 public:
81 enum class Enum12
82 {
83 Val1 = 1121,
84 Val2 = 1122,
85 Val3,
86 Val4,
87 Val5c = 1121,
88 Val6c
89 };
90
91 enum Enum13
92 {
93 Val1 = 1131,
94 Val2 = 1132,
95 Val3,
96 Val4,
97 Val5d = 1131,
98 Val6d
99 };
100
101 enum class Enum14
102 {
103 Val1 = 1141,
104 Val2 = 1142,
105 Val3,
106 Val4,
107 Val5e = 1141,
108 Val6e
109 };
110
111 struct Struct1
112 {
113 enum class Enum12
114 {
115 Val1 = 3121,
116 Val2 = 3122,
117 Val3,
118 Val4,
119 Val5f = 3121,
120 Val6f
121 };
122
123 enum Enum13
124 {
125 Val1 = 3131,
126 Val2 = 3132,
127 Val3,
128 Val4,
129 };
130
131 enum class Enum14
132 {
133 Val1 = 3141,
134 Val2 = 3142,
135 Val3,
136 Val4,
137 Val5g = 3141,
138 Val6g
139 };
140 };
class1Test1(Enum1 e)141 Enum1 class1Test1(Enum1 e) { return e; }
class1Test2(Enum12 e)142 Enum12 class1Test2(Enum12 e) { return e; }
class1Test3(Struct1::Enum12 e)143 Struct1::Enum12 class1Test3(Struct1::Enum12 e) { return e; }
144 };
145
146 class Class2
147 {
148 public:
149 enum class Enum12
150 {
151 Val1 = 2121,
152 Val2 = 2122,
153 Val3,
154 Val4,
155 Val5h = 2121,
156 Val6h
157 };
158
159 enum Enum13
160 {
161 Val1 = 2131,
162 Val2 = 2132,
163 Val3,
164 Val4,
165 Val5i = 2131,
166 Val6i
167 };
168
169 enum class Enum14
170 {
171 Val1 = 2141,
172 Val2 = 2142,
173 Val3,
174 Val4,
175 Val5j = 2141,
176 Val6j
177 };
178
179 struct Struct1
180 {
181 enum class Enum12
182 {
183 Val1 = 4121,
184 Val2 = 4122,
185 Val3,
186 Val4,
187 Val5k = 4121,
188 Val6k
189 };
190
191 enum Enum13
192 {
193 Val1 = 4131,
194 Val2 = 4132,
195 Val3,
196 Val4,
197 Val5l = 4131,
198 Val6l
199 };
200
201 enum class Enum14
202 {
203 Val1 = 4141,
204 Val2 = 4142,
205 Val3,
206 Val4,
207 Val5m = 4141,
208 Val6m
209 };
210 };
211 };
212
globalTest1(Enum1 e)213 Enum1 globalTest1(Enum1 e) { return e; }
globalTest2(Class1::Enum12 e)214 Class1::Enum12 globalTest2(Class1::Enum12 e) { return e; }
globalTest3(Class1::Struct1::Enum12 e)215 Class1::Struct1::Enum12 globalTest3(Class1::Struct1::Enum12 e) { return e; }
216
217 class PrivateEnumClass {
218 private:
219 enum class Enum {
220 PrivateEnum1,
221 PrivateEnum2
222 };
223 };
224 %}
225
226