treap_set.hpp 40 KB

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