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)