# HG changeset patch
# User "Balazs Dezso <deba@inf.elte.hu>"
# Date 1222073761 -7200
# Node ID 7abfb55f1ecc813ea33ff03ec3f5e909d1e738b2
# Parent b4784a66a8e6c7069d9a0af4250d0055e435be75
Removing fixme an log assert handler from assertion system
diff -r b4784a66a8e6 -r 7abfb55f1ecc lemon/assert.h
|
a
|
b
|
|
| 27 | 27 | |
| 28 | 28 | namespace lemon { |
| 29 | 29 | |
| 30 | | inline void assert_fail_log(const char *file, int line, const char *function, |
| 31 | | const char *message, const char *assertion) |
| | 30 | inline void assert_fail_abort(const char *file, int line, |
| | 31 | const char *function, const char* message, |
| | 32 | const char *assertion) |
| 32 | 33 | { |
| 33 | 34 | std::cerr << file << ":" << line << ": "; |
| 34 | 35 | if (function) |
| … |
… |
namespace lemon { |
| 37 | 38 | if (assertion) |
| 38 | 39 | std::cerr << " (assertion '" << assertion << "' failed)"; |
| 39 | 40 | std::cerr << std::endl; |
| 40 | | } |
| 41 | | |
| 42 | | inline void assert_fail_abort(const char *file, int line, |
| 43 | | const char *function, const char* message, |
| 44 | | const char *assertion) |
| 45 | | { |
| 46 | | assert_fail_log(file, line, function, message, assertion); |
| 47 | 41 | std::abort(); |
| 48 | 42 | } |
| 49 | 43 | |
| … |
… |
namespace lemon { |
| 63 | 57 | #endif // LEMON_ASSERT_H |
| 64 | 58 | |
| 65 | 59 | #undef LEMON_ASSERT |
| 66 | | #undef LEMON_FIXME |
| 67 | 60 | #undef LEMON_DEBUG |
| 68 | 61 | |
| 69 | | #if (defined(LEMON_ASSERT_LOG) ? 1 : 0) + \ |
| 70 | | (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
| | 62 | #if (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
| 71 | 63 | (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1 |
| 72 | 64 | #error "LEMON assertion system is not set properly" |
| 73 | 65 | #endif |
| 74 | 66 | |
| 75 | | #if ((defined(LEMON_ASSERT_LOG) ? 1 : 0) + \ |
| 76 | | (defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
| | 67 | #if ((defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \ |
| 77 | 68 | (defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 || \ |
| 78 | 69 | defined(LEMON_ENABLE_ASSERTS)) && \ |
| 79 | 70 | (defined(LEMON_DISABLE_ASSERTS) || \ |
| … |
… |
namespace lemon { |
| 82 | 73 | #endif |
| 83 | 74 | |
| 84 | 75 | |
| 85 | | #if defined LEMON_ASSERT_LOG |
| 86 | | # undef LEMON_ASSERT_HANDLER |
| 87 | | # define LEMON_ASSERT_HANDLER ::lemon::assert_fail_log |
| 88 | | #elif defined LEMON_ASSERT_ABORT |
| | 76 | #if defined LEMON_ASSERT_ABORT |
| 89 | 77 | # undef LEMON_ASSERT_HANDLER |
| 90 | 78 | # define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort |
| 91 | 79 | #elif defined LEMON_ASSERT_CUSTOM |
| … |
… |
namespace lemon { |
| 120 | 108 | /// |
| 121 | 109 | /// \brief Macro for assertion with customizable message |
| 122 | 110 | /// |
| 123 | | /// Macro for assertion with customizable message. \param exp An |
| 124 | | /// expression that must be convertible to \c bool. If it is \c |
| 125 | | /// false, then an assertion is raised. The concrete behaviour depends |
| 126 | | /// on the settings of the assertion system. \param msg A <tt>const |
| 127 | | /// char*</tt> parameter, which can be used to provide information |
| 128 | | /// about the circumstances of the failed assertion. |
| | 111 | /// Macro for assertion with customizable message. |
| | 112 | /// \param exp An expression that must be convertible to \c bool. If it is \c |
| | 113 | /// false, then an assertion is raised. The concrete behaviour depends on the |
| | 114 | /// settings of the assertion system. |
| | 115 | /// \param msg A <tt>const char*</tt> parameter, which can be used to provide |
| | 116 | /// information about the circumstances of the failed assertion. |
| 129 | 117 | /// |
| 130 | 118 | /// The assertions are enabled in the default behaviour. |
| 131 | 119 | /// You can disable them with the following code: |
| … |
… |
namespace lemon { |
| 139 | 127 | /// \endcode |
| 140 | 128 | /// The checking is also disabled when the standard macro \c NDEBUG is defined. |
| 141 | 129 | /// |
| 142 | | /// The LEMON assertion system has a wide range of customization |
| 143 | | /// properties. As a default behaviour the failed assertion prints a |
| 144 | | /// short log message to the standard error and aborts the execution. |
| 145 | | /// |
| 146 | | /// The following modes can be used in the assertion system: |
| 147 | | /// |
| 148 | | /// - \c LEMON_ASSERT_LOG The failed assertion prints a short log |
| 149 | | /// message to the standard error and continues the execution. |
| 150 | | /// - \c LEMON_ASSERT_ABORT This mode is similar to the \c |
| 151 | | /// LEMON_ASSERT_LOG, but it aborts the program. It is the default |
| 152 | | /// behaviour. |
| | 130 | /// As a default behaviour the failed assertion prints a short log message to |
| | 131 | /// the standard error and aborts the execution. |
| | 132 | /// |
| | 133 | /// However, the following modes can be used in the assertion system: |
| | 134 | /// - \c LEMON_ASSERT_ABORT The failed assertion prints a short log message to |
| | 135 | /// the standard error and aborts the program. It is the default behaviour. |
| 153 | 136 | /// - \c LEMON_ASSERT_CUSTOM The user can define own assertion handler |
| 154 | 137 | /// function. |
| 155 | 138 | /// \code |
| … |
… |
namespace lemon { |
| 177 | 160 | |
| 178 | 161 | /// \ingroup exceptions |
| 179 | 162 | /// |
| 180 | | /// \brief Macro for mark not yet implemented features. |
| 181 | | /// |
| 182 | | /// Macro for mark not yet implemented features and outstanding bugs. |
| 183 | | /// It is close to be the shortcut of the following code: |
| 184 | | /// \code |
| 185 | | /// LEMON_ASSERT(false, msg); |
| 186 | | /// \endcode |
| 187 | | /// |
| 188 | | /// \see LEMON_ASSERT |
| 189 | | # define LEMON_FIXME(msg) \ |
| 190 | | (LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \ |
| 191 | | ::lemon::_assert_bits::cstringify(msg), \ |
| 192 | | static_cast<const char*>(0))) |
| 193 | | |
| 194 | | /// \ingroup exceptions |
| 195 | | /// |
| 196 | 163 | /// \brief Macro for internal assertions |
| 197 | 164 | /// |
| 198 | 165 | /// Macro for internal assertions, it is used in the library to check |
| … |
… |
namespace lemon { |
| 224 | 191 | |
| 225 | 192 | # ifndef LEMON_ASSERT_HANDLER |
| 226 | 193 | # define LEMON_ASSERT(exp, msg) (static_cast<void>(0)) |
| 227 | | # define LEMON_FIXME(msg) (static_cast<void>(0)) |
| 228 | 194 | # define LEMON_DEBUG(exp, msg) (static_cast<void>(0)) |
| 229 | 195 | # else |
| 230 | 196 | # define LEMON_ASSERT(exp, msg) \ |
| … |
… |
namespace lemon { |
| 233 | 199 | LEMON_FUNCTION_NAME, \ |
| 234 | 200 | ::lemon::_assert_bits::cstringify(msg), \ |
| 235 | 201 | #exp), 0))) |
| 236 | | # define LEMON_FIXME(msg) \ |
| 237 | | (LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \ |
| 238 | | ::lemon::_assert_bits::cstringify(msg), \ |
| 239 | | static_cast<const char*>(0))) |
| 240 | | |
| 241 | 202 | # if LEMON_ENABLE_DEBUG |
| 242 | 203 | # define LEMON_DEBUG(exp, msg) \ |
| 243 | 204 | (static_cast<void> (!!(exp) ? 0 : ( \ |
diff -r b4784a66a8e6 -r 7abfb55f1ecc test/error_test.cc
|
a
|
b
|
void assertion_text_disable() { |
| 47 | 47 | LEMON_ASSERT(false, "This is a fault message"); |
| 48 | 48 | } |
| 49 | 49 | |
| 50 | | void fixme_disable() { |
| 51 | | LEMON_FIXME("fixme_disable() is fixme!"); |
| 52 | | } |
| 53 | | |
| 54 | 50 | void check_assertion_disable() { |
| 55 | 51 | no_assertion_text_disable(); |
| 56 | 52 | assertion_text_disable(); |
| 57 | | fixme_disable(); |
| 58 | 53 | } |
| 59 | 54 | #undef LEMON_DISABLE_ASSERTS |
| 60 | 55 | |
| … |
… |
void assertion_text_custom() { |
| 78 | 73 | LEMON_ASSERT(false, "This is a fault message"); |
| 79 | 74 | } |
| 80 | 75 | |
| 81 | | void fixme_custom() { |
| 82 | | LEMON_FIXME("fixme_custom() is fixme!"); |
| 83 | | } |
| 84 | | |
| 85 | 76 | void check_assertion_custom() { |
| 86 | 77 | no_assertion_text_custom(); |
| 87 | 78 | assertion_text_custom(); |
| 88 | | fixme_custom(); |
| 89 | | check(cnt == 2, "The custom assert handler does not work"); |
| | 79 | check(cnt == 1, "The custom assert handler does not work"); |
| 90 | 80 | } |
| 91 | 81 | |
| 92 | 82 | #undef LEMON_ASSERT_CUSTOM |