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>
51 __check_singular(_Iterator& __x)
52 {
return __check_singular_aux(&__x); }
55 template<
typename _Tp>
57 __check_singular(
const _Tp* __ptr)
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());
348 template<
typename _ForwardIterator,
typename _Tp>
350 __check_partitioned_lower_aux(_ForwardIterator __first,
351 _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;
367 template<
typename _Iterator,
typename _Sequence,
typename _Tp>
369 __check_partitioned_lower_aux(
370 const _Safe_iterator<_Iterator, _Sequence>& __first,
371 const _Safe_iterator<_Iterator, _Sequence>& __last,
375 return __check_partitioned_lower_aux(__first.base(), __last.base(),
382 template<
typename _ForwardIterator,
typename _Tp>
384 __check_partitioned_lower(_ForwardIterator __first,
385 _ForwardIterator __last,
const _Tp& __value)
387 return __check_partitioned_lower_aux(__first, __last, __value,
391 template<
typename _ForwardIterator,
typename _Tp>
393 __check_partitioned_upper_aux(_ForwardIterator __first,
394 _ForwardIterator __last,
const _Tp& __value,
397 while (__first != __last && !(__value < *__first))
399 if (__first != __last)
402 while (__first != __last && __value < *__first)
405 return __first == __last;
410 template<
typename _Iterator,
typename _Sequence,
typename _Tp>
412 __check_partitioned_upper_aux(
413 const _Safe_iterator<_Iterator, _Sequence>& __first,
414 const _Safe_iterator<_Iterator, _Sequence>& __last,
418 return __check_partitioned_upper_aux(__first.base(), __last.base(),
422 template<
typename _ForwardIterator,
typename _Tp>
424 __check_partitioned_upper(_ForwardIterator __first,
425 _ForwardIterator __last,
const _Tp& __value)
427 return __check_partitioned_upper_aux(__first, __last, __value,
431 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
433 __check_partitioned_lower_aux(_ForwardIterator __first,
434 _ForwardIterator __last,
const _Tp& __value,
438 while (__first != __last &&
bool(__pred(*__first, __value)))
440 if (__first != __last)
443 while (__first != __last && !
bool(__pred(*__first, __value)))
446 return __first == __last;
451 template<
typename _Iterator,
typename _Sequence,
452 typename _Tp,
typename _Pred>
454 __check_partitioned_lower_aux(
455 const _Safe_iterator<_Iterator, _Sequence>& __first,
456 const _Safe_iterator<_Iterator, _Sequence>& __last,
457 const _Tp& __value, _Pred __pred,
460 return __check_partitioned_lower_aux(__first.base(), __last.base(),
461 __value, __pred, __tag);
465 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
467 __check_partitioned_lower(_ForwardIterator __first,
468 _ForwardIterator __last,
const _Tp& __value,
471 return __check_partitioned_lower_aux(__first, __last, __value, __pred,
475 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
477 __check_partitioned_upper_aux(_ForwardIterator __first,
478 _ForwardIterator __last,
const _Tp& __value,
482 while (__first != __last && !
bool(__pred(__value, *__first)))
484 if (__first != __last)
487 while (__first != __last &&
bool(__pred(__value, *__first)))
490 return __first == __last;
495 template<
typename _Iterator,
typename _Sequence,
496 typename _Tp,
typename _Pred>
498 __check_partitioned_upper_aux(
499 const _Safe_iterator<_Iterator, _Sequence>& __first,
500 const _Safe_iterator<_Iterator, _Sequence>& __last,
501 const _Tp& __value, _Pred __pred,
504 return __check_partitioned_upper_aux(__first.base(), __last.base(),
505 __value, __pred, __tag);
508 template<
typename _ForwardIterator,
typename _Tp,
typename _Pred>
510 __check_partitioned_upper(_ForwardIterator __first,
511 _ForwardIterator __last,
const _Tp& __value,
514 return __check_partitioned_upper_aux(__first, __last, __value, __pred,
519 template<
typename _Iterator>
520 struct __is_safe_random_iterator
522 enum { __value = 0 };
523 typedef std::__false_type __type;
526 template<
typename _Iterator,
typename _Sequence>
527 struct __is_safe_random_iterator<_Safe_iterator<_Iterator, _Sequence> >
528 : std::__are_same<std::random_access_iterator_tag,
529 typename std::iterator_traits<_Iterator>::
533 template<
typename _Iterator>
535 : std::_Iter_base<_Iterator, __is_safe_random_iterator<_Iterator>::__value>
544 template<
typename _Iterator>
545 inline typename _Siter_base<_Iterator>::iterator_type
547 {
return _Siter_base<_Iterator>::_S_base(__it); }