CMCore/inc/hgl/thread/atomic/AtomicGNU.h
2019-08-19 19:19:58 +08:00

49 lines
2.6 KiB
C++

#ifndef HGL_THREAD_ATOMIC_GNU_INCLUDE
#define HGL_THREAD_ATOMIC_GNU_INCLUDE
namespace hgl
{
template<typename T> class atom
{
volatile T value;
public:
atom(){value=0;}
atom(const volatile T new_value){operator=(new_value);}
inline T operator ->(){return value;}
inline T operator *= (const volatile T v) {return operator=(value *=v);}
inline T operator /= (const volatile T v) {return operator=(value /=v);}
inline T operator %= (const volatile T v) {return operator=(value %=v);}
inline T operator >>= (const volatile T v) {return operator=(value>>=v);}
inline T operator <<= (const volatile T v) {return operator=(value<<=v);}
inline T operator ! ()const {return !value;}
inline T operator ~ ()const {return ~value;}
inline operator T () {return value;}
inline operator const T ()const {return value;}
inline bool operator ! () {return !value;}
inline bool operator == (const volatile T v)const {return value==v;}
inline bool operator != (const volatile T v)const {return value!=v;}
inline T operator = (const volatile T new_value) {__sync_lock_test_and_set(&value,new_value); return value;}
inline T operator += (const volatile T add_value) {return __sync_add_and_fetch(&value,add_value);}
inline T operator -= (const volatile T sub_value) {return __sync_sub_and_fetch(&value,sub_value);}
inline T operator &= (const volatile T v) {return __sync_and_and_fetch(&value,v);}
inline T operator |= (const volatile T v) {return __sync_or_and_fetch (&value,v);}
inline T operator ^= (const volatile T v) {return __sync_xor_and_fetch(&value,v);}
inline T operator ++ () {return __sync_add_and_fetch(&value,1);} //前置++
inline T operator ++ (int) {return __sync_fetch_and_add(&value,1);} //后置++
inline T operator -- () {return __sync_sub_and_fetch(&value,1);}
inline T operator -- (int) {return __sync_fetch_and_sub(&value,1);}
};//template<typename T> class atom
}//namespace hgl
#endif//HGL_THREAD_ATOMIC_GNU_INCLUDE