forked from boostorg/container
* Implemented merge operations for associative containers.
* Update tree-based containers to changes done in Intrusive internal utilities in order to fix Trac 12432.
This commit is contained in:
@@ -59,22 +59,22 @@ namespace container {
|
||||
//! \tparam Key is the type to be inserted in the set, which is also the key_type
|
||||
//! \tparam Compare is the comparison functor used to order keys
|
||||
//! \tparam Allocator is the allocator to be used to allocate memory for this container
|
||||
//! \tparam SetOptions is an packed option type generated using using boost::container::tree_assoc_options.
|
||||
template <class Key, class Compare = std::less<Key>, class Allocator = new_allocator<Key>, class SetOptions = tree_assoc_defaults >
|
||||
//! \tparam Options is an packed option type generated using using boost::container::tree_assoc_options.
|
||||
template <class Key, class Compare = std::less<Key>, class Allocator = new_allocator<Key>, class Options = tree_assoc_defaults >
|
||||
#else
|
||||
template <class Key, class Compare, class Allocator, class SetOptions>
|
||||
template <class Key, class Compare, class Allocator, class Options>
|
||||
#endif
|
||||
class set
|
||||
///@cond
|
||||
: public container_detail::tree
|
||||
< Key, Key, container_detail::identity<Key>, Compare, Allocator, SetOptions>
|
||||
< Key, container_detail::identity<Key>, Compare, Allocator, Options>
|
||||
///@endcond
|
||||
{
|
||||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
||||
private:
|
||||
BOOST_COPYABLE_AND_MOVABLE(set)
|
||||
typedef container_detail::tree
|
||||
< Key, Key, container_detail::identity<Key>, Compare, Allocator, SetOptions> base_t;
|
||||
< Key, container_detail::identity<Key>, Compare, Allocator, Options> base_t;
|
||||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
||||
|
||||
public:
|
||||
@@ -533,6 +533,34 @@ class set
|
||||
insert_return_type insert(const_iterator hint, BOOST_RV_REF_BEG_IF_CXX11 node_type BOOST_RV_REF_END_IF_CXX11 nh)
|
||||
{ return this->base_t::insert_unique_node(hint, boost::move(nh)); }
|
||||
|
||||
//! @copydoc ::boost::container::map::merge(map<Key, T, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(set<Key, C2, Allocator, Options>& source)
|
||||
{
|
||||
typedef container_detail::tree
|
||||
<Key, container_detail::identity<Key>, C2, Allocator, Options> base2_t;
|
||||
this->base_t::merge_unique(static_cast<base2_t&>(source));
|
||||
}
|
||||
|
||||
//! @copydoc ::boost::container::set::merge(set<Key, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(BOOST_RV_REF_BEG set<Key, C2, Allocator, Options> BOOST_RV_REF_END source)
|
||||
{ return this->merge(static_cast<set<Key, C2, Allocator, Options>&>(source)); }
|
||||
|
||||
//! @copydoc ::boost::container::map::merge(multimap<Key, T, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(multiset<Key, C2, Allocator, Options>& source)
|
||||
{
|
||||
typedef container_detail::tree
|
||||
<Key, container_detail::identity<Key>, C2, Allocator, Options> base2_t;
|
||||
this->base_t::merge_unique(static_cast<base2_t&>(source));
|
||||
}
|
||||
|
||||
//! @copydoc ::boost::container::set::merge(multiset<Key, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(BOOST_RV_REF_BEG multiset<Key, C2, Allocator, Options> BOOST_RV_REF_END source)
|
||||
{ return this->merge(static_cast<multiset<Key, C2, Allocator, Options>&>(source)); }
|
||||
|
||||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
||||
|
||||
//! <b>Effects</b>: Erases the element pointed to by p.
|
||||
@@ -724,8 +752,8 @@ class set
|
||||
|
||||
//!has_trivial_destructor_after_move<> == true_type
|
||||
//!specialization for optimizations
|
||||
template <class Key, class Compare, class SetOptions, class Allocator>
|
||||
struct has_trivial_destructor_after_move<boost::container::set<Key, Compare, Allocator, SetOptions> >
|
||||
template <class Key, class Compare, class Options, class Allocator>
|
||||
struct has_trivial_destructor_after_move<boost::container::set<Key, Compare, Allocator, Options> >
|
||||
{
|
||||
typedef typename ::boost::container::allocator_traits<Allocator>::pointer pointer;
|
||||
static const bool value = ::boost::has_trivial_destructor_after_move<Allocator>::value &&
|
||||
@@ -750,22 +778,22 @@ namespace container {
|
||||
//! \tparam Key is the type to be inserted in the set, which is also the key_type
|
||||
//! \tparam Compare is the comparison functor used to order keys
|
||||
//! \tparam Allocator is the allocator to be used to allocate memory for this container
|
||||
//! \tparam MultiSetOptions is an packed option type generated using using boost::container::tree_assoc_options.
|
||||
template <class Key, class Compare = std::less<Key>, class Allocator = new_allocator<Key>, class MultiSetOptions = tree_assoc_defaults >
|
||||
//! \tparam Options is an packed option type generated using using boost::container::tree_assoc_options.
|
||||
template <class Key, class Compare = std::less<Key>, class Allocator = new_allocator<Key>, class Options = tree_assoc_defaults >
|
||||
#else
|
||||
template <class Key, class Compare, class Allocator, class MultiSetOptions>
|
||||
template <class Key, class Compare, class Allocator, class Options>
|
||||
#endif
|
||||
class multiset
|
||||
/// @cond
|
||||
: public container_detail::tree
|
||||
<Key, Key,container_detail::identity<Key>, Compare, Allocator, MultiSetOptions>
|
||||
<Key,container_detail::identity<Key>, Compare, Allocator, Options>
|
||||
/// @endcond
|
||||
{
|
||||
#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
||||
private:
|
||||
BOOST_COPYABLE_AND_MOVABLE(multiset)
|
||||
typedef container_detail::tree
|
||||
<Key, Key,container_detail::identity<Key>, Compare, Allocator, MultiSetOptions> base_t;
|
||||
<Key,container_detail::identity<Key>, Compare, Allocator, Options> base_t;
|
||||
#endif //#ifndef BOOST_CONTAINER_DOXYGEN_INVOKED
|
||||
|
||||
public:
|
||||
@@ -1068,6 +1096,34 @@ class multiset
|
||||
iterator insert(const_iterator hint, BOOST_RV_REF_BEG_IF_CXX11 node_type BOOST_RV_REF_END_IF_CXX11 nh)
|
||||
{ return this->base_t::insert_equal_node(hint, boost::move(nh)); }
|
||||
|
||||
//! @copydoc ::boost::container::multimap::merge(multimap<Key, T, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(multiset<Key, C2, Allocator, Options>& source)
|
||||
{
|
||||
typedef container_detail::tree
|
||||
<Key, container_detail::identity<Key>, C2, Allocator, Options> base2_t;
|
||||
this->base_t::merge_equal(static_cast<base2_t&>(source));
|
||||
}
|
||||
|
||||
//! @copydoc ::boost::container::multiset::merge(multiset<Key, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(BOOST_RV_REF_BEG multiset<Key, C2, Allocator, Options> BOOST_RV_REF_END source)
|
||||
{ return this->merge(static_cast<multiset<Key, C2, Allocator, Options>&>(source)); }
|
||||
|
||||
//! @copydoc ::boost::container::multimap::merge(map<Key, T, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(set<Key, C2, Allocator, Options>& source)
|
||||
{
|
||||
typedef container_detail::tree
|
||||
<Key, container_detail::identity<Key>, C2, Allocator, Options> base2_t;
|
||||
this->base_t::merge_equal(static_cast<base2_t&>(source));
|
||||
}
|
||||
|
||||
//! @copydoc ::boost::container::multiset::merge(set<Key, C2, Allocator, Options>&)
|
||||
template<class C2>
|
||||
BOOST_CONTAINER_FORCEINLINE void merge(BOOST_RV_REF_BEG set<Key, C2, Allocator, Options> BOOST_RV_REF_END source)
|
||||
{ return this->merge(static_cast<set<Key, C2, Allocator, Options>&>(source)); }
|
||||
|
||||
#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
||||
|
||||
//! @copydoc ::boost::container::set::erase(const_iterator)
|
||||
@@ -1179,8 +1235,8 @@ class multiset
|
||||
|
||||
//!has_trivial_destructor_after_move<> == true_type
|
||||
//!specialization for optimizations
|
||||
template <class Key, class Compare, class Allocator, class MultiSetOptions>
|
||||
struct has_trivial_destructor_after_move<boost::container::multiset<Key, Compare, Allocator, MultiSetOptions> >
|
||||
template <class Key, class Compare, class Allocator, class Options>
|
||||
struct has_trivial_destructor_after_move<boost::container::multiset<Key, Compare, Allocator, Options> >
|
||||
{
|
||||
typedef typename ::boost::container::allocator_traits<Allocator>::pointer pointer;
|
||||
static const bool value = ::boost::has_trivial_destructor_after_move<Allocator>::value &&
|
||||
|
||||
Reference in New Issue
Block a user