123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800 |
- #ifndef BOOST_CONTRACT_CONFIG_HPP_
- #define BOOST_CONTRACT_CONFIG_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
- Configure this library compile-time and run-time behaviours.
- */
- // IMPORTANT: This header MUST NOT #include any other header of this lib.
- // That way users can #include this header and not #include any of this lib
- // headers after that depending on the contract 0/1 macros below ensuring no
- // compilation overhead.
- // Export symbols when compiling as shared lib (for internal use only). (Named
- // after similar macros in all Boost libs.)
- // BOOST_CONTRACT_SOURCE
- // Disable automatic library selection for linking. (Named after similar macros
- // in all Boost libs.)
- // BOOST_CONTRACT_NO_LIB
- // BOOST_ALL_NO_LIB
- #if (!defined(BOOST_CONTRACT_DYN_LINK) && defined(BOOST_ALL_DYN_LINK)) || \
- defined(BOOST_CONTRACT_DETAIL_DOXYGEN)
- /**
- Define this macro to compile this library as a shared library (recommended).
-
- If this macro is defined, this library is compiled so it can be linked
- as a shared library (a.k.a., Dynamically Linked Library or DLL) to user
- code.
- This library will automatically define this macro when Boost libraries are
- built as shared libraries (e.g., defining @c BOOST_ALL_DYN_LINK or using
- <c>bjam link=shared ...</c>).
-
- @warning In general this library will correctly check contracts at
- run-time only when compiled as a shared library, unless user
- code checks contracts in a single program unit (e.g., a single
- program with only statically linked libraries).
- Therefore, it is recommended to build and use this library as
- a shared library by defining this macro (or equivalently by
- building all Boost libraries as shared libraries).
-
- @see @RefSect{getting_started, Getting Started}
- */
- #define BOOST_CONTRACT_DYN_LINK
- #elif defined(BOOST_CONTRACT_DYN_LINK) && defined(BOOST_CONTRACT_STATIC_LINK)
- #error "DYN_LINK defined with STATIC_LINK"
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Define this macro to compile this library as a static library (not
- recommended).
- If this macro is defined, this library is compiled so it can be linked
- statically to user code.
- This library will automatically define this macro when Boost libraries
- are built as static libraries.
- @warning This library is not guaranteed to always work correctly at
- run-time when this macro is defined (define
- @RefMacro{BOOST_CONTRACT_DYN_LINK} or @c BOOST_ALL_DYN_LINK
- instead).
- However, this macro can be defined and this library can be
- safely used as a static library for user code that checks
- contracts in a single program unit (e.g., a single program with
- only statically linked libraries).
-
- @see @RefSect{getting_started, Getting Started}
- */
- #define BOOST_CONTRACT_STATIC_LINK
- #elif defined(BOOST_CONTRACT_STATIC_LINK) && defined(BOOST_CONTRACT_DYN_LINK)
- #error "STATIC_LINK defined with DYN_LINK"
- #endif
- #ifdef BOOST_CONTRACT_HEADER_ONLY
- #error "leave DYN_LINK and STATIC_LINK undefined instead"
- #elif (!defined(BOOST_CONTRACT_DYN_LINK) && \
- !defined(BOOST_CONTRACT_STATIC_LINK)) || \
- defined(BOOST_CONTRACT_DETAIL_DOXYGEN)
- /**
- Automatically defined by this library when it is being used as a header-only
- library (not recommended).
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users do not define
- @RefMacro{BOOST_CONTRACT_DYN_LINK} (or @c BOOST_ALL_DYN_LINK) and
- @RefMacro{BOOST_CONTRACT_STATIC_LINK}.
- When used as a header-only library, this library code does not have to be
- compiled separately from user code, this library headers are simply included
- and compiled as part of the user program.
-
- @warning This library is not guaranteed to always work correctly at
- run-time when this macro is defined (define
- @RefMacro{BOOST_CONTRACT_DYN_LINK} or @c BOOST_ALL_DYN_LINK
- instead).
- However, this macro can be defined and this library can be
- safely used as a header-only library for user code that checks
- contracts in a single program unit (e.g., a single program with
- only statically linked libraries).
-
- @see @RefSect{getting_started, Getting Started}
- */
- #define BOOST_CONTRACT_HEADER_ONLY
- #endif
- #if (!defined(BOOST_CONTRACT_DISABLE_THREADS) && \
- defined(BOOST_DISABLE_THREADS)) || \
- defined(BOOST_CONTRACT_DETAIL_DOXYGEN)
- /**
- Define this macro to not lock internal library data for thread safety
- (undefined by default).
- Defining this macro will make the library implementation code not thread
- safe so this macro should not be defined unless the library is being used by
- single-threaded applications only.
- This library will automatically define this macro when Boost libraries are
- built without threads (e.g., defining @c BOOST_DISABLE_THREADS).
- @note When this macro is left undefined this library needs to internally
- use some sort of global lock (to ensure contract checking is
- globally disabled when other contracts are being checked and also to
- safely access failure handler functors).
- That could introduce an undesired amount of synchronization in some
- multi-threaded applications.
-
- @see @RefSect{contract_programming_overview.assertions, Assertions}
- */
- #define BOOST_CONTRACT_DISABLE_THREADS
- #endif
- #ifndef BOOST_CONTRACT_MAX_ARGS
- /**
- Maximum number of arguments for public function overrides on compilers that
- do not support variadic templates (default to @c 10).
- On compilers that do not support C++11 variadic templates, this macro is
- defined to the maximum number of arguments that public function overrides
- can have and pass to @RefFunc{boost::contract::public_function} (users can
- redefine this macro to a different value).
- On compilers that support variadic templates, this macro has no effect.
- @note Regardless of the value of this macro and of compiler support for
- variadic templates, there might be an intrinsic limit of about 18
- arguments for public function overrides (because of similar limits
- in Boost.MPL and Boost.FunctionTypes internally used by this
- library).
- @see @RefSect{extras.no_macros__and_no_variadic_macros_, No Macros}
- */
- #define BOOST_CONTRACT_MAX_ARGS 10
- #endif
- #ifndef BOOST_CONTRACT_BASES_TYPEDEF
- /**
- Define the name of the base type @c typedef (@c base_types by default).
- This macro expands to the name of the @c typedef that lists the base
- classes for subcontracting via @RefMacro{BOOST_CONTRACT_BASE_TYPES}:
- @code
- class u
- #define BASES public b, private w
- : BASES
- {
- friend class boost::contract:access;
- typedef BOOST_CONTRACT_BASE_TYPES(BASES) BOOST_CONTRACT_TYPEDEF;
- #undef BASES
- ...
- };
- @endcode
- When used this way, users can redefine this macro if the @c typedef must
- have a name different from @c base_types (because of name clashes in user
- code, etc.).
-
- @see @RefSect{tutorial.base_classes__subcontracting_, Base Classes}
- */
- #define BOOST_CONTRACT_BASES_TYPEDEF base_types
- #endif
- #ifndef BOOST_CONTRACT_INVARIANT_FUNC
- /**
- Define the name of the class invariant member function (@c invariant by
- default).
- This macro expands to the name of the @c const and <c>const volatile</c>
- member functions that check class invariants and volatile class invariants
- respectively:
- @code
- class u {
- friend class boost::contract::access;
- void BOOST_CONTRACT_INVARIANT_FUNC() const {
- BOOST_CONTRACT_ASSERT(...);
- ...
- }
-
- void BOOST_CONTRACT_INVARIANT_FUNC() const volatile {
- BOOST_CONTRACT_ASSERT(...);
- ...
- }
- ...
- };
- @endcode
- When used this way, users can redefine this macro if the invariant functions
- must have a name different from @c invariant (because of name clashes in
- user code, etc.).
-
- @note C++ does not allow to overload member functions based on the
- @c static classifier, so this macro must always be defined to be
- different than the function name defined for
- @RefMacro{BOOST_CONTRACT_STATIC_INVARIANT_FUNC}.
-
- @see @RefSect{tutorial.class_invariants, Class Invariants},
- @RefSect{extras.volatile_public_functions,
- Volatile Public Functions}
- */
- #define BOOST_CONTRACT_INVARIANT_FUNC invariant
- #endif
- #ifndef BOOST_CONTRACT_STATIC_INVARIANT_FUNC
- /**
- Define the name of the static invariant member function (@c static_invariant
- by default).
- This macro expands to the name of the @c static member function that checks
- static class invariants:
- @code
- class u {
- friend class boost::contract::access;
- static void BOOST_CONTRACT_STATIC_INVARIANT_FUNC() {
- BOOST_CONTRACT_ASSERT(...);
- ...
- }
- ...
- };
- @endcode
- When used this way, users can redefine this macro if the static invariant
- function must have a name different from @c static_invariant (because of
- name clashes in user code, etc.).
- @note C++ does not allow to overload member functions based on the
- @c static classifier, so this macro must always be defined to be
- different than the function name defined for
- @RefMacro{BOOST_CONTRACT_INVARIANT_FUNC}.
-
- @see @RefSect{tutorial.class_invariants, Class Invariants}
- */
- #define BOOST_CONTRACT_STATIC_INVARIANT_FUNC static_invariant
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Disable some compile-time errors generated by this library (undefined by
- default).
- Defining this macro disables a number of static checks and related
- compile-time errors generated by this library, for example:
- @li The static invariant member function named as
- @c BOOST_CONTRACT_STATIC_INVARIANT_FUNC must be declared @c static.
- @li Non-static invariant member functions named as
- @c BOOST_CONTRACT_INVARIANT_FUNC must be declared either @c const,
- <c>const volatile</c>, or <c>volatile const</c>.
- @li Derived classes that program contracts for one or more public function
- overrides via @RefFunc{boost::contract::public_function} must also
- define the @RefMacro{BOOST_CONTRACT_BASE_TYPES} @c typedef.
- In general, it is not recommended to define this macro because these
- compile-time checks can guard against misuses of this library.
-
- @see @RefSect{tutorial.class_invariants, Class Invariants},
- @RefSect{tutorial.base_classes__subcontracting_, Base Classes}
- */
- #define BOOST_CONTRACT_PERMISSIVE
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Code block to execute if contracts are not assigned to a
- @RefClass{boost::contract::check} variable (undefined and executes
- @c BOOST_ASSERT(false) by default).
- In general, there is a logic error in the program when contracts are not
- explicitly assigned to a local variable of type
- @RefClass{boost::contract::check} and without using C++11 @c auto
- declarations (because that is a misuse of this library).
- Therefore, by default (i.e., when this macro is not defined) this library
- calls <c>BOOST_ASSERT(false)</c> in those cases.
- If this macro is defined, this library will execute the code expanded by
- this macro instead of calling @c BOOST_ASSERT(false) (if programmers prefer
- to throw an exception, etc.).
- This macro can also be defined to be any block of code (and use empty curly
- brackets @c {} to generate no error, not recommended), for example (on GCC):
- @code
- gcc -DBOOST_CONTRACT_ON_MISSING_CHECK_DECL='{ throw std::logic_error("missing contract check declaration"); }' ...
- @endcode
- @see @RefSect{tutorial, Tutorial}
- */
- #define BOOST_CONTRACT_ON_MISSING_CHECK_DECL
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Define this macro to not disable other assertions while checking
- preconditions (undefined by default).
-
- Not disabling other assertions while checking preconditions can lead to
- infinite recursion in user code so by default this macro is not defined.
- However, the @RefSect{bibliography, [N1962]} proposal does not disable
- assertions while checking preconditions because arguments can reach the
- function body unchecked if assertions are disabled while checking
- preconditions (e.g., when these same functions bodies are called to check
- the preconditions in question).
- This macro can be defined to obtain the behaviour specified in
- @RefSect{bibliography, [N1962]} (at the risk of infinite recursion).
- @see @RefSect{contract_programming_overview.feature_summary,
- Feature Summary}
- */
- #define BOOST_CONTRACT_PRECONDITIONS_DISABLE_NO_ASSERTION
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Define this macro to not disable any assertion while checking other
- assertions (undefined by default).
-
- Not disabling assertions while checking other assertions can lead to
- infinite recursion in user code so by default this macro is not defined.
- (Defining this macro automatically implies that other assertion checking is
- disabled while checking preconditions as if
- @RefMacro{BOOST_CONTRACT_PRECONDITIONS_DISABLE_NO_ASSERTION} was also
- defined.)
- @see @RefSect{contract_programming_overview.feature_summary,
- Feature Summary}
- */
- #define BOOST_CONTRACT_ALL_DISABLE_NO_ASSERTION
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- Define this macro to evaluate and check audit assertions at run-time
- (undefined by default).
- Audit assertions and implementation checks programmed via
- @RefMacro{BOOST_CONTRACT_ASSERT_AUDIT} and
- @RefMacro{BOOST_CONTRACT_CHECK_AUDIT} are always compiled and validated
- syntactically.
- However, they are not evaluated and checked at run-time unless
- this macro is defined (because these conditions can be computationally
- expensive, at least compared to the computational cost of executing the
- function body).
- @see @RefSect{extras.assertion_levels, Assertion Levels}
- */
- #define BOOST_CONTRACT_AUDITS
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- If defined, this library disables implementation checks (undefined by
- default).
- If this macro is defined, this library internal code is also optimized to
- reduce compile-time (not just run-time) overhead associated with
- implementation checks.
- In addition, users can manually program @c \#ifndef statements in their code
- using this macro to completely disable compilation of implementation checks
- or use @RefMacro{BOOST_CONTRACT_CHECK} (recommended).
-
- @see @RefSect{advanced.implementation_checks,
- Implementation Checks},
- @RefSect{extras.disable_contract_checking,
- Disable Contract Checking},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_CHECKS
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- If defined, this library does not check preconditions (undefined by
- default).
- If this macro is defined, this library internal code is also optimized to
- reduce compile-time (not just run-time) overhead associated with
- checking preconditions.
- In addition, users can manually program @c \#ifndef statements in their code
- using this macro to completely disable compilation of preconditions or use
- the macros defined in @c boost/contract_macro.hpp (recommended only for
- applications where it is truly necessary to completely remove contract code
- compilation from production code).
- @see @RefSect{tutorial.preconditions, Preconditions},
- @RefSect{extras.disable_contract_checking,
- Disable Contract Checking},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_PRECONDITIONS
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- If defined, this library does not check postconditions (undefined by
- default).
- If this macro is defined, this library internal code is also optimized to
- reduce compile-time (not just run-time) overhead associated with
- checking postconditions.
- In addition, users can manually program @c \#ifndef statements in their code
- using this macro to completely disable compilation of postconditions or use
- the macros defined in @c boost/contract_macro.hpp (recommended only for
- applications where it is truly necessary to completely remove contract code
- compilation from production code).
- It is necessary to disable both postconditions and exception guarantees
- defining @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS} and
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS} in order to disable old value copies
- (see @RefMacro{BOOST_CONTRACT_NO_OLDS}).
- @see @RefSect{tutorial.postconditions, Postconditions},
- @RefSect{extras.disable_contract_checking,
- Disable Contract Checking},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_POSTCONDITIONS
- #endif
- #ifdef BOOST_CONTRACT_DETAIL_DOXYGEN
- /**
- If defined, this library does not check exception guarantees (undefined by
- default).
- If this macro is defined, this library internal code is also optimized to
- reduce compile-time (not just run-time) overhead associated with
- checking exception guarantees.
- In addition, users can manually program @c \#ifndef statements in their code
- using this macro to completely disable compilation of exception guarantees
- or use the macros defined in @c boost/contract_macro.hpp (recommended only
- for applications where it is truly necessary to completely remove contract
- code compilation from production code).
-
- It is necessary to disable both postconditions and exception guarantees
- defining @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS} and
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS} in order to disable old value copies
- (see @RefMacro{BOOST_CONTRACT_NO_OLDS}).
-
- @see @RefSect{tutorial.exception_guarantees, Exception Guarantees},
- @RefSect{extras.disable_contract_checking,
- Disable Contract Checking},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_EXCEPTS
- #endif
- #if defined(BOOST_CONTRACT_DETAIL_DOXYGEN) || \
- ( \
- !defined(BOOST_CONTRACT_NO_ENTRY_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_INVARIANTS) \
- )
- /**
- If defined, this library does not check class invariants at entry (undefined
- by default).
- If this macro is defined, this library internal code is also optimized to
- reduce compile-time (not just run-time) overhead associated with
- checking class invariants at entry.
- In addition, users can manually program @c \#ifndef statements in their code
- using this macro to completely disable compilation of entry class invariants
- or use the macros defined in @c boost/contract_macro.hpp (recommended only
- for applications where it is truly necessary to completely remove contract
- code compilation from production code).
- This macro is automatically defined when
- @RefMacro{BOOST_CONTRACT_NO_INVARIANTS} is defined.
- @see @RefSect{tutorial.class_invariants, Class Invariants},
- @RefSect{extras.disable_contract_checking,
- Disable Contract Checking},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_ENTRY_INVARIANTS
- #endif
- #if defined(BOOST_CONTRACT_DETAIL_DOXYGEN) || \
- ( \
- !defined(BOOST_CONTRACT_NO_EXIT_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_INVARIANTS) \
- )
- /**
- If defined, this library does not check class invariants at exit (undefined
- by default).
- If this macro is defined, this library internal code is also optimized to
- reduce compile-time (not just run-time) overhead associated with
- checking class invariants at exit.
- In addition, users can manually program @c \#ifndef statements in their code
- using this macro to completely disable compilation of exit class invariants
- or use the macros defined in @c boost/contract_macro.hpp (recommended only
- for applications where it is truly necessary to completely remove contract
- code compilation from production code).
- This macro is automatically defined when
- @RefMacro{BOOST_CONTRACT_NO_INVARIANTS} is defined.
- @see @RefSect{tutorial.class_invariants, Class Invariants},
- @RefSect{extras.disable_contract_checking,
- Disable Contract Checking},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_EXIT_INVARIANTS
- #endif
- #if !defined(BOOST_CONTRACT_NO_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_ENTRY_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_EXIT_INVARIANTS)
- /**
- If defined, this library does not check class invariants (undefined by
- default).
- If this macro is defined, this library internal code is also optimized to
- reduce compile-time (not just run-time) overhead associated with
- checking class invariants.
- In addition, users can manually program @c \#ifndef statements in their code
- using this macro to completely disable compilation of class invariants or
- use the macros defined in @c boost/contract_macro.hpp (recommended only for
- applications where it is truly necessary to completely remove contract code
- compilation from production code).
- Defining this macro is equivalent to defining both
- @RefMacro{BOOST_CONTRACT_NO_ENTRY_INVARIANTS} and
- @RefMacro{BOOST_CONTRACT_NO_EXIT_INVARIANTS}.
- @see @RefSect{tutorial.class_invariants, Class Invariants},
- @RefSect{extras.disable_contract_checking,
- Disable Contract Checking},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_INVARIANTS
- #endif
- #ifdef BOOST_CONTRACT_NO_OLDS
- #error "define NO_POSTCONDITIONS and NO_EXCEPTS instead"
- #elif defined(BOOST_CONTRACT_NO_POSTCONDITIONS) && \
- defined(BOOST_CONTRACT_NO_EXCEPTS)
- /**
- Automatically defined by this library when old value copies are not to be
- performed.
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users define both
- @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS} and
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS}.
- Users can manually program @c \#ifndef statements in their code using this
- macro to completely disable compilation of old value copies or use the
- macros defined in @c boost/contract_macro.hpp (recommended only for
- applications where it is truly necessary to completely remove contract code
- compilation from production code).
- @see @RefSect{tutorial.old_values, Old Values},
- @RefSect{advanced.old_values_copied_at_body,
- Old Values Copied at Body},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_OLDS
- #endif
- // Ctor pre checked separately and outside RAII so not part of this #define.
- #ifdef BOOST_CONTRACT_NO_CONSTRUCTORS
- #error "define NO_INVARIANTS, NO_POSTCONDITIONS, and NO_EXCEPTS instead"
- #elif defined(BOOST_CONTRACT_NO_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_POSTCONDITIONS) && \
- defined(BOOST_CONTRACT_NO_EXCEPTS)
- /**
- Automatically defined by this library when contracts are not checked for
- constructors.
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users define all
- @RefMacro{BOOST_CONTRACT_NO_INVARIANTS},
- @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS}, and
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS}.
- Users can manually program @c \#ifndef statements in their code using this
- macro to completely disable compilation of contracts for constructors or use
- the macros defined in @c boost/contract_macro.hpp (recommended only for
- applications where it is truly necessary to completely remove contract code
- compilation from production code).
-
- @note Constructor preconditions are checked separately by
- @RefClass{boost::contract::constructor_precondition} so they are
- disabled by @RefMacro{BOOST_CONTRACT_NO_PRECONDITIONS} instead.
- @see @RefSect{tutorial.constructors, Constructors},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_CONSTRUCTORS
- #endif
- #ifdef BOOST_CONTRACT_NO_DESTRUCTORS
- #error "define NO_INVARIANTS, NO_POSTCONDITIONS, and NO_EXCEPTS instead"
- #elif defined(BOOST_CONTRACT_NO_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_POSTCONDITIONS) && \
- defined(BOOST_CONTRACT_NO_EXCEPTS)
- /**
- Automatically defined by this library when contracts are not checked for
- destructors.
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users define all
- @RefMacro{BOOST_CONTRACT_NO_INVARIANTS},
- @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS}, and
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS}.
- Users can manually program @c \#ifndef statements in their code using this
- macro to completely disable compilation of contracts for destructors or use
- the macros defined in @c boost/contract_macro.hpp (recommended only for
- applications where it is truly necessary to completely remove contract code
- compilation from production code).
-
- @see @RefSect{tutorial.destructors, Destructors},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_DESTRUCTORS
- #endif
- #ifdef BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS
- #error "define NO_INVARIANTS, NO_PRECONDITIONS, NO_POSTCONDITIONS, and NO_EXCEPTS instead"
- #elif defined(BOOST_CONTRACT_NO_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_PRECONDITIONS) && \
- defined(BOOST_CONTRACT_NO_POSTCONDITIONS) && \
- defined(BOOST_CONTRACT_NO_EXCEPTS)
- /**
- Automatically defined by this library when contracts are not checked for
- public functions.
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users define all
- @RefMacro{BOOST_CONTRACT_NO_INVARIANTS},
- @RefMacro{BOOST_CONTRACT_NO_PRECONDITIONS},
- @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS}, and
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS}.
- Users can manually program @c \#ifndef statements in their code using this
- macro to completely disable compilation of contracts for public functions or
- use the macros defined in @c boost/contract_macro.hpp (recommended only for
- applications where it is truly necessary to completely remove contract code
- compilation from production code).
-
- @see @RefSect{tutorial.public_functions, Public Functions},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_PUBLIC_FUNCTIONS
- #endif
-
- #ifdef BOOST_CONTRACT_NO_FUNCTIONS
- #error "define NO_PRECONDITIONS, NO_POSTCONDITIONS, and NO_EXCEPTS instead"
- #elif defined(BOOST_CONTRACT_NO_PRECONDITIONS) && \
- defined(BOOST_CONTRACT_NO_POSTCONDITIONS) && \
- defined(BOOST_CONTRACT_NO_EXCEPTS)
- /**
- Automatically defined by this library when contracts are not checked for
- non-member, private, or protected functions.
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users define all
- @RefMacro{BOOST_CONTRACT_NO_PRECONDITIONS},
- @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS}, and
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS}.
- Users can manually program @c \#ifndef statements in their code using this
- macro to completely disable compilation of contracts for non-member,
- private and protected functions, or use the macros defined in
- @c boost/contract_macro.hpp (recommended only for applications where it is
- truly necessary to completely remove contract code compilation from
- production code).
- This macro is also used when contracts are not checked for private or
- protected functions, lambda functions, code blocks, loops, etc.
- @see @RefSect{tutorial.non_member_functions, Non-Member Functions},
- @RefSect{advanced.private_and_protected_functions,
- Private and Protected Functions},
- @RefSect{advanced.lambdas__loops__code_blocks__and__constexpr__,
- Lambdas\, Loops\, Code Blocks},
- @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_FUNCTIONS
- #endif
- #ifdef BOOST_CONTRACT_NO_CONDITIONS
- #error "define NO_INVARIANTS, NO_PRECONDITIONS, NO_POSTCONDITIONS, and NO_EXCEPTS instead"
- #elif defined(BOOST_CONTRACT_NO_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_PRECONDITIONS) && \
- defined(BOOST_CONTRACT_NO_POSTCONDITIONS) && \
- defined(BOOST_CONTRACT_NO_EXCEPTS)
- /**
- Automatically defined by this library when contracts are not checked for
- preconditions, postconditions, exceptions guarantees, and class invariants
- (excluding implementation checks).
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users define all
- @RefMacro{BOOST_CONTRACT_NO_PRECONDITIONS},
- @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS},
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS}, and
- @RefMacro{BOOST_CONTRACT_NO_INVARIANTS}.
- Users can manually program @c \#ifndef statements in their code using this
- macro to completely disable compilation of contracts within specifications
- (so excluding implementation checks which are contracts within
- implementations instead), or use the macros defined in
- @c boost/contract_macro.hpp (recommended only for applications where it is
- truly necessary to completely remove contract code compilation from
- production code).
- @see @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_CONDITIONS
- #endif
- #ifdef BOOST_CONTRACT_NO_ALL
- #error "define NO_INVARIANTS, NO_PRECONDITIONS, NO_POSTCONDITIONS, NO_EXCEPTS, and NO_CHECKS instead"
- #elif defined(BOOST_CONTRACT_NO_INVARIANTS) && \
- defined(BOOST_CONTRACT_NO_PRECONDITIONS) && \
- defined(BOOST_CONTRACT_NO_POSTCONDITIONS) && \
- defined(BOOST_CONTRACT_NO_EXCEPTS) && \
- defined(BOOST_CONTRACT_NO_CHECKS)
- /**
- Automatically defined by this library when contracts are not checked at all
- (neither for specifications nor for implementations).
- This macro is not a configuration macro and this library will generate a
- compile-time error if users try to define it directly.
- This library will automatically define this macro when users define all
- @RefMacro{BOOST_CONTRACT_NO_INVARIANTS},
- @RefMacro{BOOST_CONTRACT_NO_PRECONDITIONS},
- @RefMacro{BOOST_CONTRACT_NO_POSTCONDITIONS},
- @RefMacro{BOOST_CONTRACT_NO_EXCEPTS}, and
- @RefMacro{BOOST_CONTRACT_NO_CHECKS}.
- For example, users can manually program @c \#ifndef statements in their code
- using this macro to avoid including the @c boost/contract.hpp header all
- together:
- @code
- #include <boost/contract/core/config.hpp>
- #ifndef BOOST_CONTRACT_NO_ALL
- #include <boost/contract.hpp>
- #endif
- @endcode
-
- Or, use the @c boost/contract_macro.hpp header and related macros instead
- (because the @c boost/contract_macro.hpp header is already optimized to not
- include other headers from this library when contracts are not checked, but
- recommended only for applications where it is truly necessary to completely
- remove contract code compilation from production code).
- @see @RefSect{extras.disable_contract_compilation__macro_interface_,
- Disable Contract Compilation}
- */
- #define BOOST_CONTRACT_NO_ALL
- #endif
- #endif // #include guard
|