Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / intrusive / bs_set.hpp
1 /////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga  2013-2014
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 //    (See accompanying file LICENSE_1_0.txt or copy at
7 //          http://www.boost.org/LICENSE_1_0.txt)
8 //
9 // See http://www.boost.org/libs/intrusive for documentation.
10 //
11 /////////////////////////////////////////////////////////////////////////////
12 #ifndef BOOST_INTRUSIVE_BS_SET_HPP
13 #define BOOST_INTRUSIVE_BS_SET_HPP
14
15 #if defined(_MSC_VER)
16 #  pragma once
17 #endif
18
19 #include <boost/intrusive/detail/config_begin.hpp>
20 #include <boost/intrusive/intrusive_fwd.hpp>
21 #include <boost/intrusive/detail/mpl.hpp>
22 #include <boost/intrusive/bstree.hpp>
23 #include <boost/move/utility_core.hpp>
24 #include <boost/static_assert.hpp>
25
26 namespace boost {
27 namespace intrusive {
28
29 //! The class template bs_set is an intrusive container, that mimics most of
30 //! the interface of std::set as described in the C++ standard.
31 //!
32 //! The template parameter \c T is the type to be managed by the container.
33 //! The user can specify additional options and if no options are provided
34 //! default options are used.
35 //!
36 //! The container supports the following options:
37 //! \c base_hook<>/member_hook<>/value_traits<>,
38 //! \c constant_time_size<>, \c size_type<> and
39 //! \c compare<>.
40 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
41 template<class T, class ...Options>
42 #else
43 template<class ValueTraits, class Compare, class SizeType, bool ConstantTimeSize, typename HeaderHolder>
44 #endif
45 class bs_set_impl
46 #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
47    : public bstree_impl<ValueTraits, Compare, SizeType, ConstantTimeSize, BsTreeAlgorithms, HeaderHolder>
48 #endif
49 {
50    /// @cond
51    typedef bstree_impl<ValueTraits, Compare, SizeType, ConstantTimeSize, BsTreeAlgorithms, HeaderHolder> tree_type;
52    BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_set_impl)
53
54    typedef tree_type implementation_defined;
55    /// @endcond
56
57    public:
58    typedef typename implementation_defined::value_type               value_type;
59    typedef typename implementation_defined::value_traits             value_traits;
60    typedef typename implementation_defined::pointer                  pointer;
61    typedef typename implementation_defined::const_pointer            const_pointer;
62    typedef typename implementation_defined::reference                reference;
63    typedef typename implementation_defined::const_reference          const_reference;
64    typedef typename implementation_defined::difference_type          difference_type;
65    typedef typename implementation_defined::size_type                size_type;
66    typedef typename implementation_defined::value_compare            value_compare;
67    typedef typename implementation_defined::key_compare              key_compare;
68    typedef typename implementation_defined::iterator                 iterator;
69    typedef typename implementation_defined::const_iterator           const_iterator;
70    typedef typename implementation_defined::reverse_iterator         reverse_iterator;
71    typedef typename implementation_defined::const_reverse_iterator   const_reverse_iterator;
72    typedef typename implementation_defined::insert_commit_data       insert_commit_data;
73    typedef typename implementation_defined::node_traits              node_traits;
74    typedef typename implementation_defined::node                     node;
75    typedef typename implementation_defined::node_ptr                 node_ptr;
76    typedef typename implementation_defined::const_node_ptr           const_node_ptr;
77    typedef typename implementation_defined::node_algorithms          node_algorithms;
78
79    static const bool constant_time_size = tree_type::constant_time_size;
80
81    public:
82    //! @copydoc ::boost::intrusive::bstree::bstree(const value_compare &,const value_traits &)
83    explicit bs_set_impl( const value_compare &cmp = value_compare()
84                     , const value_traits &v_traits = value_traits())
85       :  tree_type(cmp, v_traits)
86    {}
87
88    //! @copydoc ::boost::intrusive::bstree::bstree(bool,Iterator,Iterator,const value_compare &,const value_traits &)
89    template<class Iterator>
90    bs_set_impl( Iterator b, Iterator e
91            , const value_compare &cmp = value_compare()
92            , const value_traits &v_traits = value_traits())
93       : tree_type(true, b, e, cmp, v_traits)
94    {}
95
96    //! @copydoc ::boost::intrusive::bstree::bstree(bstree &&)
97    bs_set_impl(BOOST_RV_REF(bs_set_impl) x)
98       :  tree_type(::boost::move(static_cast<tree_type&>(x)))
99    {}
100
101    //! @copydoc ::boost::intrusive::bstree::operator=(bstree &&)
102    bs_set_impl& operator=(BOOST_RV_REF(bs_set_impl) x)
103    {  return static_cast<bs_set_impl&>(tree_type::operator=(::boost::move(static_cast<tree_type&>(x)))); }
104
105    #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
106    //! @copydoc ::boost::intrusive::bstree::~bstree()
107    ~bs_set_impl();
108
109    //! @copydoc ::boost::intrusive::bstree::begin()
110    iterator begin();
111
112    //! @copydoc ::boost::intrusive::bstree::begin()const
113    const_iterator begin() const;
114
115    //! @copydoc ::boost::intrusive::bstree::cbegin()const
116    const_iterator cbegin() const;
117
118    //! @copydoc ::boost::intrusive::bstree::end()
119    iterator end();
120
121    //! @copydoc ::boost::intrusive::bstree::end()const
122    const_iterator end() const;
123
124    //! @copydoc ::boost::intrusive::bstree::cend()const
125    const_iterator cend() const;
126
127    //! @copydoc ::boost::intrusive::bstree::rbegin()
128    reverse_iterator rbegin();
129
130    //! @copydoc ::boost::intrusive::bstree::rbegin()const
131    const_reverse_iterator rbegin() const;
132
133    //! @copydoc ::boost::intrusive::bstree::crbegin()const
134    const_reverse_iterator crbegin() const;
135
136    //! @copydoc ::boost::intrusive::bstree::rend()
137    reverse_iterator rend();
138
139    //! @copydoc ::boost::intrusive::bstree::rend()const
140    const_reverse_iterator rend() const;
141
142    //! @copydoc ::boost::intrusive::bstree::crend()const
143    const_reverse_iterator crend() const;
144
145    //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(iterator)
146    static bs_set_impl &container_from_end_iterator(iterator end_iterator);
147
148    //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(const_iterator)
149    static const bs_set_impl &container_from_end_iterator(const_iterator end_iterator);
150
151    //! @copydoc ::boost::intrusive::bstree::container_from_iterator(iterator)
152    static bs_set_impl &container_from_iterator(iterator it);
153
154    //! @copydoc ::boost::intrusive::bstree::container_from_iterator(const_iterator)
155    static const bs_set_impl &container_from_iterator(const_iterator it);
156
157    //! @copydoc ::boost::intrusive::bstree::key_comp()const
158    key_compare key_comp() const;
159
160    //! @copydoc ::boost::intrusive::bstree::value_comp()const
161    value_compare value_comp() const;
162
163    //! @copydoc ::boost::intrusive::bstree::empty()const
164    bool empty() const;
165
166    //! @copydoc ::boost::intrusive::bstree::size()const
167    size_type size() const;
168
169    //! @copydoc ::boost::intrusive::bstree::swap
170    void swap(bs_set_impl& other);
171
172    //! @copydoc ::boost::intrusive::bstree::clone_from
173    template <class Cloner, class Disposer>
174    void clone_from(const bs_set_impl &src, Cloner cloner, Disposer disposer);
175    
176    #endif   //#ifdef BOOST_iNTRUSIVE_DOXYGEN_INVOKED
177
178    //! @copydoc ::boost::intrusive::bstree::insert_unique(reference)
179    std::pair<iterator, bool> insert(reference value)
180    {  return tree_type::insert_unique(value);  }
181
182    //! @copydoc ::boost::intrusive::bstree::insert_unique(const_iterator,reference)
183    iterator insert(const_iterator hint, reference value)
184    {  return tree_type::insert_unique(hint, value);  }
185
186    //! @copydoc ::boost::intrusive::bstree::insert_unique_check(const KeyType&,KeyValueCompare,insert_commit_data&)
187    template<class KeyType, class KeyValueCompare>
188    std::pair<iterator, bool> insert_check
189       (const KeyType &key, KeyValueCompare key_value_comp, insert_commit_data &commit_data)
190    {  return tree_type::insert_unique_check(key, key_value_comp, commit_data); }
191
192    //! @copydoc ::boost::intrusive::bstree::insert_unique_check(const_iterator,const KeyType&,KeyValueCompare,insert_commit_data&)
193    template<class KeyType, class KeyValueCompare>
194    std::pair<iterator, bool> insert_check
195       (const_iterator hint, const KeyType &key
196       ,KeyValueCompare key_value_comp, insert_commit_data &commit_data)
197    {  return tree_type::insert_unique_check(hint, key, key_value_comp, commit_data); }
198
199    //! @copydoc ::boost::intrusive::bstree::insert_unique(Iterator,Iterator)
200    template<class Iterator>
201    void insert(Iterator b, Iterator e)
202    {  tree_type::insert_unique(b, e);  }
203
204    //! @copydoc ::boost::intrusive::bstree::insert_unique_commit
205    iterator insert_commit(reference value, const insert_commit_data &commit_data)
206    {  return tree_type::insert_unique_commit(value, commit_data);  }
207
208    #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
209    //! @copydoc ::boost::intrusive::bstree::insert_before
210    iterator insert_before(const_iterator pos, reference value);
211
212    //! @copydoc ::boost::intrusive::bstree::push_back
213    void push_back(reference value);
214
215    //! @copydoc ::boost::intrusive::bstree::push_front
216    void push_front(reference value);
217
218    //! @copydoc ::boost::intrusive::bstree::erase(const_iterator)
219    iterator erase(const_iterator i);
220
221    //! @copydoc ::boost::intrusive::bstree::erase(const_iterator,const_iterator)
222    iterator erase(const_iterator b, const_iterator e);
223
224    //! @copydoc ::boost::intrusive::bstree::erase(const_reference)
225    size_type erase(const_reference value);
226
227    //! @copydoc ::boost::intrusive::bstree::erase(const KeyType&,KeyValueCompare)
228    template<class KeyType, class KeyValueCompare>
229    size_type erase(const KeyType& key, KeyValueCompare comp);
230
231    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,Disposer)
232    template<class Disposer>
233    iterator erase_and_dispose(const_iterator i, Disposer disposer);
234
235    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,const_iterator,Disposer)
236    template<class Disposer>
237    iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer);
238
239    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_reference, Disposer)
240    template<class Disposer>
241    size_type erase_and_dispose(const_reference value, Disposer disposer);
242
243    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const KeyType&,KeyValueCompare,Disposer)
244    template<class KeyType, class KeyValueCompare, class Disposer>
245    size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer);
246
247    //! @copydoc ::boost::intrusive::bstree::clear
248    void clear();
249
250    //! @copydoc ::boost::intrusive::bstree::clear_and_dispose
251    template<class Disposer>
252    void clear_and_dispose(Disposer disposer);
253
254    #endif   //   #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
255
256    //! @copydoc ::boost::intrusive::bstree::count(const_reference)const
257    size_type count(const_reference value) const
258    {  return static_cast<size_type>(this->tree_type::find(value) == this->tree_type::cend()); }
259
260    //! @copydoc ::boost::intrusive::bstree::count(const KeyType&,KeyValueCompare)const
261    template<class KeyType, class KeyValueCompare>
262    size_type count(const KeyType& key, KeyValueCompare comp) const
263    {  return static_cast<size_type>(this->tree_type::find(key, comp) == this->tree_type::cend()); }
264
265    #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
266
267    //! @copydoc ::boost::intrusive::bstree::lower_bound(const_reference)
268    iterator lower_bound(const_reference value);
269    
270    //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyValueCompare)
271    template<class KeyType, class KeyValueCompare>
272    iterator lower_bound(const KeyType& key, KeyValueCompare comp);
273
274    //! @copydoc ::boost::intrusive::bstree::lower_bound(const_reference)const
275    const_iterator lower_bound(const_reference value) const;
276
277    //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyValueCompare)const
278    template<class KeyType, class KeyValueCompare>
279    const_iterator lower_bound(const KeyType& key, KeyValueCompare comp) const;
280
281    //! @copydoc ::boost::intrusive::bstree::upper_bound(const_reference)
282    iterator upper_bound(const_reference value);
283
284    //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyValueCompare)
285    template<class KeyType, class KeyValueCompare>
286    iterator upper_bound(const KeyType& key, KeyValueCompare comp);
287
288    //! @copydoc ::boost::intrusive::bstree::upper_bound(const_reference)const
289    const_iterator upper_bound(const_reference value) const;
290
291    //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyValueCompare)const
292    template<class KeyType, class KeyValueCompare>
293    const_iterator upper_bound(const KeyType& key, KeyValueCompare comp) const;
294
295    //! @copydoc ::boost::intrusive::bstree::find(const_reference)
296    iterator find(const_reference value);
297
298    //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyValueCompare)
299    template<class KeyType, class KeyValueCompare>
300    iterator find(const KeyType& key, KeyValueCompare comp);
301
302    //! @copydoc ::boost::intrusive::bstree::find(const_reference)const
303    const_iterator find(const_reference value) const;
304
305    //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyValueCompare)const
306    template<class KeyType, class KeyValueCompare>
307    const_iterator find(const KeyType& key, KeyValueCompare comp) const;
308
309    #endif   //   #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
310
311    //! @copydoc ::boost::intrusive::rbtree::equal_range(const_reference)
312    std::pair<iterator,iterator> equal_range(const_reference value)
313    {  return this->tree_type::lower_bound_range(value); }
314
315    //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyValueCompare)
316    template<class KeyType, class KeyValueCompare>
317    std::pair<iterator,iterator> equal_range(const KeyType& key, KeyValueCompare comp)
318    {  return this->tree_type::lower_bound_range(key, comp); }
319
320    //! @copydoc ::boost::intrusive::rbtree::equal_range(const_reference)const
321    std::pair<const_iterator, const_iterator>
322       equal_range(const_reference value) const
323    {  return this->tree_type::lower_bound_range(value); }
324
325    //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyValueCompare)const
326    template<class KeyType, class KeyValueCompare>
327    std::pair<const_iterator, const_iterator>
328       equal_range(const KeyType& key, KeyValueCompare comp) const
329    {  return this->tree_type::lower_bound_range(key, comp); }
330
331    #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
332
333    //! @copydoc ::boost::intrusive::bstree::bounded_range(const_reference,const_reference,bool,bool)
334    std::pair<iterator,iterator> bounded_range
335       (const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed);
336
337    //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool)
338    template<class KeyType, class KeyValueCompare>
339    std::pair<iterator,iterator> bounded_range
340       (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed);
341
342    //! @copydoc ::boost::intrusive::bstree::bounded_range(const_reference,const_reference,bool,bool)const
343    std::pair<const_iterator, const_iterator>
344       bounded_range(const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed) const;
345
346    //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool)const
347    template<class KeyType, class KeyValueCompare>
348    std::pair<const_iterator, const_iterator> bounded_range
349          (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed) const;
350
351    //! @copydoc ::boost::intrusive::bstree::s_iterator_to(reference)
352    static iterator s_iterator_to(reference value);
353
354    //! @copydoc ::boost::intrusive::bstree::s_iterator_to(const_reference)
355    static const_iterator s_iterator_to(const_reference value);
356
357    //! @copydoc ::boost::intrusive::bstree::iterator_to(reference)
358    iterator iterator_to(reference value);
359
360    //! @copydoc ::boost::intrusive::bstree::iterator_to(const_reference)const
361    const_iterator iterator_to(const_reference value) const;
362
363    //! @copydoc ::boost::intrusive::bstree::init_node(reference)
364    static void init_node(reference value);
365
366    //! @copydoc ::boost::intrusive::bstree::unlink_leftmost_without_rebalance
367    pointer unlink_leftmost_without_rebalance();
368
369    //! @copydoc ::boost::intrusive::bstree::replace_node
370    void replace_node(iterator replace_this, reference with_this);
371
372    //! @copydoc ::boost::intrusive::bstree::remove_node
373    void remove_node(reference value);
374    #endif   //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
375 };
376
377 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
378
379 template<class T, class ...Options>
380 bool operator!= (const bs_set_impl<T, Options...> &x, const bs_set_impl<T, Options...> &y);
381
382 template<class T, class ...Options>
383 bool operator>(const bs_set_impl<T, Options...> &x, const bs_set_impl<T, Options...> &y);
384
385 template<class T, class ...Options>
386 bool operator<=(const bs_set_impl<T, Options...> &x, const bs_set_impl<T, Options...> &y);
387
388 template<class T, class ...Options>
389 bool operator>=(const bs_set_impl<T, Options...> &x, const bs_set_impl<T, Options...> &y);
390
391 template<class T, class ...Options>
392 void swap(bs_set_impl<T, Options...> &x, bs_set_impl<T, Options...> &y);
393
394 #endif   //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
395
396 //! Helper metafunction to define a \c bs_set that yields to the same type when the
397 //! same options (either explicitly or implicitly) are used.
398 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
399 template<class T, class ...Options>
400 #else
401 template<class T, class O1 = void, class O2 = void
402                 , class O3 = void, class O4 = void
403                 , class O5 = void>
404 #endif
405 struct make_bs_set
406 {
407    /// @cond
408    typedef typename pack_options
409       < bstree_defaults,
410       #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
411       O1, O2, O3, O4, O5
412       #else
413       Options...
414       #endif
415       >::type packed_options;
416
417    typedef typename detail::get_value_traits
418       <T, typename packed_options::proto_value_traits>::type value_traits;
419    typedef typename detail::get_header_holder_type
420       < value_traits, typename packed_options::header_holder_type >::type header_holder_type;
421
422    typedef bs_set_impl
423          < value_traits
424          , typename packed_options::compare
425          , typename packed_options::size_type
426          , packed_options::constant_time_size
427          , header_holder_type
428          > implementation_defined;
429    /// @endcond
430    typedef implementation_defined type;
431 };
432
433 #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
434 #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
435 template<class T, class O1, class O2, class O3, class O4, class O5>
436 #else
437 template<class T, class ...Options>
438 #endif
439 class bs_set
440    :  public make_bs_set<T,
441    #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
442    O1, O2, O3, O4, O5
443    #else
444    Options...
445    #endif
446    >::type
447 {
448    typedef typename make_bs_set
449       <T,
450       #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
451       O1, O2, O3, O4, O5
452       #else
453       Options...
454       #endif
455       >::type   Base;
456
457    BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_set)
458    public:
459    typedef typename Base::value_compare      value_compare;
460    typedef typename Base::value_traits       value_traits;
461    typedef typename Base::iterator           iterator;
462    typedef typename Base::const_iterator     const_iterator;
463
464    //Assert if passed value traits are compatible with the type
465    BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
466
467    explicit bs_set( const value_compare &cmp = value_compare()
468                   , const value_traits &v_traits = value_traits())
469       :  Base(cmp, v_traits)
470    {}
471
472    template<class Iterator>
473    bs_set( Iterator b, Iterator e
474       , const value_compare &cmp = value_compare()
475       , const value_traits &v_traits = value_traits())
476       :  Base(b, e, cmp, v_traits)
477    {}
478
479    bs_set(BOOST_RV_REF(bs_set) x)
480       :  Base(::boost::move(static_cast<Base&>(x)))
481    {}
482
483    bs_set& operator=(BOOST_RV_REF(bs_set) x)
484    {  return static_cast<bs_set &>(this->Base::operator=(::boost::move(static_cast<Base&>(x))));  }
485
486    static bs_set &container_from_end_iterator(iterator end_iterator)
487    {  return static_cast<bs_set &>(Base::container_from_end_iterator(end_iterator));   }
488
489    static const bs_set &container_from_end_iterator(const_iterator end_iterator)
490    {  return static_cast<const bs_set &>(Base::container_from_end_iterator(end_iterator));   }
491
492    static bs_set &container_from_iterator(iterator it)
493    {  return static_cast<bs_set &>(Base::container_from_iterator(it));   }
494
495    static const bs_set &container_from_iterator(const_iterator it)
496    {  return static_cast<const bs_set &>(Base::container_from_iterator(it));   }
497 };
498
499 #endif
500
501 //! The class template bs_multiset is an intrusive container, that mimics most of
502 //! the interface of std::multiset as described in the C++ standard.
503 //!
504 //! The template parameter \c T is the type to be managed by the container.
505 //! The user can specify additional options and if no options are provided
506 //! default options are used.
507 //!
508 //! The container supports the following options:
509 //! \c base_hook<>/member_hook<>/value_traits<>,
510 //! \c constant_time_size<>, \c size_type<> and
511 //! \c compare<>.
512 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
513 template<class T, class ...Options>
514 #else
515 template<class ValueTraits, class Compare, class SizeType, bool ConstantTimeSize, typename HeaderHolder>
516 #endif
517 class bs_multiset_impl
518 #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
519    : public bstree_impl<ValueTraits, Compare, SizeType, ConstantTimeSize, RbTreeAlgorithms, HeaderHolder>
520 #endif
521 {
522    /// @cond
523    typedef bstree_impl<ValueTraits, Compare, SizeType, ConstantTimeSize, RbTreeAlgorithms, HeaderHolder> tree_type;
524
525    BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_multiset_impl)
526    typedef tree_type implementation_defined;
527    /// @endcond
528
529    public:
530    typedef typename implementation_defined::value_type               value_type;
531    typedef typename implementation_defined::value_traits             value_traits;
532    typedef typename implementation_defined::pointer                  pointer;
533    typedef typename implementation_defined::const_pointer            const_pointer;
534    typedef typename implementation_defined::reference                reference;
535    typedef typename implementation_defined::const_reference          const_reference;
536    typedef typename implementation_defined::difference_type          difference_type;
537    typedef typename implementation_defined::size_type                size_type;
538    typedef typename implementation_defined::value_compare            value_compare;
539    typedef typename implementation_defined::key_compare              key_compare;
540    typedef typename implementation_defined::iterator                 iterator;
541    typedef typename implementation_defined::const_iterator           const_iterator;
542    typedef typename implementation_defined::reverse_iterator         reverse_iterator;
543    typedef typename implementation_defined::const_reverse_iterator   const_reverse_iterator;
544    typedef typename implementation_defined::insert_commit_data       insert_commit_data;
545    typedef typename implementation_defined::node_traits              node_traits;
546    typedef typename implementation_defined::node                     node;
547    typedef typename implementation_defined::node_ptr                 node_ptr;
548    typedef typename implementation_defined::const_node_ptr           const_node_ptr;
549    typedef typename implementation_defined::node_algorithms          node_algorithms;
550
551    static const bool constant_time_size = tree_type::constant_time_size;
552
553    public:
554    //! @copydoc ::boost::intrusive::bstree::bstree(const value_compare &,const value_traits &)
555    explicit bs_multiset_impl( const value_compare &cmp = value_compare()
556                             , const value_traits &v_traits = value_traits())
557       :  tree_type(cmp, v_traits)
558    {}
559
560    //! @copydoc ::boost::intrusive::bstree::bstree(bool,Iterator,Iterator,const value_compare &,const value_traits &)
561    template<class Iterator>
562    bs_multiset_impl( Iterator b, Iterator e
563                 , const value_compare &cmp = value_compare()
564                 , const value_traits &v_traits = value_traits())
565       : tree_type(false, b, e, cmp, v_traits)
566    {}
567
568    //! @copydoc ::boost::intrusive::bstree::bstree(bstree &&)
569    bs_multiset_impl(BOOST_RV_REF(bs_multiset_impl) x)
570       :  tree_type(::boost::move(static_cast<tree_type&>(x)))
571    {}
572
573    //! @copydoc ::boost::intrusive::bstree::operator=(bstree &&)
574    bs_multiset_impl& operator=(BOOST_RV_REF(bs_multiset_impl) x)
575    {  return static_cast<bs_multiset_impl&>(tree_type::operator=(::boost::move(static_cast<tree_type&>(x)))); }
576
577    #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
578    //! @copydoc ::boost::intrusive::bstree::~bstree()
579    ~bs_multiset_impl();
580
581    //! @copydoc ::boost::intrusive::bstree::begin()
582    iterator begin();
583
584    //! @copydoc ::boost::intrusive::bstree::begin()const
585    const_iterator begin() const;
586
587    //! @copydoc ::boost::intrusive::bstree::cbegin()const
588    const_iterator cbegin() const;
589
590    //! @copydoc ::boost::intrusive::bstree::end()
591    iterator end();
592
593    //! @copydoc ::boost::intrusive::bstree::end()const
594    const_iterator end() const;
595
596    //! @copydoc ::boost::intrusive::bstree::cend()const
597    const_iterator cend() const;
598
599    //! @copydoc ::boost::intrusive::bstree::rbegin()
600    reverse_iterator rbegin();
601
602    //! @copydoc ::boost::intrusive::bstree::rbegin()const
603    const_reverse_iterator rbegin() const;
604
605    //! @copydoc ::boost::intrusive::bstree::crbegin()const
606    const_reverse_iterator crbegin() const;
607
608    //! @copydoc ::boost::intrusive::bstree::rend()
609    reverse_iterator rend();
610
611    //! @copydoc ::boost::intrusive::bstree::rend()const
612    const_reverse_iterator rend() const;
613
614    //! @copydoc ::boost::intrusive::bstree::crend()const
615    const_reverse_iterator crend() const;
616
617    //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(iterator)
618    static bs_multiset_impl &container_from_end_iterator(iterator end_iterator);
619
620    //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(const_iterator)
621    static const bs_multiset_impl &container_from_end_iterator(const_iterator end_iterator);
622
623    //! @copydoc ::boost::intrusive::bstree::container_from_iterator(iterator)
624    static bs_multiset_impl &container_from_iterator(iterator it);
625
626    //! @copydoc ::boost::intrusive::bstree::container_from_iterator(const_iterator)
627    static const bs_multiset_impl &container_from_iterator(const_iterator it);
628
629    //! @copydoc ::boost::intrusive::bstree::key_comp()const
630    key_compare key_comp() const;
631
632    //! @copydoc ::boost::intrusive::bstree::value_comp()const
633    value_compare value_comp() const;
634
635    //! @copydoc ::boost::intrusive::bstree::empty()const
636    bool empty() const;
637
638    //! @copydoc ::boost::intrusive::bstree::size()const
639    size_type size() const;
640
641    //! @copydoc ::boost::intrusive::bstree::swap
642    void swap(bs_multiset_impl& other);
643
644    //! @copydoc ::boost::intrusive::bstree::clone_from
645    template <class Cloner, class Disposer>
646    void clone_from(const bs_multiset_impl &src, Cloner cloner, Disposer disposer);
647
648    #endif   //#ifdef BOOST_iNTRUSIVE_DOXYGEN_INVOKED
649
650    //! @copydoc ::boost::intrusive::bstree::insert_equal(reference)
651    iterator insert(reference value)
652    {  return tree_type::insert_equal(value);  }
653
654    //! @copydoc ::boost::intrusive::bstree::insert_equal(const_iterator,reference)
655    iterator insert(const_iterator hint, reference value)
656    {  return tree_type::insert_equal(hint, value);  }
657
658    //! @copydoc ::boost::intrusive::bstree::insert_equal(Iterator,Iterator)
659    template<class Iterator>
660    void insert(Iterator b, Iterator e)
661    {  tree_type::insert_equal(b, e);  }
662
663    #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
664    //! @copydoc ::boost::intrusive::bstree::insert_before
665    iterator insert_before(const_iterator pos, reference value);
666
667    //! @copydoc ::boost::intrusive::bstree::push_back
668    void push_back(reference value);
669
670    //! @copydoc ::boost::intrusive::bstree::push_front
671    void push_front(reference value);
672
673    //! @copydoc ::boost::intrusive::bstree::erase(const_iterator)
674    iterator erase(const_iterator i);
675
676    //! @copydoc ::boost::intrusive::bstree::erase(const_iterator,const_iterator)
677    iterator erase(const_iterator b, const_iterator e);
678
679    //! @copydoc ::boost::intrusive::bstree::erase(const_reference)
680    size_type erase(const_reference value);
681
682    //! @copydoc ::boost::intrusive::bstree::erase(const KeyType&,KeyValueCompare)
683    template<class KeyType, class KeyValueCompare>
684    size_type erase(const KeyType& key, KeyValueCompare comp);
685
686    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,Disposer)
687    template<class Disposer>
688    iterator erase_and_dispose(const_iterator i, Disposer disposer);
689
690    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,const_iterator,Disposer)
691    template<class Disposer>
692    iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer);
693
694    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_reference, Disposer)
695    template<class Disposer>
696    size_type erase_and_dispose(const_reference value, Disposer disposer);
697
698    //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const KeyType&,KeyValueCompare,Disposer)
699    template<class KeyType, class KeyValueCompare, class Disposer>
700    size_type erase_and_dispose(const KeyType& key, KeyValueCompare comp, Disposer disposer);
701
702    //! @copydoc ::boost::intrusive::bstree::clear
703    void clear();
704
705    //! @copydoc ::boost::intrusive::bstree::clear_and_dispose
706    template<class Disposer>
707    void clear_and_dispose(Disposer disposer);
708
709    //! @copydoc ::boost::intrusive::bstree::count(const_reference)const
710    size_type count(const_reference value) const;
711
712    //! @copydoc ::boost::intrusive::bstree::count(const KeyType&,KeyValueCompare)const
713    template<class KeyType, class KeyValueCompare>
714    size_type count(const KeyType& key, KeyValueCompare comp) const;
715    
716    //! @copydoc ::boost::intrusive::bstree::lower_bound(const_reference)
717    iterator lower_bound(const_reference value);
718    
719    //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyValueCompare)
720    template<class KeyType, class KeyValueCompare>
721    iterator lower_bound(const KeyType& key, KeyValueCompare comp);
722
723    //! @copydoc ::boost::intrusive::bstree::lower_bound(const_reference)const
724    const_iterator lower_bound(const_reference value) const;
725
726    //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyValueCompare)const
727    template<class KeyType, class KeyValueCompare>
728    const_iterator lower_bound(const KeyType& key, KeyValueCompare comp) const;
729
730    //! @copydoc ::boost::intrusive::bstree::upper_bound(const_reference)
731    iterator upper_bound(const_reference value);
732
733    //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyValueCompare)
734    template<class KeyType, class KeyValueCompare>
735    iterator upper_bound(const KeyType& key, KeyValueCompare comp);
736
737    //! @copydoc ::boost::intrusive::bstree::upper_bound(const_reference)const
738    const_iterator upper_bound(const_reference value) const;
739
740    //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyValueCompare)const
741    template<class KeyType, class KeyValueCompare>
742    const_iterator upper_bound(const KeyType& key, KeyValueCompare comp) const;
743
744    //! @copydoc ::boost::intrusive::bstree::find(const_reference)
745    iterator find(const_reference value);
746
747    //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyValueCompare)
748    template<class KeyType, class KeyValueCompare>
749    iterator find(const KeyType& key, KeyValueCompare comp);
750
751    //! @copydoc ::boost::intrusive::bstree::find(const_reference)const
752    const_iterator find(const_reference value) const;
753
754    //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyValueCompare)const
755    template<class KeyType, class KeyValueCompare>
756    const_iterator find(const KeyType& key, KeyValueCompare comp) const;
757
758    //! @copydoc ::boost::intrusive::bstree::equal_range(const_reference)
759    std::pair<iterator,iterator> equal_range(const_reference value);
760
761    //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyValueCompare)
762    template<class KeyType, class KeyValueCompare>
763    std::pair<iterator,iterator> equal_range(const KeyType& key, KeyValueCompare comp);
764
765    //! @copydoc ::boost::intrusive::bstree::equal_range(const_reference)const
766    std::pair<const_iterator, const_iterator>
767       equal_range(const_reference value) const;
768
769    //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyValueCompare)const
770    template<class KeyType, class KeyValueCompare>
771    std::pair<const_iterator, const_iterator>
772       equal_range(const KeyType& key, KeyValueCompare comp) const;
773
774    //! @copydoc ::boost::intrusive::bstree::bounded_range(const_reference,const_reference,bool,bool)
775    std::pair<iterator,iterator> bounded_range
776       (const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed);
777
778    //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool)
779    template<class KeyType, class KeyValueCompare>
780    std::pair<iterator,iterator> bounded_range
781       (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed);
782
783    //! @copydoc ::boost::intrusive::bstree::bounded_range(const_reference,const_reference,bool,bool)const
784    std::pair<const_iterator, const_iterator>
785       bounded_range(const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed) const;
786
787    //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyValueCompare,bool,bool)const
788    template<class KeyType, class KeyValueCompare>
789    std::pair<const_iterator, const_iterator> bounded_range
790          (const KeyType& lower_key, const KeyType& upper_key, KeyValueCompare comp, bool left_closed, bool right_closed) const;
791
792    //! @copydoc ::boost::intrusive::bstree::s_iterator_to(reference)
793    static iterator s_iterator_to(reference value);
794
795    //! @copydoc ::boost::intrusive::bstree::s_iterator_to(const_reference)
796    static const_iterator s_iterator_to(const_reference value);
797
798    //! @copydoc ::boost::intrusive::bstree::iterator_to(reference)
799    iterator iterator_to(reference value);
800
801    //! @copydoc ::boost::intrusive::bstree::iterator_to(const_reference)const
802    const_iterator iterator_to(const_reference value) const;
803
804    //! @copydoc ::boost::intrusive::bstree::init_node(reference)
805    static void init_node(reference value);
806
807    //! @copydoc ::boost::intrusive::bstree::unlink_leftmost_without_rebalance
808    pointer unlink_leftmost_without_rebalance();
809
810    //! @copydoc ::boost::intrusive::bstree::replace_node
811    void replace_node(iterator replace_this, reference with_this);
812
813    //! @copydoc ::boost::intrusive::bstree::remove_node
814    void remove_node(reference value);
815    #endif   //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED
816 };
817
818 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
819
820 template<class T, class ...Options>
821 bool operator!= (const bs_multiset_impl<T, Options...> &x, const bs_multiset_impl<T, Options...> &y);
822
823 template<class T, class ...Options>
824 bool operator>(const bs_multiset_impl<T, Options...> &x, const bs_multiset_impl<T, Options...> &y);
825
826 template<class T, class ...Options>
827 bool operator<=(const bs_multiset_impl<T, Options...> &x, const bs_multiset_impl<T, Options...> &y);
828
829 template<class T, class ...Options>
830 bool operator>=(const bs_multiset_impl<T, Options...> &x, const bs_multiset_impl<T, Options...> &y);
831
832 template<class T, class ...Options>
833 void swap(bs_multiset_impl<T, Options...> &x, bs_multiset_impl<T, Options...> &y);
834
835 #endif   //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
836
837 //! Helper metafunction to define a \c bs_multiset that yields to the same type when the
838 //! same options (either explicitly or implicitly) are used.
839 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
840 template<class T, class ...Options>
841 #else
842 template<class T, class O1 = void, class O2 = void
843                 , class O3 = void, class O4 = void
844                 , class O5 = void>
845 #endif
846 struct make_bs_multiset
847 {
848    /// @cond
849    typedef typename pack_options
850       < bstree_defaults,
851       #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
852       O1, O2, O3, O4, O5
853       #else
854       Options...
855       #endif
856       >::type packed_options;
857
858    typedef typename detail::get_value_traits
859       <T, typename packed_options::proto_value_traits>::type value_traits;
860    typedef typename detail::get_header_holder_type
861       < value_traits, typename packed_options::header_holder_type >::type header_holder_type;
862
863    typedef bs_multiset_impl
864          < value_traits
865          , typename packed_options::compare
866          , typename packed_options::size_type
867          , packed_options::constant_time_size
868          , header_holder_type
869          > implementation_defined;
870    /// @endcond
871    typedef implementation_defined type;
872 };
873
874 #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED
875
876 #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
877 template<class T, class O1, class O2, class O3, class O4, class O5>
878 #else
879 template<class T, class ...Options>
880 #endif
881 class bs_multiset
882    :  public make_bs_multiset<T,
883       #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
884       O1, O2, O3, O4, O5
885       #else
886       Options...
887       #endif
888       >::type
889 {
890    typedef typename make_bs_multiset<T,
891       #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
892       O1, O2, O3, O4, O5
893       #else
894       Options...
895       #endif
896       >::type   Base;
897
898    BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_multiset)
899
900    public:
901    typedef typename Base::value_compare      value_compare;
902    typedef typename Base::value_traits       value_traits;
903    typedef typename Base::iterator           iterator;
904    typedef typename Base::const_iterator     const_iterator;
905
906    //Assert if passed value traits are compatible with the type
907    BOOST_STATIC_ASSERT((detail::is_same<typename value_traits::value_type, T>::value));
908
909    explicit bs_multiset( const value_compare &cmp = value_compare()
910                        , const value_traits &v_traits = value_traits())
911       :  Base(cmp, v_traits)
912    {}
913
914    template<class Iterator>
915    bs_multiset( Iterator b, Iterator e
916            , const value_compare &cmp = value_compare()
917            , const value_traits &v_traits = value_traits())
918       :  Base(b, e, cmp, v_traits)
919    {}
920
921    bs_multiset(BOOST_RV_REF(bs_multiset) x)
922       :  Base(::boost::move(static_cast<Base&>(x)))
923    {}
924
925    bs_multiset& operator=(BOOST_RV_REF(bs_multiset) x)
926    {  return static_cast<bs_multiset &>(this->Base::operator=(::boost::move(static_cast<Base&>(x))));  }
927
928    static bs_multiset &container_from_end_iterator(iterator end_iterator)
929    {  return static_cast<bs_multiset &>(Base::container_from_end_iterator(end_iterator));   }
930
931    static const bs_multiset &container_from_end_iterator(const_iterator end_iterator)
932    {  return static_cast<const bs_multiset &>(Base::container_from_end_iterator(end_iterator));   }
933
934    static bs_multiset &container_from_iterator(iterator it)
935    {  return static_cast<bs_multiset &>(Base::container_from_iterator(it));   }
936
937    static const bs_multiset &container_from_iterator(const_iterator it)
938    {  return static_cast<const bs_multiset &>(Base::container_from_iterator(it));   }
939 };
940
941 #endif
942
943 } //namespace intrusive
944 } //namespace boost
945
946 #include <boost/intrusive/detail/config_end.hpp>
947
948 #endif //BOOST_INTRUSIVE_BS_SET_HPP