23 lines
1 KiB
C++
23 lines
1 KiB
C++
#ifndef _ATOMIC_H_DEF_
|
|
#define _ATOMIC_H_DEF_
|
|
#define WR_MEMORDER __ATOMIC_SEQ_CST
|
|
#define RD_MEMORDER __ATOMIC_SEQ_CST
|
|
/* Velmi zjednodušené, ale v zásadě funkční.
|
|
* Asi to bude nutné trochu rozšířit, ale zatím to nebudu komplikovat.
|
|
* Použity jsou interní funkce gcc (clang), takže to není závislé na
|
|
* architektuře.
|
|
* */
|
|
template<class T> class atomic {
|
|
volatile T data;
|
|
public:
|
|
explicit atomic () noexcept : data( ) {}
|
|
explicit atomic (const T & v) noexcept : data(v) {}
|
|
atomic & operator= (volatile T & v) { __atomic_store_n (& data, v, WR_MEMORDER); return * this; }
|
|
atomic & operator= (const T & v) { __atomic_store_n (& data, v, WR_MEMORDER); return * this; }
|
|
operator T () const { return __atomic_load_n (& data, RD_MEMORDER); }
|
|
|
|
atomic & operator+= (const T & v) { __atomic_add_fetch (& data, v, WR_MEMORDER); return * this; }
|
|
atomic & operator-= (const T & v) { __atomic_sub_fetch (& data, v, WR_MEMORDER); return * this; }
|
|
};
|
|
|
|
#endif // _ATOMIC_H_DEF_
|