Chris@102
|
1 /*
|
Chris@102
|
2 * Distributed under the Boost Software License, Version 1.0.
|
Chris@102
|
3 * (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
4 * http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
5 *
|
Chris@102
|
6 * Copyright (c) 2011 Helge Bahmann
|
Chris@102
|
7 * Copyright (c) 2013 Tim Blechmann
|
Chris@102
|
8 * Copyright (c) 2014 Andrey Semashev
|
Chris@102
|
9 */
|
Chris@102
|
10 /*!
|
Chris@102
|
11 * \file atomic/detail/atomic_template.hpp
|
Chris@102
|
12 *
|
Chris@102
|
13 * This header contains interface definition of \c atomic template.
|
Chris@102
|
14 */
|
Chris@102
|
15
|
Chris@102
|
16 #ifndef BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_
|
Chris@102
|
17 #define BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_
|
Chris@102
|
18
|
Chris@102
|
19 #include <cstddef>
|
Chris@102
|
20 #include <boost/cstdint.hpp>
|
Chris@102
|
21 #include <boost/assert.hpp>
|
Chris@102
|
22 #include <boost/type_traits/is_signed.hpp>
|
Chris@102
|
23 #include <boost/type_traits/is_integral.hpp>
|
Chris@102
|
24 #include <boost/atomic/detail/config.hpp>
|
Chris@102
|
25 #include <boost/atomic/detail/casts.hpp>
|
Chris@102
|
26 #include <boost/atomic/detail/operations_fwd.hpp>
|
Chris@102
|
27
|
Chris@102
|
28 #ifdef BOOST_HAS_PRAGMA_ONCE
|
Chris@102
|
29 #pragma once
|
Chris@102
|
30 #endif
|
Chris@102
|
31
|
Chris@102
|
32 #if defined(BOOST_MSVC)
|
Chris@102
|
33 #pragma warning(push)
|
Chris@102
|
34 // 'boost::atomics::atomic<T>' : multiple assignment operators specified
|
Chris@102
|
35 #pragma warning(disable: 4522)
|
Chris@102
|
36 #endif
|
Chris@102
|
37
|
Chris@102
|
38 /*
|
Chris@102
|
39 * IMPLEMENTATION NOTE: All interface functions MUST be declared with BOOST_FORCEINLINE,
|
Chris@102
|
40 * see comment for convert_memory_order_to_gcc in ops_gcc_atomic.hpp.
|
Chris@102
|
41 */
|
Chris@102
|
42
|
Chris@102
|
43 namespace boost {
|
Chris@102
|
44 namespace atomics {
|
Chris@102
|
45 namespace detail {
|
Chris@102
|
46
|
Chris@102
|
47 BOOST_FORCEINLINE BOOST_CONSTEXPR memory_order deduce_failure_order(memory_order order) BOOST_NOEXCEPT
|
Chris@102
|
48 {
|
Chris@102
|
49 return order == memory_order_acq_rel ? memory_order_acquire : (order == memory_order_release ? memory_order_relaxed : order);
|
Chris@102
|
50 }
|
Chris@102
|
51
|
Chris@102
|
52 BOOST_FORCEINLINE BOOST_CONSTEXPR bool cas_failure_order_must_not_be_stronger_than_success_order(memory_order success_order, memory_order failure_order) BOOST_NOEXCEPT
|
Chris@102
|
53 {
|
Chris@102
|
54 // 15 == (memory_order_seq_cst | memory_order_consume), see memory_order.hpp
|
Chris@102
|
55 // Given the enum values we can test the strength of memory order requirements with this single condition.
|
Chris@102
|
56 return (failure_order & 15u) <= (success_order & 15u);
|
Chris@102
|
57 }
|
Chris@102
|
58
|
Chris@102
|
59 template< typename T, bool IsInt = boost::is_integral< T >::value >
|
Chris@102
|
60 struct classify
|
Chris@102
|
61 {
|
Chris@102
|
62 typedef void type;
|
Chris@102
|
63 };
|
Chris@102
|
64
|
Chris@102
|
65 template< typename T >
|
Chris@102
|
66 struct classify< T, true > { typedef int type; };
|
Chris@102
|
67
|
Chris@102
|
68 template< typename T >
|
Chris@102
|
69 struct classify< T*, false > { typedef void* type; };
|
Chris@102
|
70
|
Chris@102
|
71 template< typename T, typename Kind >
|
Chris@102
|
72 class base_atomic;
|
Chris@102
|
73
|
Chris@102
|
74 //! Implementation for integers
|
Chris@102
|
75 template< typename T >
|
Chris@102
|
76 class base_atomic< T, int >
|
Chris@102
|
77 {
|
Chris@102
|
78 private:
|
Chris@102
|
79 typedef T value_type;
|
Chris@102
|
80 typedef T difference_type;
|
Chris@102
|
81 typedef atomics::detail::operations< storage_size_of< value_type >::value, boost::is_signed< T >::value > operations;
|
Chris@102
|
82
|
Chris@102
|
83 protected:
|
Chris@102
|
84 typedef value_type value_arg_type;
|
Chris@102
|
85
|
Chris@102
|
86 public:
|
Chris@102
|
87 typedef typename operations::storage_type storage_type;
|
Chris@102
|
88
|
Chris@102
|
89 protected:
|
Chris@102
|
90 storage_type m_storage;
|
Chris@102
|
91
|
Chris@102
|
92 public:
|
Chris@102
|
93 BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
|
Chris@102
|
94 BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : m_storage(v) {}
|
Chris@102
|
95
|
Chris@102
|
96 BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
97 {
|
Chris@102
|
98 BOOST_ASSERT(order != memory_order_consume);
|
Chris@102
|
99 BOOST_ASSERT(order != memory_order_acquire);
|
Chris@102
|
100 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
101
|
Chris@102
|
102 operations::store(m_storage, static_cast< storage_type >(v), order);
|
Chris@102
|
103 }
|
Chris@102
|
104
|
Chris@102
|
105 BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
Chris@102
|
106 {
|
Chris@102
|
107 BOOST_ASSERT(order != memory_order_release);
|
Chris@102
|
108 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
109
|
Chris@102
|
110 return static_cast< value_type >(operations::load(m_storage, order));
|
Chris@102
|
111 }
|
Chris@102
|
112
|
Chris@102
|
113 BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
114 {
|
Chris@102
|
115 return static_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
116 }
|
Chris@102
|
117
|
Chris@102
|
118 BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
119 {
|
Chris@102
|
120 return static_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
121 }
|
Chris@102
|
122
|
Chris@102
|
123 BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
124 {
|
Chris@102
|
125 return static_cast< value_type >(operations::exchange(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
126 }
|
Chris@102
|
127
|
Chris@102
|
128 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
129 {
|
Chris@102
|
130 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
131 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
132 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
133
|
Chris@102
|
134 storage_type old_value = static_cast< storage_type >(expected);
|
Chris@102
|
135 const bool res = operations::compare_exchange_strong(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
136 expected = static_cast< value_type >(old_value);
|
Chris@102
|
137 return res;
|
Chris@102
|
138 }
|
Chris@102
|
139
|
Chris@102
|
140 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
141 {
|
Chris@102
|
142 return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
143 }
|
Chris@102
|
144
|
Chris@102
|
145 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
146 {
|
Chris@102
|
147 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
148 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
149 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
150
|
Chris@102
|
151 storage_type old_value = static_cast< storage_type >(expected);
|
Chris@102
|
152 const bool res = operations::compare_exchange_weak(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
153 expected = static_cast< value_type >(old_value);
|
Chris@102
|
154 return res;
|
Chris@102
|
155 }
|
Chris@102
|
156
|
Chris@102
|
157 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
158 {
|
Chris@102
|
159 return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
160 }
|
Chris@102
|
161
|
Chris@102
|
162 BOOST_FORCEINLINE value_type fetch_and(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
163 {
|
Chris@102
|
164 return static_cast< value_type >(operations::fetch_and(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
165 }
|
Chris@102
|
166
|
Chris@102
|
167 BOOST_FORCEINLINE value_type fetch_or(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
168 {
|
Chris@102
|
169 return static_cast< value_type >(operations::fetch_or(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
170 }
|
Chris@102
|
171
|
Chris@102
|
172 BOOST_FORCEINLINE value_type fetch_xor(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
173 {
|
Chris@102
|
174 return static_cast< value_type >(operations::fetch_xor(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
175 }
|
Chris@102
|
176
|
Chris@102
|
177 BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
|
Chris@102
|
178 {
|
Chris@102
|
179 return operations::is_lock_free(m_storage);
|
Chris@102
|
180 }
|
Chris@102
|
181
|
Chris@102
|
182 BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
|
Chris@102
|
183 {
|
Chris@102
|
184 return fetch_add(1);
|
Chris@102
|
185 }
|
Chris@102
|
186
|
Chris@102
|
187 BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
|
Chris@102
|
188 {
|
Chris@102
|
189 return fetch_add(1) + 1;
|
Chris@102
|
190 }
|
Chris@102
|
191
|
Chris@102
|
192 BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
|
Chris@102
|
193 {
|
Chris@102
|
194 return fetch_sub(1);
|
Chris@102
|
195 }
|
Chris@102
|
196
|
Chris@102
|
197 BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
|
Chris@102
|
198 {
|
Chris@102
|
199 return fetch_sub(1) - 1;
|
Chris@102
|
200 }
|
Chris@102
|
201
|
Chris@102
|
202 BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
203 {
|
Chris@102
|
204 return fetch_add(v) + v;
|
Chris@102
|
205 }
|
Chris@102
|
206
|
Chris@102
|
207 BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
208 {
|
Chris@102
|
209 return fetch_sub(v) - v;
|
Chris@102
|
210 }
|
Chris@102
|
211
|
Chris@102
|
212 BOOST_FORCEINLINE value_type operator&=(value_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
213 {
|
Chris@102
|
214 return fetch_and(v) & v;
|
Chris@102
|
215 }
|
Chris@102
|
216
|
Chris@102
|
217 BOOST_FORCEINLINE value_type operator|=(value_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
218 {
|
Chris@102
|
219 return fetch_or(v) | v;
|
Chris@102
|
220 }
|
Chris@102
|
221
|
Chris@102
|
222 BOOST_FORCEINLINE value_type operator^=(value_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
223 {
|
Chris@102
|
224 return fetch_xor(v) ^ v;
|
Chris@102
|
225 }
|
Chris@102
|
226
|
Chris@102
|
227 BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
|
Chris@102
|
228 BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
|
Chris@102
|
229 };
|
Chris@102
|
230
|
Chris@102
|
231 //! Implementation for bool
|
Chris@102
|
232 template< >
|
Chris@102
|
233 class base_atomic< bool, int >
|
Chris@102
|
234 {
|
Chris@102
|
235 private:
|
Chris@102
|
236 typedef bool value_type;
|
Chris@102
|
237 typedef atomics::detail::operations< 1u, false > operations;
|
Chris@102
|
238
|
Chris@102
|
239 protected:
|
Chris@102
|
240 typedef value_type value_arg_type;
|
Chris@102
|
241
|
Chris@102
|
242 public:
|
Chris@102
|
243 typedef operations::storage_type storage_type;
|
Chris@102
|
244
|
Chris@102
|
245 protected:
|
Chris@102
|
246 storage_type m_storage;
|
Chris@102
|
247
|
Chris@102
|
248 public:
|
Chris@102
|
249 BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
|
Chris@102
|
250 BOOST_CONSTEXPR explicit base_atomic(value_type v) BOOST_NOEXCEPT : m_storage(v) {}
|
Chris@102
|
251
|
Chris@102
|
252 BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
253 {
|
Chris@102
|
254 BOOST_ASSERT(order != memory_order_consume);
|
Chris@102
|
255 BOOST_ASSERT(order != memory_order_acquire);
|
Chris@102
|
256 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
257
|
Chris@102
|
258 operations::store(m_storage, static_cast< storage_type >(v), order);
|
Chris@102
|
259 }
|
Chris@102
|
260
|
Chris@102
|
261 BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
Chris@102
|
262 {
|
Chris@102
|
263 BOOST_ASSERT(order != memory_order_release);
|
Chris@102
|
264 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
265
|
Chris@102
|
266 return !!operations::load(m_storage, order);
|
Chris@102
|
267 }
|
Chris@102
|
268
|
Chris@102
|
269 BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
270 {
|
Chris@102
|
271 return !!operations::exchange(m_storage, static_cast< storage_type >(v), order);
|
Chris@102
|
272 }
|
Chris@102
|
273
|
Chris@102
|
274 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
275 {
|
Chris@102
|
276 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
277 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
278 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
279
|
Chris@102
|
280 storage_type old_value = static_cast< storage_type >(expected);
|
Chris@102
|
281 const bool res = operations::compare_exchange_strong(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
282 expected = !!old_value;
|
Chris@102
|
283 return res;
|
Chris@102
|
284 }
|
Chris@102
|
285
|
Chris@102
|
286 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
287 {
|
Chris@102
|
288 return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
289 }
|
Chris@102
|
290
|
Chris@102
|
291 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
292 {
|
Chris@102
|
293 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
294 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
295 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
296
|
Chris@102
|
297 storage_type old_value = static_cast< storage_type >(expected);
|
Chris@102
|
298 const bool res = operations::compare_exchange_weak(m_storage, old_value, static_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
299 expected = !!old_value;
|
Chris@102
|
300 return res;
|
Chris@102
|
301 }
|
Chris@102
|
302
|
Chris@102
|
303 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
304 {
|
Chris@102
|
305 return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
306 }
|
Chris@102
|
307
|
Chris@102
|
308 BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
|
Chris@102
|
309 {
|
Chris@102
|
310 return operations::is_lock_free(m_storage);
|
Chris@102
|
311 }
|
Chris@102
|
312
|
Chris@102
|
313 BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
|
Chris@102
|
314 BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
|
Chris@102
|
315 };
|
Chris@102
|
316
|
Chris@102
|
317
|
Chris@102
|
318 //! Implementation for user-defined types, such as structs and enums
|
Chris@102
|
319 template< typename T >
|
Chris@102
|
320 class base_atomic< T, void >
|
Chris@102
|
321 {
|
Chris@102
|
322 private:
|
Chris@102
|
323 typedef T value_type;
|
Chris@102
|
324 typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;
|
Chris@102
|
325
|
Chris@102
|
326 protected:
|
Chris@102
|
327 typedef value_type const& value_arg_type;
|
Chris@102
|
328
|
Chris@102
|
329 public:
|
Chris@102
|
330 typedef typename operations::storage_type storage_type;
|
Chris@102
|
331
|
Chris@102
|
332 protected:
|
Chris@102
|
333 storage_type m_storage;
|
Chris@102
|
334
|
Chris@102
|
335 public:
|
Chris@102
|
336 BOOST_FORCEINLINE explicit base_atomic(value_type const& v = value_type()) BOOST_NOEXCEPT : m_storage(atomics::detail::memcpy_cast< storage_type >(v))
|
Chris@102
|
337 {
|
Chris@102
|
338 }
|
Chris@102
|
339
|
Chris@102
|
340 BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
341 {
|
Chris@102
|
342 BOOST_ASSERT(order != memory_order_consume);
|
Chris@102
|
343 BOOST_ASSERT(order != memory_order_acquire);
|
Chris@102
|
344 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
345
|
Chris@102
|
346 operations::store(m_storage, atomics::detail::memcpy_cast< storage_type >(v), order);
|
Chris@102
|
347 }
|
Chris@102
|
348
|
Chris@102
|
349 BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
Chris@102
|
350 {
|
Chris@102
|
351 BOOST_ASSERT(order != memory_order_release);
|
Chris@102
|
352 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
353
|
Chris@102
|
354 return atomics::detail::memcpy_cast< value_type >(operations::load(m_storage, order));
|
Chris@102
|
355 }
|
Chris@102
|
356
|
Chris@102
|
357 BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
358 {
|
Chris@102
|
359 return atomics::detail::memcpy_cast< value_type >(operations::exchange(m_storage, atomics::detail::memcpy_cast< storage_type >(v), order));
|
Chris@102
|
360 }
|
Chris@102
|
361
|
Chris@102
|
362 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
363 {
|
Chris@102
|
364 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
365 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
366 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
367
|
Chris@102
|
368 storage_type old_value = atomics::detail::memcpy_cast< storage_type >(expected);
|
Chris@102
|
369 const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::memcpy_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
370 expected = atomics::detail::memcpy_cast< value_type >(old_value);
|
Chris@102
|
371 return res;
|
Chris@102
|
372 }
|
Chris@102
|
373
|
Chris@102
|
374 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
375 {
|
Chris@102
|
376 return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
377 }
|
Chris@102
|
378
|
Chris@102
|
379 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
380 {
|
Chris@102
|
381 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
382 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
383 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
384
|
Chris@102
|
385 storage_type old_value = atomics::detail::memcpy_cast< storage_type >(expected);
|
Chris@102
|
386 const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::memcpy_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
387 expected = atomics::detail::memcpy_cast< value_type >(old_value);
|
Chris@102
|
388 return res;
|
Chris@102
|
389 }
|
Chris@102
|
390
|
Chris@102
|
391 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
392 {
|
Chris@102
|
393 return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
394 }
|
Chris@102
|
395
|
Chris@102
|
396 BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
|
Chris@102
|
397 {
|
Chris@102
|
398 return operations::is_lock_free(m_storage);
|
Chris@102
|
399 }
|
Chris@102
|
400
|
Chris@102
|
401 BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
|
Chris@102
|
402 BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
|
Chris@102
|
403 };
|
Chris@102
|
404
|
Chris@102
|
405
|
Chris@102
|
406 //! Implementation for pointers
|
Chris@102
|
407 template< typename T >
|
Chris@102
|
408 class base_atomic< T*, void* >
|
Chris@102
|
409 {
|
Chris@102
|
410 private:
|
Chris@102
|
411 typedef T* value_type;
|
Chris@102
|
412 typedef std::ptrdiff_t difference_type;
|
Chris@102
|
413 typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;
|
Chris@102
|
414
|
Chris@102
|
415 protected:
|
Chris@102
|
416 typedef value_type value_arg_type;
|
Chris@102
|
417
|
Chris@102
|
418 public:
|
Chris@102
|
419 typedef typename operations::storage_type storage_type;
|
Chris@102
|
420
|
Chris@102
|
421 protected:
|
Chris@102
|
422 storage_type m_storage;
|
Chris@102
|
423
|
Chris@102
|
424 public:
|
Chris@102
|
425 BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
|
Chris@102
|
426 BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::union_cast< storage_type >(v))
|
Chris@102
|
427 {
|
Chris@102
|
428 }
|
Chris@102
|
429
|
Chris@102
|
430 BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
431 {
|
Chris@102
|
432 BOOST_ASSERT(order != memory_order_consume);
|
Chris@102
|
433 BOOST_ASSERT(order != memory_order_acquire);
|
Chris@102
|
434 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
435
|
Chris@102
|
436 operations::store(m_storage, atomics::detail::union_cast< storage_type >(v), order);
|
Chris@102
|
437 }
|
Chris@102
|
438
|
Chris@102
|
439 BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
Chris@102
|
440 {
|
Chris@102
|
441 BOOST_ASSERT(order != memory_order_release);
|
Chris@102
|
442 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
443
|
Chris@102
|
444 return atomics::detail::union_cast< value_type >(operations::load(m_storage, order));
|
Chris@102
|
445 }
|
Chris@102
|
446
|
Chris@102
|
447 BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
448 {
|
Chris@102
|
449 return atomics::detail::union_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v * sizeof(T)), order));
|
Chris@102
|
450 }
|
Chris@102
|
451
|
Chris@102
|
452 BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
453 {
|
Chris@102
|
454 return atomics::detail::union_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v * sizeof(T)), order));
|
Chris@102
|
455 }
|
Chris@102
|
456
|
Chris@102
|
457 BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
458 {
|
Chris@102
|
459 return atomics::detail::union_cast< value_type >(operations::exchange(m_storage, atomics::detail::union_cast< storage_type >(v), order));
|
Chris@102
|
460 }
|
Chris@102
|
461
|
Chris@102
|
462 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
463 {
|
Chris@102
|
464 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
465 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
466 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
467
|
Chris@102
|
468 storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
|
Chris@102
|
469 const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
470 expected = atomics::detail::union_cast< value_type >(old_value);
|
Chris@102
|
471 return res;
|
Chris@102
|
472 }
|
Chris@102
|
473
|
Chris@102
|
474 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
475 {
|
Chris@102
|
476 return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
477 }
|
Chris@102
|
478
|
Chris@102
|
479 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
480 {
|
Chris@102
|
481 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
482 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
483 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
484
|
Chris@102
|
485 storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
|
Chris@102
|
486 const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
487 expected = atomics::detail::union_cast< value_type >(old_value);
|
Chris@102
|
488 return res;
|
Chris@102
|
489 }
|
Chris@102
|
490
|
Chris@102
|
491 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
492 {
|
Chris@102
|
493 return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
494 }
|
Chris@102
|
495
|
Chris@102
|
496 BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
|
Chris@102
|
497 {
|
Chris@102
|
498 return operations::is_lock_free(m_storage);
|
Chris@102
|
499 }
|
Chris@102
|
500
|
Chris@102
|
501 BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
|
Chris@102
|
502 {
|
Chris@102
|
503 return fetch_add(1);
|
Chris@102
|
504 }
|
Chris@102
|
505
|
Chris@102
|
506 BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
|
Chris@102
|
507 {
|
Chris@102
|
508 return fetch_add(1) + 1;
|
Chris@102
|
509 }
|
Chris@102
|
510
|
Chris@102
|
511 BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
|
Chris@102
|
512 {
|
Chris@102
|
513 return fetch_sub(1);
|
Chris@102
|
514 }
|
Chris@102
|
515
|
Chris@102
|
516 BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
|
Chris@102
|
517 {
|
Chris@102
|
518 return fetch_sub(1) - 1;
|
Chris@102
|
519 }
|
Chris@102
|
520
|
Chris@102
|
521 BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
522 {
|
Chris@102
|
523 return fetch_add(v) + v;
|
Chris@102
|
524 }
|
Chris@102
|
525
|
Chris@102
|
526 BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
527 {
|
Chris@102
|
528 return fetch_sub(v) - v;
|
Chris@102
|
529 }
|
Chris@102
|
530
|
Chris@102
|
531 BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
|
Chris@102
|
532 BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
|
Chris@102
|
533 };
|
Chris@102
|
534
|
Chris@102
|
535
|
Chris@102
|
536 //! Implementation for void pointers
|
Chris@102
|
537 template< >
|
Chris@102
|
538 class base_atomic< void*, void* >
|
Chris@102
|
539 {
|
Chris@102
|
540 private:
|
Chris@102
|
541 typedef void* value_type;
|
Chris@102
|
542 typedef std::ptrdiff_t difference_type;
|
Chris@102
|
543 typedef atomics::detail::operations< storage_size_of< value_type >::value, false > operations;
|
Chris@102
|
544
|
Chris@102
|
545 protected:
|
Chris@102
|
546 typedef value_type value_arg_type;
|
Chris@102
|
547
|
Chris@102
|
548 public:
|
Chris@102
|
549 typedef operations::storage_type storage_type;
|
Chris@102
|
550
|
Chris@102
|
551 protected:
|
Chris@102
|
552 storage_type m_storage;
|
Chris@102
|
553
|
Chris@102
|
554 public:
|
Chris@102
|
555 BOOST_DEFAULTED_FUNCTION(base_atomic(), {})
|
Chris@102
|
556 BOOST_FORCEINLINE explicit base_atomic(value_type const& v) BOOST_NOEXCEPT : m_storage(atomics::detail::union_cast< storage_type >(v))
|
Chris@102
|
557 {
|
Chris@102
|
558 }
|
Chris@102
|
559
|
Chris@102
|
560 BOOST_FORCEINLINE void store(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
561 {
|
Chris@102
|
562 BOOST_ASSERT(order != memory_order_consume);
|
Chris@102
|
563 BOOST_ASSERT(order != memory_order_acquire);
|
Chris@102
|
564 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
565
|
Chris@102
|
566 operations::store(m_storage, atomics::detail::union_cast< storage_type >(v), order);
|
Chris@102
|
567 }
|
Chris@102
|
568
|
Chris@102
|
569 BOOST_FORCEINLINE value_type load(memory_order order = memory_order_seq_cst) const volatile BOOST_NOEXCEPT
|
Chris@102
|
570 {
|
Chris@102
|
571 BOOST_ASSERT(order != memory_order_release);
|
Chris@102
|
572 BOOST_ASSERT(order != memory_order_acq_rel);
|
Chris@102
|
573
|
Chris@102
|
574 return atomics::detail::union_cast< value_type >(operations::load(m_storage, order));
|
Chris@102
|
575 }
|
Chris@102
|
576
|
Chris@102
|
577 BOOST_FORCEINLINE value_type fetch_add(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
578 {
|
Chris@102
|
579 return atomics::detail::union_cast< value_type >(operations::fetch_add(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
580 }
|
Chris@102
|
581
|
Chris@102
|
582 BOOST_FORCEINLINE value_type fetch_sub(difference_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
583 {
|
Chris@102
|
584 return atomics::detail::union_cast< value_type >(operations::fetch_sub(m_storage, static_cast< storage_type >(v), order));
|
Chris@102
|
585 }
|
Chris@102
|
586
|
Chris@102
|
587 BOOST_FORCEINLINE value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
588 {
|
Chris@102
|
589 return atomics::detail::union_cast< value_type >(operations::exchange(m_storage, atomics::detail::union_cast< storage_type >(v), order));
|
Chris@102
|
590 }
|
Chris@102
|
591
|
Chris@102
|
592 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
593 {
|
Chris@102
|
594 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
595 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
596 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
597
|
Chris@102
|
598 storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
|
Chris@102
|
599 const bool res = operations::compare_exchange_strong(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
600 expected = atomics::detail::union_cast< value_type >(old_value);
|
Chris@102
|
601 return res;
|
Chris@102
|
602 }
|
Chris@102
|
603
|
Chris@102
|
604 BOOST_FORCEINLINE bool compare_exchange_strong(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
605 {
|
Chris@102
|
606 return compare_exchange_strong(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
607 }
|
Chris@102
|
608
|
Chris@102
|
609 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order success_order, memory_order failure_order) volatile BOOST_NOEXCEPT
|
Chris@102
|
610 {
|
Chris@102
|
611 BOOST_ASSERT(failure_order != memory_order_release);
|
Chris@102
|
612 BOOST_ASSERT(failure_order != memory_order_acq_rel);
|
Chris@102
|
613 BOOST_ASSERT(cas_failure_order_must_not_be_stronger_than_success_order(success_order, failure_order));
|
Chris@102
|
614
|
Chris@102
|
615 storage_type old_value = atomics::detail::union_cast< storage_type >(expected);
|
Chris@102
|
616 const bool res = operations::compare_exchange_weak(m_storage, old_value, atomics::detail::union_cast< storage_type >(desired), success_order, failure_order);
|
Chris@102
|
617 expected = atomics::detail::union_cast< value_type >(old_value);
|
Chris@102
|
618 return res;
|
Chris@102
|
619 }
|
Chris@102
|
620
|
Chris@102
|
621 BOOST_FORCEINLINE bool compare_exchange_weak(value_type& expected, value_type desired, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
|
Chris@102
|
622 {
|
Chris@102
|
623 return compare_exchange_weak(expected, desired, order, atomics::detail::deduce_failure_order(order));
|
Chris@102
|
624 }
|
Chris@102
|
625
|
Chris@102
|
626 BOOST_FORCEINLINE bool is_lock_free() const volatile BOOST_NOEXCEPT
|
Chris@102
|
627 {
|
Chris@102
|
628 return operations::is_lock_free(m_storage);
|
Chris@102
|
629 }
|
Chris@102
|
630
|
Chris@102
|
631 BOOST_FORCEINLINE value_type operator++(int) volatile BOOST_NOEXCEPT
|
Chris@102
|
632 {
|
Chris@102
|
633 return fetch_add(1);
|
Chris@102
|
634 }
|
Chris@102
|
635
|
Chris@102
|
636 BOOST_FORCEINLINE value_type operator++() volatile BOOST_NOEXCEPT
|
Chris@102
|
637 {
|
Chris@102
|
638 return (char*)fetch_add(1) + 1;
|
Chris@102
|
639 }
|
Chris@102
|
640
|
Chris@102
|
641 BOOST_FORCEINLINE value_type operator--(int) volatile BOOST_NOEXCEPT
|
Chris@102
|
642 {
|
Chris@102
|
643 return fetch_sub(1);
|
Chris@102
|
644 }
|
Chris@102
|
645
|
Chris@102
|
646 BOOST_FORCEINLINE value_type operator--() volatile BOOST_NOEXCEPT
|
Chris@102
|
647 {
|
Chris@102
|
648 return (char*)fetch_sub(1) - 1;
|
Chris@102
|
649 }
|
Chris@102
|
650
|
Chris@102
|
651 BOOST_FORCEINLINE value_type operator+=(difference_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
652 {
|
Chris@102
|
653 return (char*)fetch_add(v) + v;
|
Chris@102
|
654 }
|
Chris@102
|
655
|
Chris@102
|
656 BOOST_FORCEINLINE value_type operator-=(difference_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
657 {
|
Chris@102
|
658 return (char*)fetch_sub(v) - v;
|
Chris@102
|
659 }
|
Chris@102
|
660
|
Chris@102
|
661 BOOST_DELETED_FUNCTION(base_atomic(base_atomic const&))
|
Chris@102
|
662 BOOST_DELETED_FUNCTION(base_atomic& operator=(base_atomic const&))
|
Chris@102
|
663 };
|
Chris@102
|
664
|
Chris@102
|
665 } // namespace detail
|
Chris@102
|
666
|
Chris@102
|
667 template< typename T >
|
Chris@102
|
668 class atomic :
|
Chris@102
|
669 public atomics::detail::base_atomic< T, typename atomics::detail::classify< T >::type >
|
Chris@102
|
670 {
|
Chris@102
|
671 private:
|
Chris@102
|
672 typedef T value_type;
|
Chris@102
|
673 typedef atomics::detail::base_atomic< T, typename atomics::detail::classify< T >::type > base_type;
|
Chris@102
|
674 typedef typename base_type::value_arg_type value_arg_type;
|
Chris@102
|
675
|
Chris@102
|
676 public:
|
Chris@102
|
677 typedef typename base_type::storage_type storage_type;
|
Chris@102
|
678
|
Chris@102
|
679 public:
|
Chris@102
|
680 BOOST_DEFAULTED_FUNCTION(atomic(), BOOST_NOEXCEPT {})
|
Chris@102
|
681
|
Chris@102
|
682 // NOTE: The constructor is made explicit because gcc 4.7 complains that
|
Chris@102
|
683 // operator=(value_arg_type) is considered ambiguous with operator=(atomic const&)
|
Chris@102
|
684 // in assignment expressions, even though conversion to atomic<> is less preferred
|
Chris@102
|
685 // than conversion to value_arg_type.
|
Chris@102
|
686 BOOST_FORCEINLINE explicit BOOST_CONSTEXPR atomic(value_arg_type v) BOOST_NOEXCEPT : base_type(v) {}
|
Chris@102
|
687
|
Chris@102
|
688 BOOST_FORCEINLINE value_type operator= (value_arg_type v) volatile BOOST_NOEXCEPT
|
Chris@102
|
689 {
|
Chris@102
|
690 this->store(v);
|
Chris@102
|
691 return v;
|
Chris@102
|
692 }
|
Chris@102
|
693
|
Chris@102
|
694 BOOST_FORCEINLINE operator value_type() volatile const BOOST_NOEXCEPT
|
Chris@102
|
695 {
|
Chris@102
|
696 return this->load();
|
Chris@102
|
697 }
|
Chris@102
|
698
|
Chris@102
|
699 BOOST_FORCEINLINE storage_type& storage() BOOST_NOEXCEPT { return this->m_storage; }
|
Chris@102
|
700 BOOST_FORCEINLINE storage_type volatile& storage() volatile BOOST_NOEXCEPT { return this->m_storage; }
|
Chris@102
|
701 BOOST_FORCEINLINE storage_type const& storage() const BOOST_NOEXCEPT { return this->m_storage; }
|
Chris@102
|
702 BOOST_FORCEINLINE storage_type const volatile& storage() const volatile BOOST_NOEXCEPT { return this->m_storage; }
|
Chris@102
|
703
|
Chris@102
|
704 BOOST_DELETED_FUNCTION(atomic(atomic const&))
|
Chris@102
|
705 BOOST_DELETED_FUNCTION(atomic& operator= (atomic const&))
|
Chris@102
|
706 BOOST_DELETED_FUNCTION(atomic& operator= (atomic const&) volatile)
|
Chris@102
|
707 };
|
Chris@102
|
708
|
Chris@102
|
709 typedef atomic< char > atomic_char;
|
Chris@102
|
710 typedef atomic< unsigned char > atomic_uchar;
|
Chris@102
|
711 typedef atomic< signed char > atomic_schar;
|
Chris@102
|
712 typedef atomic< uint8_t > atomic_uint8_t;
|
Chris@102
|
713 typedef atomic< int8_t > atomic_int8_t;
|
Chris@102
|
714 typedef atomic< unsigned short > atomic_ushort;
|
Chris@102
|
715 typedef atomic< short > atomic_short;
|
Chris@102
|
716 typedef atomic< uint16_t > atomic_uint16_t;
|
Chris@102
|
717 typedef atomic< int16_t > atomic_int16_t;
|
Chris@102
|
718 typedef atomic< unsigned int > atomic_uint;
|
Chris@102
|
719 typedef atomic< int > atomic_int;
|
Chris@102
|
720 typedef atomic< uint32_t > atomic_uint32_t;
|
Chris@102
|
721 typedef atomic< int32_t > atomic_int32_t;
|
Chris@102
|
722 typedef atomic< unsigned long > atomic_ulong;
|
Chris@102
|
723 typedef atomic< long > atomic_long;
|
Chris@102
|
724 typedef atomic< uint64_t > atomic_uint64_t;
|
Chris@102
|
725 typedef atomic< int64_t > atomic_int64_t;
|
Chris@102
|
726 #ifdef BOOST_HAS_LONG_LONG
|
Chris@102
|
727 typedef atomic< boost::ulong_long_type > atomic_ullong;
|
Chris@102
|
728 typedef atomic< boost::long_long_type > atomic_llong;
|
Chris@102
|
729 #endif
|
Chris@102
|
730 typedef atomic< void* > atomic_address;
|
Chris@102
|
731 typedef atomic< bool > atomic_bool;
|
Chris@102
|
732 typedef atomic< wchar_t > atomic_wchar_t;
|
Chris@102
|
733 #if !defined(BOOST_NO_CXX11_CHAR16_T)
|
Chris@102
|
734 typedef atomic< char16_t > atomic_char16_t;
|
Chris@102
|
735 #endif
|
Chris@102
|
736 #if !defined(BOOST_NO_CXX11_CHAR32_T)
|
Chris@102
|
737 typedef atomic< char32_t > atomic_char32_t;
|
Chris@102
|
738 #endif
|
Chris@102
|
739
|
Chris@102
|
740 typedef atomic< int_least8_t > atomic_int_least8_t;
|
Chris@102
|
741 typedef atomic< uint_least8_t > atomic_uint_least8_t;
|
Chris@102
|
742 typedef atomic< int_least16_t > atomic_int_least16_t;
|
Chris@102
|
743 typedef atomic< uint_least16_t > atomic_uint_least16_t;
|
Chris@102
|
744 typedef atomic< int_least32_t > atomic_int_least32_t;
|
Chris@102
|
745 typedef atomic< uint_least32_t > atomic_uint_least32_t;
|
Chris@102
|
746 typedef atomic< int_least64_t > atomic_int_least64_t;
|
Chris@102
|
747 typedef atomic< uint_least64_t > atomic_uint_least64_t;
|
Chris@102
|
748 typedef atomic< int_fast8_t > atomic_int_fast8_t;
|
Chris@102
|
749 typedef atomic< uint_fast8_t > atomic_uint_fast8_t;
|
Chris@102
|
750 typedef atomic< int_fast16_t > atomic_int_fast16_t;
|
Chris@102
|
751 typedef atomic< uint_fast16_t > atomic_uint_fast16_t;
|
Chris@102
|
752 typedef atomic< int_fast32_t > atomic_int_fast32_t;
|
Chris@102
|
753 typedef atomic< uint_fast32_t > atomic_uint_fast32_t;
|
Chris@102
|
754 typedef atomic< int_fast64_t > atomic_int_fast64_t;
|
Chris@102
|
755 typedef atomic< uint_fast64_t > atomic_uint_fast64_t;
|
Chris@102
|
756 typedef atomic< intmax_t > atomic_intmax_t;
|
Chris@102
|
757 typedef atomic< uintmax_t > atomic_uintmax_t;
|
Chris@102
|
758
|
Chris@102
|
759 typedef atomic< std::size_t > atomic_size_t;
|
Chris@102
|
760 typedef atomic< std::ptrdiff_t > atomic_ptrdiff_t;
|
Chris@102
|
761
|
Chris@102
|
762 #if defined(BOOST_HAS_INTPTR_T)
|
Chris@102
|
763 typedef atomic< intptr_t > atomic_intptr_t;
|
Chris@102
|
764 typedef atomic< uintptr_t > atomic_uintptr_t;
|
Chris@102
|
765 #endif
|
Chris@102
|
766
|
Chris@102
|
767 } // namespace atomics
|
Chris@102
|
768 } // namespace boost
|
Chris@102
|
769
|
Chris@102
|
770 #if defined(BOOST_MSVC)
|
Chris@102
|
771 #pragma warning(pop)
|
Chris@102
|
772 #endif
|
Chris@102
|
773
|
Chris@102
|
774 #endif // BOOST_ATOMIC_DETAIL_ATOMIC_TEMPLATE_HPP_INCLUDED_
|