Spec-Zone .ru
спецификации, руководства, описания, API
ADC домой > Ссылочная библиотека> Ссылка> Дарвин> Разное пространство пользователя ссылка API

 


debug.h

Включает:
<assert.h>
<limits.h>
«wx/wxchar.h»
<cassert>
<stddef.h>
<bits/stl_iterator_base_types.h>
<bits/type_traits.h>
<debug/support.h>
<cassert>
<stddef.h>
<bits/stl_iterator_base_types.h>
<bits/type_traits.h>
<cassert>
<stddef.h>
<bits/stl_iterator_base_types.h>
<bits/cpp_type_traits.h>

Введение



Функции

__ check_dereferenceable
__ check_dereferenceable (_Iterator)
__ check_dereferenceable (константа _Tp *)
__ check_singular (константа _Safe_iterator _Iterator _Sequence и)
__ check_singular (константа _Tp *)
__ check_string (константа _CharT *)
__ check_string (константа _CharT *, константа _Integer и)
__ valid_range
__ valid_range_aux
__ valid_range_aux2 (константа _InputIterator, константа _InputIterator, станд.::)
__ valid_range_aux2 (константа _RandomAccessIterator и, константа _RandomAccessIterator и, станд.::)

__ check_dereferenceable


template<typename _Iterator, typename _Sequence> inline bool __check_dereferenceable(
    const _Safe_iterator<_Iterator, _Sequence>& __x) 
Обсуждение

Безопасные итераторы знают, исключительны ли они.


__ check_dereferenceable (_Iterator)


template<typename _Iterator> inline bool __check_dereferenceable(
    _Iterator&) 
Обсуждение

Предположите, что некоторый произвольный итератор dereferenceable, потому что мы не можем доказать, что это не.


__ check_dereferenceable (константа _Tp *)


template<typename _Tp> inline bool __check_dereferenceable(
    const _Tp*__ptr) 
Обсуждение

НЕНУЛЕВЫЕ УКАЗАТЕЛИ dereferenceable.


__ check_singular (константа _Safe_iterator _Iterator _Sequence и)


template<typename _Iterator, typename _Sequence> inline bool __check_singular(
    const _Safe_iterator<_Iterator, _Sequence>& __x) 
Обсуждение

Безопасные итераторы знают, исключительны ли они.


__ check_singular (константа _Tp *)


template<typename _Tp> inline bool __check_singular(
    const _Tp*__ptr) 
Обсуждение

НЕНУЛЕВЫЕ УКАЗАТЕЛИ неисключительны.


__ check_string (константа _CharT *)


template<typename _CharT> inline const _CharT* __check_string(
    const _CharT*__s) 
Обсуждение

Проверки, что __ s является не-NULL и затем возвращается __ s.


__ check_string (константа _CharT *, константа _Integer и)


template<typename _CharT, typename _Integer> inline const _CharT* __check_string(
    const _CharT*__s,
    const _Integer& __n) 
Обсуждение

Проверки, что __ s является не-NULL или __ n == 0, и затем возвращается __ s.


__ valid_range


template<typename _Iterator, typename _Sequence> inline bool __valid_range(
    const _Safe_iterator<_Iterator, _Sequence>& __first, 
    const _Safe_iterator<_Iterator, _Sequence>& __last) 
Обсуждение

Безопасные итераторы знают, как проверить, формируют ли они допустимый диапазон.


__ valid_range_aux


template<typename _Integral> inline bool __valid_range_aux(
    const _Integral&,
    const _Integral&,
    __true_type) 
Обсуждение

Мы говорим, что целочисленные типы для допустимого диапазона, и подчиняются другим подпрограммам для понимания, что сделать с целочисленными типами вместо итераторов.


__ valid_range_aux2 (константа _InputIterator, константа _InputIterator, станд.::)


template<typename _InputIterator> inline bool __valid_range_aux2(
    const _InputIterator&,
    const _InputIterator&, 
    std::input_iterator_tag) 
Обсуждение

