annotate DEPENDENCIES/generic/include/boost/atomic/atomic.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 #ifndef BOOST_ATOMIC_ATOMIC_HPP
Chris@16 2 #define BOOST_ATOMIC_ATOMIC_HPP
Chris@16 3
Chris@16 4 // Copyright (c) 2011 Helge Bahmann
Chris@16 5 // Copyright (c) 2013 Tim Blechmann
Chris@16 6 //
Chris@16 7 // Distributed under the Boost Software License, Version 1.0.
Chris@16 8 // See accompanying file LICENSE_1_0.txt or copy at
Chris@16 9 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11 #include <cstddef>
Chris@16 12 #include <boost/cstdint.hpp>
Chris@16 13
Chris@16 14 #include <boost/memory_order.hpp>
Chris@16 15
Chris@16 16 #include <boost/atomic/detail/config.hpp>
Chris@16 17 #include <boost/atomic/detail/platform.hpp>
Chris@16 18 #include <boost/atomic/detail/type-classification.hpp>
Chris@16 19 #include <boost/type_traits/is_signed.hpp>
Chris@16 20 #if defined(BOOST_MSVC) && BOOST_MSVC < 1400
Chris@16 21 #include <boost/type_traits/is_integral.hpp>
Chris@16 22 #include <boost/mpl/and.hpp>
Chris@16 23 #endif
Chris@16 24
Chris@16 25 #ifdef BOOST_HAS_PRAGMA_ONCE
Chris@16 26 #pragma once
Chris@16 27 #endif
Chris@16 28
Chris@16 29 namespace boost {
Chris@16 30
Chris@16 31 #ifndef BOOST_ATOMIC_CHAR_LOCK_FREE
Chris@16 32 #define BOOST_ATOMIC_CHAR_LOCK_FREE 0
Chris@16 33 #endif
Chris@16 34
Chris@16 35 #ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE
Chris@16 36 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE 0
Chris@16 37 #endif
Chris@16 38
Chris@16 39 #ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE
Chris@16 40 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE 0
Chris@16 41 #endif
Chris@16 42
Chris@16 43 #ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE
Chris@16 44 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
Chris@16 45 #endif
Chris@16 46
Chris@16 47 #ifndef BOOST_ATOMIC_SHORT_LOCK_FREE
Chris@16 48 #define BOOST_ATOMIC_SHORT_LOCK_FREE 0
Chris@16 49 #endif
Chris@16 50
Chris@16 51 #ifndef BOOST_ATOMIC_INT_LOCK_FREE
Chris@16 52 #define BOOST_ATOMIC_INT_LOCK_FREE 0
Chris@16 53 #endif
Chris@16 54
Chris@16 55 #ifndef BOOST_ATOMIC_LONG_LOCK_FREE
Chris@16 56 #define BOOST_ATOMIC_LONG_LOCK_FREE 0
Chris@16 57 #endif
Chris@16 58
Chris@16 59 #ifndef BOOST_ATOMIC_LLONG_LOCK_FREE
Chris@16 60 #define BOOST_ATOMIC_LLONG_LOCK_FREE 0
Chris@16 61 #endif
Chris@16 62
Chris@16 63 #ifndef BOOST_ATOMIC_INT128_LOCK_FREE
Chris@16 64 #define BOOST_ATOMIC_INT128_LOCK_FREE 0
Chris@16 65 #endif
Chris@16 66
Chris@16 67 #ifndef BOOST_ATOMIC_POINTER_LOCK_FREE
Chris@16 68 #define BOOST_ATOMIC_POINTER_LOCK_FREE 0
Chris@16 69 #endif
Chris@16 70
Chris@16 71 #define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE
Chris@16 72
Chris@16 73 #ifndef BOOST_ATOMIC_BOOL_LOCK_FREE
Chris@16 74 #define BOOST_ATOMIC_BOOL_LOCK_FREE 0
Chris@16 75 #endif
Chris@16 76
Chris@16 77 #ifndef BOOST_ATOMIC_THREAD_FENCE
Chris@16 78 #define BOOST_ATOMIC_THREAD_FENCE 0
Chris@16 79 inline void atomic_thread_fence(memory_order)
Chris@16 80 {
Chris@16 81 }
Chris@16 82 #endif
Chris@16 83
Chris@16 84 #ifndef BOOST_ATOMIC_SIGNAL_FENCE
Chris@16 85 #define BOOST_ATOMIC_SIGNAL_FENCE 0
Chris@16 86 inline void atomic_signal_fence(memory_order order)
Chris@16 87 {
Chris@16 88 atomic_thread_fence(order);
Chris@16 89 }
Chris@16 90 #endif
Chris@16 91
Chris@16 92 template<typename T>
Chris@16 93 class atomic :
Chris@16 94 public atomics::detail::base_atomic<
Chris@16 95 T,
Chris@16 96 typename atomics::detail::classify<T>::type,
Chris@16 97 atomics::detail::storage_size_of<T>::value,
Chris@16 98 #if !defined(BOOST_MSVC) || BOOST_MSVC >= 1400
Chris@16 99 boost::is_signed<T>::value
Chris@16 100 #else
Chris@16 101 // MSVC 2003 has problems instantiating is_signed on non-integral types
Chris@16 102 mpl::and_< boost::is_integral<T>, boost::is_signed<T> >::value
Chris@16 103 #endif
Chris@16 104 >
Chris@16 105 {
Chris@16 106 private:
Chris@16 107 typedef T value_type;
Chris@16 108 typedef atomics::detail::base_atomic<
Chris@16 109 T,
Chris@16 110 typename atomics::detail::classify<T>::type,
Chris@16 111 atomics::detail::storage_size_of<T>::value,
Chris@16 112 #if !defined(BOOST_MSVC) || BOOST_MSVC >= 1400
Chris@16 113 boost::is_signed<T>::value
Chris@16 114 #else
Chris@16 115 // MSVC 2003 has problems instantiating is_signed on non-itegral types
Chris@16 116 mpl::and_< boost::is_integral<T>, boost::is_signed<T> >::value
Chris@16 117 #endif
Chris@16 118 > super;
Chris@16 119 typedef typename super::value_arg_type value_arg_type;
Chris@16 120
Chris@16 121 public:
Chris@16 122 BOOST_DEFAULTED_FUNCTION(atomic(void), BOOST_NOEXCEPT {})
Chris@16 123
Chris@16 124 // NOTE: The constructor is made explicit because gcc 4.7 complains that
Chris@16 125 // operator=(value_arg_type) is considered ambiguous with operator=(atomic const&)
Chris@16 126 // in assignment expressions, even though conversion to atomic<> is less preferred
Chris@16 127 // than conversion to value_arg_type.
Chris@16 128 explicit BOOST_CONSTEXPR atomic(value_arg_type v) BOOST_NOEXCEPT : super(v) {}
Chris@16 129
Chris@16 130 value_type operator=(value_arg_type v) volatile BOOST_NOEXCEPT
Chris@16 131 {
Chris@16 132 this->store(v);
Chris@16 133 return v;
Chris@16 134 }
Chris@16 135
Chris@16 136 operator value_type(void) volatile const BOOST_NOEXCEPT
Chris@16 137 {
Chris@16 138 return this->load();
Chris@16 139 }
Chris@16 140
Chris@16 141 BOOST_DELETED_FUNCTION(atomic(atomic const&))
Chris@16 142 BOOST_DELETED_FUNCTION(atomic& operator=(atomic const&) volatile)
Chris@16 143 };
Chris@16 144
Chris@16 145 typedef atomic<char> atomic_char;
Chris@16 146 typedef atomic<unsigned char> atomic_uchar;
Chris@16 147 typedef atomic<signed char> atomic_schar;
Chris@16 148 typedef atomic<uint8_t> atomic_uint8_t;
Chris@16 149 typedef atomic<int8_t> atomic_int8_t;
Chris@16 150 typedef atomic<unsigned short> atomic_ushort;
Chris@16 151 typedef atomic<short> atomic_short;
Chris@16 152 typedef atomic<uint16_t> atomic_uint16_t;
Chris@16 153 typedef atomic<int16_t> atomic_int16_t;
Chris@16 154 typedef atomic<unsigned int> atomic_uint;
Chris@16 155 typedef atomic<int> atomic_int;
Chris@16 156 typedef atomic<uint32_t> atomic_uint32_t;
Chris@16 157 typedef atomic<int32_t> atomic_int32_t;
Chris@16 158 typedef atomic<unsigned long> atomic_ulong;
Chris@16 159 typedef atomic<long> atomic_long;
Chris@16 160 typedef atomic<uint64_t> atomic_uint64_t;
Chris@16 161 typedef atomic<int64_t> atomic_int64_t;
Chris@16 162 #ifdef BOOST_HAS_LONG_LONG
Chris@16 163 typedef atomic<boost::ulong_long_type> atomic_ullong;
Chris@16 164 typedef atomic<boost::long_long_type> atomic_llong;
Chris@16 165 #endif
Chris@16 166 typedef atomic<void*> atomic_address;
Chris@16 167 typedef atomic<bool> atomic_bool;
Chris@16 168 typedef atomic<wchar_t> atomic_wchar_t;
Chris@16 169 #if !defined(BOOST_NO_CXX11_CHAR16_T)
Chris@16 170 typedef atomic<char16_t> atomic_char16_t;
Chris@16 171 #endif
Chris@16 172 #if !defined(BOOST_NO_CXX11_CHAR32_T)
Chris@16 173 typedef atomic<char32_t> atomic_char32_t;
Chris@16 174 #endif
Chris@16 175
Chris@16 176 typedef atomic<int_least8_t> atomic_int_least8_t;
Chris@16 177 typedef atomic<uint_least8_t> atomic_uint_least8_t;
Chris@16 178 typedef atomic<int_least16_t> atomic_int_least16_t;
Chris@16 179 typedef atomic<uint_least16_t> atomic_uint_least16_t;
Chris@16 180 typedef atomic<int_least32_t> atomic_int_least32_t;
Chris@16 181 typedef atomic<uint_least32_t> atomic_uint_least32_t;
Chris@16 182 typedef atomic<int_least64_t> atomic_int_least64_t;
Chris@16 183 typedef atomic<uint_least64_t> atomic_uint_least64_t;
Chris@16 184 typedef atomic<int_fast8_t> atomic_int_fast8_t;
Chris@16 185 typedef atomic<uint_fast8_t> atomic_uint_fast8_t;
Chris@16 186 typedef atomic<int_fast16_t> atomic_int_fast16_t;
Chris@16 187 typedef atomic<uint_fast16_t> atomic_uint_fast16_t;
Chris@16 188 typedef atomic<int_fast32_t> atomic_int_fast32_t;
Chris@16 189 typedef atomic<uint_fast32_t> atomic_uint_fast32_t;
Chris@16 190 typedef atomic<int_fast64_t> atomic_int_fast64_t;
Chris@16 191 typedef atomic<uint_fast64_t> atomic_uint_fast64_t;
Chris@16 192 typedef atomic<intmax_t> atomic_intmax_t;
Chris@16 193 typedef atomic<uintmax_t> atomic_uintmax_t;
Chris@16 194
Chris@16 195 typedef atomic<std::size_t> atomic_size_t;
Chris@16 196 typedef atomic<std::ptrdiff_t> atomic_ptrdiff_t;
Chris@16 197
Chris@16 198 #if defined(BOOST_HAS_INTPTR_T)
Chris@16 199 typedef atomic<intptr_t> atomic_intptr_t;
Chris@16 200 typedef atomic<uintptr_t> atomic_uintptr_t;
Chris@16 201 #endif
Chris@16 202
Chris@16 203 #ifndef BOOST_ATOMIC_FLAG_LOCK_FREE
Chris@16 204 #define BOOST_ATOMIC_FLAG_LOCK_FREE 0
Chris@16 205 class atomic_flag
Chris@16 206 {
Chris@16 207 public:
Chris@16 208 BOOST_CONSTEXPR atomic_flag(void) BOOST_NOEXCEPT : v_(false) {}
Chris@16 209
Chris@16 210 bool
Chris@16 211 test_and_set(memory_order order = memory_order_seq_cst) BOOST_NOEXCEPT
Chris@16 212 {
Chris@16 213 return v_.exchange(true, order);
Chris@16 214 }
Chris@16 215
Chris@16 216 void
Chris@16 217 clear(memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
Chris@16 218 {
Chris@16 219 v_.store(false, order);
Chris@16 220 }
Chris@16 221
Chris@16 222 BOOST_DELETED_FUNCTION(atomic_flag(atomic_flag const&))
Chris@16 223 BOOST_DELETED_FUNCTION(atomic_flag& operator=(atomic_flag const&))
Chris@16 224
Chris@16 225 private:
Chris@16 226 atomic<bool> v_;
Chris@16 227 };
Chris@16 228 #endif
Chris@16 229
Chris@16 230 }
Chris@16 231
Chris@16 232 #endif