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