diff options
Diffstat (limited to 'boost/contract/core/check_macro.hpp')
-rw-r--r-- | boost/contract/core/check_macro.hpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/boost/contract/core/check_macro.hpp b/boost/contract/core/check_macro.hpp new file mode 100644 index 0000000000..3ecc93ea82 --- /dev/null +++ b/boost/contract/core/check_macro.hpp @@ -0,0 +1,133 @@ + +#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(...); + ... + } + @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, + @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 cost of executing the + function body. + + The specified condition will always be compiled and validated + syntactically, but it will not be evaluated 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, + @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 assert implementation check conditions that are computationally +prohibitive, at least compared to the cost of executing the function body. + +The specified condition will always be compiled and validated +syntactically, but it will never be evaluated 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, + @c BOOST_CONTRACT_CHECK_AXIOM((cond)) will always work.) +*/ +#define BOOST_CONTRACT_CHECK_AXIOM(cond) \ + BOOST_CONTRACT_DETAIL_NOEVAL(cond) + +#endif // #include guard + |