From fb17bf685e3633b070a3ce3638ee74372f39aeb3 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 20 Jun 2017 20:38:26 +0300 Subject: [PATCH] Add more tests; fix errors --- .../boost/smart_ptr/allocate_shared_array.hpp | 16 ++ .../smart_ptr/detail/local_sp_deleter.hpp | 11 +- .../smart_ptr/detail/sp_counted_impl.hpp | 7 +- .../smart_ptr/make_local_shared_array.hpp | 4 +- test/Jamfile.v2 | 3 + test/get_local_deleter_array_test.cpp | 151 ++++++++++++++++++ test/get_local_deleter_array_test2.cpp | 74 +++++++++ test/get_local_deleter_test3.cpp | 59 +++++++ test/local_sp_test.cpp | 4 +- 9 files changed, 321 insertions(+), 8 deletions(-) create mode 100644 test/get_local_deleter_array_test.cpp create mode 100644 test/get_local_deleter_array_test2.cpp create mode 100644 test/get_local_deleter_test3.cpp diff --git a/include/boost/smart_ptr/allocate_shared_array.hpp b/include/boost/smart_ptr/allocate_shared_array.hpp index b9c4ce4..39b7567 100644 --- a/include/boost/smart_ptr/allocate_shared_array.hpp +++ b/include/boost/smart_ptr/allocate_shared_array.hpp @@ -766,6 +766,10 @@ public: return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } + void* get_local_deleter(const sp_typeinfo&) { + return 0; + } + void* get_untyped_deleter() { return &reinterpret_cast(deleter_); } @@ -807,6 +811,10 @@ public: return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } + void* get_local_deleter(const sp_typeinfo&) { + return 0; + } + void* get_untyped_deleter() { return &reinterpret_cast(deleter_); } @@ -853,6 +861,10 @@ public: return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } + void* get_local_deleter(const sp_typeinfo&) { + return 0; + } + void* get_untyped_deleter() { return &reinterpret_cast(deleter_); } @@ -898,6 +910,10 @@ public: return ti == BOOST_SP_TYPEID(deleter_type)? &reinterpret_cast(deleter_): 0; } + void* get_local_deleter(const sp_typeinfo&) { + return 0; + } + void* get_untyped_deleter() { return &reinterpret_cast(deleter_); } diff --git a/include/boost/smart_ptr/detail/local_sp_deleter.hpp b/include/boost/smart_ptr/detail/local_sp_deleter.hpp index 3dd62fa..7d04f1d 100644 --- a/include/boost/smart_ptr/detail/local_sp_deleter.hpp +++ b/include/boost/smart_ptr/detail/local_sp_deleter.hpp @@ -70,9 +70,18 @@ public: #endif }; +template<> class local_sp_deleter +{ +}; + template D * get_local_deleter( local_sp_deleter * p ) { - return &p->deleter(); + return &p->deleter(); +} + +inline void * get_local_deleter( local_sp_deleter * /*p*/ ) +{ + return 0; } } // namespace detail diff --git a/include/boost/smart_ptr/detail/sp_counted_impl.hpp b/include/boost/smart_ptr/detail/sp_counted_impl.hpp index ad5d254..fa2f75e 100644 --- a/include/boost/smart_ptr/detail/sp_counted_impl.hpp +++ b/include/boost/smart_ptr/detail/sp_counted_impl.hpp @@ -26,6 +26,7 @@ #include #include +#include #if defined(BOOST_SP_USE_QUICK_ALLOCATOR) #include @@ -54,7 +55,7 @@ namespace detail template class local_sp_deleter; -template D * get_local_deleter( D * p ) +template D * get_local_deleter( D * /*p*/ ) { return 0; } @@ -178,7 +179,7 @@ public: virtual void * get_local_deleter( sp_typeinfo const & ti ) { - return ti == BOOST_SP_TYPEID(D)? boost::detail::get_local_deleter( &reinterpret_cast( del ) ): 0; + return ti == BOOST_SP_TYPEID(D)? boost::detail::get_local_deleter( boost::addressof( del ) ): 0; } virtual void * get_untyped_deleter() @@ -271,7 +272,7 @@ public: virtual void * get_local_deleter( sp_typeinfo const & ti ) { - return ti == BOOST_SP_TYPEID(D)? boost::detail::get_local_deleter( &reinterpret_cast( d_ ) ): 0; + return ti == BOOST_SP_TYPEID(D)? boost::detail::get_local_deleter( boost::addressof( d_ ) ): 0; } virtual void * get_untyped_deleter() diff --git a/include/boost/smart_ptr/make_local_shared_array.hpp b/include/boost/smart_ptr/make_local_shared_array.hpp index d0eec2f..136c767 100644 --- a/include/boost/smart_ptr/make_local_shared_array.hpp +++ b/include/boost/smart_ptr/make_local_shared_array.hpp @@ -28,12 +28,12 @@ template struct lsp_if_array template struct lsp_if_array { - typedef boost::local_shared_ptr type; + typedef boost::local_shared_ptr type; }; template struct lsp_if_array { - typedef boost::local_shared_ptr type; + typedef boost::local_shared_ptr type; }; } // namespace detail diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index d963dda..10b14cf 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -231,6 +231,9 @@ import testing ; [ run get_local_deleter_test.cpp ] [ run get_local_deleter_test2.cpp ] + [ run get_local_deleter_test3.cpp ] + [ run get_local_deleter_array_test.cpp ] + [ run get_local_deleter_array_test2.cpp ] [ run make_local_shared_test.cpp ] [ run make_local_shared_esft_test.cpp ] diff --git a/test/get_local_deleter_array_test.cpp b/test/get_local_deleter_array_test.cpp new file mode 100644 index 0000000..3a8351b --- /dev/null +++ b/test/get_local_deleter_array_test.cpp @@ -0,0 +1,151 @@ +// +// get_local_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::local_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::local_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::local_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::local_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::local_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::local_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_local_deleter_array_test2.cpp b/test/get_local_deleter_array_test2.cpp new file mode 100644 index 0000000..999fffe --- /dev/null +++ b/test/get_local_deleter_array_test2.cpp @@ -0,0 +1,74 @@ +// +// get_local_deleter_test2.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 + +#if defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) || defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) + +int main() +{ +} + +#else + +#include +#include +#include + +struct deleter +{ +}; + +struct deleter2; + +struct X +{ +}; + +int main() +{ + { + boost::local_shared_ptr p = boost::make_local_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::local_shared_ptr p = boost::make_local_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 +{ +}; + +#endif diff --git a/test/get_local_deleter_test3.cpp b/test/get_local_deleter_test3.cpp new file mode 100644 index 0000000..655c7fc --- /dev/null +++ b/test/get_local_deleter_test3.cpp @@ -0,0 +1,59 @@ +// +// get_local_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 + +#if defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) || defined( BOOST_NO_CXX11_VARIADIC_TEMPLATES ) + +int main() +{ +} + +#else + +#include +#include +#include + +struct deleter +{ +}; + +struct deleter2; + +struct X +{ +}; + +int main() +{ + { + boost::local_shared_ptr p = boost::make_local_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 +{ +}; + +#endif diff --git a/test/local_sp_test.cpp b/test/local_sp_test.cpp index dd161d8..dc0e316 100644 --- a/test/local_sp_test.cpp +++ b/test/local_sp_test.cpp @@ -1929,7 +1929,7 @@ template static void test_deleter_reset( boost::local_shared_p boost::shared_ptr p3( p2 ); - // BOOST_TEST( boost::get_deleter< deleter >( p3 ) != 0 ); + BOOST_TEST( boost::get_deleter< deleter >( p3 ) != 0 ); p3.reset(); BOOST_TEST( !called ); @@ -2010,7 +2010,7 @@ template static void test_allocator_reset( boost::local_shared boost::shared_ptr p3( p2 ); - // BOOST_TEST( boost::get_deleter< deleter >( p3 ) != 0 ); + BOOST_TEST( boost::get_deleter< deleter >( p3 ) != 0 ); p3.reset(); BOOST_TEST( !called );