28 #ifndef _GLIBCXX_PROFILE_MAP_H 29 #define _GLIBCXX_PROFILE_MAP_H 1 34 namespace std _GLIBCXX_VISIBILITY(default)
39 template<
typename _Key,
typename _Tp,
typename _Compare = std::less<_Key>,
40 typename _Allocator = std::allocator<std::pair<const _Key, _Tp> > >
42 :
public _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Allocator>,
43 public _Ordered_profile<map<_Key, _Tp, _Compare, _Allocator> >
45 typedef _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Allocator>
_Base;
47 typedef typename _Base::iterator _Base_iterator;
48 typedef typename _Base::const_iterator _Base_const_iterator;
52 typedef _Key key_type;
53 typedef _Tp mapped_type;
54 typedef typename _Base::value_type value_type;
55 typedef _Compare key_compare;
56 typedef typename _Base::reference reference;
57 typedef typename _Base::const_reference const_reference;
59 typedef __iterator_tracker<_Base_iterator, map> iterator;
60 typedef __iterator_tracker<_Base_const_iterator,
65 typedef typename _Base::size_type size_type;
66 typedef typename _Base::difference_type difference_type;
70 #if __cplusplus < 201103L 85 map(
const _Compare& __comp,
86 const _Allocator& __a = _Allocator())
87 : _Base(__comp, __a) { }
89 #if __cplusplus >= 201103L 90 template<
typename _InputIterator,
91 typename = std::_RequireInputIter<_InputIterator>>
93 template<
typename _InputIterator>
95 map(_InputIterator __first, _InputIterator __last,
96 const _Compare& __comp = _Compare(),
97 const _Allocator& __a = _Allocator())
98 : _Base(__first, __last, __comp, __a) { }
100 map(
const _Base& __x)
103 #if __cplusplus >= 201103L 105 const _Compare& __c = _Compare(),
106 const _Allocator& __a = _Allocator())
107 : _Base(__l, __c, __a) { }
110 map(
const _Allocator& __a)
113 map(
const map& __x,
const _Allocator& __a)
114 : _Base(__x, __a) { }
116 map(map&& __x,
const _Allocator& __a)
117 noexcept( noexcept(_Base(std::move(__x), __a)) )
118 : _Base(std::move(__x), __a) { }
121 : _Base(__l, __a) { }
123 template<
typename _InputIterator>
124 map(_InputIterator __first, _InputIterator __last,
125 const _Allocator& __a)
126 : _Base(__first, __last, __a) { }
129 #if __cplusplus < 201103L 131 operator=(
const map& __x)
133 this->_M_profile_destruct();
135 this->_M_profile_construct();
140 operator=(
const map&) =
default;
143 operator=(map&&) =
default;
148 this->_M_profile_destruct();
150 this->_M_profile_construct();
157 begin() _GLIBCXX_NOEXCEPT
158 {
return iterator(_Base::begin(),
this); }
161 begin()
const _GLIBCXX_NOEXCEPT
162 {
return const_iterator(_Base::begin(),
this); }
165 end() _GLIBCXX_NOEXCEPT
166 {
return iterator(_Base::end(),
this); }
169 end()
const _GLIBCXX_NOEXCEPT
170 {
return const_iterator(_Base::end(),
this); }
172 #if __cplusplus >= 201103L 174 cbegin()
const noexcept
175 {
return const_iterator(_Base::cbegin(),
this); }
178 cend()
const noexcept
179 {
return const_iterator(_Base::cend(),
this); }
183 rbegin() _GLIBCXX_NOEXCEPT
185 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
186 return reverse_iterator(end());
189 const_reverse_iterator
190 rbegin()
const _GLIBCXX_NOEXCEPT
192 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
193 return const_reverse_iterator(end());
197 rend() _GLIBCXX_NOEXCEPT
199 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
200 return reverse_iterator(begin());
203 const_reverse_iterator
204 rend()
const _GLIBCXX_NOEXCEPT
206 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
207 return const_reverse_iterator(begin());
210 #if __cplusplus >= 201103L 211 const_reverse_iterator
212 crbegin()
const noexcept
214 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
215 return const_reverse_iterator(cend());
218 const_reverse_iterator
219 crend()
const noexcept
221 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
222 return const_reverse_iterator(cbegin());
228 operator[](
const key_type& __k)
230 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
231 return _Base::operator[](__k);
234 #if __cplusplus >= 201103L 236 operator[](key_type&& __k)
238 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
239 return _Base::operator[](std::move(__k));
244 at(
const key_type& __k)
246 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
247 return _Base::at(__k);
251 at(
const key_type& __k)
const 253 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
254 return _Base::at(__k);
258 #if __cplusplus >= 201103L 259 template<
typename... _Args>
261 emplace(_Args&&... __args)
265 __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1);
266 auto __base_ret = _Base::emplace(std::forward<_Args>(__args)...);
271 template<
typename... _Args>
273 emplace_hint(const_iterator __pos, _Args&&... __args)
275 auto size_before = this->size();
277 = _Base::emplace_hint(__pos.base(), std::forward<_Args>(__args)...);
278 __profcxx_map2umap_insert(this->_M_map2umap_info,
279 size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1);
280 return iterator(__res,
this);
285 insert(
const value_type& __x)
287 __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1);
293 #if __cplusplus >= 201103L 294 template<
typename _Pair,
typename =
typename 295 std::enable_if<std::is_constructible<value_type,
296 _Pair&&>::value>::type>
300 __profcxx_map2umap_insert(this->_M_map2umap_info, this->size(), 1);
301 auto __base_ret= _Base::insert(std::forward<_Pair>(__x));
307 #if __cplusplus >= 201103L 310 { insert(__list.begin(), __list.end()); }
314 #if __cplusplus >= 201103L 315 insert(const_iterator __pos,
const value_type& __x)
317 insert(iterator __pos,
const value_type& __x)
320 size_type size_before = this->size();
321 _Base_iterator __res = _Base::insert(__pos.base(), __x);
323 __profcxx_map2umap_insert(this->_M_map2umap_info,
324 size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1);
325 return iterator(__res,
this);
328 #if __cplusplus >= 201103L 329 template<
typename _Pair,
typename =
typename 330 std::enable_if<std::is_constructible<value_type,
331 _Pair&&>::value>::type>
333 insert(const_iterator __pos, _Pair&& __x)
335 size_type size_before = this->size();
336 auto __res = _Base::insert(__pos.base(), std::forward<_Pair>(__x));
338 __profcxx_map2umap_insert(this->_M_map2umap_info,
339 size_before, _M_hint_used(__pos.base(), __res) ? 0 : 1);
340 return iterator(__res,
this);
344 template<
typename _InputIterator>
346 insert(_InputIterator __first, _InputIterator __last)
348 for (; __first != __last; ++__first)
352 #if __cplusplus >= 201103L 354 erase(const_iterator __pos)
356 __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1);
357 return iterator(_Base::erase(__pos.base()),
this);
361 erase(iterator __pos)
363 __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1);
364 return iterator(_Base::erase(__pos.base()),
this);
368 erase(iterator __pos)
370 __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1);
371 _Base::erase(__pos.base());
376 erase(
const key_type& __x)
378 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
379 __profcxx_map2umap_erase(this->_M_map2umap_info, this->size(), 1);
380 return _Base::erase(__x);
383 #if __cplusplus >= 201103L 385 erase(const_iterator __first, const_iterator __last)
387 if (__first != __last)
390 for (; __first != __last;)
391 __ret = erase(__first++);
395 return iterator(_Base::erase(__first.base(), __last.base()),
this);
399 erase(iterator __first, iterator __last)
401 for (; __first != __last;)
408 _GLIBCXX_NOEXCEPT_IF( noexcept(declval<_Base&>().swap(__x)) )
415 clear() _GLIBCXX_NOEXCEPT
417 this->_M_profile_destruct();
419 this->_M_profile_construct();
424 find(
const key_type& __x)
426 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
427 return iterator(_Base::find(__x),
this);
430 #if __cplusplus > 201103L 431 template<
typename _Kt,
433 typename __has_is_transparent<_Compare, _Kt>::type>
437 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
438 return { _Base::find(__x),
this };
443 find(
const key_type& __x)
const 445 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
446 return const_iterator(_Base::find(__x),
this);
449 #if __cplusplus > 201103L 450 template<
typename _Kt,
452 typename __has_is_transparent<_Compare, _Kt>::type>
454 find(
const _Kt& __x)
const 456 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
457 return { _Base::find(__x),
this };
462 count(
const key_type& __x)
const 464 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
465 return _Base::count(__x);
468 #if __cplusplus > 201103L 469 template<
typename _Kt,
471 typename __has_is_transparent<_Compare, _Kt>::type>
473 count(
const _Kt& __x)
const 475 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
476 return _Base::count(__x);
481 lower_bound(
const key_type& __x)
483 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
484 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
485 return iterator(_Base::lower_bound(__x),
this);
488 #if __cplusplus > 201103L 489 template<
typename _Kt,
491 typename __has_is_transparent<_Compare, _Kt>::type>
493 lower_bound(
const _Kt& __x)
495 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
496 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
497 return { _Base::lower_bound(__x),
this };
502 lower_bound(
const key_type& __x)
const 504 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
505 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
506 return const_iterator(_Base::lower_bound(__x),
this);
509 #if __cplusplus > 201103L 510 template<
typename _Kt,
512 typename __has_is_transparent<_Compare, _Kt>::type>
514 lower_bound(
const _Kt& __x)
const 516 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
517 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
518 return { _Base::lower_bound(__x),
this };
523 upper_bound(
const key_type& __x)
525 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
526 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
527 return iterator(_Base::upper_bound(__x),
this);
530 #if __cplusplus > 201103L 531 template<
typename _Kt,
533 typename __has_is_transparent<_Compare, _Kt>::type>
535 upper_bound(
const _Kt& __x)
537 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
538 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
539 return { _Base::upper_bound(__x),
this };
544 upper_bound(
const key_type& __x)
const 546 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
547 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
548 return const_iterator(_Base::upper_bound(__x),
this);
551 #if __cplusplus > 201103L 552 template<
typename _Kt,
554 typename __has_is_transparent<_Compare, _Kt>::type>
556 upper_bound(
const _Kt& __x)
const 558 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
559 __profcxx_map2umap_invalidate(this->_M_map2umap_info);
560 return { _Base::upper_bound(__x),
this };
565 equal_range(
const key_type& __x)
567 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
569 = _Base::equal_range(__x);
571 iterator(__base_ret.
second,
this));
574 #if __cplusplus > 201103L 575 template<
typename _Kt,
577 typename __has_is_transparent<_Compare, _Kt>::type>
579 equal_range(
const _Kt& __x)
581 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
582 auto __res = _Base::equal_range(__x);
583 return { { __res.first,
this }, { __res.second,
this } };
588 equal_range(
const key_type& __x)
const 590 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
592 = _Base::equal_range(__x);
594 const_iterator(__base_ret.
second,
this));
597 #if __cplusplus > 201103L 598 template<
typename _Kt,
600 typename __has_is_transparent<_Compare, _Kt>::type>
602 equal_range(
const _Kt& __x)
const 604 __profcxx_map2umap_find(this->_M_map2umap_info, this->size());
605 auto __res = _Base::equal_range(__x);
606 return { { __res.first,
this }, { __res.second,
this } };
611 _M_base() _GLIBCXX_NOEXCEPT {
return *
this; }
614 _M_base()
const _GLIBCXX_NOEXCEPT {
return *
this; }
624 _M_hint_used(_Base_const_iterator __hint, _Base_iterator __res)
626 return (__hint == __res
627 || (__hint == _M_base().end() && ++__res == _M_base().end())
628 || (__hint != _M_base().end() && (++__hint == __res
629 || ++__res == --__hint)));
633 template<
typename _K1,
typename _T1,
typename _C1,
typename _A1>
638 template<
typename _K1,
typename _T1,
typename _C1,
typename _A1>
640 operator<(const map<_K1, _T1, _C1, _A1>&,
644 template<
typename _Key,
typename _Tp,
645 typename _Compare,
typename _Allocator>
650 __profcxx_map2umap_invalidate(__lhs._M_map2umap_info);
651 __profcxx_map2umap_invalidate(__rhs._M_map2umap_info);
652 return __lhs._M_base() == __rhs._M_base();
655 template<
typename _Key,
typename _Tp,
656 typename _Compare,
typename _Allocator>
658 operator<(const map<_Key, _Tp, _Compare, _Allocator>& __lhs,
661 __profcxx_map2umap_invalidate(__lhs._M_map2umap_info);
662 __profcxx_map2umap_invalidate(__rhs._M_map2umap_info);
663 return __lhs._M_base() < __rhs._M_base();
666 template<
typename _Key,
typename _Tp,
667 typename _Compare,
typename _Allocator>
671 {
return !(__lhs == __rhs); }
673 template<
typename _Key,
typename _Tp,
674 typename _Compare,
typename _Allocator>
676 operator<=(const map<_Key, _Tp, _Compare, _Allocator>& __lhs,
678 {
return !(__rhs < __lhs); }
680 template<
typename _Key,
typename _Tp,
681 typename _Compare,
typename _Allocator>
685 {
return !(__lhs < __rhs); }
687 template<
typename _Key,
typename _Tp,
688 typename _Compare,
typename _Allocator>
692 {
return __rhs < __lhs; }
694 template<
typename _Key,
typename _Tp,
695 typename _Compare,
typename _Allocator>
699 _GLIBCXX_NOEXCEPT_IF(noexcept(__lhs.swap(__rhs)))
700 { __lhs.swap(__rhs); }
_T2 second
first is a copy of the first object
Sequential helper functions. This file is a GNU profile extension to the Standard C++ Library...
Class std::map wrapper with performance instrumentation.
_T1 first
second_type is the second bound type
ISO C++ entities toplevel namespace is std.
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.
Struct holding two objects of arbitrary type.