treap_set.hpp 45 KB

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