summaryrefslogtreecommitdiff
path: root/Examples/test-suite/cpp11_shared_ptr_upcast.i
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2017-04-12 19:08:23 +0100
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2017-04-13 06:59:56 +0100
commit83a389d3fbccbd588f3a649c4a736feeae617341 (patch)
tree263a11ff767fb3b572dceea4fd6b03cb6aa90243 /Examples/test-suite/cpp11_shared_ptr_upcast.i
parentbd233408e8ec192b342dc02e014906affab9e08f (diff)
downloadswig-83a389d3fbccbd588f3a649c4a736feeae617341.tar.gz
Add support for pointers to shared_ptr and null shared_ptr in Ruby containers
Upcasting of pointers to shared_ptr would need some more fundamental changes, but not done yet ... pointers to shared_ptr are not common.
Diffstat (limited to 'Examples/test-suite/cpp11_shared_ptr_upcast.i')
-rw-r--r--Examples/test-suite/cpp11_shared_ptr_upcast.i70
1 files changed, 64 insertions, 6 deletions
diff --git a/Examples/test-suite/cpp11_shared_ptr_upcast.i b/Examples/test-suite/cpp11_shared_ptr_upcast.i
index 9f65eb7e1..3427829d9 100644
--- a/Examples/test-suite/cpp11_shared_ptr_upcast.i
+++ b/Examples/test-suite/cpp11_shared_ptr_upcast.i
@@ -36,27 +36,27 @@ typedef std::shared_ptr<Derived> DerivedPtr;
// non-overloaded
int derived_num1(DerivedPtr v) {
- return (*v).get_n();
+ return v == nullptr ? 999 : (*v).get_n();
}
int derived_num2(std::vector<DerivedPtr> v) {
- return (*v[0]).get_n();
+ return v[0] == nullptr ? 999 : (*v[0]).get_n();
}
int derived_num3(std::map<int, DerivedPtr> v) {
- return (*v[0]).get_n();
+ return v[0] == nullptr ? 999 : (*v[0]).get_n();
}
int base_num1(BasePtr v) {
- return (*v).get_m();
+ return v == nullptr ? 999 : (*v).get_m();
}
int base_num2(std::vector<BasePtr > v) {
- return (*v[0]).get_m();
+ return v[0] == nullptr ? 999 : (*v[0]).get_m();
}
int base_num3(std::map<int, BasePtr > v) {
- return (*v[0]).get_m();
+ return v[0] == nullptr ? 999 : (*v[0]).get_m();
}
// overloaded
@@ -128,3 +128,61 @@ int derived_num(std::map<int, DerivedPtr> v);
int base_num(BasePtr);
int base_num(std::vector<std::shared_ptr<Base> > v);
int base_num(std::map<int, BasePtr > v);
+
+// ptr to shared_ptr
+%shared_ptr(Base2);
+%shared_ptr(Derived2)
+
+%inline %{
+class Base2 {
+public:
+ Base2() : m(-1) {}
+ Base2(int i) : m(i) {}
+ int get_m() { return m; }
+ int m;
+};
+
+
+class Derived2 : public Base2 {
+public:
+ Derived2() : n(0) {}
+ Derived2(int i) : n(i) {}
+ int get_n_2() { return n; }
+ int n;
+};
+%}
+
+%template(Base2List) std::vector<std::shared_ptr<Base2> * >;
+%template(Base2Map) std::map<int, std::shared_ptr<Base2> * >;
+
+%template(Derived2List) std::vector<std::shared_ptr<Derived2> * >;
+%template(Derived2Map) std::map<int, std::shared_ptr<Derived2> * >;
+
+%inline %{
+typedef std::shared_ptr<Derived2> * Derived2Ptr;
+typedef std::shared_ptr<Base2> * Base2Ptr;
+
+int base2_num1(Base2Ptr v) {
+ return v == nullptr ? 999 : *v == nullptr ? 888 : (*v)->get_m();
+}
+
+int base2_num2(std::vector<Base2Ptr> v) {
+ return v[0] == nullptr ? 999 : *v[0] == nullptr ? 888 : (*v[0])->get_m();
+}
+
+int base2_num3(std::map<int, Base2Ptr> v) {
+ return v[0] == nullptr ? 999 : *v[0] == nullptr ? 888 : (*v[0])->get_m();
+}
+
+int derived2_num1(Derived2Ptr v) {
+ return v == nullptr ? 999 : *v == nullptr ? 888 : (*v)->get_n_2();
+}
+
+int derived2_num2(std::vector<Derived2Ptr> v) {
+ return v[0] == nullptr ? 999 : *v[0] == nullptr ? 888 : (*v[0])->get_n_2();
+}
+
+int derived2_num3(std::map<int, Derived2Ptr> v) {
+ return v[0] == nullptr ? 999 : *v[0] == nullptr ? 888 : (*v[0])->get_n_2();
+}
+%}