Remove calls to const_cast_pointer

It was needed because std::allocator_traits::construct doesn't work with
a const pointer (e.g. pointer to the first member of a std::pair). But
now we're only calling construct if BOOST_UNORDERED_CXX11_CONSTRUCTION
is true, so the allocator_traits::construct is no longer used here.
This commit is contained in:
Daniel James
2017-04-18 10:14:26 +01:00
parent c333a7f9fc
commit 7de8c91301

View File

@ -485,17 +485,6 @@ struct convert_from_anything
template <typename T> convert_from_anything(T const&); template <typename T> convert_from_anything(T const&);
}; };
namespace func {
// This is a bit nasty, when constructing the individual members
// of a std::pair, need to cast away 'const'. For modern compilers,
// should be able to use std::piecewise_construct instead.
template <typename T> T* const_cast_pointer(T* x) { return x; }
template <typename T> T* const_cast_pointer(T const* x)
{
return const_cast<T*>(x);
}
}
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// emplace_args // emplace_args
// //
@ -1524,21 +1513,16 @@ inline typename enable_if<use_piecewise<A0>, void>::type construct_from_args(
BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2) BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2)
{ {
boost::unordered::detail::func::construct_from_tuple( boost::unordered::detail::func::construct_from_tuple(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(address->first), boost::forward<A1>(a1));
boost::addressof(address->first)),
boost::forward<A1>(a1));
BOOST_TRY BOOST_TRY
{ {
boost::unordered::detail::func::construct_from_tuple( boost::unordered::detail::func::construct_from_tuple(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(address->second), boost::forward<A2>(a2));
boost::addressof(address->second)),
boost::forward<A2>(a2));
} }
BOOST_CATCH(...) BOOST_CATCH(...)
{ {
boost::unordered::detail::func::call_destroy( boost::unordered::detail::func::call_destroy(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(address->first));
boost::addressof(address->first)));
BOOST_RETHROW; BOOST_RETHROW;
} }
BOOST_CATCH_END BOOST_CATCH_END
@ -1602,21 +1586,16 @@ inline void construct_from_args(Alloc& alloc, std::pair<A, B>* address,
typename enable_if<use_piecewise<A0>, void*>::type = 0) typename enable_if<use_piecewise<A0>, void*>::type = 0)
{ {
boost::unordered::detail::func::construct_from_tuple( boost::unordered::detail::func::construct_from_tuple(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(address->first), args.a1);
boost::addressof(address->first)),
args.a1);
BOOST_TRY BOOST_TRY
{ {
boost::unordered::detail::func::construct_from_tuple( boost::unordered::detail::func::construct_from_tuple(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(address->second), args.a2);
boost::addressof(address->second)),
args.a2);
} }
BOOST_CATCH(...) BOOST_CATCH(...)
{ {
boost::unordered::detail::func::call_destroy( boost::unordered::detail::func::call_destroy(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(address->first));
boost::addressof(address->first)));
BOOST_RETHROW; BOOST_RETHROW;
} }
BOOST_CATCH_END BOOST_CATCH_END
@ -1816,21 +1795,17 @@ construct_node_pair(Alloc& alloc, BOOST_FWD_REF(Key) k)
{ {
node_constructor<Alloc> a(alloc); node_constructor<Alloc> a(alloc);
a.create_node(); a.create_node();
boost::unordered::detail::func::call_construct( boost::unordered::detail::func::call_construct(alloc,
alloc, boost::unordered::detail::func::const_cast_pointer( boost::addressof(a.node_->value_ptr()->first), boost::forward<Key>(k));
boost::addressof(a.node_->value_ptr()->first)),
boost::forward<Key>(k));
BOOST_TRY BOOST_TRY
{ {
boost::unordered::detail::func::call_construct( boost::unordered::detail::func::call_construct(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(a.node_->value_ptr()->second));
boost::addressof(a.node_->value_ptr()->second)));
} }
BOOST_CATCH(...) BOOST_CATCH(...)
{ {
boost::unordered::detail::func::call_destroy( boost::unordered::detail::func::call_destroy(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(a.node_->value_ptr()->first));
boost::addressof(a.node_->value_ptr()->first)));
BOOST_RETHROW; BOOST_RETHROW;
} }
BOOST_CATCH_END BOOST_CATCH_END
@ -1843,22 +1818,18 @@ construct_node_pair(Alloc& alloc, BOOST_FWD_REF(Key) k, BOOST_FWD_REF(Mapped) m)
{ {
node_constructor<Alloc> a(alloc); node_constructor<Alloc> a(alloc);
a.create_node(); a.create_node();
boost::unordered::detail::func::call_construct( boost::unordered::detail::func::call_construct(alloc,
alloc, boost::unordered::detail::func::const_cast_pointer( boost::addressof(a.node_->value_ptr()->first), boost::forward<Key>(k));
boost::addressof(a.node_->value_ptr()->first)),
boost::forward<Key>(k));
BOOST_TRY BOOST_TRY
{ {
boost::unordered::detail::func::call_construct( boost::unordered::detail::func::call_construct(alloc,
alloc, boost::unordered::detail::func::const_cast_pointer( boost::addressof(a.node_->value_ptr()->second),
boost::addressof(a.node_->value_ptr()->second)),
boost::forward<Mapped>(m)); boost::forward<Mapped>(m));
} }
BOOST_CATCH(...) BOOST_CATCH(...)
{ {
boost::unordered::detail::func::call_destroy( boost::unordered::detail::func::call_destroy(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(a.node_->value_ptr()->first));
boost::addressof(a.node_->value_ptr()->first)));
BOOST_RETHROW; BOOST_RETHROW;
} }
BOOST_CATCH_END BOOST_CATCH_END
@ -1872,22 +1843,18 @@ construct_node_pair_from_args(
{ {
node_constructor<Alloc> a(alloc); node_constructor<Alloc> a(alloc);
a.create_node(); a.create_node();
boost::unordered::detail::func::call_construct( boost::unordered::detail::func::call_construct(alloc,
alloc, boost::unordered::detail::func::const_cast_pointer( boost::addressof(a.node_->value_ptr()->first), boost::forward<Key>(k));
boost::addressof(a.node_->value_ptr()->first)),
boost::forward<Key>(k));
BOOST_TRY BOOST_TRY
{ {
boost::unordered::detail::func::construct_from_args( boost::unordered::detail::func::construct_from_args(alloc,
alloc, boost::unordered::detail::func::const_cast_pointer( boost::addressof(a.node_->value_ptr()->second),
boost::addressof(a.node_->value_ptr()->second)),
BOOST_UNORDERED_EMPLACE_FORWARD); BOOST_UNORDERED_EMPLACE_FORWARD);
} }
BOOST_CATCH(...) BOOST_CATCH(...)
{ {
boost::unordered::detail::func::call_destroy( boost::unordered::detail::func::call_destroy(
alloc, boost::unordered::detail::func::const_cast_pointer( alloc, boost::addressof(a.node_->value_ptr()->first));
boost::addressof(a.node_->value_ptr()->first)));
BOOST_RETHROW; BOOST_RETHROW;
} }
BOOST_CATCH_END BOOST_CATCH_END