diff --git a/include/boost/smart_ptr/allocate_shared_array.hpp b/include/boost/smart_ptr/allocate_shared_array.hpp index e7d0964..90c5614 100644 --- a/include/boost/smart_ptr/allocate_shared_array.hpp +++ b/include/boost/smart_ptr/allocate_shared_array.hpp @@ -352,8 +352,8 @@ sp_array_default(T* storage, std::size_t size) template struct sp_less_align { enum { - value = ((boost::alignment_of::value) < - boost::alignment_of::value) + value = (boost::alignment_of::value) < + (boost::alignment_of::value) }; }; @@ -664,7 +664,7 @@ public: size_(other.size_), result_(other.result_) { } - value_type* allocate(std::size_t count, const void* = 0) { + value_type* allocate(std::size_t count) { type_allocator allocator(allocator_); std::size_t head = sp_align(count); std::size_t tail = sp_align(size_); diff --git a/include/boost/smart_ptr/detail/shared_count.hpp b/include/boost/smart_ptr/detail/shared_count.hpp index 7996aa4..9813842 100644 --- a/include/boost/smart_ptr/detail/shared_count.hpp +++ b/include/boost/smart_ptr/detail/shared_count.hpp @@ -249,18 +249,8 @@ public: try { -#if !defined( BOOST_NO_CXX11_ALLOCATOR ) - - impl_type * pi = std::allocator_traits::allocate( a2, 1 ); - pi_ = pi; - std::allocator_traits::construct( a2, pi, p, d, a ); - -#else - - pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); + pi_ = a2.allocate( 1 ); ::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); - -#endif } catch(...) { @@ -276,28 +266,11 @@ public: #else -#if !defined( BOOST_NO_CXX11_ALLOCATOR ) - - impl_type * pi = std::allocator_traits::allocate( a2, 1 ); - pi_ = pi; - -#else - - pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); - -#endif + pi_ = a2.allocate( 1 ); if( pi_ != 0 ) { -#if !defined( BOOST_NO_CXX11_ALLOCATOR ) - - std::allocator_traits::construct( a2, pi, p, d, a ); - -#else - ::new( static_cast< void* >( pi_ ) ) impl_type( p, d, a ); - -#endif } else { @@ -333,18 +306,8 @@ public: try { -#if !defined( BOOST_NO_CXX11_ALLOCATOR ) - - impl_type * pi = std::allocator_traits::allocate( a2, 1 ); - pi_ = pi; - std::allocator_traits::construct( a2, pi, p, a ); - -#else - - pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); + pi_ = a2.allocate( 1 ); ::new( static_cast< void* >( pi_ ) ) impl_type( p, a ); - -#endif } catch(...) { @@ -360,28 +323,11 @@ public: #else -#if !defined( BOOST_NO_CXX11_ALLOCATOR ) - - impl_type * pi = std::allocator_traits::allocate( a2, 1 ); - pi_ = pi; - -#else - - pi_ = a2.allocate( 1, static_cast< impl_type* >( 0 ) ); - -#endif + pi_ = a2.allocate( 1 ); if( pi_ != 0 ) { -#if !defined( BOOST_NO_CXX11_ALLOCATOR ) - - std::allocator_traits::construct( a2, pi, p, a ); - -#else - ::new( static_cast< void* >( pi_ ) ) impl_type( p, a ); - -#endif } else { diff --git a/include/boost/smart_ptr/detail/sp_counted_impl.hpp b/include/boost/smart_ptr/detail/sp_counted_impl.hpp index 1222f3c..b29769e 100644 --- a/include/boost/smart_ptr/detail/sp_counted_impl.hpp +++ b/include/boost/smart_ptr/detail/sp_counted_impl.hpp @@ -236,16 +236,8 @@ public: A2 a2( a_ ); -#if !defined( BOOST_NO_CXX11_ALLOCATOR ) - - std::allocator_traits::destroy( a2, this ); - -#else - this->~this_type(); -#endif - a2.deallocate( this, 1 ); } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 1814bd8..528fe06 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -84,6 +84,7 @@ import testing ; [ run sa_nullptr_test.cpp ] [ run shared_ptr_alloc3_test.cpp ] [ run shared_ptr_alloc11_test.cpp ] + [ run shared_ptr_alloc_construct11_test.cpp ] [ run allocate_shared_alloc11_test.cpp ] [ run allocate_shared_construct11_test.cpp ] [ run sp_interlocked_test.cpp ] diff --git a/test/shared_ptr_alloc_construct11_test.cpp b/test/shared_ptr_alloc_construct11_test.cpp new file mode 100644 index 0000000..436f828 --- /dev/null +++ b/test/shared_ptr_alloc_construct11_test.cpp @@ -0,0 +1,128 @@ +/* +Copyright 2017 Glen Joseph Fernandes +(glenjofe@gmail.com) + +Distributed under the Boost Software License, Version 1.0. +(http://www.boost.org/LICENSE_1_0.txt) +*/ +#include +#include + +#if !defined(BOOST_NO_CXX11_ALLOCATOR) +struct counters { + unsigned allocate; + unsigned construct; +}; + +template +class creator { +public: + typedef T value_type; + + creator(counters* state) + : state_(state) { } + + template + creator(const creator& other) + : state_(other.state()) { } + + T* allocate(std::size_t size) { + void* ptr = ::operator new(sizeof(T) * size); + ++state_->allocate; + return static_cast(ptr); + } + + void deallocate(T* ptr, std::size_t) { + ::operator delete(ptr); + --state_->allocate; + } + + template + void construct(T* ptr, Args&&... args) { + ::new(static_cast(ptr)) T(std::forward(args)...); + ++state_->construct; + } + + void destroy(T* ptr) { + ptr->~T(); + --state_->construct; + } + + counters* state() const { + return state_; + } + +private: + counters* state_; +}; + +template +inline bool +operator==(const creator& lhs, const creator& rhs) +{ + return lhs.state() == rhs.state(); +} + +template +inline bool +operator!=(const creator& lhs, const creator& rhs) +{ + return !(lhs == rhs); +} + +struct deleter { + template + void operator()(U ptr) const { + delete ptr; + } +}; + +int main() +{ + { + counters state = { }; + boost::shared_ptr pointer(new int(), deleter(), + creator(&state)); + BOOST_TEST(state.allocate == 1); + BOOST_TEST(state.construct == 0); + pointer.reset(); + BOOST_TEST(state.allocate == 0); + } + { + counters state = { }; + boost::shared_ptr pointer = + boost::allocate_shared(creator(&state)); + BOOST_TEST(state.allocate == 1); + BOOST_TEST(state.construct == 1); + pointer.reset(); + BOOST_TEST(state.allocate == 0); + BOOST_TEST(state.construct == 0); + } + { + counters state = { }; + boost::shared_ptr pointer = + boost::allocate_shared(creator(&state), 5); + BOOST_TEST(state.allocate == 1); + BOOST_TEST(state.construct == 5); + pointer.reset(); + BOOST_TEST(state.allocate == 0); + BOOST_TEST(state.construct == 0); + } + { + counters state = { }; + boost::shared_ptr pointer = + boost::allocate_shared(creator(&state)); + BOOST_TEST(state.allocate == 1); + BOOST_TEST(state.construct == 5); + pointer.reset(); + BOOST_TEST(state.allocate == 0); + BOOST_TEST(state.construct == 0); + } + return boost::report_errors(); +} +#else +int main() +{ + return 0; +} +#endif