5 * This material is provided "as is", with absolutely no warranty expressed
6 * or implied. Any use is at your own risk.
8 * Permission to use or copy this software for any purpose is hereby granted
9 * without fee, provided the above notices are retained on all copies.
10 * Permission to modify the code and to distribute modified code is granted,
11 * provided the above notices are retained, and a notice that the code was
12 * modified is included with the above copyright notice.
15 /* NOTE: This is an internal header file, included by other STL headers.
16 * You should not attempt to use it directly.
19 #ifndef _STLP_PTR_SPECIALIZED_SET_H
20 #define _STLP_PTR_SPECIALIZED_SET_H
22 #ifndef _STLP_POINTERS_SPEC_TOOLS_H
23 # include <stl/pointers/_tools.h>
28 #if defined (__BORLANDC__) || defined (__DMC__)
32 //Specific iterator traits creation
33 _STLP_CREATE_ITERATOR_TRAITS(SetTraitsT
, Const_traits
)
35 #if defined (_STLP_USE_TEMPLATE_EXPORT) && !defined (_STLP_USE_MSVC6_MEM_T_BUG_WORKAROUND)
36 _STLP_EXPORT
template struct _STLP_CLASS_DECLSPEC less
<void*>;
38 _STLP_MOVE_TO_PRIV_NAMESPACE
40 typedef _Rb_tree_node
<void*> _Node
;
41 _STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy
<_Rb_tree_node_base
, _Node
, allocator
<_Node
> >;
42 _STLP_EXPORT_TEMPLATE_CLASS _Rb_tree_base
<void*, allocator
<void*> >;
43 # if defined (_STLP_DEBUG)
44 _STLP_EXPORT_TEMPLATE_CLASS _DbgCompare
<void*, less
<void*> >;
45 # define _Rb_tree _STLP_NON_DBG_NAME(Rb_tree)
46 _STLP_EXPORT_TEMPLATE_CLASS _Rb_tree
<void*, _DbgCompare
<void*, less
<void*> >, void*, _Identity
<void*>,
47 _SetTraitsT
<void*>, allocator
<void*> >;
50 _STLP_EXPORT_TEMPLATE_CLASS _Rb_tree
<void*, less
<void*>, void*, _Identity
<void*>,
51 _SetTraitsT
<void*>, allocator
<void*> >;
52 _STLP_MOVE_TO_STD_NAMESPACE
55 template <class _Key
, _STLP_DFL_TMPL_PARAM(_Compare
, less
<_Key
>),
56 _STLP_DFL_TMPL_PARAM(_Alloc
, allocator
<_Key
>) >
58 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
59 : public __stlport_class
<set
<_Key
, _Compare
, _Alloc
> >
62 #if !defined (__BORLANDC__)
63 typedef _STLP_PRIV _AssocStorageTypes
<_Key
, _Compare
> _AssocStorageTypes
;
64 typedef typename
_AssocStorageTypes::_KeyStorageType _KeyStorageType
;
65 typedef typename
_AssocStorageTypes::_CompareStorageType _CompareStorageType
;
67 typedef _STLP_PRIV _AssocStorageTypes
<_Key
, _Compare
>::_KeyStorageType _KeyStorageType
;
68 typedef _STLP_PRIV _AssocStorageTypes
<_Key
, _Compare
>::_CompareStorageType _CompareStorageType
;
70 typedef typename _Alloc_traits
<_KeyStorageType
, _Alloc
>::allocator_type _StorageTypeAlloc
;
71 typedef _STLP_PRIV _CastTraits
<_KeyStorageType
, _Key
> cast_traits
;
73 typedef set
<_Key
, _Compare
, _Alloc
> _Self
;
75 typedef _Key key_type
;
76 typedef _Key value_type
;
77 typedef _Compare key_compare
;
78 typedef _Compare value_compare
;
81 //Specific iterator traits creation
82 typedef _STLP_PRIV _SetTraitsT
<value_type
> _SetTraits
;
83 typedef _STLP_PRIV _Rb_tree
<key_type
, key_compare
,
84 value_type
, _STLP_PRIV _Identity
<value_type
>,
85 _SetTraits
, _Alloc
> _Priv_Rep_type
;
87 typedef _STLP_PRIV _SetTraitsT
<_KeyStorageType
> _SetStorageTraits
;
90 //dums: need the following public for the __move_traits framework
91 typedef _STLP_PRIV _Rb_tree
<_KeyStorageType
, _CompareStorageType
,
92 _KeyStorageType
, _STLP_PRIV _Identity
<_KeyStorageType
>,
93 _SetStorageTraits
, _StorageTypeAlloc
> _Rep_type
;
96 typedef typename
_Rep_type::iterator base_iterator
;
97 typedef typename
_Rep_type::const_iterator const_base_iterator
;
100 typedef typename
_Priv_Rep_type::pointer pointer
;
101 typedef typename
_Priv_Rep_type::const_pointer const_pointer
;
102 typedef typename
_Priv_Rep_type::reference reference
;
103 typedef typename
_Priv_Rep_type::const_reference const_reference
;
104 typedef typename
_Priv_Rep_type::iterator iterator
;
105 typedef typename
_Priv_Rep_type::const_iterator const_iterator
;
106 typedef typename
_Priv_Rep_type::reverse_iterator reverse_iterator
;
107 typedef typename
_Priv_Rep_type::const_reverse_iterator const_reverse_iterator
;
108 typedef typename
_Priv_Rep_type::size_type size_type
;
109 typedef typename
_Priv_Rep_type::difference_type difference_type
;
110 typedef typename
_Priv_Rep_type::allocator_type allocator_type
;
113 _Rep_type _M_t
; // red-black tree representing set
114 _STLP_KEY_TYPE_FOR_CONT_EXT(key_type
)
116 #if defined (_STLP_DEBUG)
117 static iterator
_S_to_value_ite(const_base_iterator __ite
)
118 { return iterator(__ite
._Owner(), __ite
._M_iterator
._M_node
); }
119 static base_iterator
_S_to_storage_ite(const_iterator __ite
)
120 { return base_iterator(__ite
._Owner(), __ite
._M_iterator
._M_node
); }
122 static iterator
_S_to_value_ite(const_base_iterator __ite
)
123 { return iterator(__ite
._M_node
); }
124 static base_iterator
_S_to_storage_ite(const_iterator __ite
)
125 { return base_iterator(__ite
._M_node
); }
129 set() : _M_t(_CompareStorageType(), _StorageTypeAlloc()) {}
130 explicit set(const _Compare
& __comp
,
131 const allocator_type
& __a
= allocator_type())
132 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
)) {}
134 #if defined (_STLP_MEMBER_TEMPLATES)
135 template <class _InputIterator
>
136 set(_InputIterator __first
, _InputIterator __last
)
137 : _M_t(_Compare(), _StorageTypeAlloc()) {
138 # if defined (_STLP_USE_ITERATOR_WRAPPER)
139 _M_t
.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
140 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
142 _M_t
.insert_unique(__first
, __last
);
146 # if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
147 template <class _InputIterator
>
148 set(_InputIterator __first
, _InputIterator __last
, const _Compare
& __comp
)
149 : _M_t(__comp
, _StorageTypeAlloc()) {
150 # if defined (_STLP_USE_ITERATOR_WRAPPER)
151 _M_t
.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
152 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
154 _M_t
.insert_unique(__first
, __last
);
158 template <class _InputIterator
>
159 set(_InputIterator __first
, _InputIterator __last
, const _Compare
& __comp
,
160 const allocator_type
& __a _STLP_ALLOCATOR_TYPE_DFL
)
161 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
)) {
162 # if defined (_STLP_USE_ITERATOR_WRAPPER)
163 _M_t
.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
164 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
166 _M_t
.insert_unique(__first
, __last
);
170 set(const value_type
* __first
, const value_type
* __last
)
171 : _M_t(_Compare(), _StorageTypeAlloc()) {
172 _M_t
.insert_unique(cast_traits::to_storage_type_cptr(__first
),
173 cast_traits::to_storage_type_cptr(__last
));
176 set(const value_type
* __first
, const value_type
* __last
,
177 const _Compare
& __comp
, const allocator_type
& __a
= allocator_type())
178 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
)) {
179 _M_t
.insert_unique(cast_traits::to_storage_type_cptr(__first
),
180 cast_traits::to_storage_type_cptr(__last
));
183 set(const_iterator __first
, const_iterator __last
)
184 : _M_t(_Compare(), _StorageTypeAlloc())
185 { _M_t
.insert_unique(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
187 set(const_iterator __first
, const_iterator __last
,
188 const _Compare
& __comp
, const allocator_type
& __a
= allocator_type())
189 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
))
190 { _M_t
.insert_unique(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
191 #endif /* _STLP_MEMBER_TEMPLATES */
193 set(const _Self
& __x
) : _M_t(__x
._M_t
) {}
195 #if !defined (_STLP_NO_MOVE_SEMANTIC)
196 set(__move_source
<_Self
> src
)
197 : _M_t(__move_source
<_Rep_type
>(src
.get()._M_t
)) {}
200 _Self
& operator=(const _Self
& __x
) {
206 key_compare
key_comp() const { return _M_t
.key_comp(); }
207 value_compare
value_comp() const { return _M_t
.key_comp(); }
208 allocator_type
get_allocator() const
209 { return _STLP_CONVERT_ALLOCATOR(_M_t
.get_allocator(), value_type
); }
211 iterator
begin() { return _S_to_value_ite(_M_t
.begin()); }
212 iterator
end() { return _S_to_value_ite(_M_t
.end()); }
213 const_iterator
begin() const { return _S_to_value_ite(_M_t
.begin()); }
214 const_iterator
end() const { return _S_to_value_ite(_M_t
.end()); }
215 reverse_iterator
rbegin() { return reverse_iterator(end()); }
216 reverse_iterator
rend() { return reverse_iterator(begin()); }
217 const_reverse_iterator
rbegin() const { return const_reverse_iterator(end()); }
218 const_reverse_iterator
rend() const { return const_reverse_iterator(begin()); }
219 bool empty() const { return _M_t
.empty(); }
220 size_type
size() const { return _M_t
.size(); }
221 size_type
max_size() const { return _M_t
.max_size(); }
222 void swap(_Self
& __x
) { _M_t
.swap(__x
._M_t
); }
223 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
224 void _M_swap_workaround(_Self
& __x
) { swap(__x
); }
228 pair
<iterator
,bool> insert(const value_type
& __x
) {
229 pair
<base_iterator
, bool> ret
= _M_t
.insert_unique(cast_traits::to_storage_type_cref(__x
));
230 return pair
<iterator
, bool>(_S_to_value_ite(ret
.first
), ret
.second
);
232 iterator
insert(iterator __pos
, const value_type
& __x
)
233 { return _S_to_value_ite(_M_t
.insert_unique(_S_to_storage_ite(__pos
), cast_traits::to_storage_type_cref(__x
))); }
235 #if defined (_STLP_MEMBER_TEMPLATES)
236 template <class _InputIterator
>
237 void insert(_InputIterator __first
, _InputIterator __last
) {
238 # if defined (_STLP_USE_ITERATOR_WRAPPER)
239 _M_t
.insert_unique(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
240 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
242 _M_t
.insert_unique(__first
, __last
);
246 void insert(const_iterator __first
, const_iterator __last
)
247 { _M_t
.insert_unique(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
248 void insert(const value_type
* __first
, const value_type
* __last
) {
249 _M_t
.insert_unique(cast_traits::to_storage_type_cptr(__first
),
250 cast_traits::to_storage_type_cptr(__last
));
253 void erase(iterator __pos
)
254 { _M_t
.erase(_S_to_storage_ite(__pos
)); }
255 size_type
erase(const key_type
& __x
)
256 { return _M_t
.erase_unique(cast_traits::to_storage_type_cref(__x
)); }
257 void erase(iterator __first
, iterator __last
)
258 { _M_t
.erase(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
259 void clear() { _M_t
.clear(); }
262 _STLP_TEMPLATE_FOR_CONT_EXT
263 const_iterator
find(const _KT
& __x
) const
264 { return _S_to_value_ite(_M_t
.find(cast_traits::to_storage_type_crefT(__x
))); }
265 _STLP_TEMPLATE_FOR_CONT_EXT
266 iterator
find(const _KT
& __x
)
267 { return _S_to_value_ite(_M_t
.find(cast_traits::to_storage_type_crefT(__x
))); }
268 _STLP_TEMPLATE_FOR_CONT_EXT
269 size_type
count(const _KT
& __x
) const
270 { return _M_t
.find(cast_traits::to_storage_type_crefT(__x
)) == _M_t
.end() ? 0 : 1; }
271 _STLP_TEMPLATE_FOR_CONT_EXT
272 iterator
lower_bound(const _KT
& __x
)
273 { return _S_to_value_ite(_M_t
.lower_bound(cast_traits::to_storage_type_crefT(__x
))); }
274 _STLP_TEMPLATE_FOR_CONT_EXT
275 const_iterator
lower_bound(const _KT
& __x
) const
276 { return _S_to_value_ite(_M_t
.lower_bound(cast_traits::to_storage_type_crefT(__x
))); }
277 _STLP_TEMPLATE_FOR_CONT_EXT
278 iterator
upper_bound(const _KT
& __x
)
279 { return _S_to_value_ite(_M_t
.upper_bound(cast_traits::to_storage_type_crefT(__x
))); }
280 _STLP_TEMPLATE_FOR_CONT_EXT
281 const_iterator
upper_bound(const _KT
& __x
) const
282 { return _S_to_value_ite(_M_t
.upper_bound(cast_traits::to_storage_type_crefT(__x
))); }
283 _STLP_TEMPLATE_FOR_CONT_EXT
284 pair
<iterator
, iterator
> equal_range(const _KT
& __x
) {
285 pair
<base_iterator
, base_iterator
> __ret
;
286 __ret
= _M_t
.equal_range(cast_traits::to_storage_type_crefT(__x
));
287 return pair
<iterator
, iterator
>(_S_to_value_ite(__ret
.first
),
288 _S_to_value_ite(__ret
.second
));
290 _STLP_TEMPLATE_FOR_CONT_EXT
291 pair
<const_iterator
, const_iterator
> equal_range(const _KT
& __x
) const {
292 pair
<const_base_iterator
, const_base_iterator
> __ret
;
293 __ret
= _M_t
.equal_range_unique(cast_traits::to_storage_type_crefT(__x
));
294 return pair
<const_iterator
, const_iterator
>(_S_to_value_ite(__ret
.first
),
295 _S_to_value_ite(__ret
.second
));
299 //Specific iterator traits creation
300 _STLP_CREATE_ITERATOR_TRAITS(MultisetTraitsT
, Const_traits
)
302 template <class _Key
, _STLP_DFL_TMPL_PARAM(_Compare
, less
<_Key
>),
303 _STLP_DFL_TMPL_PARAM(_Alloc
, allocator
<_Key
>) >
305 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND)
306 : public __stlport_class
<multiset
<_Key
, _Compare
, _Alloc
> >
309 #if !defined (__BORLANDC__)
310 typedef _STLP_PRIV _AssocStorageTypes
<_Key
, _Compare
> _AssocStorageTypes
;
311 typedef typename
_AssocStorageTypes::_KeyStorageType _KeyStorageType
;
312 typedef typename
_AssocStorageTypes::_CompareStorageType _CompareStorageType
;
314 typedef _STLP_PRIV _AssocStorageTypes
<_Key
, _Compare
>::_KeyStorageType _KeyStorageType
;
315 typedef _STLP_PRIV _AssocStorageTypes
<_Key
, _Compare
>::_CompareStorageType _CompareStorageType
;
317 typedef typename _Alloc_traits
<_KeyStorageType
, _Alloc
>::allocator_type _StorageTypeAlloc
;
318 typedef _STLP_PRIV _CastTraits
<_KeyStorageType
, _Key
> cast_traits
;
320 typedef multiset
<_Key
, _Compare
, _Alloc
> _Self
;
323 typedef _Key key_type
;
324 typedef _Key value_type
;
325 typedef _Compare key_compare
;
326 typedef _Compare value_compare
;
329 //Specific iterator traits creation
330 typedef _STLP_PRIV _MultisetTraitsT
<value_type
> _MultisetTraits
;
331 typedef _STLP_PRIV _Rb_tree
<key_type
, key_compare
,
332 value_type
, _STLP_PRIV _Identity
<value_type
>,
333 _MultisetTraits
, _Alloc
> _Priv_Rep_type
;
335 typedef _STLP_PRIV _MultisetTraitsT
<_KeyStorageType
> _MultisetStorageTraits
;
337 //dums: need the following public for the __move_traits framework
338 typedef _STLP_PRIV _Rb_tree
<_KeyStorageType
, _CompareStorageType
,
339 _KeyStorageType
, _STLP_PRIV _Identity
<_KeyStorageType
>,
340 _MultisetStorageTraits
, _StorageTypeAlloc
> _Rep_type
;
343 typedef typename
_Rep_type::iterator base_iterator
;
344 typedef typename
_Rep_type::const_iterator const_base_iterator
;
347 typedef typename
_Priv_Rep_type::pointer pointer
;
348 typedef typename
_Priv_Rep_type::const_pointer const_pointer
;
349 typedef typename
_Priv_Rep_type::reference reference
;
350 typedef typename
_Priv_Rep_type::const_reference const_reference
;
351 typedef typename
_Priv_Rep_type::iterator iterator
;
352 typedef typename
_Priv_Rep_type::const_iterator const_iterator
;
353 typedef typename
_Priv_Rep_type::reverse_iterator reverse_iterator
;
354 typedef typename
_Priv_Rep_type::const_reverse_iterator const_reverse_iterator
;
355 typedef typename
_Priv_Rep_type::size_type size_type
;
356 typedef typename
_Priv_Rep_type::difference_type difference_type
;
357 typedef typename
_Priv_Rep_type::allocator_type allocator_type
;
360 _Rep_type _M_t
; // red-black tree representing multiset
361 _STLP_KEY_TYPE_FOR_CONT_EXT(key_type
)
363 #if defined (_STLP_DEBUG)
364 static iterator
_S_to_value_ite(const_base_iterator __ite
)
365 { return iterator(__ite
._Owner(), __ite
._M_iterator
._M_node
); }
366 static base_iterator
_S_to_storage_ite(const_iterator __ite
)
367 { return base_iterator(__ite
._Owner(), __ite
._M_iterator
._M_node
); }
369 static iterator
_S_to_value_ite(const_base_iterator __ite
)
370 { return iterator(__ite
._M_node
); }
371 static base_iterator
_S_to_storage_ite(const_iterator __ite
)
372 { return base_iterator(__ite
._M_node
); }
376 multiset() : _M_t(_Compare(), _StorageTypeAlloc()) {}
377 explicit multiset(const _Compare
& __comp
,
378 const allocator_type
& __a
= allocator_type())
379 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
)) {}
381 #if defined (_STLP_MEMBER_TEMPLATES)
382 template <class _InputIterator
>
383 multiset(_InputIterator __first
, _InputIterator __last
)
384 : _M_t(_Compare(), _StorageTypeAlloc()) {
385 # if defined (_STLP_USE_ITERATOR_WRAPPER)
386 _M_t
.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
387 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
389 _M_t
.insert_equal(__first
, __last
);
393 # if defined (_STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS)
394 template <class _InputIterator
>
395 multiset(_InputIterator __first
, _InputIterator __last
,
396 const _Compare
& __comp
)
397 : _M_t(__comp
, _StorageTypeAlloc()) {
398 # if defined (_STLP_USE_ITERATOR_WRAPPER)
399 _M_t
.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
400 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
402 _M_t
.insert_equal(__first
, __last
);
406 template <class _InputIterator
>
407 multiset(_InputIterator __first
, _InputIterator __last
,
408 const _Compare
& __comp
,
409 const allocator_type
& __a _STLP_ALLOCATOR_TYPE_DFL
)
410 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
)) {
411 # if defined (_STLP_USE_ITERATOR_WRAPPER)
412 _M_t
.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
413 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
415 _M_t
.insert_equal(__first
, __last
);
420 multiset(const value_type
* __first
, const value_type
* __last
)
421 : _M_t(_Compare(), _StorageTypeAlloc()) {
422 _M_t
.insert_equal(cast_traits::to_storage_type_cptr(__first
),
423 cast_traits::to_storage_type_cptr(__last
));
426 multiset(const value_type
* __first
, const value_type
* __last
,
427 const _Compare
& __comp
,
428 const allocator_type
& __a
= allocator_type())
429 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
)) {
430 _M_t
.insert_equal(cast_traits::to_storage_type_cptr(__first
),
431 cast_traits::to_storage_type_cptr(__last
));
434 multiset(const_iterator __first
, const_iterator __last
)
435 : _M_t(_Compare(), _StorageTypeAlloc())
436 { _M_t
.insert_equal(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
438 multiset(const_iterator __first
, const_iterator __last
,
439 const _Compare
& __comp
,
440 const allocator_type
& __a
= allocator_type())
441 : _M_t(__comp
, _STLP_CONVERT_ALLOCATOR(__a
, _KeyStorageType
))
442 { _M_t
.insert_equal(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
443 #endif /* _STLP_MEMBER_TEMPLATES */
445 multiset(const _Self
& __x
)
448 _Self
& operator=(const _Self
& __x
) {
453 #if !defined (_STLP_NO_MOVE_SEMANTIC)
454 multiset(__move_source
<_Self
> src
)
455 : _M_t(__move_source
<_Rep_type
>(src
.get()._M_t
)) {}
459 key_compare
key_comp() const { return _M_t
.key_comp(); }
460 value_compare
value_comp() const { return _M_t
.key_comp(); }
461 allocator_type
get_allocator() const
462 { return _STLP_CONVERT_ALLOCATOR(_M_t
.get_allocator(), value_type
); }
464 iterator
begin() { return _S_to_value_ite(_M_t
.begin()); }
465 iterator
end() { return _S_to_value_ite(_M_t
.end()); }
466 const_iterator
begin() const { return _S_to_value_ite(_M_t
.begin()); }
467 const_iterator
end() const { return _S_to_value_ite(_M_t
.end()); }
468 reverse_iterator
rbegin() { return reverse_iterator(end()); }
469 reverse_iterator
rend() { return reverse_iterator(begin()); }
470 const_reverse_iterator
rbegin() const { return const_reverse_iterator(end()); }
471 const_reverse_iterator
rend() const { return const_reverse_iterator(begin()); }
472 bool empty() const { return _M_t
.empty(); }
473 size_type
size() const { return _M_t
.size(); }
474 size_type
max_size() const { return _M_t
.max_size(); }
475 void swap(_Self
& __x
) { _M_t
.swap(__x
._M_t
); }
476 #if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
477 void _M_swap_workaround(_Self
& __x
) { swap(__x
); }
481 iterator
insert(const value_type
& __x
)
482 { return _S_to_value_ite(_M_t
.insert_equal(cast_traits::to_storage_type_cref(__x
))); }
483 iterator
insert(iterator __pos
, const value_type
& __x
) {
484 return _S_to_value_ite(_M_t
.insert_equal(_S_to_storage_ite(__pos
),
485 cast_traits::to_storage_type_cref(__x
)));
488 #if defined (_STLP_MEMBER_TEMPLATES)
489 template <class _InputIterator
>
490 void insert(_InputIterator __first
, _InputIterator __last
) {
491 # if defined (_STLP_USE_ITERATOR_WRAPPER)
492 _M_t
.insert_equal(_STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__first
),
493 _STLP_TYPENAME _STLP_PRIV _IteWrapper
<_KeyStorageType
, _Key
, _InputIterator
>::_Ite(__last
));
495 _M_t
.insert_equal(__first
, __last
);
499 void insert(const value_type
* __first
, const value_type
* __last
) {
500 _M_t
.insert_equal(cast_traits::to_storage_type_cptr(__first
),
501 cast_traits::to_storage_type_cptr(__last
));
503 void insert(const_iterator __first
, const_iterator __last
)
504 { _M_t
.insert_equal(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
505 #endif /* _STLP_MEMBER_TEMPLATES */
507 void erase(iterator __pos
)
508 { _M_t
.erase(_S_to_storage_ite(__pos
)); }
509 size_type
erase(const key_type
& __x
)
510 { return _M_t
.erase(cast_traits::to_storage_type_cref(__x
)); }
511 void erase(iterator __first
, iterator __last
)
512 { _M_t
.erase(_S_to_storage_ite(__first
), _S_to_storage_ite(__last
)); }
513 void clear() { _M_t
.clear(); }
515 // multiset operations:
517 _STLP_TEMPLATE_FOR_CONT_EXT
518 iterator
find(const _KT
& __x
)
519 { return _S_to_value_ite(_M_t
.find(cast_traits::to_storage_type_crefT(__x
))); }
520 _STLP_TEMPLATE_FOR_CONT_EXT
521 const_iterator
find(const _KT
& __x
) const
522 { return _S_to_value_ite(_M_t
.find(cast_traits::to_storage_type_crefT(__x
))); }
523 _STLP_TEMPLATE_FOR_CONT_EXT
524 size_type
count(const _KT
& __x
) const
525 { return _M_t
.count(cast_traits::to_storage_type_crefT(__x
)); }
526 _STLP_TEMPLATE_FOR_CONT_EXT
527 iterator
lower_bound(const _KT
& __x
)
528 { return _S_to_value_ite(_M_t
.lower_bound(cast_traits::to_storage_type_crefT(__x
))); }
529 _STLP_TEMPLATE_FOR_CONT_EXT
530 const_iterator
lower_bound(const _KT
& __x
) const
531 { return _S_to_value_ite(_M_t
.lower_bound(cast_traits::to_storage_type_crefT(__x
))); }
532 _STLP_TEMPLATE_FOR_CONT_EXT
533 iterator
upper_bound(const _KT
& __x
)
534 { return _S_to_value_ite(_M_t
.upper_bound(cast_traits::to_storage_type_crefT(__x
))); }
535 _STLP_TEMPLATE_FOR_CONT_EXT
536 const_iterator
upper_bound(const _KT
& __x
) const
537 { return _S_to_value_ite(_M_t
.upper_bound(cast_traits::to_storage_type_crefT(__x
))); }
538 _STLP_TEMPLATE_FOR_CONT_EXT
539 pair
<iterator
, iterator
> equal_range(const _KT
& __x
) {
540 pair
<base_iterator
, base_iterator
> __ret
;
541 __ret
= _M_t
.equal_range(cast_traits::to_storage_type_crefT(__x
));
542 return pair
<iterator
, iterator
>(_S_to_value_ite(__ret
.first
),
543 _S_to_value_ite(__ret
.second
));
545 _STLP_TEMPLATE_FOR_CONT_EXT
546 pair
<const_iterator
, const_iterator
> equal_range(const _KT
& __x
) const {
547 pair
<const_base_iterator
, const_base_iterator
> __ret
;
548 __ret
= _M_t
.equal_range(cast_traits::to_storage_type_crefT(__x
));
549 return pair
<const_iterator
, const_iterator
>(_S_to_value_ite(__ret
.first
),
550 _S_to_value_ite(__ret
.second
));
554 #if defined (__BORLANDC__) || defined (__DMC__)
560 #endif /* _STLP_PTR_SPECIALIZED_SET_H */