29 #ifndef _GLIBCXX_DEBUG_FUNCTIONS_H
30 #define _GLIBCXX_DEBUG_FUNCTIONS_H 1
40 template<
typename _Iterator,
typename _Sequence>
45 __check_singular_aux(
const void*) {
return false; }
49 template<
typename _Iterator>
52 {
return __check_singular_aux(&__x); }
55 template<
typename _Tp>
58 {
return __ptr == 0; }
61 template<
typename _Iterator,
typename _Sequence>
68 template<
typename _Iterator>
74 template<
typename _Tp>
80 template<
typename _Iterator,
typename _Sequence>
88 template<
typename _RandomAccessIterator>
91 const _RandomAccessIterator& __last,
93 {
return __last - __first >= 0; }
99 template<
typename _InputIterator>
109 template<
typename _Integral>
117 template<
typename _InputIterator>
120 const _InputIterator& __last, std::__false_type)
129 template<
typename _InputIterator>
133 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
138 template<
typename _Iterator,
typename _Sequence>
142 {
return __first._M_valid_range(__last); }
145 template<
typename _Iterator,
typename _Sequence>
149 {
return __first._M_valid_range(__last); }
155 template<
typename _InputIterator>
156 inline _InputIterator
157 __check_valid_range(
const _InputIterator& __first,
158 const _InputIterator& __last
159 __attribute__((__unused__)))
161 __glibcxx_check_valid_range(__first, __last);
166 template<
typename _CharT,
typename _Integer>
169 const _Integer& __n __attribute__((__unused__)))
171 #ifdef _GLIBCXX_DEBUG_PEDANTIC
172 __glibcxx_assert(__s != 0 || __n == 0);
178 template<
typename _CharT>
182 #ifdef _GLIBCXX_DEBUG_PEDANTIC
183 __glibcxx_assert(__s != 0);
190 template<
typename _InputIterator>
192 __check_sorted_aux(
const _InputIterator&,
const _InputIterator&,
198 template<
typename _ForwardIterator>
200 __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
203 if (__first == __last)
206 _ForwardIterator __next = __first;
207 for (++__next; __next != __last; __first = __next, ++__next)
208 if (*__next < *__first)
216 template<
typename _Iterator,
typename _Sequence>
218 __check_sorted_aux(
const _Safe_iterator<_Iterator, _Sequence>& __first,
219 const _Safe_iterator<_Iterator, _Sequence>& __last,
221 {
return __check_sorted_aux(__first.base(), __last.base(), __tag); }
225 template<
typename _InputIterator,
typename _Predicate>
227 __check_sorted_aux(
const _InputIterator&,
const _InputIterator&,
233 template<
typename _ForwardIterator,
typename _Predicate>
235 __check_sorted_aux(_ForwardIterator __first, _ForwardIterator __last,
238 if (__first == __last)
241 _ForwardIterator __next = __first;
242 for (++__next; __next != __last; __first = __next, ++__next)
243 if (__pred(*__next, *__first))
251 template<
typename _Iterator,
typename _Sequence,
254 __check_sorted_aux(
const _Safe_iterator<_Iterator, _Sequence>& __first,
255 const _Safe_iterator<_Iterator, _Sequence>& __last,
258 {
return __check_sorted_aux(__first.base(), __last.base(), __pred, __tag); }
261 template<
typename _InputIterator>
263 __check_sorted(
const _InputIterator& __first,
const _InputIterator& __last)
267 __glibcxx_assert(__first == __last || !(*__first < *__first));
269 return __check_sorted_aux(__first, __last,
273 template<
typename _InputIterator,
typename _Predicate>
275 __check_sorted(
const _InputIterator& __first,
const _InputIterator& __last,
280 __glibcxx_assert(__first == __last || !__pred(*__first, *__first));
282 return __check_sorted_aux(__first, __last, __pred,
286 template<
typename _InputIterator>
288 __check_sorted_set_aux(
const _InputIterator& __first,
289 const _InputIterator& __last,
291 {
return __check_sorted(__first, __last); }
293 template<
typename _InputIterator>
295 __check_sorted_set_aux(
const _InputIterator&,
296 const _InputIterator&,
300 template<
typename _InputIterator,
typename _Predicate>
302 __check_sorted_set_aux(
const _InputIterator& __first,
303 const _InputIterator& __last,
304 _Predicate __pred, std::__true_type)
305 {
return __check_sorted(__first, __last, __pred); }
307 template<
typename _InputIterator,
typename _Predicate>
309 __check_sorted_set_aux(
const _InputIterator&,
310 const _InputIterator&, _Predicate,
315 template<
typename _InputIterator1,
typename _InputIterator2>
317 __check_sorted_set(
const _InputIterator1& __first,
318 const _InputIterator1& __last,
319 const _InputIterator2&)
321 typedef typename std::iterator_traits<_InputIterator1>::value_type
323 typedef typename std::iterator_traits<_InputIterator2>::value_type
326 typedef typename std::__are_same<_ValueType1, _ValueType2>::__type
328 return __check_sorted_set_aux(__first, __last, _SameType());
331 template<
typename _InputIterator1,
typename _InputIterator2,
334 __check_sorted_set(
const _InputIterator1& __first,
335 const _InputIterator1& __last,
336 const _InputIterator2&, _Predicate __pred)
338 typedef typename std::iterator_traits<_InputIterator1>::value_type
340 typedef typename std::iterator_traits<_InputIterator2>::value_type
343 typedef typename std::__are_same<_ValueType1, _ValueType2>::__type
345 return __check_sorted_set_aux(__first, __last, __pred, _SameType());
351 template<
typename _ForwardIterator,
typename _Tp>
353 __check_partitioned_lower(_ForwardIterator __first,
354 _ForwardIterator __last,
const _Tp& __value)
356 while (__first != __last && *__first < __value)
358 if (__first != __last)
361 while (__first != __last && !(*__first < __value))
364 return __first == __last;
367 template<
typename _ForwardIterator,
typename _Tp>
369 __check_partitioned_upper(_ForwardIterator __first,
370 _ForwardIterator __last,
const _Tp& __value)
372 while (__first != __last && !(__value < *__first))
374 if (__first != __last)
377 while (__first != __last && __value < *__first)
380 return __first == __last;
384 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>
403 __check_partitioned_upper(_ForwardIterator __first,
404 _ForwardIterator __last,
const _Tp& __value,
407 while (__first != __last && !
bool(__pred(__value, *__first)))
409 if (__first != __last)
412 while (__first != __last &&
bool(__pred(__value, *__first)))
415 return __first == __last;
419 template<
typename _Iterator>
420 struct __is_safe_random_iterator
422 enum { __value = 0 };
423 typedef std::__false_type __type;
426 template<
typename _Iterator,
typename _Sequence>
427 struct __is_safe_random_iterator<_Safe_iterator<_Iterator, _Sequence> >
428 : std::__are_same<std::random_access_iterator_tag,
429 typename std::iterator_traits<_Iterator>::
433 template<
typename _Iterator>
435 : std::_Iter_base<_Iterator, __is_safe_random_iterator<_Iterator>::__value>
444 template<
typename _Iterator>
445 inline typename _Siter_base<_Iterator>::iterator_type
447 {
return _Siter_base<_Iterator>::_S_base(__it); }
_Siter_base< _Iterator >::iterator_type __base(_Iterator __it)
bool __check_singular(const _Safe_iterator< _Iterator, _Sequence > &__x)
bool __check_dereferenceable(_Iterator &)
Random-access iterators support a superset of bidirectional iterator operations.
const _CharT * __check_string(const _CharT *__s, const _Integer &__n __attribute__((__unused__)))
bool __valid_range(const _InputIterator &__first, const _InputIterator &__last)
iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
bool __valid_range_aux(const _Integral &, const _Integral &, std::__true_type)
bool __valid_range_aux2(const _RandomAccessIterator &__first, const _RandomAccessIterator &__last, std::random_access_iterator_tag)
Forward iterators support a superset of input iterator operations.
GNU debug classes for public use.
bool _M_dereferenceable() const
Is the iterator dereferenceable?