mirror of
https://github.com/boostorg/intrusive.git
synced 2025-08-02 14:04:36 +02:00
Added experimental move semantics to containers. Undocumented
[SVN r70299]
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <boost/intrusive/intrusive_fwd.hpp>
|
||||
#include <boost/intrusive/avltree.hpp>
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
#include <iterator>
|
||||
|
||||
namespace boost {
|
||||
@@ -42,12 +43,8 @@ class avl_set_impl
|
||||
/// @cond
|
||||
typedef avltree_impl<Config> tree_type;
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
avl_set_impl (const avl_set_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-assignable
|
||||
avl_set_impl &operator =(const avl_set_impl&);
|
||||
//! movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_set_impl)
|
||||
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
@@ -113,6 +110,17 @@ class avl_set_impl
|
||||
: tree_(true, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
avl_set_impl(BOOST_RV_REF(avl_set_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
avl_set_impl& operator=(BOOST_RV_REF(avl_set_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the avl_set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -1181,6 +1189,7 @@ class avl_set
|
||||
#endif
|
||||
::type Base;
|
||||
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_set)
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -1202,6 +1211,13 @@ class avl_set
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
avl_set(BOOST_RV_REF(avl_set) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
avl_set& operator=(BOOST_RV_REF(avl_set) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static avl_set &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<avl_set &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
@@ -1238,9 +1254,8 @@ class avl_multiset_impl
|
||||
/// @cond
|
||||
typedef avltree_impl<Config> tree_type;
|
||||
|
||||
//Non-copyable and non-assignable
|
||||
avl_multiset_impl (const avl_multiset_impl&);
|
||||
avl_multiset_impl &operator =(const avl_multiset_impl&);
|
||||
//Movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_multiset_impl)
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
|
||||
@@ -1305,6 +1320,17 @@ class avl_multiset_impl
|
||||
: tree_(false, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
avl_multiset_impl(BOOST_RV_REF(avl_multiset_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
avl_multiset_impl& operator=(BOOST_RV_REF(avl_multiset_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the avl_multiset
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -2280,6 +2306,7 @@ class avl_multiset
|
||||
#endif
|
||||
::type Base;
|
||||
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_multiset)
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -2301,6 +2328,13 @@ class avl_multiset
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
avl_multiset(BOOST_RV_REF(avl_multiset) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
avl_multiset& operator=(BOOST_RV_REF(avl_multiset) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static avl_multiset &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<avl_multiset &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -32,6 +32,7 @@
|
||||
#include <boost/intrusive/options.hpp>
|
||||
#include <boost/intrusive/avltree_algorithms.hpp>
|
||||
#include <boost/intrusive/link_mode.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
@@ -122,9 +123,8 @@ class avltree_impl
|
||||
private:
|
||||
typedef detail::size_holder<constant_time_size, size_type> size_traits;
|
||||
|
||||
//noncopyable
|
||||
avltree_impl (const avltree_impl&);
|
||||
avltree_impl operator =(const avltree_impl&);
|
||||
//noncopyable, movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(avltree_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -159,6 +159,12 @@ class avltree_impl
|
||||
value_compare &priv_comp()
|
||||
{ return data_.node_plus_pred_.get(); }
|
||||
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
const node &priv_header() const
|
||||
{ return data_.node_plus_pred_.header_plus_size_.header_; }
|
||||
|
||||
@@ -241,6 +247,21 @@ class avltree_impl
|
||||
this->insert_equal(b, e);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
avltree_impl(BOOST_RV_REF(avltree_impl) x)
|
||||
: data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
|
||||
{
|
||||
node_algorithms::init_header(&priv_header());
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
this->swap(x);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
avltree_impl& operator=(BOOST_RV_REF(avltree_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called), but the nodes according to
|
||||
//! the value_traits template parameter are reinitialized and thus can be reused.
|
||||
@@ -1606,6 +1627,8 @@ class avltree
|
||||
#endif
|
||||
::type Base;
|
||||
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(avltree)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -1628,6 +1651,13 @@ class avltree
|
||||
: Base(unique, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
avltree(BOOST_RV_REF(avltree) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
avltree& operator=(BOOST_RV_REF(avltree) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static avltree &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<avltree &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -23,6 +23,9 @@
|
||||
#include <boost/intrusive/detail/slist_node.hpp> //remove-me
|
||||
#include <cstddef>
|
||||
#include <boost/pointer_cast.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
namespace detail {
|
||||
@@ -76,6 +79,10 @@ struct bucket_impl : public Slist
|
||||
template<class Slist>
|
||||
struct bucket_traits_impl
|
||||
{
|
||||
private:
|
||||
BOOST_COPYABLE_AND_MOVABLE(bucket_traits_impl)
|
||||
|
||||
public:
|
||||
/// @cond
|
||||
typedef typename boost::pointer_to_other
|
||||
< typename Slist::pointer, bucket_impl<Slist> >::type bucket_ptr;
|
||||
@@ -86,6 +93,21 @@ struct bucket_traits_impl
|
||||
: buckets_(buckets), buckets_len_(len)
|
||||
{}
|
||||
|
||||
bucket_traits_impl(BOOST_RV_REF(bucket_traits_impl) x)
|
||||
: buckets_(x.buckets_), buckets_len_(x.buckets_len_)
|
||||
{ x.buckets_ = bucket_ptr(0); x.buckets_len_ = 0; }
|
||||
|
||||
bucket_traits_impl& operator=(BOOST_RV_REF(bucket_traits_impl) x)
|
||||
{
|
||||
buckets_ = x.buckets_; buckets_len_ = x.buckets_len_;
|
||||
x.buckets_ = bucket_ptr(0); x.buckets_len_ = 0; return *this;
|
||||
}
|
||||
|
||||
bucket_traits_impl& operator=(BOOST_COPY_ASSIGN_REF(bucket_traits_impl) x)
|
||||
{
|
||||
buckets_ = x.buckets_; buckets_len_ = x.buckets_len_; return *this;
|
||||
}
|
||||
|
||||
bucket_ptr bucket_begin() const
|
||||
{ return buckets_; }
|
||||
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include <boost/intrusive/slist.hpp>
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
@@ -212,7 +213,7 @@ struct optimize_multikey_is_true
|
||||
|
||||
template<class Config>
|
||||
struct bucket_plus_size
|
||||
: public detail::size_holder
|
||||
: public detail::size_holder //size_traits
|
||||
< 0 != (Config::bool_flags & hash_bool_flags::constant_time_size_pos)
|
||||
, typename Config::size_type>
|
||||
{
|
||||
@@ -221,15 +222,23 @@ struct bucket_plus_size
|
||||
, typename Config::size_type> size_traits;
|
||||
typedef typename Config::bucket_traits bucket_traits;
|
||||
|
||||
bucket_plus_size(const bucket_traits &b_traits)
|
||||
: bucket_traits_(b_traits)
|
||||
template<class BucketTraits>
|
||||
bucket_plus_size(BOOST_FWD_REF(BucketTraits) b_traits)
|
||||
: bucket_traits_(::boost::forward<BucketTraits>(b_traits))
|
||||
{}
|
||||
|
||||
bucket_plus_size & operator =(const bucket_plus_size &x)
|
||||
{
|
||||
this->size_traits::operator=(x);
|
||||
bucket_traits_ = x.bucket_traits_;
|
||||
return *this;
|
||||
}
|
||||
bucket_traits bucket_traits_;
|
||||
};
|
||||
|
||||
template<class Config>
|
||||
struct bucket_hash_t
|
||||
: public detail::ebo_functor_holder<typename Config::hash>
|
||||
: public detail::ebo_functor_holder<typename Config::hash> //hash
|
||||
{
|
||||
typedef typename Config::hash hasher;
|
||||
typedef detail::size_holder
|
||||
@@ -237,22 +246,26 @@ struct bucket_hash_t
|
||||
, typename Config::size_type> size_traits;
|
||||
typedef typename Config::bucket_traits bucket_traits;
|
||||
|
||||
bucket_hash_t(const bucket_traits &b_traits, const hasher & h)
|
||||
: detail::ebo_functor_holder<hasher>(h), bucket_plus_size_(b_traits)
|
||||
template<class BucketTraits>
|
||||
bucket_hash_t(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h)
|
||||
: detail::ebo_functor_holder<hasher>(h), bucket_plus_size_(::boost::forward<BucketTraits>(b_traits))
|
||||
{}
|
||||
|
||||
bucket_plus_size<Config> bucket_plus_size_;
|
||||
};
|
||||
|
||||
template<class Config, bool>
|
||||
struct bucket_hash_equal_t : public detail::ebo_functor_holder<typename Config::equal>
|
||||
struct bucket_hash_equal_t
|
||||
: public detail::ebo_functor_holder<typename Config::equal>
|
||||
{
|
||||
typedef typename Config::equal equal;
|
||||
typedef typename Config::hash hasher;
|
||||
typedef typename Config::bucket_traits bucket_traits;
|
||||
|
||||
bucket_hash_equal_t(const bucket_traits &b_traits, const hasher & h, const equal &e)
|
||||
: detail::ebo_functor_holder<typename Config::equal>(e), bucket_hash(b_traits, h)
|
||||
template<class BucketTraits>
|
||||
bucket_hash_equal_t(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h, const equal &e)
|
||||
: detail::ebo_functor_holder<typename Config::equal>(e)//equal()
|
||||
, bucket_hash(::boost::forward<BucketTraits>(b_traits), h)
|
||||
{}
|
||||
bucket_hash_t<Config> bucket_hash;
|
||||
};
|
||||
@@ -267,8 +280,10 @@ struct bucket_hash_equal_t<Config, true>
|
||||
typedef typename unordered_bucket_ptr_impl
|
||||
<typename Config::value_traits>::type bucket_ptr;
|
||||
|
||||
bucket_hash_equal_t(const bucket_traits &b_traits, const hasher & h, const equal &e)
|
||||
: detail::ebo_functor_holder<typename Config::equal>(e), bucket_hash(b_traits, h)
|
||||
template<class BucketTraits>
|
||||
bucket_hash_equal_t(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h, const equal &e)
|
||||
: detail::ebo_functor_holder<typename Config::equal>(e) //equal()
|
||||
, bucket_hash(::boost::forward<BucketTraits>(b_traits), h)
|
||||
{}
|
||||
bucket_hash_t<Config> bucket_hash;
|
||||
bucket_ptr cached_begin_;
|
||||
@@ -283,22 +298,25 @@ struct hashtable_data_t : public Config::value_traits
|
||||
typedef typename Config::hash hasher;
|
||||
typedef typename Config::bucket_traits bucket_traits;
|
||||
|
||||
hashtable_data_t( const bucket_traits &b_traits, const hasher & h
|
||||
template<class BucketTraits>
|
||||
hashtable_data_t( BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h
|
||||
, const equal &e, const value_traits &val_traits)
|
||||
: Config::value_traits(val_traits), internal_(b_traits, h, e)
|
||||
: Config::value_traits(val_traits) //value_traits
|
||||
, internal_(::boost::forward<BucketTraits>(b_traits), h, e)
|
||||
{}
|
||||
typedef typename detail::usetopt_mask
|
||||
< Config
|
||||
, detail::hash_bool_flags::constant_time_size_pos
|
||||
| detail::hash_bool_flags::incremental_pos
|
||||
| detail::hash_bool_flags::incremental_pos
|
||||
>::type masked_config_t;
|
||||
struct internal
|
||||
: public detail::size_holder
|
||||
: public detail::size_holder //split_traits
|
||||
< 0 != (Config::bool_flags & hash_bool_flags::incremental_pos)
|
||||
, typename Config::size_type>
|
||||
{
|
||||
internal(const bucket_traits &b_traits, const hasher & h, const equal &e)
|
||||
: bucket_hash_equal_(b_traits, h, e)
|
||||
template<class BucketTraits>
|
||||
internal(BOOST_FWD_REF(BucketTraits) b_traits, const hasher & h, const equal &e)
|
||||
: bucket_hash_equal_(::boost::forward<BucketTraits>(b_traits), h, e)
|
||||
{}
|
||||
|
||||
bucket_hash_equal_t
|
||||
@@ -707,9 +725,8 @@ class hashtable_impl
|
||||
};
|
||||
|
||||
private:
|
||||
//noncopyable
|
||||
hashtable_impl (const hashtable_impl&);
|
||||
hashtable_impl operator =(const hashtable_impl&);
|
||||
//noncopyable, movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -791,6 +808,33 @@ class hashtable_impl
|
||||
priv_split_traits().set_size(bucket_size>>1);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
hashtable_impl(BOOST_RV_REF(hashtable_impl) x)
|
||||
: data_( ::boost::move(x.priv_bucket_traits())
|
||||
, ::boost::move(x.priv_hasher())
|
||||
, ::boost::move(x.priv_equal())
|
||||
, ::boost::move(x.priv_value_traits())
|
||||
)
|
||||
{
|
||||
priv_swap_cache(cache_begin_t(), x);
|
||||
x.priv_initialize_cache();
|
||||
if(constant_time_size){
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
this->priv_size_traits().set_size(x.priv_size_traits().get_size());
|
||||
x.priv_size_traits().set_size(size_type(0));
|
||||
}
|
||||
if(incremental){
|
||||
this->priv_split_traits().set_size(x.priv_split_traits().get_size());
|
||||
x.priv_split_traits().set_size(size_type(0));
|
||||
}
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
hashtable_impl& operator=(BOOST_RV_REF(hashtable_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the unordered_set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -935,14 +979,15 @@ class hashtable_impl
|
||||
swap(this->priv_equal(), other.priv_equal());
|
||||
swap(this->priv_hasher(), other.priv_hasher());
|
||||
//These can't throw
|
||||
swap(this->priv_real_bucket_traits(), other.priv_real_bucket_traits());
|
||||
swap(this->priv_bucket_traits(), other.priv_bucket_traits());
|
||||
swap(this->priv_value_traits(), other.priv_value_traits());
|
||||
priv_swap_cache(cache_begin_t(), other);
|
||||
if(constant_time_size){
|
||||
size_type backup = this->priv_size_traits().get_size();
|
||||
this->priv_size_traits().set_size(other.priv_size_traits().get_size());
|
||||
other.priv_size_traits().set_size(backup);
|
||||
}
|
||||
else if(incremental){
|
||||
if(incremental){
|
||||
size_type backup = this->priv_split_traits().get_size();
|
||||
this->priv_split_traits().set_size(other.priv_split_traits().get_size());
|
||||
other.priv_split_traits().set_size(backup);
|
||||
@@ -2201,6 +2246,12 @@ class hashtable_impl
|
||||
key_equal &priv_equal()
|
||||
{ return static_cast<key_equal&>(this->data_.internal_.bucket_hash_equal_.get()); }
|
||||
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
value_type &priv_value_from_slist_node(slist_node_ptr n)
|
||||
{ return *this->get_real_value_traits().to_value_ptr(dcast_bucket_ptr(n)); }
|
||||
|
||||
@@ -2225,6 +2276,12 @@ class hashtable_impl
|
||||
real_bucket_traits &priv_real_bucket_traits()
|
||||
{ return this->priv_real_bucket_traits(detail::bool_<external_bucket_traits>()); }
|
||||
|
||||
const bucket_traits &priv_bucket_traits() const
|
||||
{ return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
|
||||
|
||||
bucket_traits &priv_bucket_traits()
|
||||
{ return this->data_.internal_.bucket_hash_equal_.bucket_hash.bucket_plus_size_.bucket_traits_; }
|
||||
|
||||
const hasher &priv_hasher() const
|
||||
{ return static_cast<const hasher&>(this->data_.internal_.bucket_hash_equal_.bucket_hash.get()); }
|
||||
|
||||
@@ -2989,6 +3046,7 @@ class hashtable
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -3010,6 +3068,13 @@ class hashtable
|
||||
, const value_traits &v_traits = value_traits())
|
||||
: Base(b_traits, hash_func, equal_func, v_traits)
|
||||
{}
|
||||
|
||||
hashtable(BOOST_RV_REF(hashtable) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
hashtable& operator=(BOOST_RV_REF(hashtable) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -30,7 +30,7 @@
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <cstddef>
|
||||
//iG pending #include <boost/pointer_cast.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
@@ -114,9 +114,8 @@ class list_impl
|
||||
private:
|
||||
typedef detail::size_holder<constant_time_size, size_type> size_traits;
|
||||
|
||||
//Non-copyable and non-moveable
|
||||
list_impl (const list_impl&);
|
||||
list_impl &operator =(const list_impl&);
|
||||
//noncopyable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(list_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -173,10 +172,10 @@ class list_impl
|
||||
real_value_traits &get_real_value_traits(detail::bool_<true>)
|
||||
{ return data_.get_value_traits(*this); }
|
||||
|
||||
const value_traits &get_value_traits() const
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &get_value_traits()
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
protected:
|
||||
@@ -229,6 +228,21 @@ class list_impl
|
||||
this->insert(this->cend(), b, e);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
list_impl(BOOST_RV_REF(list_impl) x)
|
||||
: data_(::boost::move(x.priv_value_traits()))
|
||||
{
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
node_algorithms::init_header(this->get_root_node());
|
||||
this->swap(x);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
list_impl& operator=(BOOST_RV_REF(list_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: If it's not a safe-mode or an auto-unlink value_type
|
||||
//! the destructor does nothing
|
||||
//! (ie. no code is generated). Otherwise it detaches all elements from this.
|
||||
@@ -988,8 +1002,8 @@ class list_impl
|
||||
{
|
||||
if(node_traits::get_next(this->get_root_node())
|
||||
!= node_traits::get_previous(this->get_root_node())){
|
||||
list_impl carry(this->get_value_traits());
|
||||
detail::array_initializer<list_impl, 64> counter(this->get_value_traits());
|
||||
list_impl carry(this->priv_value_traits());
|
||||
detail::array_initializer<list_impl, 64> counter(this->priv_value_traits());
|
||||
int fill = 0;
|
||||
while(!this->empty()){
|
||||
carry.splice(carry.cbegin(), *this, this->cbegin());
|
||||
@@ -1473,6 +1487,8 @@ class list
|
||||
typedef typename Base::real_value_traits real_value_traits;
|
||||
//Assert if passed value traits are compatible with the type
|
||||
BOOST_STATIC_ASSERT((detail::is_same<typename real_value_traits::value_type, T>::value));
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(list)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_traits value_traits;
|
||||
typedef typename Base::iterator iterator;
|
||||
@@ -1487,6 +1503,13 @@ class list
|
||||
: Base(b, e, v_traits)
|
||||
{}
|
||||
|
||||
list(BOOST_RV_REF(list) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
list& operator=(BOOST_RV_REF(list) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static list &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<list &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -33,7 +33,7 @@
|
||||
#include <boost/intrusive/options.hpp>
|
||||
#include <boost/intrusive/rbtree_algorithms.hpp>
|
||||
#include <boost/intrusive/link_mode.hpp>
|
||||
//iG pending #include <boost/pointer_cast.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
@@ -122,8 +122,7 @@ class rbtree_impl
|
||||
typedef detail::size_holder<constant_time_size, size_type> size_traits;
|
||||
|
||||
//noncopyable
|
||||
rbtree_impl (const rbtree_impl&);
|
||||
rbtree_impl operator =(const rbtree_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(rbtree_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -158,6 +157,12 @@ class rbtree_impl
|
||||
value_compare &priv_comp()
|
||||
{ return data_.node_plus_pred_.get(); }
|
||||
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
const node &priv_header() const
|
||||
{ return data_.node_plus_pred_.header_plus_size_.header_; }
|
||||
|
||||
@@ -254,6 +259,21 @@ class rbtree_impl
|
||||
this->insert_equal(b, e);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
rbtree_impl(BOOST_RV_REF(rbtree_impl) x)
|
||||
: data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
|
||||
{
|
||||
node_algorithms::init_header(&priv_header());
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
this->swap(x);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
rbtree_impl& operator=(BOOST_RV_REF(rbtree_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called), but the nodes according to
|
||||
//! the value_traits template parameter are reinitialized and thus can be reused.
|
||||
@@ -1613,6 +1633,7 @@ class rbtree
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(rbtree)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -1636,6 +1657,13 @@ class rbtree
|
||||
: Base(unique, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
rbtree(BOOST_RV_REF(rbtree) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
rbtree& operator=(BOOST_RV_REF(rbtree) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static rbtree &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<rbtree &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -18,6 +18,7 @@
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/intrusive/rbtree.hpp>
|
||||
#include <iterator>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
@@ -42,13 +43,7 @@ class set_impl
|
||||
{
|
||||
/// @cond
|
||||
typedef rbtree_impl<Config> tree_type;
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
set_impl (const set_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-assignable
|
||||
set_impl &operator =(const set_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(set_impl)
|
||||
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
@@ -122,6 +117,17 @@ class set_impl
|
||||
: tree_(true, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
set_impl(BOOST_RV_REF(set_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
set_impl& operator=(BOOST_RV_REF(set_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -1190,6 +1196,7 @@ class set
|
||||
#endif
|
||||
>::type Base;
|
||||
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(set)
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -1211,6 +1218,13 @@ class set
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
set(BOOST_RV_REF(set) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
set& operator=(BOOST_RV_REF(set) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static set &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<set &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
@@ -1247,9 +1261,7 @@ class multiset_impl
|
||||
/// @cond
|
||||
typedef rbtree_impl<Config> tree_type;
|
||||
|
||||
//Non-copyable and non-assignable
|
||||
multiset_impl (const multiset_impl&);
|
||||
multiset_impl &operator =(const multiset_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(multiset_impl)
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
|
||||
@@ -1321,6 +1333,17 @@ class multiset_impl
|
||||
: tree_(false, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
multiset_impl(BOOST_RV_REF(multiset_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
multiset_impl& operator=(BOOST_RV_REF(multiset_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -2307,6 +2330,8 @@ class multiset
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(multiset)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -2329,6 +2354,13 @@ class multiset
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
multiset(BOOST_RV_REF(multiset) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
multiset& operator=(BOOST_RV_REF(multiset) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static multiset &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<multiset &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include <boost/intrusive/intrusive_fwd.hpp>
|
||||
#include <boost/intrusive/sgtree.hpp>
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
#include <iterator>
|
||||
|
||||
namespace boost {
|
||||
@@ -42,12 +43,8 @@ class sg_set_impl
|
||||
/// @cond
|
||||
typedef sgtree_impl<Config> tree_type;
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
sg_set_impl (const sg_set_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-assignable
|
||||
sg_set_impl &operator =(const sg_set_impl&);
|
||||
//! movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_set_impl)
|
||||
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
@@ -111,6 +108,17 @@ class sg_set_impl
|
||||
: tree_(true, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
sg_set_impl(BOOST_RV_REF(sg_set_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
sg_set_impl& operator=(BOOST_RV_REF(sg_set_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the sg_set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -1218,6 +1226,7 @@ class sg_set
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_set)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -1240,6 +1249,13 @@ class sg_set
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
sg_set(BOOST_RV_REF(sg_set) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
sg_set& operator=(BOOST_RV_REF(sg_set) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static sg_set &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<sg_set &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
@@ -1277,8 +1293,7 @@ class sg_multiset_impl
|
||||
typedef sgtree_impl<Config> tree_type;
|
||||
|
||||
//Non-copyable and non-assignable
|
||||
sg_multiset_impl (const sg_multiset_impl&);
|
||||
sg_multiset_impl &operator =(const sg_multiset_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_multiset_impl)
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
|
||||
@@ -1341,6 +1356,17 @@ class sg_multiset_impl
|
||||
: tree_(false, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
sg_multiset_impl(BOOST_RV_REF(sg_multiset_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
sg_multiset_impl& operator=(BOOST_RV_REF(sg_multiset_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the sg_multiset
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -2352,6 +2378,7 @@ class sg_multiset
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_multiset)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -2374,6 +2401,13 @@ class sg_multiset
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
sg_multiset(BOOST_RV_REF(sg_multiset) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
sg_multiset& operator=(BOOST_RV_REF(sg_multiset) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static sg_multiset &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<sg_multiset &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -38,6 +38,7 @@
|
||||
#include <boost/intrusive/options.hpp>
|
||||
#include <boost/intrusive/sgtree_algorithms.hpp>
|
||||
#include <boost/intrusive/link_mode.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
@@ -254,8 +255,7 @@ class sgtree_impl
|
||||
typedef typename alpha_traits::multiply_by_alpha_t multiply_by_alpha_t;
|
||||
|
||||
//noncopyable
|
||||
sgtree_impl (const sgtree_impl&);
|
||||
sgtree_impl operator =(const sgtree_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(sgtree_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -303,6 +303,12 @@ class sgtree_impl
|
||||
value_compare &priv_comp()
|
||||
{ return data_.node_plus_pred_.get(); }
|
||||
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
const node &priv_header() const
|
||||
{ return data_.node_plus_pred_.header_plus_alpha_.header_; }
|
||||
|
||||
@@ -395,6 +401,21 @@ class sgtree_impl
|
||||
this->insert_equal(b, e);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
sgtree_impl(BOOST_RV_REF(sgtree_impl) x)
|
||||
: data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
|
||||
{
|
||||
node_algorithms::init_header(&priv_header());
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
this->swap(x);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
sgtree_impl& operator=(BOOST_RV_REF(sgtree_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called), but the nodes according to
|
||||
//! the value_traits template parameter are reinitialized and thus can be reused.
|
||||
@@ -1838,6 +1859,8 @@ class sgtree
|
||||
#endif
|
||||
>::type Base;
|
||||
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(sgtree)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -1860,6 +1883,13 @@ class sgtree
|
||||
: Base(unique, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
sgtree(BOOST_RV_REF(sgtree) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
sgtree& operator=(BOOST_RV_REF(sgtree) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static sgtree &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<sgtree &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#include <algorithm>
|
||||
#include <cstddef> //std::size_t
|
||||
#include <utility> //std::pair
|
||||
//iG pending #include <boost/pointer_cast.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
@@ -148,13 +148,8 @@ class slist_impl
|
||||
private:
|
||||
typedef detail::size_holder<constant_time_size, size_type> size_traits;
|
||||
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
slist_impl (const slist_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-asignable
|
||||
slist_impl &operator =(const slist_impl&);
|
||||
//noncopyable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(slist_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -252,10 +247,10 @@ class slist_impl
|
||||
real_value_traits &get_real_value_traits(detail::bool_<true>)
|
||||
{ return data_.get_value_traits(*this); }
|
||||
|
||||
const value_traits &get_value_traits() const
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &get_value_traits()
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
protected:
|
||||
@@ -305,6 +300,21 @@ class slist_impl
|
||||
this->insert_after(this->cbefore_begin(), b, e);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
slist_impl(BOOST_RV_REF(slist_impl) x)
|
||||
: data_(::boost::move(x.priv_value_traits()))
|
||||
{
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
node_algorithms::init_header(this->get_root_node());
|
||||
this->swap(x);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
slist_impl& operator=(BOOST_RV_REF(slist_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: If it's a safe-mode
|
||||
//! or auto-unlink value, the destructor does nothing
|
||||
//! (ie. no code is generated). Otherwise it detaches all elements from this.
|
||||
@@ -1313,8 +1323,8 @@ class slist_impl
|
||||
if (node_traits::get_next(node_traits::get_next(this->get_root_node()))
|
||||
!= this->get_root_node()) {
|
||||
|
||||
slist_impl carry(this->get_value_traits());
|
||||
detail::array_initializer<slist_impl, 64> counter(this->get_value_traits());
|
||||
slist_impl carry(this->priv_value_traits());
|
||||
detail::array_initializer<slist_impl, 64> counter(this->priv_value_traits());
|
||||
int fill = 0;
|
||||
const_iterator last_inserted;
|
||||
while(!this->empty()){
|
||||
@@ -2084,6 +2094,8 @@ class slist
|
||||
typedef typename Base::real_value_traits real_value_traits;
|
||||
//Assert if passed value traits are compatible with the type
|
||||
BOOST_STATIC_ASSERT((detail::is_same<typename real_value_traits::value_type, T>::value));
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(slist)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_traits value_traits;
|
||||
typedef typename Base::iterator iterator;
|
||||
@@ -2098,6 +2110,13 @@ class slist
|
||||
: Base(b, e, v_traits)
|
||||
{}
|
||||
|
||||
slist(BOOST_RV_REF(slist) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
slist& operator=(BOOST_RV_REF(slist) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static slist &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<slist &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include <boost/intrusive/intrusive_fwd.hpp>
|
||||
#include <boost/intrusive/splaytree.hpp>
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
#include <iterator>
|
||||
|
||||
namespace boost {
|
||||
@@ -42,12 +43,8 @@ class splay_set_impl
|
||||
/// @cond
|
||||
typedef splaytree_impl<Config> tree_type;
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
splay_set_impl (const splay_set_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-assignable
|
||||
splay_set_impl &operator =(const splay_set_impl&);
|
||||
//! movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_set_impl)
|
||||
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
@@ -113,6 +110,17 @@ class splay_set_impl
|
||||
: tree_(true, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
splay_set_impl(BOOST_RV_REF(splay_set_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
splay_set_impl& operator=(BOOST_RV_REF(splay_set_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the splay_set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -1202,6 +1210,7 @@ class splay_set
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_set)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -1224,6 +1233,13 @@ class splay_set
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
splay_set(BOOST_RV_REF(splay_set) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
splay_set& operator=(BOOST_RV_REF(splay_set) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static splay_set &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<splay_set &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
@@ -1260,9 +1276,8 @@ class splay_multiset_impl
|
||||
/// @cond
|
||||
typedef splaytree_impl<Config> tree_type;
|
||||
|
||||
//Non-copyable and non-assignable
|
||||
splay_multiset_impl (const splay_multiset_impl&);
|
||||
splay_multiset_impl &operator =(const splay_multiset_impl&);
|
||||
//Movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_multiset_impl)
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
|
||||
@@ -1327,6 +1342,17 @@ class splay_multiset_impl
|
||||
: tree_(false, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
splay_multiset_impl(BOOST_RV_REF(splay_multiset_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
splay_multiset_impl& operator=(BOOST_RV_REF(splay_multiset_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -2324,6 +2350,7 @@ class splay_multiset
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_multiset)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -2346,6 +2373,13 @@ class splay_multiset
|
||||
: Base(b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
splay_multiset(BOOST_RV_REF(splay_multiset) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
splay_multiset& operator=(BOOST_RV_REF(splay_multiset) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static splay_multiset &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<splay_multiset &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include <boost/intrusive/options.hpp>
|
||||
#include <boost/intrusive/splaytree_algorithms.hpp>
|
||||
#include <boost/intrusive/link_mode.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
|
||||
|
||||
namespace boost {
|
||||
@@ -122,8 +123,7 @@ class splaytree_impl
|
||||
typedef detail::size_holder<constant_time_size, size_type> size_traits;
|
||||
|
||||
//noncopyable
|
||||
splaytree_impl (const splaytree_impl&);
|
||||
splaytree_impl operator =(const splaytree_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(splaytree_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -158,6 +158,12 @@ class splaytree_impl
|
||||
value_compare &priv_comp()
|
||||
{ return data_.node_plus_pred_.get(); }
|
||||
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
const node &priv_header() const
|
||||
{ return data_.node_plus_pred_.header_plus_size_.header_; }
|
||||
|
||||
@@ -240,6 +246,21 @@ class splaytree_impl
|
||||
this->insert_equal(b, e);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
splaytree_impl(BOOST_RV_REF(splaytree_impl) x)
|
||||
: data_(::boost::move(x.priv_comp()), ::boost::move(x.priv_value_traits()))
|
||||
{
|
||||
node_algorithms::init_header(&priv_header());
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
this->swap(x);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
splaytree_impl& operator=(BOOST_RV_REF(splaytree_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called), but the nodes according to
|
||||
//! the value_traits template parameter are reinitialized and thus can be reused.
|
||||
@@ -1614,6 +1635,7 @@ class splaytree
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(splaytree)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -1637,6 +1659,13 @@ class splaytree
|
||||
: Base(unique, b, e, cmp, v_traits)
|
||||
{}
|
||||
|
||||
splaytree(BOOST_RV_REF(splaytree) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
splaytree& operator=(BOOST_RV_REF(splaytree) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static splaytree &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<splaytree &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -31,6 +31,7 @@
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/intrusive/treap_algorithms.hpp>
|
||||
#include <boost/intrusive/link_mode.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
#include <boost/intrusive/priority_compare.hpp>
|
||||
|
||||
namespace boost {
|
||||
@@ -126,8 +127,7 @@ class treap_impl
|
||||
typedef detail::size_holder<constant_time_size, size_type> size_traits;
|
||||
|
||||
//noncopyable
|
||||
treap_impl (const treap_impl&);
|
||||
treap_impl operator =(const treap_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_impl)
|
||||
|
||||
enum { safemode_or_autounlink =
|
||||
(int)real_value_traits::link_mode == (int)auto_unlink ||
|
||||
@@ -176,6 +176,12 @@ class treap_impl
|
||||
priority_compare &priv_pcomp()
|
||||
{ return data_.node_plus_pred_.header_plus_priority_size_.get(); }
|
||||
|
||||
const value_traits &priv_value_traits() const
|
||||
{ return data_; }
|
||||
|
||||
value_traits &priv_value_traits()
|
||||
{ return data_; }
|
||||
|
||||
const node &priv_header() const
|
||||
{ return data_.node_plus_pred_.header_plus_priority_size_.header_plus_size_.header_; }
|
||||
|
||||
@@ -224,7 +230,7 @@ class treap_impl
|
||||
//! <b>Throws</b>: If value_traits::node_traits::node
|
||||
//! constructor throws (this does not happen with predefined Boost.Intrusive hooks)
|
||||
//! or the copy constructor of the value_compare/priority_compare objects throw. Basic guarantee.
|
||||
treap_impl( const value_compare &cmp = value_compare()
|
||||
treap_impl( const value_compare &cmp = value_compare()
|
||||
, const priority_compare &pcmp = priority_compare()
|
||||
, const value_traits &v_traits = value_traits())
|
||||
: data_(cmp, pcmp, v_traits)
|
||||
@@ -261,6 +267,23 @@ class treap_impl
|
||||
this->insert_equal(b, e);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
treap_impl(BOOST_RV_REF(treap_impl) x)
|
||||
: data_( ::boost::move(x.priv_comp())
|
||||
, ::boost::move(x.priv_pcomp())
|
||||
, ::boost::move(x.priv_value_traits()))
|
||||
{
|
||||
node_algorithms::init_header(&priv_header());
|
||||
this->priv_size_traits().set_size(size_type(0));
|
||||
this->swap(x);
|
||||
}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
treap_impl& operator=(BOOST_RV_REF(treap_impl) x)
|
||||
{ this->swap(x); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the set
|
||||
//! are not deleted (i.e. no destructors are called), but the nodes according to
|
||||
//! the value_traits template parameter are reinitialized and thus can be reused.
|
||||
@@ -1701,6 +1724,7 @@ class treap
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(treap)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -1727,6 +1751,13 @@ class treap
|
||||
: Base(unique, b, e, cmp, pcmp, v_traits)
|
||||
{}
|
||||
|
||||
treap(BOOST_RV_REF(treap) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
treap& operator=(BOOST_RV_REF(treap) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static treap &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<treap &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include <boost/intrusive/intrusive_fwd.hpp>
|
||||
#include <boost/intrusive/treap.hpp>
|
||||
#include <boost/intrusive/detail/mpl.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
#include <iterator>
|
||||
|
||||
namespace boost {
|
||||
@@ -42,12 +43,8 @@ class treap_set_impl
|
||||
/// @cond
|
||||
typedef treap_impl<Config> tree_type;
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
treap_set_impl (const treap_set_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-assignable
|
||||
treap_set_impl &operator =(const treap_set_impl&);
|
||||
//! movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_set_impl)
|
||||
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
@@ -116,6 +113,17 @@ class treap_set_impl
|
||||
: tree_(true, b, e, cmp, pcmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
treap_set_impl(BOOST_RV_REF(treap_set_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
treap_set_impl& operator=(BOOST_RV_REF(treap_set_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the treap_set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -1294,6 +1302,7 @@ class treap_set
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_set)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -1319,6 +1328,13 @@ class treap_set
|
||||
: Base(b, e, cmp, pcmp, v_traits)
|
||||
{}
|
||||
|
||||
treap_set(BOOST_RV_REF(treap_set) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
treap_set& operator=(BOOST_RV_REF(treap_set) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static treap_set &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<treap_set &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
@@ -1355,9 +1371,7 @@ class treap_multiset_impl
|
||||
/// @cond
|
||||
typedef treap_impl<Config> tree_type;
|
||||
|
||||
//Non-copyable and non-assignable
|
||||
treap_multiset_impl (const treap_multiset_impl&);
|
||||
treap_multiset_impl &operator =(const treap_multiset_impl&);
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_multiset_impl)
|
||||
typedef tree_type implementation_defined;
|
||||
/// @endcond
|
||||
|
||||
@@ -1425,6 +1439,17 @@ class treap_multiset_impl
|
||||
: tree_(false, b, e, cmp, pcmp, v_traits)
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
treap_multiset_impl(BOOST_RV_REF(treap_multiset_impl) x)
|
||||
: tree_(::boost::move(x.tree_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
treap_multiset_impl& operator=(BOOST_RV_REF(treap_multiset_impl) x)
|
||||
{ tree_ = ::boost::move(x.tree_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the treap_multiset
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -2499,6 +2524,8 @@ class treap_multiset
|
||||
Options...
|
||||
#endif
|
||||
>::type Base;
|
||||
//Movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_multiset)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_compare value_compare;
|
||||
@@ -2524,6 +2551,13 @@ class treap_multiset
|
||||
: Base(b, e, cmp, pcmp, v_traits)
|
||||
{}
|
||||
|
||||
treap_multiset(BOOST_RV_REF(treap_multiset) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
treap_multiset& operator=(BOOST_RV_REF(treap_multiset) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
|
||||
static treap_multiset &container_from_end_iterator(iterator end_iterator)
|
||||
{ return static_cast<treap_multiset &>(Base::container_from_end_iterator(end_iterator)); }
|
||||
|
||||
|
@@ -16,8 +16,10 @@
|
||||
#include <boost/intrusive/detail/config_begin.hpp>
|
||||
#include <boost/intrusive/intrusive_fwd.hpp>
|
||||
#include <boost/intrusive/hashtable.hpp>
|
||||
#include <boost/move/move.hpp>
|
||||
#include <iterator>
|
||||
|
||||
|
||||
namespace boost {
|
||||
namespace intrusive {
|
||||
|
||||
@@ -68,12 +70,8 @@ class unordered_set_impl
|
||||
typedef hashtable_impl<Config> table_type;
|
||||
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
unordered_set_impl (const unordered_set_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-assignable
|
||||
unordered_set_impl &operator =(const unordered_set_impl&);
|
||||
//! movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_set_impl)
|
||||
|
||||
typedef table_type implementation_defined;
|
||||
/// @endcond
|
||||
@@ -156,6 +154,17 @@ class unordered_set_impl
|
||||
: table_(b_traits, hash_func, equal_func, v_traits)
|
||||
{ table_.insert_unique(b, e); }
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
unordered_set_impl(BOOST_RV_REF(unordered_set_impl) x)
|
||||
: table_(::boost::move(x.table_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
unordered_set_impl& operator=(BOOST_RV_REF(unordered_set_impl) x)
|
||||
{ table_ = ::boost::move(x.table_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the unordered_set
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -1046,6 +1055,7 @@ class unordered_set
|
||||
|
||||
//Assert if passed value traits are compatible with the type
|
||||
BOOST_STATIC_ASSERT((detail::is_same<typename Base::value_traits::value_type, T>::value));
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_set)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -1073,6 +1083,13 @@ class unordered_set
|
||||
, const value_traits &v_traits = value_traits())
|
||||
: Base(b, e, b_traits, hash_func, equal_func, v_traits)
|
||||
{}
|
||||
|
||||
unordered_set(BOOST_RV_REF(unordered_set) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
unordered_set& operator=(BOOST_RV_REF(unordered_set) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1125,13 +1142,8 @@ class unordered_multiset_impl
|
||||
typedef hashtable_impl<Config> table_type;
|
||||
/// @endcond
|
||||
|
||||
//! This class is
|
||||
//! non-copyable
|
||||
unordered_multiset_impl (const unordered_multiset_impl&);
|
||||
|
||||
//! This class is
|
||||
//! non-assignable
|
||||
unordered_multiset_impl &operator =(const unordered_multiset_impl&);
|
||||
//Movable
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_multiset_impl)
|
||||
|
||||
typedef table_type implementation_defined;
|
||||
|
||||
@@ -1213,6 +1225,17 @@ class unordered_multiset_impl
|
||||
: table_(b_traits, hash_func, equal_func, v_traits)
|
||||
{ table_.insert_equal(b, e); }
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
unordered_multiset_impl(BOOST_RV_REF(unordered_multiset_impl) x)
|
||||
: table_(::boost::move(x.table_))
|
||||
{}
|
||||
|
||||
//! <b>Effects</b>: to-do
|
||||
//!
|
||||
unordered_multiset_impl& operator=(BOOST_RV_REF(unordered_multiset_impl) x)
|
||||
{ table_ = ::boost::move(x.table_); return *this; }
|
||||
|
||||
//! <b>Effects</b>: Detaches all elements from this. The objects in the unordered_multiset
|
||||
//! are not deleted (i.e. no destructors are called).
|
||||
//!
|
||||
@@ -2045,6 +2068,7 @@ class unordered_multiset
|
||||
>::type Base;
|
||||
//Assert if passed value traits are compatible with the type
|
||||
BOOST_STATIC_ASSERT((detail::is_same<typename Base::value_traits::value_type, T>::value));
|
||||
BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_multiset)
|
||||
|
||||
public:
|
||||
typedef typename Base::value_traits value_traits;
|
||||
@@ -2072,6 +2096,13 @@ class unordered_multiset
|
||||
, const value_traits &v_traits = value_traits())
|
||||
: Base(b, e, b_traits, hash_func, equal_func, v_traits)
|
||||
{}
|
||||
|
||||
unordered_multiset(BOOST_RV_REF(unordered_multiset) x)
|
||||
: Base(::boost::move(static_cast<Base&>(x)))
|
||||
{}
|
||||
|
||||
unordered_multiset& operator=(BOOST_RV_REF(unordered_multiset) x)
|
||||
{ this->Base::operator=(::boost::move(static_cast<Base&>(x))); return *this; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user