From 87272703c2b0efac974d2a9092c65f6c1cf7401d Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 20 Jun 2017 17:47:17 +0300 Subject: [PATCH 1/3] Add get_deleter test with an incomplete class --- test/Jamfile.v2 | 2 ++ test/get_deleter_test2.cpp | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 test/get_deleter_test2.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 6340cf5..212c4d9 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -218,6 +218,8 @@ import testing ; [ run atomic_sp_constexpr_test.cpp ] + [ run get_deleter_test2.cpp ] + [ run local_sp_test.cpp ] [ run lsp_array_test.cpp ] [ run lsp_array_n_test.cpp ] diff --git a/test/get_deleter_test2.cpp b/test/get_deleter_test2.cpp new file mode 100644 index 0000000..4ddc65e --- /dev/null +++ b/test/get_deleter_test2.cpp @@ -0,0 +1,37 @@ +// +// get_deleter_test2.cpp +// +// Copyright 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include + +struct deleter; + +struct X +{ +}; + +static void test_get_deleter( boost::shared_ptr const & p ) +{ + BOOST_TEST( boost::get_deleter( p ) != 0 ); +} + +struct deleter +{ + void operator()( X const * p ) { delete p; } +}; + +int main() +{ + boost::shared_ptr p( new X, deleter() ); + + test_get_deleter( p ); + + return boost::report_errors(); +} From 9fe68850781c0c64f18949bea22f48047100cdee Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 20 Jun 2017 19:18:30 +0300 Subject: [PATCH 2/3] Add more get_deleter tests --- test/Jamfile.v2 | 3 + test/get_deleter_array_test2.cpp | 151 +++++++++++++++++++++++++++++++ test/get_deleter_array_test3.cpp | 62 +++++++++++++ test/get_deleter_test3.cpp | 47 ++++++++++ 4 files changed, 263 insertions(+) create mode 100644 test/get_deleter_array_test2.cpp create mode 100644 test/get_deleter_array_test3.cpp create mode 100644 test/get_deleter_test3.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 212c4d9..3ce07f4 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -219,6 +219,9 @@ import testing ; [ run atomic_sp_constexpr_test.cpp ] [ run get_deleter_test2.cpp ] + [ run get_deleter_test3.cpp ] + [ run get_deleter_array_test2.cpp ] + [ run get_deleter_array_test3.cpp ] [ run local_sp_test.cpp ] [ run lsp_array_test.cpp ] diff --git a/test/get_deleter_array_test2.cpp b/test/get_deleter_array_test2.cpp new file mode 100644 index 0000000..473aac2 --- /dev/null +++ b/test/get_deleter_array_test2.cpp @@ -0,0 +1,151 @@ +// +// get_deleter_array_test2.cpp +// +// Copyright 2002, 2011, 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include + +struct deleter +{ + int data; + + deleter(): data(0) + { + } + + void operator()(void *) + { + BOOST_TEST(data == 17041); + } +}; + +struct deleter2 +{ +}; + +struct X +{ +}; + +int main() +{ + { + boost::shared_ptr p; + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + } + + { + boost::shared_ptr p; + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + } + + { + boost::shared_ptr p(new X[1]); + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + } + + { + boost::shared_ptr p(new X[1]); + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + } + + { + X x[1]; + boost::shared_ptr p(x, deleter()); + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + + deleter * q = boost::get_deleter(p); + + BOOST_TEST(q != 0); + BOOST_TEST(q->data == 0); + + q->data = 17041; + + deleter const * r = boost::get_deleter(p); + + BOOST_TEST(r == q); + BOOST_TEST(r->data == 17041); + } + + { + X x[1]; + boost::shared_ptr p(x, deleter()); + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + + deleter * q = boost::get_deleter(p); + + BOOST_TEST(q != 0); + BOOST_TEST(q->data == 0); + + q->data = 17041; + + deleter const * r = boost::get_deleter(p); + + BOOST_TEST(r == q); + BOOST_TEST(r->data == 17041); + } + + return boost::report_errors(); +} diff --git a/test/get_deleter_array_test3.cpp b/test/get_deleter_array_test3.cpp new file mode 100644 index 0000000..7a33eea --- /dev/null +++ b/test/get_deleter_array_test3.cpp @@ -0,0 +1,62 @@ +// +// get_deleter_test3.cpp +// +// Copyright 2002, 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include +#include + +struct deleter +{ +}; + +struct deleter2; + +struct X +{ +}; + +int main() +{ + { + boost::shared_ptr p = boost::make_shared( 1 ); + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + } + + { + boost::shared_ptr p = boost::make_shared(); + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + } + + return boost::report_errors(); +} + +struct deleter2 +{ +}; diff --git a/test/get_deleter_test3.cpp b/test/get_deleter_test3.cpp new file mode 100644 index 0000000..c42643b --- /dev/null +++ b/test/get_deleter_test3.cpp @@ -0,0 +1,47 @@ +// +// get_deleter_test3.cpp +// +// Copyright 2002, 2017 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// + +#include +#include +#include + +struct deleter +{ +}; + +struct deleter2; + +struct X +{ +}; + +int main() +{ + { + boost::shared_ptr p = boost::make_shared(); + + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + BOOST_TEST(boost::get_deleter(p) == 0); + } + + return boost::report_errors(); +} + +struct deleter2 +{ +}; From 028bb2cee86d5aea931bb4b928a54f70ace6a565 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 20 Jun 2017 19:33:39 +0300 Subject: [PATCH 3/3] Fix get_deleter in allocate_shared_array.hpp --- .../boost/smart_ptr/allocate_shared_array.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/boost/smart_ptr/allocate_shared_array.hpp b/include/boost/smart_ptr/allocate_shared_array.hpp index 636340c..b9c4ce4 100644 --- a/include/boost/smart_ptr/allocate_shared_array.hpp +++ b/include/boost/smart_ptr/allocate_shared_array.hpp @@ -762,8 +762,8 @@ public: allocator.deallocate(this, 1); } - void* get_deleter(const sp_typeinfo&) { - return &reinterpret_cast(deleter_); + void* get_deleter(const sp_typeinfo& ti) { + return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } void* get_untyped_deleter() { @@ -803,8 +803,8 @@ public: allocator.deallocate(this, 1); } - void* get_deleter(const sp_typeinfo&) { - return &reinterpret_cast(deleter_); + void* get_deleter(const sp_typeinfo& ti) { + return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } void* get_untyped_deleter() { @@ -849,8 +849,8 @@ public: allocator.deallocate(this, 1); } - void* get_deleter(const sp_typeinfo&) { - return &reinterpret_cast(deleter_); + void* get_deleter(const sp_typeinfo& ti) { + return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } void* get_untyped_deleter() { @@ -894,8 +894,8 @@ public: allocator.deallocate(this, 1); } - void* get_deleter(const sp_typeinfo&) { - return &reinterpret_cast(deleter_); + void* get_deleter(const sp_typeinfo& ti) { + return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } void* get_untyped_deleter() {