9 #ifndef BOOST_LOCKFREE_ATOMIC_INT_HPP
10 #define BOOST_LOCKFREE_ATOMIC_INT_HPP
12 #include <boost/lockfree/detail/prefix.hpp>
13 #include <boost/lockfree/detail/cas.hpp>
14 #include <boost/noncopyable.hpp>
21 #if defined(__GNUC__) && ( (__GNUC__ > 4) || ((__GNUC__ >= 4) && (__GNUC_MINOR__ >= 1)) ) || __INTEL_COMPILER
28 explicit atomic_int(T v = 0):
32 operator T(
void)
const
34 return __sync_fetch_and_add(&value, 0);
45 return __sync_add_and_fetch(&value, v);
50 return __sync_sub_and_fetch(&value, v);
56 return __sync_add_and_fetch(&value, 1);
62 return __sync_sub_and_fetch(&value, 1);
68 return __sync_fetch_and_add(&value, 1);
74 return __sync_fetch_and_sub(&value, 1);
81 #elif defined(__GLIBCPP__) || defined(__GLIBCXX__)
88 explicit atomic_int(T v = 0):
92 operator T(
void)
const
94 return __gnu_cxx::__exchange_and_add(&value, 0);
104 return __gnu_cxx::__exchange_and_add(&value, v) + v;
109 return __gnu_cxx::__exchange_and_add(&value, -v) - v;
115 return operator+=(1);
121 return operator-=(1);
127 return __gnu_cxx::__exchange_and_add(&value, 1);
133 return __gnu_cxx::__exchange_and_add(&value, -1);
137 mutable _Atomic_word value;
142 template <
typename T>
152 operator T(
void)
const
182 if(likely(atomic_cas(&value, oldv, newv)))
194 if(likely(atomic_cas(&value, oldv, newv)))
205 if(likely(atomic_cas(&value, oldv, oldv+1)))
216 if(likely(atomic_cas(&value, oldv, oldv-1)))