annotate DEPENDENCIES/generic/include/boost/intrusive/avl_set.hpp @ 16:2665513ce2d3

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