Не может протестировать на допустимый диапазон с входными итераторами, потому что итерация может быть разрушительной. Таким образом, мы просто предполагаем, что диапазон допустим.


__ valid_range_aux2 (константа _RandomAccessIterator и, константа _RandomAccessIterator и, станд.::)


template<typename _RandomAccessIterator> inline bool __valid_range_aux2(
    const _RandomAccessIterator& __first, 
    const _RandomAccessIterator& __last, 
    std::random_access_iterator_tag) 
Обсуждение

Если расстояние между двумя итераторами произвольного доступа является неотрицательным, предположите, что диапазон допустим.

Определения типов


__ valid_range


template<typename _InputIterator> inline bool __valid_range(
    const _InputIterator& __first,
    const _InputIterator& __last) 
Обсуждение

Не знайте то, что эти итераторы, или если они - даже итераторы (мы можем получить целочисленный тип для InputIterator), поэтому посмотрите, являются ли они неотъемлемой частью и передают их на следующую фазу иначе.


__ valid_range_aux


template<typename _InputIterator> inline bool __valid_range_aux(
    const _InputIterator& __first, 
    const _InputIterator& __last,
    __false_type) 
Обсуждение

У нас есть итераторы, таким образом выясните, какие итераторы, которые должны видеть, можем ли мы проверить диапазон заранее.

#defines


__ glibcxx_check_erase


