Chris@16: #ifndef BOOST_ATOMIC_ATOMIC_HPP Chris@16: #define BOOST_ATOMIC_ATOMIC_HPP Chris@16: Chris@16: // Copyright (c) 2011 Helge Bahmann Chris@16: // Copyright (c) 2013 Tim Blechmann Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #if defined(BOOST_MSVC) && BOOST_MSVC < 1400 Chris@16: #include Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_HAS_PRAGMA_ONCE Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: #ifndef BOOST_ATOMIC_CHAR_LOCK_FREE Chris@16: #define BOOST_ATOMIC_CHAR_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE Chris@16: #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE Chris@16: #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE Chris@16: #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_SHORT_LOCK_FREE Chris@16: #define BOOST_ATOMIC_SHORT_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_INT_LOCK_FREE Chris@16: #define BOOST_ATOMIC_INT_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_LONG_LOCK_FREE Chris@16: #define BOOST_ATOMIC_LONG_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_LLONG_LOCK_FREE Chris@16: #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_INT128_LOCK_FREE Chris@16: #define BOOST_ATOMIC_INT128_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_POINTER_LOCK_FREE Chris@16: #define BOOST_ATOMIC_POINTER_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE Chris@16: Chris@16: #ifndef BOOST_ATOMIC_BOOL_LOCK_FREE Chris@16: #define BOOST_ATOMIC_BOOL_LOCK_FREE 0 Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_THREAD_FENCE Chris@16: #define BOOST_ATOMIC_THREAD_FENCE 0 Chris@16: inline void atomic_thread_fence(memory_order) Chris@16: { Chris@16: } Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_SIGNAL_FENCE Chris@16: #define BOOST_ATOMIC_SIGNAL_FENCE 0 Chris@16: inline void atomic_signal_fence(memory_order order) Chris@16: { Chris@16: atomic_thread_fence(order); Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: class atomic : Chris@16: public atomics::detail::base_atomic< Chris@16: T, Chris@16: typename atomics::detail::classify::type, Chris@16: atomics::detail::storage_size_of::value, Chris@16: #if !defined(BOOST_MSVC) || BOOST_MSVC >= 1400 Chris@16: boost::is_signed::value Chris@16: #else Chris@16: // MSVC 2003 has problems instantiating is_signed on non-integral types Chris@16: mpl::and_< boost::is_integral, boost::is_signed >::value Chris@16: #endif Chris@16: > Chris@16: { Chris@16: private: Chris@16: typedef T value_type; Chris@16: typedef atomics::detail::base_atomic< Chris@16: T, Chris@16: typename atomics::detail::classify::type, Chris@16: atomics::detail::storage_size_of::value, Chris@16: #if !defined(BOOST_MSVC) || BOOST_MSVC >= 1400 Chris@16: boost::is_signed::value Chris@16: #else Chris@16: // MSVC 2003 has problems instantiating is_signed on non-itegral types Chris@16: mpl::and_< boost::is_integral, boost::is_signed >::value Chris@16: #endif Chris@16: > super; Chris@16: typedef typename super::value_arg_type value_arg_type; Chris@16: Chris@16: public: Chris@16: BOOST_DEFAULTED_FUNCTION(atomic(void), BOOST_NOEXCEPT {}) Chris@16: Chris@16: // NOTE: The constructor is made explicit because gcc 4.7 complains that Chris@16: // operator=(value_arg_type) is considered ambiguous with operator=(atomic const&) Chris@16: // in assignment expressions, even though conversion to atomic<> is less preferred Chris@16: // than conversion to value_arg_type. Chris@16: explicit BOOST_CONSTEXPR atomic(value_arg_type v) BOOST_NOEXCEPT : super(v) {} Chris@16: Chris@16: value_type operator=(value_arg_type v) volatile BOOST_NOEXCEPT Chris@16: { Chris@16: this->store(v); Chris@16: return v; Chris@16: } Chris@16: Chris@16: operator value_type(void) volatile const BOOST_NOEXCEPT Chris@16: { Chris@16: return this->load(); Chris@16: } Chris@16: Chris@16: BOOST_DELETED_FUNCTION(atomic(atomic const&)) Chris@16: BOOST_DELETED_FUNCTION(atomic& operator=(atomic const&) volatile) Chris@16: }; Chris@16: Chris@16: typedef atomic atomic_char; Chris@16: typedef atomic atomic_uchar; Chris@16: typedef atomic atomic_schar; Chris@16: typedef atomic atomic_uint8_t; Chris@16: typedef atomic atomic_int8_t; Chris@16: typedef atomic atomic_ushort; Chris@16: typedef atomic atomic_short; Chris@16: typedef atomic atomic_uint16_t; Chris@16: typedef atomic atomic_int16_t; Chris@16: typedef atomic atomic_uint; Chris@16: typedef atomic atomic_int; Chris@16: typedef atomic atomic_uint32_t; Chris@16: typedef atomic atomic_int32_t; Chris@16: typedef atomic atomic_ulong; Chris@16: typedef atomic atomic_long; Chris@16: typedef atomic atomic_uint64_t; Chris@16: typedef atomic atomic_int64_t; Chris@16: #ifdef BOOST_HAS_LONG_LONG Chris@16: typedef atomic atomic_ullong; Chris@16: typedef atomic atomic_llong; Chris@16: #endif Chris@16: typedef atomic atomic_address; Chris@16: typedef atomic atomic_bool; Chris@16: typedef atomic atomic_wchar_t; Chris@16: #if !defined(BOOST_NO_CXX11_CHAR16_T) Chris@16: typedef atomic atomic_char16_t; Chris@16: #endif Chris@16: #if !defined(BOOST_NO_CXX11_CHAR32_T) Chris@16: typedef atomic atomic_char32_t; Chris@16: #endif Chris@16: Chris@16: typedef atomic atomic_int_least8_t; Chris@16: typedef atomic atomic_uint_least8_t; Chris@16: typedef atomic atomic_int_least16_t; Chris@16: typedef atomic atomic_uint_least16_t; Chris@16: typedef atomic atomic_int_least32_t; Chris@16: typedef atomic atomic_uint_least32_t; Chris@16: typedef atomic atomic_int_least64_t; Chris@16: typedef atomic atomic_uint_least64_t; Chris@16: typedef atomic atomic_int_fast8_t; Chris@16: typedef atomic atomic_uint_fast8_t; Chris@16: typedef atomic atomic_int_fast16_t; Chris@16: typedef atomic atomic_uint_fast16_t; Chris@16: typedef atomic atomic_int_fast32_t; Chris@16: typedef atomic atomic_uint_fast32_t; Chris@16: typedef atomic atomic_int_fast64_t; Chris@16: typedef atomic atomic_uint_fast64_t; Chris@16: typedef atomic atomic_intmax_t; Chris@16: typedef atomic atomic_uintmax_t; Chris@16: Chris@16: typedef atomic atomic_size_t; Chris@16: typedef atomic atomic_ptrdiff_t; Chris@16: Chris@16: #if defined(BOOST_HAS_INTPTR_T) Chris@16: typedef atomic atomic_intptr_t; Chris@16: typedef atomic atomic_uintptr_t; Chris@16: #endif Chris@16: Chris@16: #ifndef BOOST_ATOMIC_FLAG_LOCK_FREE Chris@16: #define BOOST_ATOMIC_FLAG_LOCK_FREE 0 Chris@16: class atomic_flag Chris@16: { Chris@16: public: Chris@16: BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(false) {} Chris@16: Chris@16: bool Chris@16: test_and_set(memory_order order = memory_order_seq_cst) BOOST_NOEXCEPT Chris@16: { Chris@16: return v_.exchange(true, order); Chris@16: } Chris@16: Chris@16: void Chris@16: clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT Chris@16: { Chris@16: v_.store(false, order); Chris@16: } Chris@16: Chris@16: BOOST_DELETED_FUNCTION(atomic_flag(atomic_flag const&)) Chris@16: BOOST_DELETED_FUNCTION(atomic_flag& operator=(atomic_flag const&)) Chris@16: Chris@16: private: Chris@16: atomic v_; Chris@16: }; Chris@16: #endif Chris@16: Chris@16: } Chris@16: Chris@16: #endif