diff options
Diffstat (limited to 'libtests/pointer_holder.cc')
-rw-r--r-- | libtests/pointer_holder.cc | 134 |
1 files changed, 132 insertions, 2 deletions
diff --git a/libtests/pointer_holder.cc b/libtests/pointer_holder.cc index 70c83aeb..f03c4257 100644 --- a/libtests/pointer_holder.cc +++ b/libtests/pointer_holder.cc @@ -65,8 +65,8 @@ callHelloWithGet(ObjectHolder const& oh) (*oh).hello(); } -int -main(int argc, char* argv[]) +void +test_ph() { std::list<ObjectHolder> ol1; @@ -111,5 +111,135 @@ main(int argc, char* argv[]) std::cout << "array" << std::endl; PointerHolder<Object> o_arr1_ph(true, new Object[2]); std::cout << "goodbye" << std::endl; +} + +PointerHolder<Object> +make_object_ph() +{ + return new Object; +} + +std::shared_ptr<Object> +make_object_sp() +{ + return std::make_shared<Object>(); +} + +PointerHolder<Object const> +make_object_const_ph() +{ + return new Object; +} + +std::shared_ptr<Object const> +make_object_const_sp() +{ + return std::make_shared<Object const>(); +} + +void +hello_ph(PointerHolder<Object> o) +{ + o->hello(); +} + +void +hello_sp(std::shared_ptr<Object> o) +{ + o->hello(); +} + +void +hello_ph_const(PointerHolder<Object const> o) +{ + o->hello(); +} + +void +hello_sp_const(std::shared_ptr<Object const> o) +{ + o->hello(); +} + +void +ph_sp_compat() +{ + // Ensure bidirectional compatibility between PointerHolder and + // shared_ptr. + std::cout << "compat" << std::endl; + PointerHolder<Object> ph_from_ph = make_object_ph(); + std::shared_ptr<Object> sp_from_ph = make_object_ph(); + PointerHolder<Object> ph_from_sp = make_object_sp(); + std::shared_ptr<Object> sp_from_sp = make_object_sp(); + hello_sp(ph_from_ph); + hello_ph(sp_from_ph); + hello_sp(ph_from_sp); + hello_ph(sp_from_sp); + PointerHolder<Object const> ph_const_from_ph = make_object_const_ph(); + std::shared_ptr<Object const> sp_const_from_ph = make_object_const_ph(); + PointerHolder<Object const> ph_const_from_sp = make_object_const_sp(); + std::shared_ptr<Object const> sp_const_from_sp = make_object_const_sp(); + hello_sp_const(ph_const_from_ph); + hello_ph_const(sp_const_from_ph); + hello_sp_const(ph_const_from_sp); + hello_ph_const(sp_const_from_sp); + PointerHolder<Object> arr1_ph; + { + std::cout << "initialize ph array from shared_ptr" << std::endl; + std::shared_ptr<Object> arr1( + new Object[2], std::default_delete<Object[]>()); + arr1_ph = arr1; + } + std::cout << "delete ph array" << std::endl; + arr1_ph = nullptr; + std::shared_ptr<Object> arr2_sp; + { + std::cout << "initialize sp array from PointerHolder" << std::endl; + PointerHolder<Object> arr2(true, new Object[2]); + arr2_sp = arr2; + } + std::cout << "delete sp array" << std::endl; + arr2_sp = nullptr; + std::cout << "end compat" << std::endl; +} + +std::list<PointerHolder<Object>> +get_ph_list() +{ + std::list<PointerHolder<Object>> l = { + make_object_sp(), + make_object_ph(), + }; + return l; +} + +std::list<std::shared_ptr<Object>> +get_sp_list() +{ + std::list<std::shared_ptr<Object>> l = { + make_object_sp(), + make_object_ph(), + }; + return l; +} + +void +ph_sp_containers() +{ + std::cout << "containers" << std::endl; + // Demonstrate that using auto makes it easy to switch interfaces + // from using a container of one shared pointer type to a + // container of the other. + auto phl1 = get_ph_list(); + auto phl2 = get_sp_list(); + std::cout << "end containers" << std::endl; +} + +int +main(int argc, char* argv[]) +{ + test_ph(); + ph_sp_compat(); + ph_sp_containers(); return 0; } |