29 #ifndef _GLIBCXX_DEBUG_FUNCTIONS_H
30 #define _GLIBCXX_DEBUG_FUNCTIONS_H 1
38 #if __cplusplus >= 201103L
39 # include <type_traits>
45 template<
typename _Iterator,
typename _Sequence>
48 template<
typename _Iterator,
typename _Sequence>
49 class _Safe_local_iterator;
51 template<
typename _Sequence>
52 struct _Insert_range_from_self_is_safe
53 {
enum { __value = 0 }; };
55 template<
typename _Sequence>
56 struct _Is_contiguous_sequence : std::__false_type { };
60 __check_singular_aux(
const void*) {
return false; }
64 template<
typename _Iterator>
66 __check_singular(
const _Iterator& __x)
67 {
return __check_singular_aux(&__x); }
70 template<
typename _Tp>
72 __check_singular(
const _Tp* __ptr)
73 {
return __ptr == 0; }
77 template<
typename _Iterator>
83 template<
typename _Tp>
89 template<
typename _Iterator,
typename _Sequence>
95 template<
typename _Iterator,
typename _Sequence>
99 {
return __x._M_dereferenceable(); }
104 template<
typename _RandomAccessIterator>
107 const _RandomAccessIterator& __last,
109 {
return __last - __first >= 0; }
115 template<
typename _InputIterator>
125 template<
typename _Integral>
133 template<
typename _InputIterator>
136 const _InputIterator& __last, std::__false_type)
145 template<
typename _InputIterator>
149 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
154 template<
typename _Iterator,
typename _Sequence>
158 {
return __first._M_valid_range(__last); }
161 template<
typename _Iterator,
typename _Sequence>
165 {
return __first._M_valid_range(__last); }
171 template<
typename _InputIterator>
172 inline _InputIterator
173 __check_valid_range(
const _InputIterator& __first,
174 const _InputIterator& __last
175 __attribute__((__unused__)))
177 __glibcxx_check_valid_range(__first, __last);
182 template<
typename _Iterator,
typename _Sequence>
184 __foreign_iterator_aux4(
const _Safe_iterator<_Iterator, _Sequence>& __it,
185 const typename _Sequence::value_type* __other)
187 typedef const typename _Sequence::value_type* _PointerType;
189 #if __cplusplus >= 201103L
190 constexpr _Less __l{};
192 const _Less __l = _Less();
194 const _Sequence* __seq = __it._M_get_sequence();
199 return __l(__other, __begin) || __l(__end, __other);
203 template<
typename _Iterator,
typename _Sequence>
205 __foreign_iterator_aux4(
const _Safe_iterator<_Iterator, _Sequence>&, ...)
209 template<
typename _Iterator,
typename _Sequence,
typename _InputIterator>
211 __foreign_iterator_aux3(
const _Safe_iterator<_Iterator, _Sequence>& __it,
212 const _InputIterator& __other,
213 const _InputIterator& __other_end,
216 if (__other == __other_end)
218 if (__it._M_get_sequence()->begin() == __it._M_get_sequence()->end())
224 template<
typename _Iterator,
typename _Sequence,
typename _InputIterator>
226 __foreign_iterator_aux3(
const _Safe_iterator<_Iterator, _Sequence>&,
227 const _InputIterator&,
const _InputIterator&,
232 template<
typename _Iterator,
typename _Sequence,
typename _OtherIterator>
237 {
return __it._M_get_sequence() != __other._M_get_sequence(); }
240 template<
typename _Iterator,
typename _Sequence,
typename _OtherIterator,
241 typename _OtherSequence>
249 template<
typename _Iterator,
typename _Sequence,
typename _InputIterator>
252 const _InputIterator& __other,
253 const _InputIterator& __other_end)
255 #if __cplusplus < 201103L
256 typedef _Is_contiguous_sequence<_Sequence> __tag;
258 using __lvalref = std::is_lvalue_reference<
259 typename std::iterator_traits<_InputIterator>::reference>;
260 using __contiguous = _Is_contiguous_sequence<_Sequence>;
261 using __tag =
typename std::conditional<__lvalref::value, __contiguous,
262 std::__false_type>::type;
264 return __foreign_iterator_aux3(__it, __other, __other_end, __tag());
268 template<
typename _Iterator,
typename _Sequence,
typename _Integral>
270 __foreign_iterator_aux(
const _Safe_iterator<_Iterator, _Sequence>&,
271 _Integral, _Integral,
276 template<
typename _Iterator,
typename _Sequence,
277 typename _InputIterator>
279 __foreign_iterator_aux(
const _Safe_iterator<_Iterator, _Sequence>& __it,
280 _InputIterator __other, _InputIterator __other_end,
283 return _Insert_range_from_self_is_safe<_Sequence>::__value
287 template<
typename _Iterator,
typename _Sequence,
288 typename _InputIterator>
290 __foreign_iterator(
const _Safe_iterator<_Iterator, _Sequence>& __it,
291 _InputIterator __other, _InputIterator __other_end)
293 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
294 return __foreign_iterator_aux(__it, __other, __other_end, _Integral());
298 template<
typename _CharT,
typename _Integer>
301 const _Integer& __n __attribute__((__unused__)))
303 #ifdef _GLIBCXX_DEBUG_PEDANTIC
304 __glibcxx_assert(__s != 0 || __n == 0);
310 template<
typename _CharT>
314 #ifdef _GLIBCXX_DEBUG_PEDANTIC
315 __glibcxx_assert(__s != 0);
322 template<
typename _InputIterator>
324 __check_sorted_aux(
const _InputIterator&,
const _InputIterator&,
330 template<
typename _ForwardIterator>
332 __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
335 if (__first == __last)
338 _ForwardIterator __next = __first;
339 for (++__next; __next != __last; __first = __next, ++__next)
340 if (*__next < *__first)
348 template<
typename _InputIterator,
typename _Predicate>
350 __check_sorted_aux(
const _InputIterator&,
const _InputIterator&,
356 template<
typename _ForwardIterator,
typename _Predicate>
358 __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
361 if (__first == __last)
364 _ForwardIterator __next = __first;
365 for (++__next; __next != __last; __first = __next, ++__next)
366 if (__pred(*__next, *__first))
373 template<
typename _InputIterator>
375 __check_sorted(
const _InputIterator& __first,
const _InputIterator& __last)
379 __glibcxx_assert(__first == __last || !(*__first < *__first));
381 return __check_sorted_aux(__first, __last,
385 template<
typename _InputIterator,
typename _Predicate>
387 __check_sorted(
const _InputIterator& __first,
const _InputIterator& __last,
392 __glibcxx_assert(__first == __last || !__pred(*__first, *__first));
394 return __check_sorted_aux(__first, __last, __pred,
398 template<
typename _InputIterator>
400 __check_sorted_set_aux(
const _InputIterator& __first,
401 const _InputIterator& __last,
403 {
return __check_sorted(__first, __last); }
405 template<
typename _InputIterator>
407 __check_sorted_set_aux(
const _InputIterator&,
408 const _InputIterator&,
412 template<
typename _InputIterator,
typename _Predicate>
414 __check_sorted_set_aux(
const _InputIterator& __first,
415 const _InputIterator& __last,
416 _Predicate __pred, std::__true_type)
417 {
return __check_sorted(__first, __last, __pred); }
419 template<
typename _InputIterator,
typename _Predicate>
421 __check_sorted_set_aux(
const _InputIterator&,
422 const _InputIterator&, _Predicate,
427 template<
typename _InputIterator1,
typename _InputIterator2>
429 __check_sorted_set(
const _InputIterator1& __first,
430 const _InputIterator1& __last,
431 const _InputIterator2&)
433 typedef typename std::iterator_traits<_InputIterator1>::value_type
435 typedef typename std::iterator_traits<_InputIterator2>::value_type
438 typedef typename std::__are_same<_ValueType1, _ValueType2>::__type
440 return __check_sorted_set_aux(__first, __last, _SameType());
443 template<
typename _InputIterator1,
typename _InputIterator2,
446 __check_sorted_set(
const _InputIterator1& __first,
447 const _InputIterator1& __last,
448 const _InputIterator2&, _Predicate __pred)
450 typedef typename std::iterator_traits<_InputIterator1>::value_type
452 typedef typename std::iterator_traits<_InputIterator2>::value_type
455 typedef typename std::__are_same<_ValueType1, _ValueType2>::__type
457 return __check_sorted_set_aux(__first, __last, __pred, _SameType());
463 template<
typename _ForwardIterator,
typename _Tp>
465 __check_partitioned_lower(_ForwardIterator __first,
466 _ForwardIterator __last,
const _Tp& __value)
468 while (__first != __last && *__first < __value)
470 if (__first != __last)
473 while (__first != __last && !(*__first < __value))
476 return __first == __last;
479 template<
typename _ForwardIterator,
typename _Tp>
481 __check_partitioned_upper(_ForwardIterator __first,
482 _ForwardIterator __last,
const _Tp& __value)
484 while (__first != __last && !(__value < *__first))
486 if (__first != __last)
489 while (__first != __last && __value < *__first)
492 return __first == __last;
496 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
498 __check_partitioned_lower(_ForwardIterator __first,
499 _ForwardIterator __last,
const _Tp& __value,
502 while (__first != __last &&
bool(__pred(*__first, __value)))
504 if (__first != __last)
507 while (__first != __last && !
bool(__pred(*__first, __value)))
510 return __first == __last;
513 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
515 __check_partitioned_upper(_ForwardIterator __first,
516 _ForwardIterator __last,
const _Tp& __value,
519 while (__first != __last && !
bool(__pred(__value, *__first)))
521 if (__first != __last)
524 while (__first != __last &&
bool(__pred(__value, *__first)))
527 return __first == __last;
531 template<
typename _Iterator>
532 struct __is_safe_random_iterator
534 enum { __value = 0 };
535 typedef std::__false_type __type;
538 template<
typename _Iterator,
typename _Sequence>
539 struct __is_safe_random_iterator<_Safe_iterator<_Iterator, _Sequence> >
540 : std::__are_same<std::random_access_iterator_tag,
541 typename std::iterator_traits<_Iterator>::
545 template<
typename _Iterator>
547 : std::_Iter_base<_Iterator, __is_safe_random_iterator<_Iterator>::__value>
556 template<
typename _Iterator>
557 inline typename _Siter_base<_Iterator>::iterator_type
559 {
return _Siter_base<_Iterator>::_S_base(__it); }
bool __valid_range_aux(const _Integral &, const _Integral &, std::__true_type)
bool __check_dereferenceable(const _Iterator &)
Forward iterators support a superset of input iterator operations.
bool __foreign_iterator_aux2(const _Safe_iterator< _Iterator, _Sequence > &__it, const _Safe_iterator< _OtherIterator, _Sequence > &__other, const _Safe_iterator< _OtherIterator, _Sequence > &)
_Siter_base< _Iterator >::iterator_type __base(_Iterator __it)
GNU debug classes for public use.
iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
bool __valid_range(const _InputIterator &__first, const _InputIterator &__last)
Random-access iterators support a superset of bidirectional iterator operations.
bool _M_dereferenceable() const
Is the iterator dereferenceable?
One of the comparison functors.
const _CharT * __check_string(const _CharT *__s, const _Integer &__n __attribute__((__unused__)))
bool __valid_range_aux2(const _RandomAccessIterator &__first, const _RandomAccessIterator &__last, std::random_access_iterator_tag)