123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #ifndef BOOST_CONTRACT_CHECK_MACRO_HPP_
- #define BOOST_CONTRACT_CHECK_MACRO_HPP_
- // Copyright (C) 2008-2018 Lorenzo Caminiti
- // Distributed under the Boost Software License, Version 1.0 (see accompanying
- // file LICENSE_1_0.txt or a copy at http://www.boost.org/LICENSE_1_0.txt).
- // See: http://www.boost.org/doc/libs/release/libs/contract/doc/html/index.html
- /** @file
- Macros for implementation checks.
- */
- // IMPORTANT: Included by contract_macro.hpp so must #if-guard all its includes.
- #include <boost/contract/core/config.hpp>
- #include <boost/contract/detail/noop.hpp>
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Preferred way to assert implementation check conditions.
-
- It is preferred to use this macro instead of programming implementation
- checks in a nullary functor passed to @RefClass{boost::contract::check}
- constructor because this macro will completely remove implementation checks
- from the code when @RefMacro{BOOST_CONTRACT_NO_CHECKS} is defined:
- @code
- void f() {
- ...
- BOOST_CONTRACT_CHECK(cond);
- ...
- }
- @endcode
-
- @RefMacro{BOOST_CONTRACT_CHECK}, @RefMacro{BOOST_CONTRACT_CHECK_AUDIT}, and
- @RefMacro{BOOST_CONTRACT_CHECK_AXIOM} are the three assertion levels
- predefined by this library for implementation checks.
- @see @RefSect{advanced.implementation_checks, Implementation Checks}
- @param cond Boolean condition to check within implementation code (function
- body, etc.).
- (This is not a variadic macro parameter so any comma it might
- contain must be protected by round parenthesis and
- @c BOOST_CONTRACT_CHECK((cond)) will always work.)
- */
- #define BOOST_CONTRACT_CHECK(cond)
- #elif !defined(BOOST_CONTRACT_NO_CHECKS)
- #include <boost/contract/detail/check.hpp>
- #include <boost/contract/detail/assert.hpp>
- #define BOOST_CONTRACT_CHECK(cond) \
- BOOST_CONTRACT_DETAIL_CHECK(BOOST_CONTRACT_DETAIL_ASSERT(cond))
- #else
- #define BOOST_CONTRACT_CHECK(cond) /* nothing */
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Preferred way to assert implementation check conditions that are
- computationally expensive, at least compared to the computational cost of
- executing the function body.
- The specified condition will always be compiled and validated syntactically,
- but it will not be checked at run-time unless
- @RefMacro{BOOST_CONTRACT_AUDITS} is defined (undefined by default).
- This macro is defined by code equivalent to:
- @code
- #ifdef BOOST_CONTRACT_AUDITS
- #define BOOST_CONTRACT_CHECK_AUDIT(cond) \
- BOOST_CONTRACT_CHECK(cond)
- #else
- #define BOOST_CONTRACT_CHECK_AUDIT(cond) \
- BOOST_CONTRACT_CHECK(true || cond)
- #endif
- @endcode
- @RefMacro{BOOST_CONTRACT_CHECK}, @RefMacro{BOOST_CONTRACT_CHECK_AUDIT}, and
- @RefMacro{BOOST_CONTRACT_CHECK_AXIOM} are the three assertion levels
- predefined by this library for implementation checks.
- If there is a need, programmers are free to implement their own assertion
- levels defining macros similar to the one above.
- @see @RefSect{extras.assertion_levels, Assertion Levels}
- @param cond Boolean condition to check within implementation code (function
- body, etc.).
- (This is not a variadic macro parameter so any comma it might
- contain must be protected by round parenthesis and
- @c BOOST_CONTRACT_CHECK_AUDIT((cond)) will always work.)
- */
- #define BOOST_CONTRACT_CHECK_AUDIT(cond)
- #elif defined(BOOST_CONTRACT_AUDITS)
- #define BOOST_CONTRACT_CHECK_AUDIT(cond) \
- BOOST_CONTRACT_CHECK(cond)
- #else
- #define BOOST_CONTRACT_CHECK_AUDIT(cond) \
- BOOST_CONTRACT_DETAIL_NOEVAL(cond)
- #endif
-
- /**
- Preferred way to document in the code implementation check conditions that are
- computationally prohibitive, at least compared to the computational cost of
- executing the function body.
- The specified condition will always be compiled and validated syntactically, but
- it will never be checked at run-time.
- This macro is defined by code equivalent to:
- @code
- #define BOOST_CONTRACT_CHECK_AXIOM(cond) \
- BOOST_CONTRACT_CHECK(true || cond)
- @endcode
- @RefMacro{BOOST_CONTRACT_CHECK}, @RefMacro{BOOST_CONTRACT_CHECK_AUDIT}, and
- @RefMacro{BOOST_CONTRACT_CHECK_AXIOM} are the three assertion levels predefined
- by this library for implementation checks.
- If there is a need, programmers are free to implement their own assertion levels
- defining macros similar to the one above.
- @see @RefSect{extras.assertion_levels, Assertion Levels}
- @param cond Boolean condition to check within implementation code (function
- body, etc.).
- (This is not a variadic macro parameter so any comma it might
- contain must be protected by round parenthesis and
- @c BOOST_CONTRACT_CHECK_AXIOM((cond)) will always work.)
- */
- #define BOOST_CONTRACT_CHECK_AXIOM(cond) \
- BOOST_CONTRACT_DETAIL_NOEVAL(cond)
- #endif // #include guard
|