1 // Debugging support implementation -*- C++ -*-
3 // Copyright (C) 2003-2013 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
25 /** @file debug/functions.h
26 * This file is a GNU debug extension to the Standard C++ Library.
29 #ifndef _GLIBCXX_DEBUG_FUNCTIONS_H
30 #define _GLIBCXX_DEBUG_FUNCTIONS_H 1
32 #include <bits/c++config.h>
33 #include <bits/stl_iterator_base_types.h> // for iterator_traits, categories and
35 #include <bits/cpp_type_traits.h> // for __is_integer
36 #include <bits/move.h> // for __addressof and addressof
37 #if __cplusplus >= 201103L
38 # include <bits/stl_function.h> // for less and greater_equal
39 # include <type_traits> // for is_lvalue_reference and __and_
41 #include <debug/formatter.h>
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 // An arbitrary iterator pointer is not singular.
57 __check_singular_aux(const void*) { return false; }
59 // We may have an iterator that derives from _Safe_iterator_base but isn't
61 template<typename _Iterator
>
63 __check_singular(const _Iterator
& __x
)
64 { return __check_singular_aux(&__x
); }
66 /** Non-NULL pointers are nonsingular. */
67 template<typename _Tp
>
69 __check_singular(const _Tp
* __ptr
)
70 { return __ptr
== 0; }
72 /** Assume that some arbitrary iterator is dereferenceable, because we
73 can't prove that it isn't. */
74 template<typename _Iterator
>
76 __check_dereferenceable(const _Iterator
&)
79 /** Non-NULL pointers are dereferenceable. */
80 template<typename _Tp
>
82 __check_dereferenceable(const _Tp
* __ptr
)
85 /** Safe iterators know if they are dereferenceable. */
86 template<typename _Iterator
, typename _Sequence
>
88 __check_dereferenceable(const _Safe_iterator
<_Iterator
, _Sequence
>& __x
)
89 { return __x
._M_dereferenceable(); }
91 /** Safe local iterators know if they are dereferenceable. */
92 template<typename _Iterator
, typename _Sequence
>
94 __check_dereferenceable(const _Safe_local_iterator
<_Iterator
,
96 { return __x
._M_dereferenceable(); }
98 /** If the distance between two random access iterators is
99 * nonnegative, assume the range is valid.
101 template<typename _RandomAccessIterator
>
103 __valid_range_aux2(const _RandomAccessIterator
& __first
,
104 const _RandomAccessIterator
& __last
,
105 std::random_access_iterator_tag
)
106 { return __last
- __first
>= 0; }
108 /** Can't test for a valid range with input iterators, because
109 * iteration may be destructive. So we just assume that the range
112 template<typename _InputIterator
>
114 __valid_range_aux2(const _InputIterator
&, const _InputIterator
&,
115 std::input_iterator_tag
)
118 /** We say that integral types for a valid range, and defer to other
119 * routines to realize what to do with integral types instead of
122 template<typename _Integral
>
124 __valid_range_aux(const _Integral
&, const _Integral
&, std::__true_type
)
127 /** We have iterators, so figure out what kind of iterators that are
128 * to see if we can check the range ahead of time.
130 template<typename _InputIterator
>
132 __valid_range_aux(const _InputIterator
& __first
,
133 const _InputIterator
& __last
, std::__false_type
)
134 { return __valid_range_aux2(__first
, __last
,
135 std::__iterator_category(__first
)); }
137 /** Don't know what these iterators are, or if they are even
138 * iterators (we may get an integral type for InputIterator), so
139 * see if they are integral and pass them on to the next phase
142 template<typename _InputIterator
>
144 __valid_range(const _InputIterator
& __first
, const _InputIterator
& __last
)
146 typedef typename
std::__is_integer
<_InputIterator
>::__type _Integral
;
147 return __valid_range_aux(__first
, __last
, _Integral());
150 /** Safe iterators know how to check if they form a valid range. */
151 template<typename _Iterator
, typename _Sequence
>
153 __valid_range(const _Safe_iterator
<_Iterator
, _Sequence
>& __first
,
154 const _Safe_iterator
<_Iterator
, _Sequence
>& __last
)
155 { return __first
._M_valid_range(__last
); }
157 /** Safe local iterators know how to check if they form a valid range. */
158 template<typename _Iterator
, typename _Sequence
>
160 __valid_range(const _Safe_local_iterator
<_Iterator
, _Sequence
>& __first
,
161 const _Safe_local_iterator
<_Iterator
, _Sequence
>& __last
)
162 { return __first
._M_valid_range(__last
); }
164 /* Checks that [first, last) is a valid range, and then returns
165 * __first. This routine is useful when we can't use a separate
166 * assertion statement because, e.g., we are in a constructor.
168 template<typename _InputIterator
>
169 inline _InputIterator
170 __check_valid_range(const _InputIterator
& __first
,
171 const _InputIterator
& __last
172 __attribute__((__unused__
)))
174 __glibcxx_check_valid_range(__first
, __last
);
178 #if __cplusplus >= 201103L
179 // Default implementation.
180 template<typename _Iterator
, typename _Sequence
>
182 __foreign_iterator_aux4(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
183 typename
_Sequence::const_pointer __begin
,
184 typename
_Sequence::const_pointer __other
)
186 typedef typename
_Sequence::const_pointer _PointerType
;
187 constexpr std::less
<_PointerType
> __l
{};
189 return (__l(__other
, __begin
)
190 || __l(std::addressof(*(__it
._M_get_sequence()->_M_base().end()
194 // Fallback when address type cannot be implicitely casted to sequence
196 template<typename _Iterator
, typename _Sequence
,
197 typename _InputIterator
>
199 __foreign_iterator_aux4(const _Safe_iterator
<_Iterator
, _Sequence
>&,
203 template<typename _Iterator
, typename _Sequence
, typename _InputIterator
>
205 __foreign_iterator_aux3(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
206 _InputIterator __other
,
209 // Only containers with all elements in contiguous memory can have their
210 // elements passed through pointers.
211 // Arithmetics is here just to make sure we are not dereferencing
212 // past-the-end iterator.
213 if (__it
._M_get_sequence()->_M_base().begin()
214 != __it
._M_get_sequence()->_M_base().end())
215 if (std::addressof(*(__it
._M_get_sequence()->_M_base().end() - 1))
216 - std::addressof(*(__it
._M_get_sequence()->_M_base().begin()))
217 == __it
._M_get_sequence()->size() - 1)
218 return (__foreign_iterator_aux4
220 std::addressof(*(__it
._M_get_sequence()->_M_base().begin())),
221 std::addressof(*__other
)));
225 /* Fallback overload for which we can't say, assume it is valid. */
226 template<typename _Iterator
, typename _Sequence
, typename _InputIterator
>
228 __foreign_iterator_aux3(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
229 _InputIterator __other
,
234 /** Checks that iterators do not belong to the same sequence. */
235 template<typename _Iterator
, typename _Sequence
, typename _OtherIterator
>
237 __foreign_iterator_aux2(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
238 const _Safe_iterator
<_OtherIterator
, _Sequence
>& __other
,
239 std::input_iterator_tag
)
240 { return __it
._M_get_sequence() != __other
._M_get_sequence(); }
242 #if __cplusplus >= 201103L
243 /* This overload detects when passing pointers to the contained elements
244 rather than using iterators.
246 template<typename _Iterator
, typename _Sequence
, typename _InputIterator
>
248 __foreign_iterator_aux2(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
249 _InputIterator __other
,
250 std::random_access_iterator_tag
)
252 typedef typename
_Sequence::const_iterator _ItType
;
253 typedef typename
std::iterator_traits
<_ItType
>::reference _Ref
;
254 return __foreign_iterator_aux3(__it
, __other
,
255 std::is_lvalue_reference
<_Ref
>());
259 /* Fallback overload for which we can't say, assume it is valid. */
260 template<typename _Iterator
, typename _Sequence
, typename _InputIterator
>
262 __foreign_iterator_aux2(const _Safe_iterator
<_Iterator
, _Sequence
>&,
264 std::input_iterator_tag
)
267 template<typename _Iterator
, typename _Sequence
,
270 __foreign_iterator_aux(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
275 template<typename _Iterator
, typename _Sequence
,
276 typename _InputIterator
>
278 __foreign_iterator_aux(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
279 _InputIterator __other
,
282 return (_Insert_range_from_self_is_safe
<_Sequence
>::__value
283 || __foreign_iterator_aux2(__it
, __other
,
284 std::__iterator_category(__it
)));
287 template<typename _Iterator
, typename _Sequence
,
288 typename _InputIterator
>
290 __foreign_iterator(const _Safe_iterator
<_Iterator
, _Sequence
>& __it
,
291 _InputIterator __other
)
293 typedef typename
std::__is_integer
<_InputIterator
>::__type _Integral
;
294 return __foreign_iterator_aux(__it
, __other
, _Integral());
297 /** Checks that __s is non-NULL or __n == 0, and then returns __s. */
298 template<typename _CharT
, typename _Integer
>
300 __check_string(const _CharT
* __s
,
301 const _Integer
& __n
__attribute__((__unused__
)))
303 #ifdef _GLIBCXX_DEBUG_PEDANTIC
304 __glibcxx_assert(__s
!= 0 || __n
== 0);
309 /** Checks that __s is non-NULL and then returns __s. */
310 template<typename _CharT
>
312 __check_string(const _CharT
* __s
)
314 #ifdef _GLIBCXX_DEBUG_PEDANTIC
315 __glibcxx_assert(__s
!= 0);
320 // Can't check if an input iterator sequence is sorted, because we
321 // can't step through the sequence.
322 template<typename _InputIterator
>
324 __check_sorted_aux(const _InputIterator
&, const _InputIterator
&,
325 std::input_iterator_tag
)
328 // Can verify if a forward iterator sequence is in fact sorted using
330 template<typename _ForwardIterator
>
332 __check_sorted_aux(_ForwardIterator __first
, _ForwardIterator __last
,
333 std::forward_iterator_tag
)
335 if (__first
== __last
)
338 _ForwardIterator __next
= __first
;
339 for (++__next
; __next
!= __last
; __first
= __next
, ++__next
)
340 if (*__next
< *__first
)
346 // Can't check if an input iterator sequence is sorted, because we can't step
347 // through the sequence.
348 template<typename _InputIterator
, typename _Predicate
>
350 __check_sorted_aux(const _InputIterator
&, const _InputIterator
&,
351 _Predicate
, std::input_iterator_tag
)
354 // Can verify if a forward iterator sequence is in fact sorted using
356 template<typename _ForwardIterator
, typename _Predicate
>
358 __check_sorted_aux(_ForwardIterator __first
, _ForwardIterator __last
,
359 _Predicate __pred
, std::forward_iterator_tag
)
361 if (__first
== __last
)
364 _ForwardIterator __next
= __first
;
365 for (++__next
; __next
!= __last
; __first
= __next
, ++__next
)
366 if (__pred(*__next
, *__first
))
372 // Determine if a sequence is sorted.
373 template<typename _InputIterator
>
375 __check_sorted(const _InputIterator
& __first
, const _InputIterator
& __last
)
377 // Verify that the < operator for elements in the sequence is a
378 // StrictWeakOrdering by checking that it is irreflexive.
379 __glibcxx_assert(__first
== __last
|| !(*__first
< *__first
));
381 return __check_sorted_aux(__first
, __last
,
382 std::__iterator_category(__first
));
385 template<typename _InputIterator
, typename _Predicate
>
387 __check_sorted(const _InputIterator
& __first
, const _InputIterator
& __last
,
390 // Verify that the predicate is StrictWeakOrdering by checking that it
392 __glibcxx_assert(__first
== __last
|| !__pred(*__first
, *__first
));
394 return __check_sorted_aux(__first
, __last
, __pred
,
395 std::__iterator_category(__first
));
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
,
426 // ... special variant used in std::merge, std::includes, std::set_*.
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());
460 // _GLIBCXX_RESOLVE_LIB_DEFECTS
461 // 270. Binary search requirements overly strict
462 // Determine if a sequence is partitioned w.r.t. this element.
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
;
495 // Determine if a sequence is partitioned w.r.t. this element.
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
;
530 // Helper struct to detect random access safe iterators.
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
>
550 /** Helper function to extract base iterator of random access safe iterator
551 in order to reduce performance impact of debug mode. Limited to random
552 access iterator because it is the only category for which it is possible
553 to check for correct iterators order in the __valid_range function
554 thanks to the < operator.
556 template<typename _Iterator
>
557 inline typename _Siter_base
<_Iterator
>::iterator_type
558 __base(_Iterator __it
)
559 { return _Siter_base
<_Iterator
>::_S_base(__it
); }
560 } // namespace __gnu_debug