00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _GLIBCXX_DEBUG_MACROS_H
00032 #define _GLIBCXX_DEBUG_MACROS_H 1
00033
00043 #define _GLIBCXX_DEBUG_VERIFY(_Condition,_ErrorMessage) \
00044 do { \
00045 if (! (_Condition)) \
00046 ::__gnu_debug::_Error_formatter::_M_at(__FILE__, __LINE__) \
00047 ._ErrorMessage._M_error(); \
00048 } while (false)
00049
00050
00051 #define __glibcxx_check_valid_range(_First,_Last) \
00052 _GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__valid_range(_First, _Last), \
00053 _M_message(::__gnu_debug::__msg_valid_range) \
00054 ._M_iterator(_First, #_First) \
00055 ._M_iterator(_Last, #_Last))
00056
00064 #define __glibcxx_check_insert(_Position) \
00065 _GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
00066 _M_message(::__gnu_debug::__msg_insert_singular) \
00067 ._M_sequence(*this, "this") \
00068 ._M_iterator(_Position, #_Position)); \
00069 _GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
00070 _M_message(::__gnu_debug::__msg_insert_different) \
00071 ._M_sequence(*this, "this") \
00072 ._M_iterator(_Position, #_Position))
00073
00087 #define __glibcxx_check_insert_range(_Position,_First,_Last) \
00088 __glibcxx_check_valid_range(_First,_Last); \
00089 _GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
00090 _M_message(::__gnu_debug::__msg_insert_singular) \
00091 ._M_sequence(*this, "this") \
00092 ._M_iterator(_Position, #_Position)); \
00093 _GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
00094 _M_message(::__gnu_debug::__msg_insert_different) \
00095 ._M_sequence(*this, "this") \
00096 ._M_iterator(_Position, #_Position))
00097
00102 #define __glibcxx_check_erase(_Position) \
00103 _GLIBCXX_DEBUG_VERIFY(_Position._M_dereferenceable(), \
00104 _M_message(::__gnu_debug::__msg_erase_bad) \
00105 ._M_sequence(*this, "this") \
00106 ._M_iterator(_Position, #_Position)); \
00107 _GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
00108 _M_message(::__gnu_debug::__msg_erase_different) \
00109 ._M_sequence(*this, "this") \
00110 ._M_iterator(_Position, #_Position))
00111
00116 #define __glibcxx_check_erase_range(_First,_Last) \
00117 __glibcxx_check_valid_range(_First,_Last); \
00118 _GLIBCXX_DEBUG_VERIFY(_First._M_attached_to(this), \
00119 _M_message(::__gnu_debug::__msg_erase_different) \
00120 ._M_sequence(*this, "this") \
00121 ._M_iterator(_First, #_First) \
00122 ._M_iterator(_Last, #_Last))
00123
00124
00125 #define __glibcxx_check_subscript(_N) \
00126 _GLIBCXX_DEBUG_VERIFY(_N < this->size(), \
00127 _M_message(::__gnu_debug::__msg_subscript_oob) \
00128 ._M_sequence(*this, "this") \
00129 ._M_integer(_N, #_N) \
00130 ._M_integer(this->size(), "size"))
00131
00132
00133 #define __glibcxx_check_nonempty() \
00134 _GLIBCXX_DEBUG_VERIFY(! this->empty(), \
00135 _M_message(::__gnu_debug::__msg_empty) \
00136 ._M_sequence(*this, "this"))
00137
00138
00139
00140 #define __glibcxx_check_strict_weak_ordering(_First,_Last) \
00141 _GLIBCXX_DEBUG_ASSERT(_First == _Last || !(*_First < *_First))
00142
00143
00144
00145 #define __glibcxx_check_strict_weak_ordering_pred(_First,_Last,_Pred) \
00146 _GLIBCXX_DEBUG_ASSERT(_First == _Last || !_Pred(*_First, *_First))
00147
00148
00149
00150 #define __glibcxx_check_sorted(_First,_Last) \
00151 __glibcxx_check_valid_range(_First,_Last); \
00152 __glibcxx_check_strict_weak_ordering(_First,_Last); \
00153 _GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_sorted(_First, _Last), \
00154 _M_message(::__gnu_debug::__msg_unsorted) \
00155 ._M_iterator(_First, #_First) \
00156 ._M_iterator(_Last, #_Last))
00157
00160 #define __glibcxx_check_sorted_pred(_First,_Last,_Pred) \
00161 __glibcxx_check_valid_range(_First,_Last); \
00162 __glibcxx_check_strict_weak_ordering_pred(_First,_Last,_Pred); \
00163 _GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_sorted(_First, _Last, _Pred), \
00164 _M_message(::__gnu_debug::__msg_unsorted_pred) \
00165 ._M_iterator(_First, #_First) \
00166 ._M_iterator(_Last, #_Last) \
00167 ._M_string(#_Pred))
00168
00171 #define __glibcxx_check_partitioned(_First,_Last,_Value) \
00172 __glibcxx_check_valid_range(_First,_Last); \
00173 _GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_partitioned(_First, _Last, \
00174 _Value), \
00175 _M_message(::__gnu_debug::__msg_unpartitioned) \
00176 ._M_iterator(_First, #_First) \
00177 ._M_iterator(_Last, #_Last) \
00178 ._M_string(#_Value))
00179
00182 #define __glibcxx_check_partitioned_pred(_First,_Last,_Value,_Pred) \
00183 __glibcxx_check_valid_range(_First,_Last); \
00184 _GLIBCXX_DEBUG_VERIFY(::__gnu_debug::__check_partitioned(_First, _Last, \
00185 _Value, _Pred), \
00186 _M_message(::__gnu_debug::__msg_unpartitioned_pred) \
00187 ._M_iterator(_First, #_First) \
00188 ._M_iterator(_Last, #_Last) \
00189 ._M_string(#_Pred) \
00190 ._M_string(#_Value))
00191
00192
00193 #define __glibcxx_check_heap(_First,_Last) \
00194 __glibcxx_check_valid_range(_First,_Last); \
00195 _GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last), \
00196 _M_message(::__gnu_debug::__msg_not_heap) \
00197 ._M_iterator(_First, #_First) \
00198 ._M_iterator(_Last, #_Last))
00199
00202 #define __glibcxx_check_heap_pred(_First,_Last,_Pred) \
00203 __glibcxx_check_valid_range(_First,_Last); \
00204 _GLIBCXX_DEBUG_VERIFY(::std::__is_heap(_First, _Last, _Pred), \
00205 _M_message(::__gnu_debug::__msg_not_heap_pred) \
00206 ._M_iterator(_First, #_First) \
00207 ._M_iterator(_Last, #_Last) \
00208 ._M_string(#_Pred))
00209
00210 #ifdef _GLIBCXX_DEBUG_PEDANTIC
00211 # define __glibcxx_check_string(_String) _GLIBCXX_DEBUG_ASSERT(_String != 0)
00212 # define __glibcxx_check_string_len(_String,_Len) \
00213 _GLIBCXX_DEBUG_ASSERT(_String != 0 || _Len == 0)
00214 #else
00215 # define __glibcxx_check_string(_String)
00216 # define __glibcxx_check_string_len(_String,_Len)
00217 #endif
00218
00219 #endif