summaryrefslogtreecommitdiff
path: root/boost/contract/core/check_macro.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/contract/core/check_macro.hpp')
-rw-r--r--boost/contract/core/check_macro.hpp133
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
+