You.i Engine
YiAtomic.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_ATOMIC_H_
3 #define _YI_ATOMIC_H_
4 
5 #include "framework/YiPredef.h"
6 
7 #if defined(_MSC_VER)
8 # if !defined(YI_MSVC_ATOMIC)
9 # define YI_MSVC_ATOMIC
10 # endif
11 #elif defined (YI_IOS) || defined (YI_TVOS) || defined (YI_OSX)
12 # if !defined(YI_OSX_ATOMIC)
13 # define YI_OSX_ATOMIC
14 # endif
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
18 # endif
19 #else
20 # if !defined(YI_GENERIC_ATOMIC)
21 # define YI_GENERIC_ATOMIC
22 # endif
23 # include "thread/YiMutex.h"
24 # include "thread/YiAutoMutex.h"
25 #endif
26 
27 
28 namespace yi {
29 
35 namespace deprecated
36 {
37 #if defined(DOXY)
38 
94 template<typename YI_ATOMIC_TYPE>
95 class CYIAtomic
96 {
97 public:
98 
99  CYIAtomic(YI_ATOMIC_TYPE nValue = (YI_ATOMIC_TYPE)0);
100  CYIAtomic(const CYIAtomic<YI_ATOMIC_TYPE> &rOther);
101  bool operator==(YI_ATOMIC_TYPE nValue) const;
102  bool operator!=(YI_ATOMIC_TYPE nValue) const;
103  bool operator!() const;
104  operator YI_ATOMIC_TYPE() const;
105  CYIAtomic<YI_ATOMIC_TYPE> &operator=(YI_ATOMIC_TYPE nValue);
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);
113  YI_ATOMIC_TYPE operator++();
114  YI_ATOMIC_TYPE operator++(int);
115  YI_ATOMIC_TYPE operator--();
116  YI_ATOMIC_TYPE operator--(int);
117 
147  YI_ATOMIC_TYPE FetchAndAdd(YI_ATOMIC_TYPE nValueToAdd);
148 
177  YI_ATOMIC_TYPE FetchAndSub(YI_ATOMIC_TYPE nValue);
178 
190  YI_ATOMIC_TYPE FetchAndAnd(YI_ATOMIC_TYPE nValue);
191 
203  YI_ATOMIC_TYPE FetchAndOr(YI_ATOMIC_TYPE nValue);
204 
216  YI_ATOMIC_TYPE FetchAndXor(YI_ATOMIC_TYPE nValue);
217 
246  YI_ATOMIC_TYPE AddAndFetch(YI_ATOMIC_TYPE nValue);
247 
248 
277  YI_ATOMIC_TYPE SubAndFetch(YI_ATOMIC_TYPE nValue);
278 
290  YI_ATOMIC_TYPE AndAndFetch(YI_ATOMIC_TYPE nValue);
291 
303  YI_ATOMIC_TYPE OrAndFetch(YI_ATOMIC_TYPE nValue);
304 
316  YI_ATOMIC_TYPE XorAndFetch(YI_ATOMIC_TYPE nValue);
317 
360  YI_ATOMIC_TYPE CompareAndSwap(YI_ATOMIC_TYPE nCurrentValue, YI_ATOMIC_TYPE nNewValue);
361 
367  YI_ATOMIC_TYPE Load() const;
368 
374  void Store(YI_ATOMIC_TYPE nNewValue);
375 
380  static bool IsLockFree() const;
381 };
382 #else
383 
384 
385 template<typename YI_ATOMIC_TYPE>
386 class CYIAtomic
387 {
388 public:
389  CYIAtomic(YI_ATOMIC_TYPE nValue = (YI_ATOMIC_TYPE)0);
390  CYIAtomic(const CYIAtomic<YI_ATOMIC_TYPE> &rOther);
391  bool operator==(YI_ATOMIC_TYPE nValue) const;
392  bool operator!=(YI_ATOMIC_TYPE nValue) const;
393  bool operator!() const;
394  operator YI_ATOMIC_TYPE() const;
396  CYIAtomic<YI_ATOMIC_TYPE> &operator=(YI_ATOMIC_TYPE nValue);
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);
404  YI_ATOMIC_TYPE operator++();
405  YI_ATOMIC_TYPE operator++(int);
406  YI_ATOMIC_TYPE operator--();
407  YI_ATOMIC_TYPE operator--(int);
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);
421  static bool IsLockFree();
422 private:
423 #if defined(YI_GENERIC_ATOMIC)
424  YI_ATOMIC_TYPE m_nValue;
425  mutable CYIMutex m_mutex;
426 #else
427  volatile YI_ATOMIC_TYPE m_nValue;
428 #endif
429 };
430 
431 // Specialization for pointer types.
432 template<typename YI_ATOMIC_TYPE>
433 class CYIAtomic<YI_ATOMIC_TYPE*>
434 {
435 public:
436  CYIAtomic(YI_ATOMIC_TYPE *pPtr = 0);
437  CYIAtomic(const CYIAtomic<YI_ATOMIC_TYPE*> &rOther);
438  bool operator==(YI_ATOMIC_TYPE *pPtr) const;
439  bool operator!=(YI_ATOMIC_TYPE *pPtr) const;
440  bool operator!() const;
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;
448  CYIAtomic<YI_ATOMIC_TYPE *> &operator=(YI_ATOMIC_TYPE *pPtr);
449  YI_ATOMIC_TYPE *operator+=(ssize_t nValueToAdd);
450  YI_ATOMIC_TYPE *operator-=(ssize_t nValueToSub);
451  YI_ATOMIC_TYPE *operator++();
452  YI_ATOMIC_TYPE *operator++(int);
453  YI_ATOMIC_TYPE *operator--();
454  YI_ATOMIC_TYPE *operator--(int);
455  YI_ATOMIC_TYPE *FetchAndAdd(ssize_t nValueToAdd);
456  YI_ATOMIC_TYPE *FetchAndSub(ssize_t nValueToSub);
457  YI_ATOMIC_TYPE *AddAndFetch(ssize_t nValueToAdd);
458  YI_ATOMIC_TYPE *SubAndFetch(ssize_t nValueToSub);
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);
462  static bool IsLockFree();
463 private:
464 #if defined(YI_GENERIC_ATOMIC)
465  YI_ATOMIC_TYPE *m_pPtr;
466  mutable CYIMutex m_mutex;
467 #else
468  YI_ATOMIC_TYPE * volatile m_pPtr;
469 #endif
470 };
471 
472 // Specialization for bool
473 template<>
474 class CYIAtomic<bool>
475 {
476 public:
477  CYIAtomic(bool bValue = false);
478  CYIAtomic(const CYIAtomic<bool> &rOther);
479  bool operator==(bool bValue) const;
480  bool operator!=(bool bValue) const;
481  bool operator!() const;
482  operator bool() const;
483  CYIAtomic<bool> &operator=(const CYIAtomic<bool> &rOther);
484  CYIAtomic<bool> &operator=(bool bValue);
485  bool CompareAndSwap(bool bCurrentValue, bool bNewValue);
486  bool Load() const;
487  void Store(bool bValue);
488  static bool IsLockFree();
489 
490 private:
491 #if defined(YI_GENERIC_ATOMIC)
492  uint32_t m_uValue;
493  mutable CYIMutex m_mutex;
494 #else
495  volatile uint32_t m_uValue;
496 #endif
497 };
498 
499 #endif /* DOXY */
500 
502 
507 
512 
515 }
516 }
517 
518 #include "deprecated/YiAtomic.inl"
519 
520 #endif /* _YI_ATOMIC_H_ */
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)