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
00032
00033
00034
00035 #ifndef _GLIBCXX_DEBUG_MACROS_H
00036 #define _GLIBCXX_DEBUG_MACROS_H 1
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 #define _GLIBCXX_DEBUG_VERIFY(_Condition,_ErrorMessage) \
00048 do \
00049 { \
00050 if (! (_Condition)) \
00051 __gnu_debug::_Error_formatter::_M_at(__FILE__, __LINE__) \
00052 ._ErrorMessage._M_error(); \
00053 } while (false)
00054
00055
00056 #define __glibcxx_check_valid_range(_First,_Last) \
00057 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__valid_range(_First, _Last), \
00058 _M_message(__gnu_debug::__msg_valid_range) \
00059 ._M_iterator(_First, #_First) \
00060 ._M_iterator(_Last, #_Last))
00061
00062
00063
00064
00065
00066
00067
00068
00069 #define __glibcxx_check_insert(_Position) \
00070 _GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
00071 _M_message(__gnu_debug::__msg_insert_singular) \
00072 ._M_sequence(*this, "this") \
00073 ._M_iterator(_Position, #_Position)); \
00074 _GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
00075 _M_message(__gnu_debug::__msg_insert_different) \
00076 ._M_sequence(*this, "this") \
00077 ._M_iterator(_Position, #_Position))
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 #define __glibcxx_check_insert_range(_Position,_First,_Last) \
00093 __glibcxx_check_valid_range(_First,_Last); \
00094 _GLIBCXX_DEBUG_VERIFY(!_Position._M_singular(), \
00095 _M_message(__gnu_debug::__msg_insert_singular) \
00096 ._M_sequence(*this, "this") \
00097 ._M_iterator(_Position, #_Position)); \
00098 _GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
00099 _M_message(__gnu_debug::__msg_insert_different) \
00100 ._M_sequence(*this, "this") \
00101 ._M_iterator(_Position, #_Position))
00102
00103
00104
00105
00106
00107 #define __glibcxx_check_erase(_Position) \
00108 _GLIBCXX_DEBUG_VERIFY(_Position._M_dereferenceable(), \
00109 _M_message(__gnu_debug::__msg_erase_bad) \
00110 ._M_sequence(*this, "this") \
00111 ._M_iterator(_Position, #_Position)); \
00112 _GLIBCXX_DEBUG_VERIFY(_Position._M_attached_to(this), \
00113 _M_message(__gnu_debug::__msg_erase_different) \
00114 ._M_sequence(*this, "this") \
00115 ._M_iterator(_Position, #_Position))
00116
00117
00118
00119
00120
00121 #define __glibcxx_check_erase_range(_First,_Last) \
00122 __glibcxx_check_valid_range(_First,_Last); \
00123 _GLIBCXX_DEBUG_VERIFY(_First._M_attached_to(this), \
00124 _M_message(__gnu_debug::__msg_erase_different) \
00125 ._M_sequence(*this, "this") \
00126 ._M_iterator(_First, #_First) \
00127 ._M_iterator(_Last, #_Last))
00128
00129
00130 #define __glibcxx_check_subscript(_N) \
00131 _GLIBCXX_DEBUG_VERIFY(_N < this->size(), \
00132 _M_message(__gnu_debug::__msg_subscript_oob) \
00133 ._M_sequence(*this, "this") \
00134 ._M_integer(_N, #_N) \
00135 ._M_integer(this->size(), "size"))
00136
00137
00138 #define __glibcxx_check_nonempty() \
00139 _GLIBCXX_DEBUG_VERIFY(! this->empty(), \
00140 _M_message(__gnu_debug::__msg_empty) \
00141 ._M_sequence(*this, "this"))
00142
00143
00144 #define __glibcxx_check_sorted(_First,_Last) \
00145 __glibcxx_check_valid_range(_First,_Last); \
00146 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_sorted(_First, _Last), \
00147 _M_message(__gnu_debug::__msg_unsorted) \
00148 ._M_iterator(_First, #_First) \
00149 ._M_iterator(_Last, #_Last))
00150
00151
00152
00153 #define __glibcxx_check_sorted_pred(_First,_Last,_Pred) \
00154 __glibcxx_check_valid_range(_First,_Last); \
00155 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_sorted(_First, _Last, _Pred), \
00156 _M_message(__gnu_debug::__msg_unsorted_pred) \
00157 ._M_iterator(_First, #_First) \
00158 ._M_iterator(_Last, #_Last) \
00159 ._M_string(#_Pred))
00160
00161
00162 #define __glibcxx_check_sorted_set(_First1,_Last1,_First2) \
00163 __glibcxx_check_valid_range(_First1,_Last1); \
00164 _GLIBCXX_DEBUG_VERIFY( \
00165 __gnu_debug::__check_sorted_set(_First1, _Last1, _First2), \
00166 _M_message(__gnu_debug::__msg_unsorted) \
00167 ._M_iterator(_First1, #_First1) \
00168 ._M_iterator(_Last1, #_Last1))
00169
00170
00171 #define __glibcxx_check_sorted_set_pred(_First1,_Last1,_First2,_Pred) \
00172 __glibcxx_check_valid_range(_First1,_Last1); \
00173 _GLIBCXX_DEBUG_VERIFY( \
00174 __gnu_debug::__check_sorted_set(_First1, _Last1, _First2, _Pred), \
00175 _M_message(__gnu_debug::__msg_unsorted_pred) \
00176 ._M_iterator(_First1, #_First1) \
00177 ._M_iterator(_Last1, #_Last1) \
00178 ._M_string(#_Pred))
00179
00180
00181
00182 #define __glibcxx_check_partitioned_lower(_First,_Last,_Value) \
00183 __glibcxx_check_valid_range(_First,_Last); \
00184 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower(_First, _Last, \
00185 _Value), \
00186 _M_message(__gnu_debug::__msg_unpartitioned) \
00187 ._M_iterator(_First, #_First) \
00188 ._M_iterator(_Last, #_Last) \
00189 ._M_string(#_Value))
00190
00191 #define __glibcxx_check_partitioned_upper(_First,_Last,_Value) \
00192 __glibcxx_check_valid_range(_First,_Last); \
00193 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper(_First, _Last, \
00194 _Value), \
00195 _M_message(__gnu_debug::__msg_unpartitioned) \
00196 ._M_iterator(_First, #_First) \
00197 ._M_iterator(_Last, #_Last) \
00198 ._M_string(#_Value))
00199
00200
00201
00202 #define __glibcxx_check_partitioned_lower_pred(_First,_Last,_Value,_Pred) \
00203 __glibcxx_check_valid_range(_First,_Last); \
00204 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_lower(_First, _Last, \
00205 _Value, _Pred), \
00206 _M_message(__gnu_debug::__msg_unpartitioned_pred) \
00207 ._M_iterator(_First, #_First) \
00208 ._M_iterator(_Last, #_Last) \
00209 ._M_string(#_Pred) \
00210 ._M_string(#_Value))
00211
00212
00213
00214 #define __glibcxx_check_partitioned_upper_pred(_First,_Last,_Value,_Pred) \
00215 __glibcxx_check_valid_range(_First,_Last); \
00216 _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__check_partitioned_upper(_First, _Last, \
00217 _Value, _Pred), \
00218 _M_message(__gnu_debug::__msg_unpartitioned_pred) \
00219 ._M_iterator(_First, #_First) \
00220 ._M_iterator(_Last, #_Last) \
00221 ._M_string(#_Pred) \
00222 ._M_string(#_Value))
00223
00224
00225 #define __glibcxx_check_heap(_First,_Last) \
00226 __glibcxx_check_valid_range(_First,_Last); \
00227 _GLIBCXX_DEBUG_VERIFY(std::__is_heap(_First, _Last), \
00228 _M_message(__gnu_debug::__msg_not_heap) \
00229 ._M_iterator(_First, #_First) \
00230 ._M_iterator(_Last, #_Last))
00231
00232
00233
00234 #define __glibcxx_check_heap_pred(_First,_Last,_Pred) \
00235 __glibcxx_check_valid_range(_First,_Last); \
00236 _GLIBCXX_DEBUG_VERIFY(std::__is_heap(_First, _Last, _Pred), \
00237 _M_message(__gnu_debug::__msg_not_heap_pred) \
00238 ._M_iterator(_First, #_First) \
00239 ._M_iterator(_Last, #_Last) \
00240 ._M_string(#_Pred))
00241
00242 #ifdef _GLIBCXX_DEBUG_PEDANTIC
00243 # define __glibcxx_check_string(_String) _GLIBCXX_DEBUG_ASSERT(_String != 0)
00244 # define __glibcxx_check_string_len(_String,_Len) \
00245 _GLIBCXX_DEBUG_ASSERT(_String != 0 || _Len == 0)
00246 #else
00247 # define __glibcxx_check_string(_String)
00248 # define __glibcxx_check_string_len(_String,_Len)
00249 #endif
00250
00251 #endif