29 #ifndef _GLIBCXX_DEBUG_FUNCTIONS_H
30 #define _GLIBCXX_DEBUG_FUNCTIONS_H 1
34 #if __cplusplus >= 201103L
44 template<
typename _Sequence>
45 struct _Insert_range_from_self_is_safe
46 {
enum { __value = 0 }; };
48 template<
typename _Sequence>
49 struct _Is_contiguous_sequence : std::__false_type { };
55 template<
typename _InputIterator>
57 __check_valid_range(
const _InputIterator& __first,
58 const _InputIterator& __last,
61 const char* __function)
63 __glibcxx_check_valid_range_at(__first, __last,
64 __file, __line, __function);
69 template<
typename _Iterator,
typename _Sequence,
typename _Category>
71 __foreign_iterator_aux4(
72 const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
73 const typename _Sequence::value_type* __other)
75 typedef const typename _Sequence::value_type* _PointerType;
77 #if __cplusplus >= 201103L
78 constexpr _Less __l{};
80 const _Less __l = _Less();
82 const _Sequence* __seq = __it._M_get_sequence();
87 return __l(__other, __begin) || __l(__end, __other);
91 template<
typename _Iterator,
typename _Sequence,
typename _Category>
93 __foreign_iterator_aux4(
94 const _Safe_iterator<_Iterator, _Sequence, _Category>&, ...)
98 template<
typename _Iterator,
typename _Sequence,
typename _Category,
99 typename _InputIterator>
101 __foreign_iterator_aux3(
102 const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
103 const _InputIterator& __other,
const _InputIterator& __other_end,
106 if (__other == __other_end)
108 if (__it._M_get_sequence()->empty())
114 template<
typename _Iterator,
typename _Sequence,
typename _Category,
115 typename _InputIterator>
117 __foreign_iterator_aux3(
118 const _Safe_iterator<_Iterator, _Sequence, _Category>&,
119 const _InputIterator&,
const _InputIterator&,
124 template<
typename _Iterator,
typename _Sequence,
typename _Category,
125 typename _OtherIterator>
131 {
return __it._M_get_sequence() != __other._M_get_sequence(); }
134 template<
typename _Iterator,
typename _Sequence,
typename _Category,
135 typename _OtherIterator,
typename _OtherSequence,
136 typename _OtherCategory>
147 template<
typename _Iterator,
typename _Sequence,
typename _Category,
148 typename _InputIterator>
151 const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
152 const _InputIterator& __other,
153 const _InputIterator& __other_end)
155 #if __cplusplus < 201103L
156 typedef _Is_contiguous_sequence<_Sequence> __tag;
160 using __contiguous = _Is_contiguous_sequence<_Sequence>;
161 using __tag = std::__conditional_t<__lvalref::value, __contiguous,
164 return __foreign_iterator_aux3(__it, __other, __other_end, __tag());
168 template<
typename _Iterator,
typename _Sequence,
typename _Category,
171 __foreign_iterator_aux(
172 const _Safe_iterator<_Iterator, _Sequence, _Category>&,
173 _Integral, _Integral, std::__true_type)
177 template<
typename _Iterator,
typename _Sequence,
typename _Category,
178 typename _InputIterator>
180 __foreign_iterator_aux(
181 const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
182 _InputIterator __other, _InputIterator __other_end,
185 return _Insert_range_from_self_is_safe<_Sequence>::__value
187 std::__miter_base(__other_end));
190 template<
typename _Iterator,
typename _Sequence,
typename _Category,
191 typename _InputIterator>
194 const _Safe_iterator<_Iterator, _Sequence, _Category>& __it,
195 _InputIterator __other, _InputIterator __other_end)
197 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
198 return __foreign_iterator_aux(__it, __other, __other_end, _Integral());
203 template<
typename _InputIterator>
206 __check_sorted_aux(
const _InputIterator&,
const _InputIterator&,
212 template<
typename _ForwardIterator>
215 __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
218 if (__first == __last)
221 _ForwardIterator __next = __first;
222 for (++__next; __next != __last; __first = __next, (void)++__next)
223 if (*__next < *__first)
231 template<
typename _InputIterator,
typename _Predicate>
234 __check_sorted_aux(
const _InputIterator&,
const _InputIterator&,
240 template<
typename _ForwardIterator,
typename _Predicate>
243 __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
246 if (__first == __last)
249 _ForwardIterator __next = __first;
250 for (++__next; __next != __last; __first = __next, (void)++__next)
251 if (__pred(*__next, *__first))
258 template<
typename _InputIterator>
261 __check_sorted(
const _InputIterator& __first,
const _InputIterator& __last)
263 return __check_sorted_aux(__first, __last,
267 template<
typename _InputIterator,
typename _Predicate>
270 __check_sorted(
const _InputIterator& __first,
const _InputIterator& __last,
273 return __check_sorted_aux(__first, __last, __pred,
277 template<
typename _InputIterator>
280 __check_sorted_set_aux(
const _InputIterator& __first,
281 const _InputIterator& __last,
283 {
return __check_sorted(__first, __last); }
285 template<
typename _InputIterator>
288 __check_sorted_set_aux(
const _InputIterator&,
289 const _InputIterator&,
293 template<
typename _InputIterator,
typename _Predicate>
296 __check_sorted_set_aux(
const _InputIterator& __first,
297 const _InputIterator& __last,
298 _Predicate __pred, std::__true_type)
299 {
return __check_sorted(__first, __last, __pred); }
301 template<
typename _InputIterator,
typename _Predicate>
304 __check_sorted_set_aux(
const _InputIterator&,
305 const _InputIterator&, _Predicate,
310 template<
typename _InputIterator1,
typename _InputIterator2>
313 __check_sorted_set(
const _InputIterator1& __first,
314 const _InputIterator1& __last,
315 const _InputIterator2&)
322 typedef typename std::__are_same<_ValueType1, _ValueType2>::__type
324 return __check_sorted_set_aux(__first, __last, _SameType());
327 template<
typename _InputIterator1,
typename _InputIterator2,
331 __check_sorted_set(
const _InputIterator1& __first,
332 const _InputIterator1& __last,
333 const _InputIterator2&, _Predicate __pred)
340 typedef typename std::__are_same<_ValueType1, _ValueType2>::__type
342 return __check_sorted_set_aux(__first, __last, __pred, _SameType());
348 template<
typename _ForwardIterator,
typename _Tp>
351 __check_partitioned_lower(_ForwardIterator __first,
352 _ForwardIterator __last,
const _Tp& __value)
354 while (__first != __last && *__first < __value)
356 if (__first != __last)
359 while (__first != __last && !(*__first < __value))
362 return __first == __last;
365 template<
typename _ForwardIterator,
typename _Tp>
368 __check_partitioned_upper(_ForwardIterator __first,
369 _ForwardIterator __last,
const _Tp& __value)
371 while (__first != __last && !(__value < *__first))
373 if (__first != __last)
376 while (__first != __last && __value < *__first)
379 return __first == __last;
383 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
386 __check_partitioned_lower(_ForwardIterator __first,
387 _ForwardIterator __last,
const _Tp& __value,
390 while (__first != __last &&
bool(__pred(*__first, __value)))
392 if (__first != __last)
395 while (__first != __last && !
bool(__pred(*__first, __value)))
398 return __first == __last;
401 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
404 __check_partitioned_upper(_ForwardIterator __first,
405 _ForwardIterator __last,
const _Tp& __value,
408 while (__first != __last && !
bool(__pred(__value, *__first)))
410 if (__first != __last)
413 while (__first != __last &&
bool(__pred(__value, *__first)))
416 return __first == __last;
419 #if __cplusplus >= 201103L
420 struct _Irreflexive_checker
422 template<
typename _It>
426 template<
typename _It,
427 typename = decltype(__ref<_It>() < __ref<_It>())>
430 _S_is_valid(_It __it)
431 {
return !(*__it < *__it); }
434 template<
typename... _Args>
437 _S_is_valid(_Args...)
440 template<
typename _It,
typename _Pred,
typename
441 = decltype(std::declval<_Pred>()(__ref<_It>(), __ref<_It>()))>
444 _S_is_valid_pred(_It __it, _Pred __pred)
445 {
return !__pred(*__it, *__it); }
448 template<
typename... _Args>
451 _S_is_valid_pred(_Args...)
455 template<
typename _Iterator>
458 __is_irreflexive(_Iterator __it)
459 {
return _Irreflexive_checker::_S_is_valid(__it); }
461 template<
typename _Iterator,
typename _Pred>
464 __is_irreflexive_pred(_Iterator __it, _Pred __pred)
465 {
return _Irreflexive_checker::_S_is_valid_pred(__it, __pred); }
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
GNU debug classes for public use.
bool __foreign_iterator_aux2(const _Safe_iterator< _Iterator, _Sequence, _Category > &__it, const _Safe_iterator< _OtherIterator, _Sequence, _Category > &__other, const _Safe_iterator< _OtherIterator, _Sequence, _Category > &)
Traits class for iterators.
One of the comparison functors.
Forward iterators support a superset of input iterator operations.