summaryrefslogtreecommitdiff
path: root/Examples/test-suite/cpp11_final_class.i
blob: 4f24293207654539deddd6817c2842e138df1bfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
%module cpp11_final_class

%warnfilter(SWIGWARN_PARSE_KEYWORD) final; // 'final' is a java keyword, renaming to '_final'
%warnfilter(SWIGWARN_PARSE_KEYWORD) override; // 'override' is a C# keyword, renaming to '_override'

%ignore Space1::final::operator=;
#if defined(SWIGPHP)
%rename(Space1_final) Space1::final::final;
#endif
#if defined(SWIGOCAML)
%rename(finale) BrokenSpace::FinalEnum1::final;
#endif

%inline %{
struct FinalBase {
  virtual ~FinalBase() {}
};

struct FinalClass1 final : FinalBase {
  void method1() {}
};

class FinalClass2 final : public FinalBase {
public:
  void method2() {}
};

struct FinalClass3 final {
  void method3() {}
};

struct FinalClass4 {
  void method4() {}
} final;

struct override final {
  void omethod() {}
};
%}

%rename(Space1_final) Space1::final;

%inline %{
namespace Space1 {
struct final final {
  void finalmethod() {}
  final() {}
  final(const final &other) = default;
  final& operator=(const final &other) = default;
};
struct FinalClass5 final {
  void method5() {}
  final final_member_var;
  final get_final_member() { return final_member_var; }
  Space1::final get_final_member2() { return final_member_var; }
};
struct FinalClass6 {
  void method6() {}
  virtual void final() final {}
  virtual ~FinalClass6() = default;
};
typedef final Space1_final_typedef1;
typedef struct final Space1_final_typedef2;
}
typedef Space1::final Space1_final_typedef3;
typedef struct Space1::final Space1_final_typedef4;
%}

%inline %{
namespace Space2 {
class Y {
public:
  Y(int i=0) {}
};

struct FinalVar1 {
    class Y notfinal;
//  class Y final; // SWIG (C++ only) fails to parse (same for struct and union)
};
struct FinalVar2 {
    class Y notfinal = {};
//  class Y final = {}; // SWIG (C++ only) fails to parse (same for struct and union)
};
struct FinalVar3 {
    class Y notfinal = Y();
//  class Y final = Y(); // SWIG (C++ only) fails to parse (same for struct and union)
};
struct FinalVar4 {
  class Y* final;
  FinalVar4() : final() {}
};
struct FinalVar5 {
  Y final;
};
struct FinalVar6 {
  Y final = {};
};
struct FinalVar7 {
  Y final = Y();
};
struct FinalVar8 {
  Y final{};
};
struct FinalVar9 {
  Y final{9};
};
struct FinalVar10 {
  void b10(Y final) {}
};
}
%}

// Unfortunately the use of final in BrokenSpace does not work with Visual C++
// so we limit testing to parsing these by SWIG and then ignoring it all.
%ignore BrokenSpace::FinalVar11;
%ignore BrokenSpace::FinalEnum1;
%ignore BrokenSpace::FinalEnum2;

namespace BrokenSpace {
using Space2::Y;
struct FinalVar11 {
  void a11(class Y final) {}
};
struct FinalEnum1 {
  enum Enum1 { one, two, final };
  void enum_in(Enum1 e) {}
};
struct FinalEnum2 {
  enum Enum2 { one, two, three, four };
  enum Enum2 final;
};
}

%rename(Space3_final) Space3::final;
%inline %{
namespace Space3 {
  typedef struct final {
    void fmethod() {}
  } final;
}
%}