/* -*- mode: C++; indent-tabs-mode: nil; -*-
* This file is a part of LEMON, a generic C++ optimization library.
* Copyright (C) 2003-2008
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
* (Egervary Research Group on Combinatorial Optimization, EGRES).
* Permission to use, modify and distribute this software is granted
* provided that this copyright notice appears in all copies. For
* precise terms see the accompanying LICENSE file.
* This software is provided "AS IS" with no warranty of any kind,
* express or implied, and with no claim as to its suitability for any
/// \brief Extended assertion handling
inline void assert_fail_log(const char *file, int line, const char *function,
const char *message, const char *assertion)
std::cerr << file << ":" << line << ": ";
std::cerr << function << ": ";
std::cerr << " (assertion '" << assertion << "' failed)";
inline void assert_fail_abort(const char *file, int line,
const char *function, const char* message,
assert_fail_log(file, line, function, message, assertion);
inline const char* cstringify(const std::string& str) {
inline const char* cstringify(const char* str) {
#if (defined(LEMON_ASSERT_LOG) ? 1 : 0) + \
(defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \
(defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) > 1
#error "LEMON assertion system is not set properly"
#if ((defined(LEMON_ASSERT_LOG) ? 1 : 0) + \
(defined(LEMON_ASSERT_ABORT) ? 1 : 0) + \
(defined(LEMON_ASSERT_CUSTOM) ? 1 : 0) == 1 || \
defined(LEMON_ENABLE_ASSERTS)) && \
(defined(LEMON_DISABLE_ASSERTS) || \
#error "LEMON assertion system is not set properly"
#if defined LEMON_ASSERT_LOG
# undef LEMON_ASSERT_HANDLER
# define LEMON_ASSERT_HANDLER ::lemon::assert_fail_log
#elif defined LEMON_ASSERT_ABORT
# undef LEMON_ASSERT_HANDLER
# define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
#elif defined LEMON_ASSERT_CUSTOM
# undef LEMON_ASSERT_HANDLER
# ifndef LEMON_CUSTOM_ASSERT_HANDLER
# error "LEMON_CUSTOM_ASSERT_HANDLER is not set"
# define LEMON_ASSERT_HANDLER LEMON_CUSTOM_ASSERT_HANDLER
#elif defined LEMON_DISABLE_ASSERTS
# undef LEMON_ASSERT_HANDLER
# undef LEMON_ASSERT_HANDLER
# define LEMON_ASSERT_HANDLER ::lemon::assert_fail_abort
#ifndef LEMON_FUNCTION_NAME
# define LEMON_FUNCTION_NAME (__PRETTY_FUNCTION__)
# define LEMON_FUNCTION_NAME (__FUNCSIG__)
# define LEMON_FUNCTION_NAME (__func__)
/// \brief Macro for assertion with customizable message
/// Macro for assertion with customizable message. \param exp An
/// expression that must be convertible to \c bool. If it is \c
/// false, then an assertion is raised. The concrete behaviour depends
/// on the settings of the assertion system. \param msg A <tt>const
/// char*</tt> parameter, which can be used to provide information
/// about the circumstances of the failed assertion.
/// The assertions are enabled in the default behaviour.
/// You can disable them with the following code:
/// #define LEMON_DISABLE_ASSERTS
/// or with compilation parameters:
/// g++ -DLEMON_DISABLE_ASSERTS
/// make CXXFLAGS='-DLEMON_DISABLE_ASSERTS'
/// The checking is also disabled when the standard macro \c NDEBUG is defined.
/// The LEMON assertion system has a wide range of customization
/// properties. As a default behaviour the failed assertion prints a
/// short log message to the standard error and aborts the execution.
/// The following modes can be used in the assertion system:
/// - \c LEMON_ASSERT_LOG The failed assertion prints a short log
/// message to the standard error and continues the execution.
/// - \c LEMON_ASSERT_ABORT This mode is similar to the \c
/// LEMON_ASSERT_LOG, but it aborts the program. It is the default
/// - \c LEMON_ASSERT_CUSTOM The user can define own assertion handler
/// void custom_assert_handler(const char* file, int line,
/// const char* function, const char* message,
/// const char* assertion);
/// The name of the function should be defined as the \c
/// LEMON_CUSTOM_ASSERT_HANDLER macro name.
/// #define LEMON_CUSTOM_ASSERT_HANDLER custom_assert_handler
/// Whenever an assertion is occured, the custom assertion
/// handler is called with appropiate parameters.
/// The assertion mode can also be changed within one compilation unit.
/// If the macros are redefined with other settings and the
/// \ref lemon/assert.h "assert.h" file is reincluded, then the
/// behaviour is changed appropiately to the new settings.
# define LEMON_ASSERT(exp, msg) \
(static_cast<void> (!!(exp) ? 0 : ( \
LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \
::lemon::_assert_bits::cstringify(msg), #exp), 0)))
/// \brief Macro for mark not yet implemented features.
/// Macro for mark not yet implemented features and outstanding bugs.
/// It is close to be the shortcut of the following code:
/// LEMON_ASSERT(false, msg);
# define LEMON_FIXME(msg) \
(LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \
::lemon::_assert_bits::cstringify(msg), \
static_cast<const char*>(0)))
/// \brief Macro for internal assertions
/// Macro for internal assertions, it is used in the library to check
/// the consistency of results of algorithms, several pre- and
/// postconditions and invariants. The checking is disabled by
/// default, but it can be turned on with the macro \c
/// #define LEMON_ENABLE_DEBUG
/// or with compilation parameters:
/// g++ -DLEMON_ENABLE_DEBUG
/// make CXXFLAGS='-DLEMON_ENABLE_DEBUG'
/// This macro works like the \c LEMON_ASSERT macro, therefore the
/// current behaviour depends on the settings of \c LEMON_ASSERT
# define LEMON_DEBUG(exp, msg) \
(static_cast<void> (!!(exp) ? 0 : ( \
LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \
::lemon::_assert_bits::cstringify(msg), #exp), 0)))
# ifndef LEMON_ASSERT_HANDLER
# define LEMON_ASSERT(exp, msg) (static_cast<void>(0))
# define LEMON_FIXME(msg) (static_cast<void>(0))
# define LEMON_DEBUG(exp, msg) (static_cast<void>(0))
# define LEMON_ASSERT(exp, msg) \
(static_cast<void> (!!(exp) ? 0 : ( \
LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \
::lemon::_assert_bits::cstringify(msg), \
# define LEMON_FIXME(msg) \
(LEMON_ASSERT_HANDLER(__FILE__, __LINE__, LEMON_FUNCTION_NAME, \
::lemon::_assert_bits::cstringify(msg), \
static_cast<const char*>(0)))
# define LEMON_DEBUG(exp, msg)
(static_cast<void> (!!(exp) ? 0 : ( \
LEMON_ASSERT_HANDLER(__FILE__, __LINE__, \
::lemon::_assert_bits::cstringify(msg), \
# define LEMON_DEBUG(exp, msg) (static_cast<void>(0))