Improve ref-qualifier implementation
Internally, handle function ref-qualifiers in the function decl type string. Needed for a whole host of things to work like %feature and %rename. Add %feature %rename and %ignore testing for ref-qualifiers.
This commit is contained in:
parent
eeab152901
commit
1cf599bccb
11 changed files with 265 additions and 52 deletions
|
|
@ -1,16 +1,76 @@
|
|||
%module cpp11_ref_qualifiers
|
||||
|
||||
%inline %{
|
||||
class Host {
|
||||
public:
|
||||
void h1() & {}
|
||||
void h2() const & {}
|
||||
void h3() && {}
|
||||
void h4() const && {}
|
||||
%include <std_string.i>
|
||||
|
||||
void h() & {}
|
||||
void h() const & {}
|
||||
void h() && {}
|
||||
void h() const && {}
|
||||
%ignore Host::h() const &;
|
||||
|
||||
// Basic testing
|
||||
%inline %{
|
||||
using std::string;
|
||||
class Host {
|
||||
string s;
|
||||
public:
|
||||
string h1() & { return string(); }
|
||||
string h2() const & { return string(); }
|
||||
string h3() && { return std::move(string()); }
|
||||
string h4() const && { return std::move(string()); }
|
||||
string h5() const { return string(); }
|
||||
string h6() volatile const & { return string(); }
|
||||
string h7() const volatile & { return string(); }
|
||||
string h8() volatile const && { return std::move(string()); }
|
||||
string h9() const volatile && { return std::move(string()); }
|
||||
|
||||
string h() & { return string(); }
|
||||
string h() const & { return string(); }
|
||||
string h() && { return std::move(string()); }
|
||||
string h() const && { return std::move(string()); }
|
||||
};
|
||||
%}
|
||||
|
||||
// %feature testing
|
||||
%feature("except") F1() & %{ result = "F1"; %}
|
||||
%feature("except") F2 %{ result = "F2"; %}
|
||||
%feature("except") F3 %{ result = "F3"; %}
|
||||
%feature("except") F3() %{ _should_not_be_used_ %}
|
||||
|
||||
%feature("except") C1(int i) const & %{ result = "C1"; %}
|
||||
%feature("except") C2 %{ result = "C2"; %}
|
||||
%feature("except") C3 %{ result = "C3"; %}
|
||||
%feature("except") C3(int i) %{ _should_not_be_used_ %}
|
||||
|
||||
%inline %{
|
||||
struct Features {
|
||||
string F1() & { return string(); }
|
||||
string F2() & { return string(); }
|
||||
string F3() & { return string(); }
|
||||
|
||||
string C1(int i) const & { return string(); }
|
||||
string C2(int i) const & { return string(); }
|
||||
string C3(int i) const & { return string(); }
|
||||
};
|
||||
%}
|
||||
|
||||
// %rename testing
|
||||
%rename(RR1) R1;
|
||||
%rename(RR2) R2() &;
|
||||
%rename(RR3) R3;
|
||||
%rename(RR3Bad) R3();
|
||||
|
||||
%rename(SS1) S1;
|
||||
%rename(SS2) S2(int i) const &;
|
||||
%rename(SS3) S3;
|
||||
%rename(SS3Bad) S3(int i);
|
||||
%rename(SS3BadConst) S3(int i) const;
|
||||
%rename(SS3BadLValue) S3(int i) &;
|
||||
|
||||
%inline %{
|
||||
struct Renames {
|
||||
string R1() & { return string(); }
|
||||
string R2() & { return string(); }
|
||||
string R3() & { return string(); }
|
||||
|
||||
string S1(int i) const & { return string(); }
|
||||
string S2(int i) const & { return string(); }
|
||||
string S3(int i) const & { return string(); }
|
||||
};
|
||||
%}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
%module cpp_refqualifier
|
||||
|
||||
%ignore Host::h_ignored;
|
||||
%ignore Host::i_ignored() &&;
|
||||
%ignore Host::j_ignored() const &&;
|
||||
|
||||
class Host {
|
||||
public:
|
||||
|
|
@ -15,4 +17,6 @@ public:
|
|||
void h() const &&;
|
||||
|
||||
void h_ignored() &&;
|
||||
void i_ignored() &&;
|
||||
void j_ignored() const &&;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
cpp_refqualifier.i:9: Warning 405: Method with rvalue ref-qualifier ignored h3() &&.
|
||||
cpp_refqualifier.i:10: Warning 405: Method with rvalue ref-qualifier ignored h4() const &&.
|
||||
cpp_refqualifier.i:14: Warning 405: Method with rvalue ref-qualifier ignored h() &&.
|
||||
cpp_refqualifier.i:15: Warning 405: Method with rvalue ref-qualifier ignored h() const &&.
|
||||
cpp_refqualifier.i:13: Warning 512: Overloaded method Host::h() const & ignored,
|
||||
cpp_refqualifier.i:12: Warning 512: using non-const method Host::h() & instead.
|
||||
cpp_refqualifier.i:11: Warning 405: Method with rvalue ref-qualifier h3() && ignored.
|
||||
cpp_refqualifier.i:12: Warning 405: Method with rvalue ref-qualifier h4() const && ignored.
|
||||
cpp_refqualifier.i:16: Warning 405: Method with rvalue ref-qualifier h() && ignored.
|
||||
cpp_refqualifier.i:17: Warning 405: Method with rvalue ref-qualifier h() const && ignored.
|
||||
cpp_refqualifier.i:15: Warning 512: Overloaded method Host::h() const & ignored,
|
||||
cpp_refqualifier.i:14: Warning 512: using non-const method Host::h() & instead.
|
||||
|
|
|
|||
|
|
@ -14,9 +14,34 @@ public class cpp11_ref_qualifiers_runme {
|
|||
|
||||
public static void main(String argv[]) {
|
||||
Host h = new Host();
|
||||
|
||||
// Basic testing
|
||||
h.h1();
|
||||
h.h2();
|
||||
h.h6();
|
||||
h.h7();
|
||||
|
||||
h.h();
|
||||
|
||||
// %feature testing
|
||||
Features f = new Features();
|
||||
if (!f.F1().equals("F1")) throw new RuntimeException("Fail");
|
||||
if (!f.F2().equals("F2")) throw new RuntimeException("Fail");
|
||||
if (!f.F3().equals("F3")) throw new RuntimeException("Fail");
|
||||
|
||||
if (!f.C1(0).equals("C1")) throw new RuntimeException("Fail");
|
||||
if (!f.C2(0).equals("C2")) throw new RuntimeException("Fail");
|
||||
if (!f.C3(0).equals("C3")) throw new RuntimeException("Fail");
|
||||
|
||||
// %rename testing
|
||||
Renames r = new Renames();
|
||||
r.RR1();
|
||||
r.RR2();
|
||||
r.RR3();
|
||||
|
||||
r.SS1(0);
|
||||
r.SS2(0);
|
||||
r.SS3(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,37 @@
|
|||
import cpp11_ref_qualifiers
|
||||
|
||||
h = cpp11_ref_qualifiers.Host()
|
||||
|
||||
# Basic testing
|
||||
h.h1()
|
||||
h.h2()
|
||||
h.h6()
|
||||
h.h7()
|
||||
|
||||
h.h()
|
||||
|
||||
# %feature testing
|
||||
f = cpp11_ref_qualifiers.Features()
|
||||
if f.F1() != "F1":
|
||||
raise RuntimeException("Fail")
|
||||
if f.F2() != "F2":
|
||||
raise RuntimeException("Fail")
|
||||
if f.F3() != "F3":
|
||||
raise RuntimeException("Fail")
|
||||
|
||||
if f.C1(0) != "C1":
|
||||
raise RuntimeException("Fail")
|
||||
if f.C2(0) != "C2":
|
||||
raise RuntimeException("Fail")
|
||||
if f.C3(0) != "C3":
|
||||
raise RuntimeException("Fail")
|
||||
|
||||
# %rename testing
|
||||
r = cpp11_ref_qualifiers.Renames()
|
||||
r.RR1()
|
||||
r.RR2()
|
||||
r.RR3()
|
||||
|
||||
r.SS1(0)
|
||||
r.SS2(0)
|
||||
r.SS3(0)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue