diff options
Diffstat (limited to 'boost/intrusive/sg_set.hpp')
-rw-r--r-- | boost/intrusive/sg_set.hpp | 390 |
1 files changed, 215 insertions, 175 deletions
diff --git a/boost/intrusive/sg_set.hpp b/boost/intrusive/sg_set.hpp index 7e250cb6a0..560845e7a2 100644 --- a/boost/intrusive/sg_set.hpp +++ b/boost/intrusive/sg_set.hpp @@ -40,15 +40,15 @@ namespace intrusive { #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) template<class T, class ...Options> #else -template<class ValueTraits, class Compare, class SizeType, bool FloatingPoint, typename HeaderHolder> +template<class ValueTraits, class VoidOrKeyOfValue, class Compare, class SizeType, bool FloatingPoint, typename HeaderHolder> #endif class sg_set_impl #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED - : public sgtree_impl<ValueTraits, Compare, SizeType, FloatingPoint, HeaderHolder> + : public sgtree_impl<ValueTraits, VoidOrKeyOfValue, Compare, SizeType, FloatingPoint, HeaderHolder> #endif { /// @cond - typedef sgtree_impl<ValueTraits, Compare, SizeType, FloatingPoint, HeaderHolder> tree_type; + typedef sgtree_impl<ValueTraits, VoidOrKeyOfValue, Compare, SizeType, FloatingPoint, HeaderHolder> tree_type; BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_set_impl) typedef tree_type implementation_defined; @@ -56,6 +56,8 @@ class sg_set_impl public: typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; typedef typename implementation_defined::value_traits value_traits; typedef typename implementation_defined::pointer pointer; typedef typename implementation_defined::const_pointer const_pointer; @@ -79,16 +81,16 @@ class sg_set_impl static const bool constant_time_size = tree_type::constant_time_size; public: - //! @copydoc ::boost::intrusive::sgtree::sgtree(const value_compare &,const value_traits &) - explicit sg_set_impl( const value_compare &cmp = value_compare() + //! @copydoc ::boost::intrusive::sgtree::sgtree(const key_compare &,const value_traits &) + explicit sg_set_impl( const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : tree_type(cmp, v_traits) {} - //! @copydoc ::boost::intrusive::sgtree::sgtree(bool,Iterator,Iterator,const value_compare &,const value_traits &) + //! @copydoc ::boost::intrusive::sgtree::sgtree(bool,Iterator,Iterator,const key_compare &,const value_traits &) template<class Iterator> sg_set_impl( Iterator b, Iterator e - , const value_compare &cmp = value_compare() + , const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : tree_type(true, b, e, cmp, v_traits) {} @@ -169,11 +171,20 @@ class sg_set_impl //! @copydoc ::boost::intrusive::sgtree::swap void swap(sg_set_impl& other); - //! @copydoc ::boost::intrusive::sgtree::clone_from + //! @copydoc ::boost::intrusive::sgtree::clone_from(const sgtree&,Cloner,Disposer) template <class Cloner, class Disposer> void clone_from(const sg_set_impl &src, Cloner cloner, Disposer disposer); - #endif //#ifdef BOOST_iNTRUSIVE_DOXYGEN_INVOKED + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::clone_from(sgtree&&,Cloner,Disposer) + template <class Cloner, class Disposer> + void clone_from(BOOST_RV_REF(sg_set_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } //! @copydoc ::boost::intrusive::sgtree::insert_unique(reference) std::pair<iterator, bool> insert(reference value) @@ -183,18 +194,18 @@ class sg_set_impl iterator insert(const_iterator hint, reference value) { return tree_type::insert_unique(hint, value); } - //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const KeyType&,KeyValueCompare,insert_commit_data&) - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template<class KeyType, class KeyTypeKeyCompare> std::pair<iterator, bool> insert_check - (const KeyType &key, KeyValueCompare key_value_comp, insert_commit_data &commit_data) - { return tree_type::insert_unique_check(key, key_value_comp, commit_data); } + (const KeyType &key, KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, comp, commit_data); } - //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const_iterator,const KeyType&,KeyValueCompare,insert_commit_data&) - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const_iterator,const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template<class KeyType, class KeyTypeKeyCompare> std::pair<iterator, bool> insert_check (const_iterator hint, const KeyType &key - ,KeyValueCompare key_value_comp, insert_commit_data &commit_data) - { return tree_type::insert_unique_check(hint, key, key_value_comp, commit_data); } + ,KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, comp, commit_data); } //! @copydoc ::boost::intrusive::sgtree::insert_unique(Iterator,Iterator) template<class Iterator> @@ -221,12 +232,12 @@ class sg_set_impl //! @copydoc ::boost::intrusive::sgtree::erase(const_iterator,const_iterator) iterator erase(const_iterator b, const_iterator e); - //! @copydoc ::boost::intrusive::sgtree::erase(const_reference) - size_type erase(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::erase(const key_type &) + size_type erase(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::erase(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - size_type erase(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::erase(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_iterator,Disposer) template<class Disposer> @@ -236,13 +247,13 @@ class sg_set_impl template<class Disposer> iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); - //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_reference, Disposer) + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const key_type &, Disposer) template<class Disposer> - size_type erase_and_dispose(const_reference value, Disposer disposer); + size_type erase_and_dispose(const key_type &key, Disposer disposer); - //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const KeyType&,KeyValueCompare,Disposer) - template<class KeyType, class KeyValueCompare, class Disposer> - size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer); + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template<class KeyType, class KeyTypeKeyCompare, class Disposer> + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); //! @copydoc ::boost::intrusive::sgtree::clear void clear(); @@ -253,100 +264,100 @@ class sg_set_impl #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED - //! @copydoc ::boost::intrusive::sgtree::count(const_reference)const - size_type count(const_reference value) const - { return static_cast<size_type>(this->tree_type::find(value) != this->tree_type::cend()); } + //! @copydoc ::boost::intrusive::sgtree::count(const key_type &)const + size_type count(const key_type &key) const + { return static_cast<size_type>(this->tree_type::find(key) != this->tree_type::cend()); } - //! @copydoc ::boost::intrusive::sgtree::count(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - size_type count(const KeyType& key, KeyValueCompare comp) const + //! @copydoc ::boost::intrusive::sgtree::count(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const { return static_cast<size_type>(this->tree_type::find(key, comp) != this->tree_type::cend()); } #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const_reference) - iterator lower_bound(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - iterator lower_bound(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const_reference)const - const_iterator lower_bound(const_reference value) const; + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - const_iterator lower_bound(const KeyType& key, KeyValueCompare comp) const; + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const_reference) - iterator upper_bound(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - iterator upper_bound(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const_reference)const - const_iterator upper_bound(const_reference value) const; + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - const_iterator upper_bound(const KeyType& key, KeyValueCompare comp) const; + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; - //! @copydoc ::boost::intrusive::sgtree::find(const_reference) - iterator find(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &) + iterator find(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - iterator find(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + iterator find(const KeyType& key, KeyTypeKeyCompare comp); - //! @copydoc ::boost::intrusive::sgtree::find(const_reference)const - const_iterator find(const_reference value) const; + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &)const + const_iterator find(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - const_iterator find(const KeyType& key, KeyValueCompare comp) const; + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED - //! @copydoc ::boost::intrusive::rbtree::equal_range(const_reference) - std::pair<iterator,iterator> equal_range(const_reference value) - { return this->tree_type::lower_bound_range(value); } + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &) + std::pair<iterator,iterator> equal_range(const key_type &key) + { return this->tree_type::lower_bound_range(key); } - //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - std::pair<iterator,iterator> equal_range(const KeyType& key, KeyValueCompare comp) + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp) { return this->tree_type::lower_bound_range(key, comp); } - //! @copydoc ::boost::intrusive::rbtree::equal_range(const_reference)const + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const std::pair<const_iterator, const_iterator> - equal_range(const_reference value) const - { return this->tree_type::lower_bound_range(value); } + equal_range(const key_type &key) const + { return this->tree_type::lower_bound_range(key); } - //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> std::pair<const_iterator, const_iterator> - equal_range(const KeyType& key, KeyValueCompare comp) const + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const { return this->tree_type::lower_bound_range(key, comp); } #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const_reference,const_reference,bool,bool) + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool) std::pair<iterator,iterator> bounded_range - (const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed); + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool) - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template<class KeyType, class KeyTypeKeyCompare> std::pair<iterator,iterator> bounded_range - (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed); + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const_reference,const_reference,bool,bool)const + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool)const std::pair<const_iterator, const_iterator> - bounded_range(const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed) const; + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool)const - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template<class KeyType, class KeyTypeKeyCompare> std::pair<const_iterator, const_iterator> bounded_range - (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed) const; + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; //! @copydoc ::boost::intrusive::sgtree::s_iterator_to(reference) static iterator s_iterator_to(reference value); @@ -413,7 +424,7 @@ template<class T, class ...Options> #else template<class T, class O1 = void, class O2 = void , class O3 = void, class O4 = void - , class O5 = void> + , class O5 = void, class O6 = void> #endif struct make_sg_set { @@ -421,7 +432,7 @@ struct make_sg_set typedef typename pack_options < sgtree_defaults, #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) - O1, O2, O3, O4, O5 + O1, O2, O3, O4, O5, O6 #else Options... #endif @@ -432,6 +443,7 @@ struct make_sg_set typedef sg_set_impl < value_traits + , typename packed_options::key_of_value , typename packed_options::compare , typename packed_options::size_type , packed_options::floating_point @@ -443,14 +455,14 @@ struct make_sg_set #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) -template<class T, class O1, class O2, class O3, class O4, class O5> +template<class T, class O1, class O2, class O3, class O4, class O5, class O6> #else template<class T, class ...Options> #endif class sg_set : public make_sg_set<T, #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) - O1, O2, O3, O4, O5 + O1, O2, O3, O4, O5, O6 #else Options... #endif @@ -459,7 +471,7 @@ class sg_set typedef typename make_sg_set <T, #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) - O1, O2, O3, O4, O5 + O1, O2, O3, O4, O5, O6 #else Options... #endif @@ -467,7 +479,7 @@ class sg_set BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_set) public: - typedef typename Base::value_compare value_compare; + typedef typename Base::key_compare key_compare; typedef typename Base::value_traits value_traits; typedef typename Base::iterator iterator; typedef typename Base::const_iterator const_iterator; @@ -475,14 +487,14 @@ class sg_set //Assert if passed value traits are compatible with the type BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value)); - explicit sg_set( const value_compare &cmp = value_compare() + explicit sg_set( const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : Base(cmp, v_traits) {} template<class Iterator> sg_set( Iterator b, Iterator e - , const value_compare &cmp = value_compare() + , const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : Base(b, e, cmp, v_traits) {} @@ -494,6 +506,14 @@ class sg_set sg_set& operator=(BOOST_RV_REF(sg_set) x) { return static_cast<sg_set &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + template <class Cloner, class Disposer> + void clone_from(const sg_set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template <class Cloner, class Disposer> + void clone_from(BOOST_RV_REF(sg_set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + static sg_set &container_from_end_iterator(iterator end_iterator) { return static_cast<sg_set &>(Base::container_from_end_iterator(end_iterator)); } @@ -523,15 +543,15 @@ class sg_set #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) template<class T, class ...Options> #else -template<class ValueTraits, class Compare, class SizeType, bool FloatingPoint, typename HeaderHolder> +template<class ValueTraits, class VoidOrKeyOfValue, class Compare, class SizeType, bool FloatingPoint, typename HeaderHolder> #endif class sg_multiset_impl #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED - : public sgtree_impl<ValueTraits, Compare, SizeType, FloatingPoint, HeaderHolder> + : public sgtree_impl<ValueTraits, VoidOrKeyOfValue, Compare, SizeType, FloatingPoint, HeaderHolder> #endif { /// @cond - typedef sgtree_impl<ValueTraits, Compare, SizeType, FloatingPoint, HeaderHolder> tree_type; + typedef sgtree_impl<ValueTraits, VoidOrKeyOfValue, Compare, SizeType, FloatingPoint, HeaderHolder> tree_type; BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_multiset_impl) typedef tree_type implementation_defined; @@ -539,6 +559,8 @@ class sg_multiset_impl public: typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; typedef typename implementation_defined::value_traits value_traits; typedef typename implementation_defined::pointer pointer; typedef typename implementation_defined::const_pointer const_pointer; @@ -562,16 +584,16 @@ class sg_multiset_impl static const bool constant_time_size = tree_type::constant_time_size; public: - //! @copydoc ::boost::intrusive::sgtree::sgtree(const value_compare &,const value_traits &) - explicit sg_multiset_impl( const value_compare &cmp = value_compare() + //! @copydoc ::boost::intrusive::sgtree::sgtree(const key_compare &,const value_traits &) + explicit sg_multiset_impl( const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : tree_type(cmp, v_traits) {} - //! @copydoc ::boost::intrusive::sgtree::sgtree(bool,Iterator,Iterator,const value_compare &,const value_traits &) + //! @copydoc ::boost::intrusive::sgtree::sgtree(bool,Iterator,Iterator,const key_compare &,const value_traits &) template<class Iterator> sg_multiset_impl( Iterator b, Iterator e - , const value_compare &cmp = value_compare() + , const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : tree_type(false, b, e, cmp, v_traits) {} @@ -652,11 +674,20 @@ class sg_multiset_impl //! @copydoc ::boost::intrusive::sgtree::swap void swap(sg_multiset_impl& other); - //! @copydoc ::boost::intrusive::sgtree::clone_from + //! @copydoc ::boost::intrusive::sgtree::clone_from(const sgtree&,Cloner,Disposer) template <class Cloner, class Disposer> void clone_from(const sg_multiset_impl &src, Cloner cloner, Disposer disposer); - #endif //#ifdef BOOST_iNTRUSIVE_DOXYGEN_INVOKED + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::clone_from(sgtree&&,Cloner,Disposer) + template <class Cloner, class Disposer> + void clone_from(BOOST_RV_REF(sg_multiset_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } //! @copydoc ::boost::intrusive::sgtree::insert_equal(reference) iterator insert(reference value) @@ -687,12 +718,12 @@ class sg_multiset_impl //! @copydoc ::boost::intrusive::sgtree::erase(const_iterator,const_iterator) iterator erase(const_iterator b, const_iterator e); - //! @copydoc ::boost::intrusive::sgtree::erase(const_reference) - size_type erase(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::erase(const key_type &) + size_type erase(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::erase(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - size_type erase(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::erase(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_iterator,Disposer) template<class Disposer> @@ -702,13 +733,13 @@ class sg_multiset_impl template<class Disposer> iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); - //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_reference, Disposer) + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const key_type &, Disposer) template<class Disposer> - size_type erase_and_dispose(const_reference value, Disposer disposer); + size_type erase_and_dispose(const key_type &key, Disposer disposer); - //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const KeyType&,KeyValueCompare,Disposer) - template<class KeyType, class KeyValueCompare, class Disposer> - size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer); + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template<class KeyType, class KeyTypeKeyCompare, class Disposer> + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); //! @copydoc ::boost::intrusive::sgtree::clear void clear(); @@ -717,88 +748,88 @@ class sg_multiset_impl template<class Disposer> void clear_and_dispose(Disposer disposer); - //! @copydoc ::boost::intrusive::sgtree::count(const_reference)const - size_type count(const_reference value) const; + //! @copydoc ::boost::intrusive::sgtree::count(const key_type &)const + size_type count(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::count(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - size_type count(const KeyType& key, KeyValueCompare comp) const; + //! @copydoc ::boost::intrusive::sgtree::count(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const_reference) - iterator lower_bound(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - iterator lower_bound(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const_reference)const - const_iterator lower_bound(const_reference value) const; + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - const_iterator lower_bound(const KeyType& key, KeyValueCompare comp) const; + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const_reference) - iterator upper_bound(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - iterator upper_bound(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const_reference)const - const_iterator upper_bound(const_reference value) const; + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - const_iterator upper_bound(const KeyType& key, KeyValueCompare comp) const; + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; - //! @copydoc ::boost::intrusive::sgtree::find(const_reference) - iterator find(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &) + iterator find(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - iterator find(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + iterator find(const KeyType& key, KeyTypeKeyCompare comp); - //! @copydoc ::boost::intrusive::sgtree::find(const_reference)const - const_iterator find(const_reference value) const; + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &)const + const_iterator find(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> - const_iterator find(const KeyType& key, KeyValueCompare comp) const; + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; - //! @copydoc ::boost::intrusive::sgtree::equal_range(const_reference) - std::pair<iterator,iterator> equal_range(const_reference value); + //! @copydoc ::boost::intrusive::sgtree::equal_range(const key_type &) + std::pair<iterator,iterator> equal_range(const key_type &key); - //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyValueCompare) - template<class KeyType, class KeyValueCompare> - std::pair<iterator,iterator> equal_range(const KeyType& key, KeyValueCompare comp); + //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyTypeKeyCompare) + template<class KeyType, class KeyTypeKeyCompare> + std::pair<iterator,iterator> equal_range(const KeyType& key, KeyTypeKeyCompare comp); - //! @copydoc ::boost::intrusive::sgtree::equal_range(const_reference)const + //! @copydoc ::boost::intrusive::sgtree::equal_range(const key_type &)const std::pair<const_iterator, const_iterator> - equal_range(const_reference value) const; + equal_range(const key_type &key) const; - //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyValueCompare)const - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template<class KeyType, class KeyTypeKeyCompare> std::pair<const_iterator, const_iterator> - equal_range(const KeyType& key, KeyValueCompare comp) const; + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const_reference,const_reference,bool,bool) + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool) std::pair<iterator,iterator> bounded_range - (const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed); + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool) - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template<class KeyType, class KeyTypeKeyCompare> std::pair<iterator,iterator> bounded_range - (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed); + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const_reference,const_reference,bool,bool)const + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool)const std::pair<const_iterator, const_iterator> - bounded_range(const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed) const; + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; - //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool)const - template<class KeyType, class KeyValueCompare> + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template<class KeyType, class KeyTypeKeyCompare> std::pair<const_iterator, const_iterator> bounded_range - (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed) const; + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; //! @copydoc ::boost::intrusive::sgtree::s_iterator_to(reference) static iterator s_iterator_to(reference value); @@ -865,7 +896,7 @@ template<class T, class ...Options> #else template<class T, class O1 = void, class O2 = void , class O3 = void, class O4 = void - , class O5 = void> + , class O5 = void, class O6 = void> #endif struct make_sg_multiset { @@ -873,7 +904,7 @@ struct make_sg_multiset typedef typename pack_options < sgtree_defaults, #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) - O1, O2, O3, O4, O5 + O1, O2, O3, O4, O5, O6 #else Options... #endif @@ -884,6 +915,7 @@ struct make_sg_multiset typedef sg_multiset_impl < value_traits + , typename packed_options::key_of_value , typename packed_options::compare , typename packed_options::size_type , packed_options::floating_point @@ -896,14 +928,14 @@ struct make_sg_multiset #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) -template<class T, class O1, class O2, class O3, class O4, class O5> +template<class T, class O1, class O2, class O3, class O4, class O5, class O6> #else template<class T, class ...Options> #endif class sg_multiset : public make_sg_multiset<T, #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) - O1, O2, O3, O4, O5 + O1, O2, O3, O4, O5, O6 #else Options... #endif @@ -911,7 +943,7 @@ class sg_multiset { typedef typename make_sg_multiset<T, #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) - O1, O2, O3, O4, O5 + O1, O2, O3, O4, O5, O6 #else Options... #endif @@ -920,7 +952,7 @@ class sg_multiset BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_multiset) public: - typedef typename Base::value_compare value_compare; + typedef typename Base::key_compare key_compare; typedef typename Base::value_traits value_traits; typedef typename Base::iterator iterator; typedef typename Base::const_iterator const_iterator; @@ -928,14 +960,14 @@ class sg_multiset //Assert if passed value traits are compatible with the type BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value)); - sg_multiset( const value_compare &cmp = value_compare() + sg_multiset( const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : Base(cmp, v_traits) {} template<class Iterator> sg_multiset( Iterator b, Iterator e - , const value_compare &cmp = value_compare() + , const key_compare &cmp = key_compare() , const value_traits &v_traits = value_traits()) : Base(b, e, cmp, v_traits) {} @@ -947,6 +979,14 @@ class sg_multiset sg_multiset& operator=(BOOST_RV_REF(sg_multiset) x) { return static_cast<sg_multiset &>(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + template <class Cloner, class Disposer> + void clone_from(const sg_multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template <class Cloner, class Disposer> + void clone_from(BOOST_RV_REF(sg_multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + static sg_multiset &container_from_end_iterator(iterator end_iterator) { return static_cast<sg_multiset &>(Base::container_from_end_iterator(end_iterator)); } |