29 #ifndef _GLIBCXX_PROFILE_SET_H 30 #define _GLIBCXX_PROFILE_SET_H 1 35 namespace std _GLIBCXX_VISIBILITY(default)
40 template<
typename _Key,
typename _Compare = std::less<_Key>,
41 typename _Allocator = std::allocator<_Key> >
43 :
public _GLIBCXX_STD_C::set<_Key,_Compare,_Allocator>,
44 public _Ordered_profile<set<_Key, _Compare, _Allocator> >
46 typedef _GLIBCXX_STD_C::set<_Key, _Compare, _Allocator>
_Base;
48 typedef typename _Base::iterator _Base_iterator;
49 typedef typename _Base::const_iterator _Base_const_iterator;
53 typedef _Key key_type;
54 typedef _Key value_type;
55 typedef _Compare key_compare;
56 typedef _Compare value_compare;
57 typedef typename _Base::reference reference;
58 typedef typename _Base::const_reference const_reference;
60 typedef __iterator_tracker<_Base_iterator, set> iterator;
61 typedef __iterator_tracker<_Base_const_iterator,
66 typedef typename _Base::size_type size_type;
67 typedef typename _Base::difference_type difference_type;
70 #if __cplusplus < 201103L 78 set(
const set&) =
default;
83 explicit set(
const _Compare& __comp,
84 const _Allocator& __a = _Allocator())
85 : _Base(__comp, __a) { }
87 #if __cplusplus >= 201103L 88 template<
typename _InputIterator,
89 typename = std::_RequireInputIter<_InputIterator>>
91 template<
typename _InputIterator>
93 set(_InputIterator __first, _InputIterator __last,
94 const _Compare& __comp = _Compare(),
95 const _Allocator& __a = _Allocator())
96 : _Base(__first, __last, __comp, __a) { }
98 #if __cplusplus >= 201103L 100 const _Compare& __comp = _Compare(),
101 const _Allocator& __a = _Allocator())
102 : _Base(__l, __comp, __a) { }
105 set(
const _Allocator& __a)
108 set(
const set& __x,
const _Allocator& __a)
109 : _Base(__x, __a) { }
111 set(
set&& __x,
const _Allocator& __a)
112 noexcept( noexcept(_Base(std::move(__x), __a)) )
113 : _Base(std::move(__x), __a) { }
116 : _Base(__l, __a) { }
118 template<
typename _InputIterator>
119 set(_InputIterator __first, _InputIterator __last,
120 const _Allocator& __a)
121 : _Base(__first, __last, __a) { }
124 set(
const _Base& __x)
127 #if __cplusplus < 201103L 129 operator=(
const set& __x)
131 this->_M_profile_destruct();
133 this->_M_profile_construct();
138 operator=(
const set&) =
default;
141 operator=(
set&&) =
default;
146 this->_M_profile_destruct();
148 this->_M_profile_construct();
155 begin() _GLIBCXX_NOEXCEPT
156 {
return iterator(_Base::begin(),
this); }
159 begin()
const _GLIBCXX_NOEXCEPT
160 {
return const_iterator(_Base::begin(),
this); }
163 end() _GLIBCXX_NOEXCEPT
164 {
return iterator(_Base::end(),
this); }
167 end()
const _GLIBCXX_NOEXCEPT
168 {
return const_iterator(_Base::end(),
this); }
170 #if __cplusplus >= 201103L 172 cbegin()
const noexcept
173 {
return const_iterator(_Base::cbegin(),
this); }
176 cend()
const noexcept
177 {
return const_iterator(_Base::cend(),
this); }
181 rbegin() _GLIBCXX_NOEXCEPT
183 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
184 return reverse_iterator(end());
187 const_reverse_iterator
188 rbegin()
const _GLIBCXX_NOEXCEPT
190 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
191 return const_reverse_iterator(end());
195 rend() _GLIBCXX_NOEXCEPT
197 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
198 return reverse_iterator(begin());
201 const_reverse_iterator
202 rend()
const _GLIBCXX_NOEXCEPT
204 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
205 return const_reverse_iterator(begin());
208 #if __cplusplus >= 201103L 209 const_reverse_iterator
210 crbegin()
const noexcept
212 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
213 return const_reverse_iterator(cend());
216 const_reverse_iterator
217 crend()
const noexcept
219 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
220 return const_reverse_iterator(cbegin());
226 #if __cplusplus >= 201103L 227 noexcept( noexcept(declval<_Base>().swap(__x)) )
235 #if __cplusplus >= 201103L 236 template<
typename... _Args>
238 emplace(_Args&&... __args)
240 __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1);
241 auto __base_ret = _Base::emplace(std::forward<_Args>(__args)...);
246 template<
typename... _Args>
248 emplace_hint(const_iterator __pos, _Args&&... __args)
250 auto size_before = this->size();
252 = _Base::emplace_hint(__pos.base(), std::forward<_Args>(__args)...);
253 __profcxx_map2umap_insert(this->_M_map2umap_info,
254 size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1);
255 return iterator(__res,
this);
260 insert(
const value_type& __x)
262 __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1);
268 #if __cplusplus >= 201103L 270 insert(value_type&& __x)
272 __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1);
274 = _Base::insert(std::move(__x));
281 insert(const_iterator __pos,
const value_type& __x)
283 size_type size_before = this->size();
284 _Base_iterator __res = _Base::insert(__pos.base(), __x);
285 __profcxx_map2umap_insert(this->_M_map2umap_info,
286 size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1);
287 return iterator(__res,
this);
290 #if __cplusplus >= 201103L 292 insert(const_iterator __pos, value_type&& __x)
293 {
return iterator(_Base::insert(__pos.base(), std::move(__x)),
this); }
296 template<
typename _InputIterator>
298 insert(_InputIterator __first, _InputIterator __last)
300 for (; __first != __last; ++__first)
304 #if __cplusplus >= 201103L 307 { insert(__l.begin(), __l.end()); }
310 #if __cplusplus >= 201103L 312 erase(const_iterator __pos)
314 __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1);
315 return iterator(_Base::erase(__pos.base()),
this);
319 erase(iterator __pos)
321 __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1);
322 _Base::erase(__pos.base());
327 erase(
const key_type& __x)
329 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
330 __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1);
331 return _Base::erase(__x);
334 #if __cplusplus >= 201103L 336 erase(const_iterator __first, const_iterator __last)
338 if (__first != __last)
341 for (; __first != __last;)
342 __ret = erase(__first++);
346 return iterator(_Base::erase(__first.base(), __last.base()),
this);
350 erase(iterator __first, iterator __last)
352 for (; __first != __last;)
358 clear() _GLIBCXX_NOEXCEPT
360 this->_M_profile_destruct();
362 this->_M_profile_construct();
366 count(
const key_type& __x)
const 368 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
369 return _Base::count(__x);
374 find(
const key_type& __x)
376 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
377 return iterator(_Base::find(__x),
this);
381 find(
const key_type& __x)
const 383 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
384 return const_iterator(_Base::find(__x),
this);
388 lower_bound(
const key_type& __x)
390 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
391 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
392 return iterator(_Base::lower_bound(__x),
this);
396 lower_bound(
const key_type& __x)
const 398 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
399 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
400 return const_iterator(_Base::lower_bound(__x),
this);
404 upper_bound(
const key_type& __x)
406 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
407 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
408 return iterator(_Base::upper_bound(__x),
this);
412 upper_bound(
const key_type& __x)
const 414 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
415 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
416 return const_iterator(_Base::upper_bound(__x),
this);
420 equal_range(
const key_type& __x)
422 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
424 = _Base::equal_range(__x);
426 iterator(__base_ret.
second,
this));
430 equal_range(
const key_type& __x)
const 432 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
434 = _Base::equal_range(__x);
436 const_iterator(__base_ret.
second,
this));
440 _M_base() _GLIBCXX_NOEXCEPT {
return *
this; }
443 _M_base()
const _GLIBCXX_NOEXCEPT {
return *
this; }
453 _M_hint_used(_Base_const_iterator __hint, _Base_iterator __res)
455 return (__hint == __res
456 || (__hint == _M_base().end() && ++__res == _M_base().end())
457 || (__hint != _M_base().end() && (++__hint == __res
458 || ++__res == --__hint)));
461 template<
typename _K1,
typename _C1,
typename _A1>
465 template<
typename _K1,
typename _C1,
typename _A1>
470 template<
typename _Key,
typename _Compare,
typename _Allocator>
475 __profcxx_map2umap_invalidate(__lhs._M_map2umap_info);
476 __profcxx_map2umap_invalidate(__rhs._M_map2umap_info);
477 return __lhs._M_base() == __rhs._M_base();
480 template<
typename _Key,
typename _Compare,
typename _Allocator>
482 operator<(const set<_Key, _Compare, _Allocator>& __lhs,
485 __profcxx_map2umap_invalidate(__lhs._M_map2umap_info);
486 __profcxx_map2umap_invalidate(__rhs._M_map2umap_info);
487 return __lhs._M_base() < __rhs._M_base();
490 template<
typename _Key,
typename _Compare,
typename _Allocator>
494 {
return !(__lhs == __rhs); }
496 template<
typename _Key,
typename _Compare,
typename _Allocator>
498 operator<=(const set<_Key, _Compare, _Allocator>& __lhs,
500 {
return !(__rhs < __lhs); }
502 template<
typename _Key,
typename _Compare,
typename _Allocator>
506 {
return !(__lhs < __rhs); }
508 template<
typename _Key,
typename _Compare,
typename _Allocator>
512 {
return __rhs < __lhs; }
514 template<
typename _Key,
typename _Compare,
typename _Allocator>
518 {
return __x.swap(__y); }
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects.
Class std::set wrapper with performance instrumentation.
_T2 second
first is a copy of the first object
Struct holding two objects of arbitrary type.
_T1 first
second_type is the second bound type
Sequential helper functions. This file is a GNU profile extension to the Standard C++ Library...
ISO C++ entities toplevel namespace is std.