29 #ifndef ETL_ATOMIC_STD_INCLUDED
30 #define ETL_ATOMIC_STD_INCLUDED
32 #include "../platform.h"
33 #include "../nullptr.h"
34 #include "../char_traits.h"
46 typedef std::memory_order memory_order;
48 static const etl::memory_order memory_order_relaxed = std::memory_order_relaxed;
49 static const etl::memory_order memory_order_consume = std::memory_order_consume;
50 static const etl::memory_order memory_order_acquire = std::memory_order_acquire;
51 static const etl::memory_order memory_order_release = std::memory_order_release;
52 static const etl::memory_order memory_order_acq_rel = std::memory_order_acq_rel;
53 static const etl::memory_order memory_order_seq_cst = std::memory_order_seq_cst;
76 T operator =(T v)
volatile
87 T operator ++()
volatile
98 T operator ++(
int)
volatile
109 T operator --()
volatile
120 T operator --(
int)
volatile
131 T operator +=(T v)
volatile
142 T operator -=(T v)
volatile
153 T operator &=(T v)
volatile
164 T operator |=(T v)
volatile
175 T operator ^=(T v)
volatile
186 operator T()
volatile const
192 bool is_lock_free()
const
194 return value.is_lock_free();
197 bool is_lock_free()
const volatile
199 return value.is_lock_free();
203 void store(T v, etl::memory_order order = etl::memory_order_seq_cst)
205 value.store(v, order);
208 void store(T v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
210 value.store(v, order);
214 T load(etl::memory_order order = etl::memory_order_seq_cst)
const
216 return value.load(order);
219 T load(etl::memory_order order = etl::memory_order_seq_cst)
const volatile
221 return value.load(order);
225 T fetch_add(T v, etl::memory_order order = etl::memory_order_seq_cst)
227 return value.fetch_add(v, order);
230 T fetch_add(T v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
232 return value.fetch_add(v, order);
236 T fetch_sub(T v, etl::memory_order order = etl::memory_order_seq_cst)
238 return value.fetch_sub(v, order);
241 T fetch_sub(T v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
243 return value.fetch_sub(v, order);
247 T fetch_or(T v, etl::memory_order order = etl::memory_order_seq_cst)
249 return value.fetch_or(v, order);
252 T fetch_or(T v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
254 return value.fetch_or(v, order);
258 T fetch_and(T v, etl::memory_order order = etl::memory_order_seq_cst)
260 return value.fetch_and(v, order);
263 T fetch_and(T v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
265 return value.fetch_and(v, order);
269 T fetch_xor(T v, etl::memory_order order = etl::memory_order_seq_cst)
271 return value.fetch_xor(v, order);
274 T fetch_xor(T v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
276 return value.fetch_xor(v, order);
280 T exchange(T v, etl::memory_order order = etl::memory_order_seq_cst)
282 return value.exchange(v, order);
285 T exchange(T v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
287 return value.exchange(v, order);
291 bool compare_exchange_weak(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst)
293 return value.compare_exchange_weak(expected, desired, order);
296 bool compare_exchange_weak(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst)
volatile
298 return value.compare_exchange_weak(expected, desired, order);
301 bool compare_exchange_weak(T& expected, T desired, etl::memory_order success, etl::memory_order failure)
303 return value.compare_exchange_weak(expected, desired, success, failure);
306 bool compare_exchange_weak(T& expected, T desired, etl::memory_order success, etl::memory_order failure)
volatile
308 return value.compare_exchange_weak(expected, desired, success, failure);
312 bool compare_exchange_strong(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst)
314 return value.compare_exchange_strong(expected, desired, order);
317 bool compare_exchange_strong(T& expected, T desired, etl::memory_order order = etl::memory_order_seq_cst)
volatile
319 return value.compare_exchange_strong(expected, desired, order);
322 bool compare_exchange_strong(T& expected, T desired, etl::memory_order success, etl::memory_order failure)
324 return value.compare_exchange_strong(expected, desired, success, failure);
327 bool compare_exchange_strong(T& expected, T desired, etl::memory_order success, etl::memory_order failure)
volatile
329 return value.compare_exchange_strong(expected, desired, success, failure);
334 atomic& operator =(
const atomic&);
337 std::atomic<T> value;
340 template <
typename T>
361 T* operator =(T* v)
volatile
372 T* operator ++()
volatile
383 T* operator ++(
int)
volatile
394 T* operator --()
volatile
405 T* operator --(
int)
volatile
411 T* operator +=(ptrdiff_t v)
416 T* operator +=(ptrdiff_t v)
volatile
422 T* operator -=(ptrdiff_t v)
427 T* operator -=(ptrdiff_t v)
volatile
438 operator T*()
volatile const
444 bool is_lock_free()
const
446 return value.is_lock_free();
449 bool is_lock_free()
const volatile
451 return value.is_lock_free();
455 void store(T* v, etl::memory_order order = etl::memory_order_seq_cst)
457 value.store(v, order);
460 void store(T* v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
462 value.store(v, order);
466 T* load(etl::memory_order order = etl::memory_order_seq_cst)
468 return value.load(order);
471 T* load(etl::memory_order order = etl::memory_order_seq_cst)
volatile
473 return value.load(order);
477 T* fetch_add(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst)
479 return value.fetch_add(v, order);
482 T* fetch_add(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
484 return value.fetch_add(v, order);
488 T* fetch_sub(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst)
490 return value.fetch_sub(v, order);
493 T* fetch_sub(ptrdiff_t v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
495 return value.fetch_sub(v, order);
499 T*
exchange(T* v, etl::memory_order order = etl::memory_order_seq_cst)
501 return value.exchange(v, order);
504 T*
exchange(T* v, etl::memory_order order = etl::memory_order_seq_cst)
volatile
506 return value.exchange(v, order);
510 bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst)
512 return value.compare_exchange_weak(expected, desired, order);
515 bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst)
volatile
517 return value.compare_exchange_weak(expected, desired, order);
520 bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure)
522 return value.compare_exchange_weak(expected, desired, success, failure);
525 bool compare_exchange_weak(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure)
volatile
527 return value.compare_exchange_weak(expected, desired, success, failure);
531 bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst)
533 return value.compare_exchange_strong(expected, desired, order);
536 bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order order = etl::memory_order_seq_cst)
volatile
538 return value.compare_exchange_strong(expected, desired, order);
541 bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure)
543 return value.compare_exchange_strong(expected, desired, success, failure);
546 bool compare_exchange_strong(T*& expected, T* desired, etl::memory_order success, etl::memory_order failure)
volatile
548 return value.compare_exchange_strong(expected, desired, success, failure);
553 atomic & operator =(
const atomic&) ETL_DELETE;
554 atomic& operator =(
const atomic&)
volatile ETL_DELETE;
556 std::atomic<T*> value;
559 typedef std::atomic<bool> atomic_bool;
560 typedef std::atomic<char> atomic_char;
561 typedef std::atomic<signed char> atomic_schar;
562 typedef std::atomic<unsigned char> atomic_uchar;
563 typedef std::atomic<short> atomic_short;
564 typedef std::atomic<unsigned short> atomic_ushort;
565 typedef std::atomic<int> atomic_int;
566 typedef std::atomic<unsigned int> atomic_uint;
567 typedef std::atomic<long> atomic_long;
568 typedef std::atomic<unsigned long> atomic_ulong;
569 typedef std::atomic<long long> atomic_llong;
570 typedef std::atomic<unsigned long long> atomic_ullong;
571 typedef std::atomic<wchar_t> atomic_wchar_t;
572 typedef std::atomic<char16_t> atomic_char16_t;
573 typedef std::atomic<char32_t> atomic_char32_t;
574 #if ETL_USING_8BIT_TYPES
575 typedef std::atomic<uint8_t> atomic_uint8_t;
576 typedef std::atomic<int8_t> atomic_int8_t;
578 typedef std::atomic<uint16_t> atomic_uint16_t;
579 typedef std::atomic<int16_t> atomic_int16_t;
580 typedef std::atomic<uint32_t> atomic_uint32_t;
581 typedef std::atomic<int32_t> atomic_int32_t;
582 #if ETL_USING_64BIT_TYPES
583 typedef std::atomic<uint64_t> atomic_uint64_t;
584 typedef std::atomic<int64_t> atomic_int64_t;
586 typedef std::atomic<int_least8_t> atomic_int_least8_t;
587 typedef std::atomic<uint_least8_t> atomic_uint_least8_t;
588 typedef std::atomic<int_least16_t> atomic_int_least16_t;
589 typedef std::atomic<uint_least16_t> atomic_uint_least16_t;
590 typedef std::atomic<int_least32_t> atomic_int_least32_t;
591 typedef std::atomic<uint_least32_t> atomic_uint_least32_t;
592 #if ETL_USING_64BIT_TYPES
593 typedef std::atomic<int_least64_t> atomic_int_least64_t;
594 typedef std::atomic<uint_least64_t> atomic_uint_least64_t;
596 typedef std::atomic<int_fast8_t> atomic_int_fast8_t;
597 typedef std::atomic<uint_fast8_t> atomic_uint_fast8_t;
598 typedef std::atomic<int_fast16_t> atomic_int_fast16_t;
599 typedef std::atomic<uint_fast16_t> atomic_uint_fast16_t;
600 typedef std::atomic<int_fast32_t> atomic_int_fast32_t;
601 typedef std::atomic<uint_fast32_t> atomic_uint_fast32_t;
602 #if ETL_USING_64BIT_TYPES
603 typedef std::atomic<int_fast64_t> atomic_int_fast64_t;
604 typedef std::atomic<uint_fast64_t> atomic_uint_fast64_t;
606 typedef std::atomic<intptr_t> atomic_intptr_t;
607 typedef std::atomic<uintptr_t> atomic_uintptr_t;
608 typedef std::atomic<size_t> atomic_size_t;
609 typedef std::atomic<ptrdiff_t> atomic_ptrdiff_t;
610 typedef std::atomic<intmax_t> atomic_intmax_t;
611 typedef std::atomic<uintmax_t> atomic_uintmax_t;
Definition: absolute.h:37
T exchange(T &object, const T &new_value)
exchange (const)
Definition: utility.h:301