diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2017-04-12 19:08:23 +0100 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2017-04-13 06:59:56 +0100 |
commit | 83a389d3fbccbd588f3a649c4a736feeae617341 (patch) | |
tree | 263a11ff767fb3b572dceea4fd6b03cb6aa90243 /Examples/test-suite/cpp11_shared_ptr_upcast.i | |
parent | bd233408e8ec192b342dc02e014906affab9e08f (diff) | |
download | swig-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.i | 70 |
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(); +} +%} |