3 #include <boost/utility.hpp>
9 template<class T> class atomic : boost::noncopyable
15 explicit atomic() : p(0) {}
18 rd_scoped_lock lock(mutex);
21 atomic &operator=(const T &q) {
22 rw_scoped_lock lock(mutex);
26 atomic &operator++(const int) {
27 rw_scoped_lock lock(mutex);
31 atomic &operator--(const int) {
32 rw_scoped_lock lock(mutex);
36 atomic &operator+=(const T &q) {
37 rw_scoped_lock lock(mutex);
41 atomic &operator-=(const T &q) {
42 rw_scoped_lock lock(mutex);
46 bool operator<(T &q) const {
49 bool operator<=(T &q) const {
52 bool operator>(T &q) const {
55 bool operator>=(T &q) const {
58 bool operator==(T &q) const {
61 bool operator!=(T &q) const {
72 mutable volatile int p;
77 atomic &operator=(const int &q) {
78 __sync_lock_test_and_set(&p, q);
81 atomic &operator++(const int) {
82 __sync_add_and_fetch(&p, 1);
85 atomic &operator--(const int) {
86 __sync_sub_and_fetch(&p, 1);
89 atomic &operator+=(const int &q) {
90 __sync_add_and_fetch(&p, q);
93 atomic &operator-=(const int &q) {
94 __sync_sub_and_fetch(&p, q);
97 bool operator<(const int &q) const {
100 bool operator<=(const int &q) const {
103 bool operator>(const int &q) const {
106 bool operator>=(const int &q) const {
109 bool operator==(const int &q) const {
112 bool operator!=(const int &q) const {
120 class atomic<long long>
123 mutable volatile long long p;
128 atomic &operator=(const long long &q) {
129 __sync_lock_test_and_set(&p, q);
132 atomic &operator++(const int) {
133 __sync_add_and_fetch(&p, 1);
136 atomic &operator--(const int) {
137 __sync_sub_and_fetch(&p, 1);
140 atomic &operator+=(const long long &q) {
141 __sync_add_and_fetch(&p, q);
144 atomic &operator-=(const long long &q) {
145 __sync_sub_and_fetch(&p, q);
148 bool operator<(const long long &q) const {
151 bool operator<=(const long long &q) const {
154 bool operator>(const long long &q) const {
157 bool operator>=(const long long &q) const {
160 bool operator==(const long long &q) const {
163 bool operator!=(const long long &q) const {
170 class atomic<unsigned long long>
173 mutable volatile unsigned long long p;
175 unsigned long long get() {
178 atomic &operator=(const unsigned long long &q) {
179 __sync_lock_test_and_set(&p, q);
182 atomic &operator++(const int) {
183 __sync_add_and_fetch(&p, 1);
186 atomic &operator--(const int) {
187 __sync_sub_and_fetch(&p, 1);
190 atomic &operator+=(const unsigned long long &q) {
191 __sync_add_and_fetch(&p, q);
194 atomic &operator-=(const unsigned long long &q) {
195 __sync_sub_and_fetch(&p, q);
198 bool operator<(const unsigned long long &q) const {
201 bool operator<=(const unsigned long long &q) const {
204 bool operator>(const unsigned long long &q) const {
207 bool operator>=(const unsigned long long &q) const {
210 bool operator==(const unsigned long long &q) const {
213 bool operator!=(const unsigned long long &q) const {