annotate DEPENDENCIES/generic/include/boost/intrusive/set.hpp @ 125:34e428693f5d vext

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