#define __glibcxx_check_erase(
    _Position) \ do {
    \ if (
    ! (
    _Position._M_dereferenceable(
    ))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_erase_bad) \ ._M_sequence(
    *this, "this") \ ._M_iterator(
    _Position, #_Position)._M_error(
    ); \ 
} while (
    false); \ do {
    \ if (
    ! (
    _Position._M_attached_to(
    this))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_erase_different) \ ._M_sequence(
    *this, "this") \ ._M_iterator(
    _Position, #_Position)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что мы можем стереть элемент, на который ссылается итератор _Position. Если _Position итератор dereferenceable и ссылается на эту последовательность, мы можем стереть элемент.


__ glibcxx_check_erase_range


#define __glibcxx_check_erase_range(
    _First,_Last) \ __glibcxx_check_valid_range(
    _First,_Last); \ do {
    \ if (
    ! (
    _First._M_attached_to(
    this))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_erase_different) \ ._M_sequence(
    *this, "this") \ ._M_iterator(
    _First, #_First) \ ._M_iterator(
    _Last, #_Last)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что мы можем стереть элементы в диапазоне итератора [_First, _Last). Мы можем стереть элементы, если [_First, _Last), допустимый диапазон итератора в этой последовательности.


__ glibcxx_check_heap_pred


#define __glibcxx_check_heap_pred(
    _First,_Last,_Pred) \ __glibcxx_check_valid_range(
    _First,_Last); \ do {
    \ if (
    ! (
    ::std::__is_heap(
    _First, _Last, _Pred))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_not_heap_pred) \ ._M_iterator(
    _First, #_First) \ ._M_iterator(
    _Last, #_Last) \ ._M_string(
    #_Pred)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что диапазон итератора [_First, _Last), «куча» w.r.t. предикат _Pred.


__ glibcxx_check_insert


#define __glibcxx_check_insert(
    _Position) \ do {
    \ if (
    ! (
    !_Position._M_singular(
    ))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_insert_singular) \ ._M_sequence(
    *this, "this") \ ._M_iterator(
    _Position, #_Position)._M_error(
    ); \ 
} while (
    false); \ do {
    \ if (
    ! (
    _Position._M_attached_to(
    this))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_insert_different) \ ._M_sequence(
    *this, "this") \ ._M_iterator(
    _Position, #_Position)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что мы можем вставить в *это с итератором _Position. Вставка в контейнер в определенной позиции требует, чтобы итератор был неисключителен (т.е. или dereferenceable или прошлый конец), и что это ссылается на последовательность, в которую мы вставляем. Обратите внимание на то, что этот макрос только допустим, когда контейнер является _Safe_sequence, и итератор является _Safe_iterator.


__ glibcxx_check_insert_range


#define __glibcxx_check_insert_range(
    _Position,_First,_Last) \ __glibcxx_check_valid_range(
    _First,_Last); \ do {
    \ if (
    ! (
    !_Position._M_singular(
    ))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_insert_singular) \ ._M_sequence(
    *this, "this") \ ._M_iterator(
    _Position, #_Position)._M_error(
    ); \ 
} while (
    false); \ do {
    \ if (
    ! (
    _Position._M_attached_to(
    this))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_insert_different) \ ._M_sequence(
    *this, "this") \ ._M_iterator(
    _Position, #_Position)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что мы можем вставить значения в диапазон итератора [_First, _Last) в *это с итератором _Position. Вставка в контейнер в определенной позиции требует, чтобы итератор был неисключителен (т.е. или dereferenceable или прошлый конец), что это ссылается на последовательность, которую мы вставляем в, и что диапазон итератора [_First, В последний раз), допустимое (возможно пустой) диапазон. Обратите внимание на то, что этот макрос только допустим, когда контейнер является _Safe_sequence, и итератор является _Safe_iterator.

@tbd, который Мы хотели бы проверить на невмешательство _Position и диапазона [_First, _Last), но это не может (в целом) быть сделано.


__ glibcxx_check_partitioned


#define __glibcxx_check_partitioned(
    _First,_Last,_Value) \ __glibcxx_check_valid_range(
    _First,_Last); \ do {
    \ if (
    ! (
    ::__gnu_debug::__check_partitioned(
    _First, _Last, \ _Value))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_unpartitioned) \ ._M_iterator(
    _First, #_First) \ ._M_iterator(
    _Last, #_Last) \ ._M_string(
    #_Value)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что диапазон итератора [_First, _Last), делится w.r.t. значение _Value.


__ glibcxx_check_partitioned_pred


#define __glibcxx_check_partitioned_pred(
    _First,_Last,_Value,_Pred) \ __glibcxx_check_valid_range(
    _First,_Last); \ do {
    \ if (
    ! (
    ::__gnu_debug::__check_partitioned(
    _First, _Last, \ _Value, _Pred))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_unpartitioned_pred) \ ._M_iterator(
    _First, #_First) \ ._M_iterator(
    _Last, #_Last) \ ._M_string(
    #_Pred) \ ._M_string(
    #_Value)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что диапазон итератора [_First, _Last), делится w.r.t. значение _Value и предикат _Pred.


__ glibcxx_check_sorted_pred


#define __glibcxx_check_sorted_pred(
    _First,_Last,_Pred) \ __glibcxx_check_valid_range(
    _First,_Last); \ __glibcxx_check_strict_weak_ordering_pred(
    _First,_Last,_Pred); \ do {
    \ if (
    ! (
    ::__gnu_debug::__check_sorted(
    _First, _Last, _Pred))) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ . \ _M_message(
    ::__gnu_debug::__msg_unsorted_pred) \ ._M_iterator(
    _First, #_First) \ ._M_iterator(
    _Last, #_Last) \ ._M_string(
    #_Pred)._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Проверьте, что диапазон итератора [_First, _Last), сортируется предикатом _Pred.


_GLIBCXX_DEBUG_VERIFY


#define _GLIBCXX_DEBUG_VERIFY(
    _Condition,_ErrorMessage) \ do {
    \ if (
    ! (
    _Condition)) \ ::__gnu_debug::_Error_formatter::_M_at(
    __FILE__, __LINE__) \ ._ErrorMessage._M_error(
    ); \ 
} while (
    false) 
Обсуждение

Макросы, используемые реализацией для проверки определенных свойств. Они макросы могут только использоваться непосредственно обертками отладки. Обратите внимание на то, что это макросы (вместо, более очевидно, «корректного» выбора создания их функции), потому что нам нужны строка и информация о файле на сайте вызова, для минимизации расстояния между пользовательской ошибкой и где сообщают об ошибке.

Последнее обновление: 20.06.2006