diff options
Diffstat (limited to 'boost/contract/detail/checking.hpp')
-rw-r--r-- | boost/contract/detail/checking.hpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/boost/contract/detail/checking.hpp b/boost/contract/detail/checking.hpp new file mode 100644 index 0000000000..765c04f4f8 --- /dev/null +++ b/boost/contract/detail/checking.hpp @@ -0,0 +1,80 @@ + +#ifndef BOOST_CONTRACT_DETAIL_CHECKING_HPP_ +#define BOOST_CONTRACT_DETAIL_CHECKING_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 + +#include <boost/contract/core/config.hpp> +#include <boost/contract/detail/static_local_var.hpp> +#include <boost/contract/detail/declspec.hpp> +#include <boost/thread/mutex.hpp> +#include <boost/noncopyable.hpp> + +namespace boost { namespace contract { namespace detail { + +#ifdef BOOST_MSVC + #pragma warning(push) + #pragma warning(disable: 4251) // Member w/o DLL spec (mutex_ type). +#endif + +// RAII facility to disable assertions while checking other assertions. +class BOOST_CONTRACT_DETAIL_DECLSPEC checking : + private boost::noncopyable // Non-copyable resource (might use mutex, etc.). +{ +public: + explicit checking() { + #ifndef BOOST_CONTRACT_DISABLE_THREADS + init_locked(); + #else + init_unlocked(); + #endif + } + + ~checking() { + #ifndef BOOST_CONTRACT_DISABLE_THREADS + done_locked(); + #else + done_unlocked(); + #endif + } + + static bool already() { + #ifndef BOOST_CONTRACT_DISABLE_THREADS + return already_locked(); + #else + return already_unlocked(); + #endif + } + +private: + void init_unlocked(); + void init_locked(); + + void done_unlocked(); + void done_locked(); + + static bool already_unlocked(); + static bool already_locked(); + + struct mutex_tag; + typedef static_local_var<mutex_tag, boost::mutex> mutex; + + struct checking_tag; + typedef static_local_var_init<checking_tag, bool, bool, false> flag; +}; + +#ifdef BOOST_MSVC + #pragma warning(pop) +#endif + +} } } // namespace + +#ifdef BOOST_CONTRACT_HEADER_ONLY + #include <boost/contract/detail/inlined/detail/checking.hpp> +#endif + +#endif // #include guard + |