12 #ifndef __LIDAR_ATOMIC_H__ 13 #define __LIDAR_ATOMIC_H__ 20 #elif defined __GNUG__ 21 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42 22 #include <bits/atomicity.h> 25 #error unknown platform 28 LT_BEGIN_LIDAR_NAMESPACE
32 typedef LONG AtomicInt;
34 inline AtomicInt AtomicIncrement(AtomicInt &value)
36 return ::InterlockedIncrement(&value);
39 inline AtomicInt AtomicDecrement(AtomicInt &value)
41 return ::InterlockedDecrement(&value);
44 template<
typename TYPE>
bool AtomicCompareAndSwap(TYPE *&value, TYPE *oldValue, TYPE *newValue)
46 return InterlockedCompareExchangePointer(reinterpret_cast<void **>(&value), newValue, oldValue) == oldValue;
49 #elif defined __GNUG__ 51 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42 52 typedef _Atomic_word AtomicInt;
54 typedef int AtomicInt;
57 inline AtomicInt AtomicIncrement(AtomicInt &value)
59 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34 60 return __exchange_and_add(&value, 1) + 1;
61 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42 62 return __gnu_cxx::__exchange_and_add(&value, 1) + 1;
64 return __sync_add_and_fetch(&value, 1);
68 inline AtomicInt AtomicDecrement(AtomicInt &value)
70 #if __GNUC__ * 10 + __GNUC_MINOR__ < 34 71 return __exchange_and_add(&value, -1) - 1;
72 #elif __GNUC__ * 10 + __GNUC_MINOR__ < 42 73 return __gnu_cxx::__exchange_and_add(&value, -1) - 1;
75 return __sync_sub_and_fetch(&value, 1);
79 template<
typename TYPE>
bool AtomicCompareAndSwap(TYPE *&value, TYPE *oldValue, TYPE *newValue)
81 #if __GNUC__ * 10 + __GNUC_MINOR__ < 42 91 return __sync_bool_compare_and_swap(&value, oldValue, newValue);
99 LT_END_LIDAR_NAMESPACE
100 #endif // __LIDAR_ATOMIC_H__