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 #ifndef _GLIBCXX_DEBUG_MACROS_H
00031 #define _GLIBCXX_DEBUG_MACROS_H 1
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #define _GLIBCXX_DEBUG_VERIFY(_Condition,_ErrorMessage) \
00043 do \
00044 { \
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
00057
00058
00059
00060
00061
00062
00063
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
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
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
00098
00099
00100
00101
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
00112
00113
00114
00115
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 #define __glibcxx_check_sorted(_First,_Last) \
00140 __glibcxx_check_valid_range(_First,_Last); \
00141 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_sorted(_First, _Last), \
00142 _M_message(__gnu_debug::__msg_unsorted) \
00143 ._M_iterator(_First, #_First) \
00144 ._M_iterator(_Last, #_Last))
00145
00146
00147
00148 #define __glibcxx_check_sorted_pred(_First,_Last,_Pred) \
00149 __glibcxx_check_valid_range(_First,_Last); \
00150 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_sorted(_First, _Last, _Pred), \
00151 _M_message(__gnu_debug::__msg_unsorted_pred) \
00152 ._M_iterator(_First, #_First) \
00153 ._M_iterator(_Last, #_Last) \
00154 ._M_string(#_Pred))
00155
00156
00157 #define __glibcxx_check_sorted_set(_First1,_Last1,_First2) \
00158 __glibcxx_check_valid_range(_First1,_Last1); \
00159 _GLIBCXX_DEBUG_VERIFY( \
00160 __gnu_debug::__check_sorted_set(_First1, _Last1, _First2), \
00161 _M_message(__gnu_debug::__msg_unsorted) \
00162 ._M_iterator(_First1, #_First1) \
00163 ._M_iterator(_Last1, #_Last1))
00164
00165
00166 #define __glibcxx_check_sorted_set_pred(_First1,_Last1,_First2,_Pred) \
00167 __glibcxx_check_valid_range(_First1,_Last1); \
00168 _GLIBCXX_DEBUG_VERIFY( \
00169 __gnu_debug::__check_sorted_set(_First1, _Last1, _First2, _Pred), \
00170 _M_message(__gnu_debug::__msg_unsorted_pred) \
00171 ._M_iterator(_First1, #_First1) \
00172 ._M_iterator(_Last1, #_Last1) \
00173 ._M_string(#_Pred))
00174
00175
00176
00177 #define __glibcxx_check_partitioned_lower(_First,_Last,_Value) \
00178 __glibcxx_check_valid_range(_First,_Last); \
00179 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower(_First, _Last, \
00180 _Value), \
00181 _M_message(__gnu_debug::__msg_unpartitioned) \
00182 ._M_iterator(_First, #_First) \
00183 ._M_iterator(_Last, #_Last) \
00184 ._M_string(#_Value))
00185
00186 #define __glibcxx_check_partitioned_upper(_First,_Last,_Value) \
00187 __glibcxx_check_valid_range(_First,_Last); \
00188 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper(_First, _Last, \
00189 _Value), \
00190 _M_message(__gnu_debug::__msg_unpartitioned) \
00191 ._M_iterator(_First, #_First) \
00192 ._M_iterator(_Last, #_Last) \
00193 ._M_string(#_Value))
00194
00195
00196
00197 #define __glibcxx_check_partitioned_lower_pred(_First,_Last,_Value,_Pred) \
00198 __glibcxx_check_valid_range(_First,_Last); \
00199 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower(_First, _Last, \
00200 _Value, _Pred), \
00201 _M_message(__gnu_debug::__msg_unpartitioned_pred) \
00202 ._M_iterator(_First, #_First) \
00203 ._M_iterator(_Last, #_Last) \
00204 ._M_string(#_Pred) \
00205 ._M_string(#_Value))
00206
00207
00208
00209 #define __glibcxx_check_partitioned_upper_pred(_First,_Last,_Value,_Pred) \
00210 __glibcxx_check_valid_range(_First,_Last); \
00211 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper(_First, _Last, \
00212 _Value, _Pred), \
00213 _M_message(__gnu_debug::__msg_unpartitioned_pred) \
00214 ._M_iterator(_First, #_First) \
00215 ._M_iterator(_Last, #_Last) \
00216 ._M_string(#_Pred) \
00217 ._M_string(#_Value))
00218
00219
00220 #define __glibcxx_check_heap(_First,_Last) \
00221 __glibcxx_check_valid_range(_First,_Last); \
00222 _GLIBCXX_DEBUG_VERIFY(std::__is_heap(_First, _Last), \
00223 _M_message(__gnu_debug::__msg_not_heap) \
00224 ._M_iterator(_First, #_First) \
00225 ._M_iterator(_Last, #_Last))
00226
00227
00228
00229 #define __glibcxx_check_heap_pred(_First,_Last,_Pred) \
00230 __glibcxx_check_valid_range(_First,_Last); \
00231 _GLIBCXX_DEBUG_VERIFY(std::__is_heap(_First, _Last, _Pred), \
00232 _M_message(__gnu_debug::__msg_not_heap_pred) \
00233 ._M_iterator(_First, #_First) \
00234 ._M_iterator(_Last, #_Last) \
00235 ._M_string(#_Pred))
00236
00237 #ifdef _GLIBCXX_DEBUG_PEDANTIC
00238 # define __glibcxx_check_string(_String) _GLIBCXX_DEBUG_ASSERT(_String != 0)
00239 # define __glibcxx_check_string_len(_String,_Len) \
00240 _GLIBCXX_DEBUG_ASSERT(_String != 0 || _Len == 0)
00241 #else
00242 # define __glibcxx_check_string(_String)
00243 # define __glibcxx_check_string_len(_String,_Len)
00244 #endif
00245
00246 #endif