mirror of
https://github.com/boostorg/container.git
synced 2025-08-02 14:04:26 +02:00
Use boost::adl_move_swap instead of custom swap or std::swap for performance and compatibility reasons.
This commit is contained in:
@@ -35,6 +35,7 @@
|
|||||||
#include <boost/type_traits/has_nothrow_assign.hpp>
|
#include <boost/type_traits/has_nothrow_assign.hpp>
|
||||||
#include <boost/move/utility_core.hpp>
|
#include <boost/move/utility_core.hpp>
|
||||||
#include <boost/move/iterator.hpp>
|
#include <boost/move/iterator.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
#include <boost/move/algorithm.hpp>
|
#include <boost/move/algorithm.hpp>
|
||||||
#include <boost/move/detail/move_helpers.hpp>
|
#include <boost/move/detail/move_helpers.hpp>
|
||||||
#include <boost/move/traits.hpp>
|
#include <boost/move/traits.hpp>
|
||||||
@@ -355,10 +356,10 @@ class deque_base
|
|||||||
|
|
||||||
void swap_members(deque_base &x) BOOST_CONTAINER_NOEXCEPT
|
void swap_members(deque_base &x) BOOST_CONTAINER_NOEXCEPT
|
||||||
{
|
{
|
||||||
::boost::container::swap_dispatch(this->members_.m_start, x.members_.m_start);
|
::boost::adl_move_swap(this->members_.m_start, x.members_.m_start);
|
||||||
::boost::container::swap_dispatch(this->members_.m_finish, x.members_.m_finish);
|
::boost::adl_move_swap(this->members_.m_finish, x.members_.m_finish);
|
||||||
::boost::container::swap_dispatch(this->members_.m_map, x.members_.m_map);
|
::boost::adl_move_swap(this->members_.m_map, x.members_.m_map);
|
||||||
::boost::container::swap_dispatch(this->members_.m_map_size, x.members_.m_map_size);
|
::boost::adl_move_swap(this->members_.m_map_size, x.members_.m_map_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void priv_initialize_map(size_type num_elements)
|
void priv_initialize_map(size_type num_elements)
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <boost/aligned_storage.hpp>
|
#include <boost/aligned_storage.hpp>
|
||||||
#include <boost/move/make_unique.hpp>
|
#include <boost/move/make_unique.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
|
|
||||||
#include <utility> //std::pair
|
#include <utility> //std::pair
|
||||||
|
|
||||||
@@ -159,7 +160,7 @@ class flat_tree
|
|||||||
void swap(Data &d)
|
void swap(Data &d)
|
||||||
{
|
{
|
||||||
value_compare& mycomp = *this, & othercomp = d;
|
value_compare& mycomp = *this, & othercomp = d;
|
||||||
boost::container::swap_dispatch(mycomp, othercomp);
|
boost::adl_move_swap(mycomp, othercomp);
|
||||||
this->m_vect.swap(d.m_vect);
|
this->m_vect.swap(d.m_vect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -57,12 +57,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include BOOST_PP_ITERATE()
|
#include BOOST_PP_ITERATE()
|
||||||
|
|
||||||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_FUNCNAME swap
|
|
||||||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_BEGIN namespace boost { namespace container { namespace container_detail {
|
|
||||||
#define BOOST_INTRUSIVE_HAS_MEMBER_FUNCTION_CALLABLE_WITH_NS_END }}}
|
|
||||||
#define BOOST_PP_ITERATION_PARAMS_1 (3, (1, 1, <boost/intrusive/detail/has_member_function_callable_with.hpp>))
|
|
||||||
#include BOOST_PP_ITERATE()
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace container {
|
namespace container {
|
||||||
namespace container_detail {
|
namespace container_detail {
|
||||||
|
@@ -40,10 +40,10 @@
|
|||||||
#include <boost/container/detail/type_traits.hpp>
|
#include <boost/container/detail/type_traits.hpp>
|
||||||
#include <boost/container/allocator_traits.hpp>
|
#include <boost/container/allocator_traits.hpp>
|
||||||
#include <boost/core/no_exceptions_support.hpp>
|
#include <boost/core/no_exceptions_support.hpp>
|
||||||
#include <boost/container/detail/memory_util.hpp>
|
|
||||||
#include <boost/intrusive/pointer_traits.hpp>
|
#include <boost/intrusive/pointer_traits.hpp>
|
||||||
#include <boost/aligned_storage.hpp>
|
#include <boost/aligned_storage.hpp>
|
||||||
|
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace container {
|
namespace container {
|
||||||
@@ -54,51 +54,6 @@ namespace container {
|
|||||||
//
|
//
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
namespace container_swap {
|
|
||||||
|
|
||||||
template<class T, bool IsClass = boost::is_class<T>::value >
|
|
||||||
struct has_member_swap
|
|
||||||
{
|
|
||||||
static const bool value = boost::container::container_detail::
|
|
||||||
has_member_function_callable_with_swap<T, T &>::value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
struct has_member_swap<T, false>
|
|
||||||
{
|
|
||||||
static const bool value = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
} //namespace container_swap {
|
|
||||||
|
|
||||||
template<class T> inline
|
|
||||||
typename container_detail::enable_if_c
|
|
||||||
<container_swap::has_member_swap<T>::value, void>::type
|
|
||||||
swap_dispatch(T &left, T &right) //swap using member swap
|
|
||||||
{
|
|
||||||
left.swap(right); // may throw
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T> inline
|
|
||||||
typename container_detail::enable_if_c
|
|
||||||
<!container_swap::has_member_swap<T>::value/* && boost::has_move_emulation_enabled<T>::value*/, void>::type
|
|
||||||
swap_dispatch(T &left, T &right)
|
|
||||||
{
|
|
||||||
T temp(boost::move(left)); // may throw
|
|
||||||
left = boost::move(right); // may throw
|
|
||||||
right = boost::move(temp); // may throw
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
template<class T> inline
|
|
||||||
typename container_detail::enable_if_c
|
|
||||||
<!container_swap::has_member_swap<T>::value && !boost::has_move_emulation_enabled<T>::value, void>::type
|
|
||||||
swap_dispatch(T &left, T &right)
|
|
||||||
{
|
|
||||||
using std::swap;
|
|
||||||
swap(left, right); // may throw
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace container_detail {
|
namespace container_detail {
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@@ -194,7 +149,7 @@ inline void swap_alloc(AllocatorType &, AllocatorType &, container_detail::false
|
|||||||
|
|
||||||
template<class AllocatorType>
|
template<class AllocatorType>
|
||||||
inline void swap_alloc(AllocatorType &l, AllocatorType &r, container_detail::true_type)
|
inline void swap_alloc(AllocatorType &l, AllocatorType &r, container_detail::true_type)
|
||||||
{ boost::container::swap_dispatch(l, r); }
|
{ boost::adl_move_swap(l, r); }
|
||||||
|
|
||||||
template<class AllocatorType>
|
template<class AllocatorType>
|
||||||
inline void assign_alloc(AllocatorType &, const AllocatorType &, container_detail::false_type)
|
inline void assign_alloc(AllocatorType &, const AllocatorType &, container_detail::false_type)
|
||||||
@@ -1102,7 +1057,7 @@ inline typename container_detail::disable_if_memtransfer_copy_assignable<F, G, v
|
|||||||
{
|
{
|
||||||
typename allocator_traits<A>::size_type n = 0;
|
typename allocator_traits<A>::size_type n = 0;
|
||||||
for (; n != n_i ; ++short_range_f, ++large_range_f, ++n){
|
for (; n != n_i ; ++short_range_f, ++large_range_f, ++n){
|
||||||
boost::container::swap_dispatch(*short_range_f, *large_range_f);
|
boost::adl_move_swap(*short_range_f, *large_range_f);
|
||||||
}
|
}
|
||||||
boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f); // may throw
|
boost::container::uninitialized_move_alloc_n(a, large_range_f, n_j - n_i, short_range_f); // may throw
|
||||||
boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
|
boost::container::destroy_alloc_n(a, large_range_f, n_j - n_i);
|
||||||
|
@@ -32,6 +32,7 @@
|
|||||||
#include <boost/container/detail/pair.hpp>
|
#include <boost/container/detail/pair.hpp>
|
||||||
#include <boost/move/utility_core.hpp>
|
#include <boost/move/utility_core.hpp>
|
||||||
#include <boost/core/no_exceptions_support.hpp>
|
#include <boost/core/no_exceptions_support.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
|
|
||||||
namespace boost { namespace container {
|
namespace boost { namespace container {
|
||||||
|
|
||||||
@@ -668,8 +669,8 @@ class scoped_allocator_adaptor_base
|
|||||||
|
|
||||||
void swap(scoped_allocator_adaptor_base &r)
|
void swap(scoped_allocator_adaptor_base &r)
|
||||||
{
|
{
|
||||||
boost::container::swap_dispatch(this->outer_allocator(), r.outer_allocator());
|
boost::adl_move_swap(this->outer_allocator(), r.outer_allocator());
|
||||||
boost::container::swap_dispatch(this->m_inner, r.inner_allocator());
|
boost::adl_move_swap(this->m_inner, r.inner_allocator());
|
||||||
}
|
}
|
||||||
|
|
||||||
friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r)
|
friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r)
|
||||||
@@ -839,8 +840,8 @@ class scoped_allocator_adaptor_base<OuterAlloc, true
|
|||||||
\
|
\
|
||||||
void swap(scoped_allocator_adaptor_base &r) \
|
void swap(scoped_allocator_adaptor_base &r) \
|
||||||
{ \
|
{ \
|
||||||
boost::container::swap_dispatch(this->outer_allocator(), r.outer_allocator()); \
|
boost::adl_move_swap(this->outer_allocator(), r.outer_allocator()); \
|
||||||
boost::container::swap_dispatch(this->m_inner, r.inner_allocator()); \
|
boost::adl_move_swap(this->m_inner, r.inner_allocator()); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r) \
|
friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r) \
|
||||||
@@ -976,7 +977,7 @@ class scoped_allocator_adaptor_base
|
|||||||
|
|
||||||
void swap(scoped_allocator_adaptor_base &r)
|
void swap(scoped_allocator_adaptor_base &r)
|
||||||
{
|
{
|
||||||
boost::container::swap_dispatch(this->outer_allocator(), r.outer_allocator());
|
boost::adl_move_swap(this->outer_allocator(), r.outer_allocator());
|
||||||
}
|
}
|
||||||
|
|
||||||
friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r)
|
friend void swap(scoped_allocator_adaptor_base &l, scoped_allocator_adaptor_base &r)
|
||||||
|
@@ -43,6 +43,7 @@
|
|||||||
#include <boost/move/iterator.hpp>
|
#include <boost/move/iterator.hpp>
|
||||||
#include <boost/move/detail/move_helpers.hpp>
|
#include <boost/move/detail/move_helpers.hpp>
|
||||||
#include <boost/container/detail/placement_new.hpp>
|
#include <boost/container/detail/placement_new.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
|
|
||||||
|
|
||||||
#include <utility> //std::pair
|
#include <utility> //std::pair
|
||||||
@@ -1911,7 +1912,7 @@ class stable_vector
|
|||||||
|
|
||||||
void priv_swap_members(stable_vector &x)
|
void priv_swap_members(stable_vector &x)
|
||||||
{
|
{
|
||||||
boost::container::swap_dispatch(this->internal_data.pool_size, x.internal_data.pool_size);
|
boost::adl_move_swap(this->internal_data.pool_size, x.internal_data.pool_size);
|
||||||
index_traits_type::readjust_end_node(this->index, this->internal_data.end_node);
|
index_traits_type::readjust_end_node(this->index, this->internal_data.end_node);
|
||||||
index_traits_type::readjust_end_node(x.index, x.internal_data.end_node);
|
index_traits_type::readjust_end_node(x.index, x.internal_data.end_node);
|
||||||
}
|
}
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
#include <boost/container/detail/mpl.hpp>
|
#include <boost/container/detail/mpl.hpp>
|
||||||
#include <boost/container/detail/iterator.hpp>
|
#include <boost/container/detail/iterator.hpp>
|
||||||
#include <boost/move/utility_core.hpp>
|
#include <boost/move/utility_core.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
#include <boost/static_assert.hpp>
|
#include <boost/static_assert.hpp>
|
||||||
#include <boost/functional/hash.hpp>
|
#include <boost/functional/hash.hpp>
|
||||||
#include <boost/intrusive/pointer_traits.hpp>
|
#include <boost/intrusive/pointer_traits.hpp>
|
||||||
@@ -433,7 +434,7 @@ class basic_string_base
|
|||||||
this->members_.m_repr.short_repr() = short_backup;
|
this->members_.m_repr.short_repr() = short_backup;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
boost::container::swap_dispatch(this->members_.m_repr.long_repr(), other.members_.m_repr.long_repr());
|
boost::adl_move_swap(this->members_.m_repr.long_repr(), other.members_.m_repr.long_repr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
#include <boost/move/algorithm.hpp>
|
#include <boost/move/algorithm.hpp>
|
||||||
#include <boost/move/detail/move_helpers.hpp>
|
#include <boost/move/detail/move_helpers.hpp>
|
||||||
#include <boost/move/traits.hpp>
|
#include <boost/move/traits.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
|
|
||||||
#include <boost/container/detail/version_type.hpp>
|
#include <boost/container/detail/version_type.hpp>
|
||||||
#include <boost/container/detail/allocation_type.hpp>
|
#include <boost/container/detail/allocation_type.hpp>
|
||||||
@@ -363,9 +364,9 @@ struct vector_alloc_holder
|
|||||||
|
|
||||||
void swap(vector_alloc_holder &x) BOOST_CONTAINER_NOEXCEPT
|
void swap(vector_alloc_holder &x) BOOST_CONTAINER_NOEXCEPT
|
||||||
{
|
{
|
||||||
boost::container::swap_dispatch(this->m_start, x.m_start);
|
boost::adl_move_swap(this->m_start, x.m_start);
|
||||||
boost::container::swap_dispatch(this->m_size, x.m_size);
|
boost::adl_move_swap(this->m_size, x.m_size);
|
||||||
boost::container::swap_dispatch(this->m_capacity, x.m_capacity);
|
boost::adl_move_swap(this->m_capacity, x.m_capacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
void move_from_empty(vector_alloc_holder &x) BOOST_CONTAINER_NOEXCEPT
|
void move_from_empty(vector_alloc_holder &x) BOOST_CONTAINER_NOEXCEPT
|
||||||
@@ -515,7 +516,7 @@ struct vector_alloc_holder<Allocator, container_detail::integral_constant<unsign
|
|||||||
else{
|
else{
|
||||||
boost::container::deep_swap_alloc_n<MaxTmpStorage>(this->alloc(), first_x, x.m_size, first_this, this->m_size);
|
boost::container::deep_swap_alloc_n<MaxTmpStorage>(this->alloc(), first_x, x.m_size, first_this, this->m_size);
|
||||||
}
|
}
|
||||||
boost::container::swap_dispatch(this->m_size, x.m_size);
|
boost::adl_move_swap(this->m_size, x.m_size);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -28,6 +28,7 @@
|
|||||||
#include <boost/container/detail/multiallocation_chain.hpp>
|
#include <boost/container/detail/multiallocation_chain.hpp>
|
||||||
#include <boost/container/throw_exception.hpp>
|
#include <boost/container/throw_exception.hpp>
|
||||||
#include <boost/move/utility_core.hpp>
|
#include <boost/move/utility_core.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
@@ -314,12 +315,12 @@ class propagation_test_allocator
|
|||||||
void swap(propagation_test_allocator &r)
|
void swap(propagation_test_allocator &r)
|
||||||
{
|
{
|
||||||
++this->swaps_; ++r.swaps_;
|
++this->swaps_; ++r.swaps_;
|
||||||
boost::container::swap_dispatch(this->id_, r.id_);
|
boost::adl_move_swap(this->id_, r.id_);
|
||||||
boost::container::swap_dispatch(this->ctr_copies_, r.ctr_copies_);
|
boost::adl_move_swap(this->ctr_copies_, r.ctr_copies_);
|
||||||
boost::container::swap_dispatch(this->ctr_moves_, r.ctr_moves_);
|
boost::adl_move_swap(this->ctr_moves_, r.ctr_moves_);
|
||||||
boost::container::swap_dispatch(this->assign_copies_, r.assign_copies_);
|
boost::adl_move_swap(this->assign_copies_, r.assign_copies_);
|
||||||
boost::container::swap_dispatch(this->assign_moves_, r.assign_moves_);
|
boost::adl_move_swap(this->assign_moves_, r.assign_moves_);
|
||||||
boost::container::swap_dispatch(this->swaps_, r.swaps_);
|
boost::adl_move_swap(this->swaps_, r.swaps_);
|
||||||
}
|
}
|
||||||
|
|
||||||
friend void swap(propagation_test_allocator &l, propagation_test_allocator &r)
|
friend void swap(propagation_test_allocator &l, propagation_test_allocator &r)
|
||||||
|
@@ -24,6 +24,7 @@
|
|||||||
#include <boost/assert.hpp>
|
#include <boost/assert.hpp>
|
||||||
#include <boost/container/detail/utilities.hpp>
|
#include <boost/container/detail/utilities.hpp>
|
||||||
#include <boost/container/detail/version_type.hpp>
|
#include <boost/container/detail/version_type.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
@@ -109,9 +110,9 @@ class expand_bwd_test_allocator
|
|||||||
|
|
||||||
friend void swap(self_t &alloc1, self_t &alloc2)
|
friend void swap(self_t &alloc1, self_t &alloc2)
|
||||||
{
|
{
|
||||||
boost::container::swap_dispatch(alloc1.mp_buffer, alloc2.mp_buffer);
|
boost::adl_move_swap(alloc1.mp_buffer, alloc2.mp_buffer);
|
||||||
boost::container::swap_dispatch(alloc1.m_size, alloc2.m_size);
|
boost::adl_move_swap(alloc1.m_size, alloc2.m_size);
|
||||||
boost::container::swap_dispatch(alloc1.m_offset, alloc2.m_offset);
|
boost::adl_move_swap(alloc1.m_offset, alloc2.m_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Experimental version 2 expand_bwd_test_allocator functions
|
//Experimental version 2 expand_bwd_test_allocator functions
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <boost/container/detail/mpl.hpp>
|
#include <boost/container/detail/mpl.hpp>
|
||||||
#include <boost/move/utility_core.hpp>
|
#include <boost/move/utility_core.hpp>
|
||||||
|
#include <boost/move/adl_move_swap.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
using namespace boost::container;
|
using namespace boost::container;
|
||||||
@@ -475,8 +476,8 @@ int main()
|
|||||||
{
|
{
|
||||||
Scoped0Inner s0i2;
|
Scoped0Inner s0i2;
|
||||||
Scoped1Inner s1i2;
|
Scoped1Inner s1i2;
|
||||||
boost::container::swap_dispatch(s0i, s0i2);
|
boost::adl_move_swap(s0i, s0i2);
|
||||||
boost::container::swap_dispatch(s1i, s1i2);
|
boost::adl_move_swap(s1i, s1i2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user