8 # if !defined(YI_MSVC_ATOMIC) 9 # define YI_MSVC_ATOMIC 11 #elif defined (YI_IOS) || defined (YI_TVOS) || defined (YI_OSX) 12 # if !defined(YI_OSX_ATOMIC) 13 # define YI_OSX_ATOMIC 15 #elif defined (__clang__) || (defined (__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 2) && (defined(__x86_64__) || defined(__i386__))) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || __GNUC__ > 4)) // GCC Atomics are only available since gcc 4.2.x for the x86 architecture only, and available on any other cpu architecture since gcc 4.3.x 16 # if !defined(YI_GCC_ATOMIC) 17 # define YI_GCC_ATOMIC 20 # if !defined(YI_GENERIC_ATOMIC) 21 # define YI_GENERIC_ATOMIC 94 template<
typename YI_ATOMIC_TYPE>
99 CYIAtomic(YI_ATOMIC_TYPE nValue = (YI_ATOMIC_TYPE)0);
104 operator YI_ATOMIC_TYPE()
const;
106 YI_ATOMIC_TYPE
operator+=(YI_ATOMIC_TYPE nValueToAdd);
107 YI_ATOMIC_TYPE
operator-=(YI_ATOMIC_TYPE nValueToSub);
108 YI_ATOMIC_TYPE
operator*=(YI_ATOMIC_TYPE nValueToMult);
109 YI_ATOMIC_TYPE
operator/=(YI_ATOMIC_TYPE nValueToDiv);
110 YI_ATOMIC_TYPE
operator&=(YI_ATOMIC_TYPE nValueToAnd);
111 YI_ATOMIC_TYPE
operator|=(YI_ATOMIC_TYPE nValueToOr);
112 YI_ATOMIC_TYPE
operator^=(YI_ATOMIC_TYPE nValueToXor);
147 YI_ATOMIC_TYPE
FetchAndAdd(YI_ATOMIC_TYPE nValueToAdd);
203 YI_ATOMIC_TYPE
FetchAndOr(YI_ATOMIC_TYPE nValue);
303 YI_ATOMIC_TYPE
OrAndFetch(YI_ATOMIC_TYPE nValue);
360 YI_ATOMIC_TYPE
CompareAndSwap(YI_ATOMIC_TYPE nCurrentValue, YI_ATOMIC_TYPE nNewValue);
367 YI_ATOMIC_TYPE
Load()
const;
374 void Store(YI_ATOMIC_TYPE nNewValue);
385 template<
typename YI_ATOMIC_TYPE>
389 CYIAtomic(YI_ATOMIC_TYPE nValue = (YI_ATOMIC_TYPE)0);
394 operator YI_ATOMIC_TYPE()
const;
397 YI_ATOMIC_TYPE
operator+=(YI_ATOMIC_TYPE nValueToAdd);
398 YI_ATOMIC_TYPE
operator-=(YI_ATOMIC_TYPE nValueToSub);
399 YI_ATOMIC_TYPE
operator*=(YI_ATOMIC_TYPE nValueToMult);
400 YI_ATOMIC_TYPE
operator/=(YI_ATOMIC_TYPE nValueToDiv);
401 YI_ATOMIC_TYPE
operator&=(YI_ATOMIC_TYPE nValueToAnd);
402 YI_ATOMIC_TYPE
operator|=(YI_ATOMIC_TYPE nValueToOr);
403 YI_ATOMIC_TYPE
operator^=(YI_ATOMIC_TYPE nValueToXor);
408 YI_ATOMIC_TYPE
FetchAndAdd(YI_ATOMIC_TYPE nValueToAdd);
409 YI_ATOMIC_TYPE
FetchAndSub(YI_ATOMIC_TYPE nValueToSub);
410 YI_ATOMIC_TYPE
FetchAndAnd(YI_ATOMIC_TYPE nValueToAnd);
411 YI_ATOMIC_TYPE
FetchAndOr(YI_ATOMIC_TYPE nValueToOr);
412 YI_ATOMIC_TYPE
FetchAndXor(YI_ATOMIC_TYPE nValueToXor);
413 YI_ATOMIC_TYPE
AddAndFetch(YI_ATOMIC_TYPE nValueToAdd);
414 YI_ATOMIC_TYPE
SubAndFetch(YI_ATOMIC_TYPE nValueToSub);
415 YI_ATOMIC_TYPE
AndAndFetch(YI_ATOMIC_TYPE nValueToAnd);
416 YI_ATOMIC_TYPE
OrAndFetch(YI_ATOMIC_TYPE nValueToOr);
417 YI_ATOMIC_TYPE
XorAndFetch(YI_ATOMIC_TYPE nValueToXor);
418 YI_ATOMIC_TYPE
CompareAndSwap(YI_ATOMIC_TYPE nCurrentValue, YI_ATOMIC_TYPE nNewValue);
419 YI_ATOMIC_TYPE
Load()
const;
420 void Store(YI_ATOMIC_TYPE nValue);
423 #if defined(YI_GENERIC_ATOMIC) 424 YI_ATOMIC_TYPE m_nValue;
427 volatile YI_ATOMIC_TYPE m_nValue;
432 template<
typename YI_ATOMIC_TYPE>
441 operator YI_ATOMIC_TYPE *();
442 operator const YI_ATOMIC_TYPE *()
const;
443 YI_ATOMIC_TYPE &operator*();
444 const YI_ATOMIC_TYPE &operator*()
const;
445 YI_ATOMIC_TYPE *operator->();
446 const YI_ATOMIC_TYPE *operator->()
const;
459 YI_ATOMIC_TYPE *
CompareAndSwap(YI_ATOMIC_TYPE *pCurrentValue, YI_ATOMIC_TYPE *pNewValue);
460 YI_ATOMIC_TYPE *
Load()
const;
461 void Store(YI_ATOMIC_TYPE *pPtr);
464 #if defined(YI_GENERIC_ATOMIC) 465 YI_ATOMIC_TYPE *m_pPtr;
468 YI_ATOMIC_TYPE *
volatile m_pPtr;
482 operator bool()
const;
487 void Store(
bool bValue);
491 #if defined(YI_GENERIC_ATOMIC) 495 volatile uint32_t m_uValue;
518 #include "deprecated/YiAtomic.inl" Definition: YiAbstractSignalTransition.h:7
YI_ATOMIC_TYPE operator--()
YI_ATOMIC_TYPE FetchAndSub(YI_ATOMIC_TYPE nValue)
YI_ATOMIC_TYPE AndAndFetch(YI_ATOMIC_TYPE nValue)
static bool IsLockFree() const
YI_ATOMIC_TYPE SubAndFetch(YI_ATOMIC_TYPE nValue)
Definition: YiMutex.h:110
YI_ATOMIC_TYPE FetchAndAnd(YI_ATOMIC_TYPE nValue)
CYIAtomic< uint32_t > YI_ATOMIC_UINT32
Definition: YiAtomic.h:505
CYIAtomic< uint64_t > YI_ATOMIC_UINT64
Definition: YiAtomic.h:506
YI_ATOMIC_TYPE Load() const
CYIAtomic< int16_t > YI_ATOMIC_INT16
Definition: YiAtomic.h:509
YI_ATOMIC_TYPE FetchAndOr(YI_ATOMIC_TYPE nValue)
YI_ATOMIC_TYPE AddAndFetch(YI_ATOMIC_TYPE nValue)
CYIAtomic< uint8_t > YI_ATOMIC_UINT8
Definition: YiAtomic.h:503
CYIAtomic< uint16_t > YI_ATOMIC_UINT16
Definition: YiAtomic.h:504
CYIAtomic< int32_t > YI_ATOMIC_INT32
Definition: YiAtomic.h:510
YI_ATOMIC_TYPE operator++()
YI_ATOMIC_TYPE XorAndFetch(YI_ATOMIC_TYPE nValue)
YI_ATOMIC_TYPE operator*=(YI_ATOMIC_TYPE nValueToMult)
YI_ATOMIC_TYPE FetchAndAdd(YI_ATOMIC_TYPE nValueToAdd)
CYIAtomic< YI_ATOMIC_TYPE > & operator=(YI_ATOMIC_TYPE nValue)
YI_ATOMIC_TYPE OrAndFetch(YI_ATOMIC_TYPE nValue)
YI_ATOMIC_TYPE operator-=(YI_ATOMIC_TYPE nValueToSub)
bool operator==(YI_ATOMIC_TYPE nValue) const
void Store(YI_ATOMIC_TYPE nNewValue)
CYIAtomic(YI_ATOMIC_TYPE nValue=(YI_ATOMIC_TYPE) 0)
YI_ATOMIC_TYPE CompareAndSwap(YI_ATOMIC_TYPE nCurrentValue, YI_ATOMIC_TYPE nNewValue)
Definition: YiAtomic.h:95
YI_ATOMIC_TYPE operator+=(YI_ATOMIC_TYPE nValueToAdd)
YI_ATOMIC_TYPE FetchAndXor(YI_ATOMIC_TYPE nValue)
CYIAtomic< int64_t > YI_ATOMIC_INT64
Definition: YiAtomic.h:511
YI_ATOMIC_TYPE operator|=(YI_ATOMIC_TYPE nValueToOr)
CYIAtomic< bool > YI_ATOMIC_BOOL
Definition: YiAtomic.h:501
CYIAtomic< int8_t > YI_ATOMIC_INT8
Definition: YiAtomic.h:508
int ssize_t
Definition: YiPredefWin32.h:133
bool operator!=(YI_ATOMIC_TYPE nValue) const
YI_ATOMIC_TYPE operator&=(YI_ATOMIC_TYPE nValueToAnd)
YI_ATOMIC_TYPE operator^=(YI_ATOMIC_TYPE nValueToXor)
YI_ATOMIC_TYPE operator/=(YI_ATOMIC_TYPE nValueToDiv)