From c0b72d97b3eccafa691ff34dfab2aa47653c57b0 Mon Sep 17 00:00:00 2001 From: Daniel James Date: Thu, 23 Feb 2017 20:14:27 +0000 Subject: [PATCH] Stricter about rebinding the allocator --- .../boost/unordered/detail/implementation.hpp | 6 +- include/boost/unordered/detail/map.hpp | 19 ++++-- include/boost/unordered/detail/set.hpp | 19 ++++-- include/boost/unordered/unordered_map.hpp | 12 ++-- include/boost/unordered/unordered_set.hpp | 12 ++-- test/objects/minimal.hpp | 68 +++++++++++++++++++ test/unordered/compile_map.cpp | 8 +-- test/unordered/compile_set.cpp | 4 +- 8 files changed, 113 insertions(+), 35 deletions(-) diff --git a/include/boost/unordered/detail/implementation.hpp b/include/boost/unordered/detail/implementation.hpp index d1d11977..4b669fd5 100644 --- a/include/boost/unordered/detail/implementation.hpp +++ b/include/boost/unordered/detail/implementation.hpp @@ -2484,10 +2484,10 @@ struct table : boost::unordered::detail::functions::type node_allocator; - typedef typename boost::unordered::detail::rebind_wrap::type bucket_allocator; typedef boost::unordered::detail::allocator_traits node_allocator_traits; diff --git a/include/boost/unordered/detail/map.hpp b/include/boost/unordered/detail/map.hpp index 15b18e71..5770e9ec 100644 --- a/include/boost/unordered/detail/map.hpp +++ b/include/boost/unordered/detail/map.hpp @@ -13,14 +13,17 @@ template struct map { typedef boost::unordered::detail::map types; - typedef A allocator; typedef std::pair value_type; typedef H hasher; typedef P key_equal; typedef K key_type; - typedef boost::unordered::detail::allocator_traits traits; - typedef boost::unordered::detail::pick_node pick; + typedef typename ::boost::unordered::detail::rebind_wrap::type value_allocator; + typedef boost::unordered::detail::allocator_traits + value_allocator_traits; + + typedef boost::unordered::detail::pick_node pick; typedef typename pick::node node; typedef typename pick::bucket bucket; typedef typename pick::link_pointer link_pointer; @@ -44,15 +47,17 @@ struct multimap { typedef boost::unordered::detail::multimap types; - typedef A allocator; typedef std::pair value_type; typedef H hasher; typedef P key_equal; typedef K key_type; - typedef boost::unordered::detail::allocator_traits traits; - typedef boost::unordered::detail::pick_grouped_node - pick; + typedef typename ::boost::unordered::detail::rebind_wrap::type value_allocator; + typedef boost::unordered::detail::allocator_traits + value_allocator_traits; + + typedef boost::unordered::detail::pick_grouped_node pick; typedef typename pick::node node; typedef typename pick::bucket bucket; typedef typename pick::link_pointer link_pointer; diff --git a/include/boost/unordered/detail/set.hpp b/include/boost/unordered/detail/set.hpp index 024cc259..2eb34207 100644 --- a/include/boost/unordered/detail/set.hpp +++ b/include/boost/unordered/detail/set.hpp @@ -13,14 +13,17 @@ template struct set { typedef boost::unordered::detail::set types; - typedef A allocator; typedef T value_type; typedef H hasher; typedef P key_equal; typedef T key_type; - typedef boost::unordered::detail::allocator_traits traits; - typedef boost::unordered::detail::pick_node pick; + typedef typename ::boost::unordered::detail::rebind_wrap::type value_allocator; + typedef boost::unordered::detail::allocator_traits + value_allocator_traits; + + typedef boost::unordered::detail::pick_node pick; typedef typename pick::node node; typedef typename pick::bucket bucket; typedef typename pick::link_pointer link_pointer; @@ -42,15 +45,17 @@ template struct multiset { typedef boost::unordered::detail::multiset types; - typedef A allocator; typedef T value_type; typedef H hasher; typedef P key_equal; typedef T key_type; - typedef boost::unordered::detail::allocator_traits traits; - typedef boost::unordered::detail::pick_grouped_node - pick; + typedef typename ::boost::unordered::detail::rebind_wrap::type value_allocator; + typedef boost::unordered::detail::allocator_traits + value_allocator_traits; + + typedef boost::unordered::detail::pick_grouped_node pick; typedef typename pick::node node; typedef typename pick::bucket bucket; typedef typename pick::link_pointer link_pointer; diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index 9200f95d..3b842d54 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -50,12 +50,12 @@ template class unordered_map private: typedef boost::unordered::detail::map types; - typedef typename types::traits allocator_traits; + typedef typename types::value_allocator_traits value_allocator_traits; typedef typename types::table table; public: - typedef typename allocator_traits::pointer pointer; - typedef typename allocator_traits::const_pointer const_pointer; + typedef typename value_allocator_traits::pointer pointer; + typedef typename value_allocator_traits::const_pointer const_pointer; typedef value_type& reference; typedef value_type const& const_reference; @@ -462,12 +462,12 @@ template class unordered_multimap private: typedef boost::unordered::detail::multimap types; - typedef typename types::traits allocator_traits; + typedef typename types::value_allocator_traits value_allocator_traits; typedef typename types::table table; public: - typedef typename allocator_traits::pointer pointer; - typedef typename allocator_traits::const_pointer const_pointer; + typedef typename value_allocator_traits::pointer pointer; + typedef typename value_allocator_traits::const_pointer const_pointer; typedef value_type& reference; typedef value_type const& const_reference; diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index 9137fbc1..513ded75 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -47,12 +47,12 @@ template class unordered_set private: typedef boost::unordered::detail::set types; - typedef typename types::traits allocator_traits; + typedef typename types::value_allocator_traits value_allocator_traits; typedef typename types::table table; public: - typedef typename allocator_traits::pointer pointer; - typedef typename allocator_traits::const_pointer const_pointer; + typedef typename value_allocator_traits::pointer pointer; + typedef typename value_allocator_traits::const_pointer const_pointer; typedef value_type& reference; typedef value_type const& const_reference; @@ -447,12 +447,12 @@ template class unordered_multiset private: typedef boost::unordered::detail::multiset types; - typedef typename types::traits allocator_traits; + typedef typename types::value_allocator_traits value_allocator_traits; typedef typename types::table table; public: - typedef typename allocator_traits::pointer pointer; - typedef typename allocator_traits::const_pointer const_pointer; + typedef typename value_allocator_traits::pointer pointer; + typedef typename value_allocator_traits::const_pointer const_pointer; typedef value_type& reference; typedef value_type const& const_reference; diff --git a/test/objects/minimal.hpp b/test/objects/minimal.hpp index 818560a6..c1fa5b4f 100644 --- a/test/objects/minimal.hpp +++ b/test/objects/minimal.hpp @@ -441,6 +441,74 @@ template class allocator #endif }; +template class allocator +{ + public: + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef void_ptr void_pointer; + typedef void_const_ptr const_void_pointer; + // Maybe these two should be const_ptr + typedef ptr pointer; + typedef const_ptr const_pointer; + typedef T const& reference; + typedef T const& const_reference; + typedef T const value_type; + + template struct rebind + { + typedef allocator other; + }; + + allocator() {} + template allocator(allocator const&) {} + allocator(allocator const&) {} + ~allocator() {} + + const_pointer address(const_reference r) { return const_pointer(&r); } + + pointer allocate(size_type n) + { + return pointer(static_cast(::operator new(n * sizeof(T)))); + } + + template pointer allocate(size_type n, const_ptr) + { + return pointer(static_cast(::operator new(n * sizeof(T)))); + } + + void deallocate(pointer p, size_type) { ::operator delete((void*)p.ptr_); } + + void construct(T const* p, T const& t) { new ((void*)p) T(t); } + +#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + template + void construct(T const* p, BOOST_FWD_REF(Args)... args) + { + new ((void*)p) T(boost::forward(args)...); + } +#endif + + void destroy(T const* p) { p->~T(); } + + size_type max_size() const { return 1000; } + +#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) || \ + BOOST_WORKAROUND(BOOST_MSVC, <= 1300) + public: + allocator& operator=(allocator const&) { return *this; } +#else + private: + allocator& operator=(allocator const&); +#endif +#if BOOST_UNORDERED_CHECK_ADDR_OPERATOR_NOT_USED + ampersand_operator_used operator&() const + { + return ampersand_operator_used(); + } +#endif +}; + template inline bool operator==(allocator const&, allocator const&) { diff --git a/test/unordered/compile_map.cpp b/test/unordered/compile_map.cpp index b149ad24..7db54e44 100644 --- a/test/unordered/compile_map.cpp +++ b/test/unordered/compile_map.cpp @@ -20,19 +20,19 @@ // Explicit instantiation to catch compile-time errors template class boost::unordered_map, - std::equal_to, test::minimal::allocator > >; + std::equal_to, test::minimal::allocator >; template class boost::unordered_multimap, - std::equal_to, test::minimal::allocator > >; + std::equal_to, test::minimal::allocator >; template class boost::unordered_map, test::minimal::equal_to, - test::minimal::allocator >; + test::minimal::allocator >; template class boost::unordered_multimap, test::minimal::equal_to, - test::minimal::allocator >; + test::minimal::allocator >; UNORDERED_AUTO_TEST(test0) { diff --git a/test/unordered/compile_set.cpp b/test/unordered/compile_set.cpp index 60f0f80f..78e8d7a0 100644 --- a/test/unordered/compile_set.cpp +++ b/test/unordered/compile_set.cpp @@ -27,11 +27,11 @@ template class boost::unordered_multiset, template class boost::unordered_set, test::minimal::equal_to, - test::minimal::allocator >; + test::minimal::allocator >; template class boost::unordered_multiset, test::minimal::equal_to, - test::minimal::allocator >; + test::minimal::allocator >; UNORDERED_AUTO_TEST(test0) {