27 #ifndef EMBB_BASE_ATOMIC_H_ 28 #define EMBB_BASE_ATOMIC_H_ 35 #include <embb/base/internal/atomic/atomic_base.h> 36 #include <embb/base/internal/atomic/atomic_pointer.h> 37 #include <embb/base/internal/atomic/atomic_integer.h> 59 template<
typename BaseType>
87 explicit Atomic(BaseType val);
113 operator BaseType()
const;
170 void Store(BaseType val);
183 BaseType
Load()
const;
198 BaseType
Swap(BaseType val);
440 template<
typename BaseType>
441 class Atomic :
public embb::base::internal::atomic::AtomicBase < BaseType > {
446 Atomic() : embb::base::internal::atomic::AtomicBase<BaseType>() {}
453 explicit Atomic(BaseType val) : embb::base::internal::atomic::
454 AtomicBase<BaseType>(val) {}
464 return embb::base::internal::atomic::AtomicBase<BaseType>::
475 template<
typename BaseType>
476 class Atomic<BaseType*> :
public embb::base::internal::atomic::
477 AtomicPointer < BaseType, ptrdiff_t, sizeof(BaseType*) > {
479 Atomic() : embb::base::internal::atomic::
480 AtomicPointer<BaseType, ptrdiff_t, sizeof(BaseType*)>() {}
481 explicit Atomic(BaseType* p) : embb::base::internal::atomic::
482 AtomicPointer<BaseType, ptrdiff_t, sizeof(BaseType*)>(p) {}
485 return embb::base::internal::atomic::
486 AtomicPointer<BaseType, ptrdiff_t, sizeof(BaseType*)>::operator=(p);
497 class Atomic<void*> :
public embb::base::internal::atomic::AtomicBase < void* > {
499 Atomic() : embb::base::internal::atomic::AtomicBase<void*>() {}
500 explicit Atomic(
void* p) : embb::base::internal::atomic::AtomicBase<void*>(p)
504 return embb::base::internal::atomic::AtomicBase<void*>::operator=(p);
512 #define __EMBB_ATOMIC_INTEGER_SPECIALIZATION(T) \ 514 class Atomic<T>: public embb::base::internal::atomic::AtomicInteger<T> { \ 517 Atomic() : embb::base::internal::atomic::AtomicInteger<T>() {} \ 518 explicit Atomic(T val) : embb::base::internal::atomic::AtomicInteger<T>(val) \ 521 T operator=(T val) { return embb::base::internal::atomic::AtomicInteger<T>::\ 527 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
signed char);
528 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
unsigned char);
529 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
signed short);
530 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
unsigned short);
531 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
signed int);
532 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
unsigned int);
534 #if defined EMBB_PLATFORM_ARCH_CXX11 535 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
signed long);
536 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
unsigned long);
537 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
signed long long);
538 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
unsigned long long);
539 #elif defined EMBB_PLATFORM_ARCH_X86_64 540 __EMBB_ATOMIC_INTEGER_SPECIALIZATION(
size_t);
547 #endif // EMBB_BASE_ATOMIC_H_ Definition: lock_free_mpmc_queue.h:40
Class representing atomic variables.
Definition: atomic.h:60
void operator&=(BaseType val)
Assignment by bitwise AND.
BaseType Swap(BaseType val)
Swap operation.
void operator^=(BaseType val)
Assignment by bitwise XOR.
BaseType Load() const
Load operation.
Atomic()
Default constructor.
void Store(BaseType val)
Store operation.
bool IsInteger() const
Predicate representing integers.
BaseType operator--()
Pre-decrement operation.
BaseType & operator*()
Dereference operation.
BaseType operator+=(BaseType val)
Assignment by sum operation.
BaseType operator-=(BaseType val)
Assignment by difference operation.
void operator|=(BaseType val)
Assignment by bitwise OR.
BaseType operator=(BaseType val)
Assignment operator.
BaseType operator++()
Pre-increment operation.
bool IsArithmetic() const
Predicate representing support for arithmetic operations.
bool CompareAndSwap(BaseType &expected, BaseType desired)
Compare-and-Swap operation (CAS).
BaseType * operator->()
Structure dereference operation.
BaseType FetchAndAdd(BaseType val)
Fetch-and-Add operation.
bool IsPointer() const
Predicate representing pointers.
BaseType FetchAndSub(BaseType val)
Fetch-and-Sub operation.