00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FXATOMIC_H
00023 #define FXATOMIC_H
00024
00025 namespace FXEX {
00026 class FXFastMutex;
00027
00028
00029 template<class TYPE> class FXAtomic;
00030
00031
00032 typedef FXAtomic<FXbool> FXAtomicBool;
00033
00034
00035 typedef FXAtomic<FXint> FXAtomicInt;
00036
00037
00038 typedef FXAtomic<FXfloat> FXAtomicFloat;
00039
00040
00041 typedef FXAtomic<FXString> FXAtomicString;
00042
00043
00044
00045 template<class TYPE> FXAPI FXbool operator==(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00046 template<class TYPE> FXAPI FXbool operator==(FXAtomic<TYPE>& v1,const TYPE v2);
00047 template<class TYPE> FXAPI FXbool operator==(const TYPE v1,FXAtomic<TYPE>& v2);
00048
00049 template<class TYPE> FXAPI FXbool operator!=(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00050 template<class TYPE> FXAPI FXbool operator!=(FXAtomic<TYPE>& v1,const TYPE v2);
00051 template<class TYPE> FXAPI FXbool operator!=(const TYPE v1,FXAtomic<TYPE>& v2);
00052
00053 template<class TYPE> FXAPI FXbool operator<(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00054 template<class TYPE> FXAPI FXbool operator<(FXAtomic<TYPE>& v1,const TYPE v2);
00055 template<class TYPE> FXAPI FXbool operator<(const TYPE v1,FXAtomic<TYPE>& v2);
00056
00057 template<class TYPE> FXAPI FXbool operator>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00058 template<class TYPE> FXAPI FXbool operator>(FXAtomic<TYPE>& v1,const TYPE v2);
00059 template<class TYPE> FXAPI FXbool operator>(const TYPE v1,FXAtomic<TYPE>& v2);
00060
00061 template<class TYPE> FXAPI FXbool operator<=(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00062 template<class TYPE> FXAPI FXbool operator<=(FXAtomic<TYPE>& v1,const TYPE v2);
00063 template<class TYPE> FXAPI FXbool operator<=(const TYPE v1,FXAtomic<TYPE>& v2);
00064
00065 template<class TYPE> FXAPI FXbool operator>=(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00066 template<class TYPE> FXAPI FXbool operator>=(FXAtomic<TYPE>& v1,const TYPE v2);
00067 template<class TYPE> FXAPI FXbool operator>=(const TYPE v1,FXAtomic<TYPE>& v2);
00068
00069 template<class TYPE> FXAPI FXStream& operator<<(FXStream& store,const FXAtomic<TYPE>& v);
00070 template<class TYPE> FXAPI FXStream& operator>>(FXStream& store,FXAtomic<TYPE>& v);
00071
00072
00073
00074
00075
00076
00077
00078
00079 template<class TYPE>
00080 class FXAPI FXAtomic {
00081
00082 private:
00083 FXFastMutex *mutex;
00084 TYPE value;
00085
00086 public:
00087
00088 FXAtomic(const TYPE v=0);
00089
00090
00091 void setValue(const TYPE v);
00092
00093
00094 TYPE getValue();
00095
00096
00097 operator TYPE();
00098
00099
00100 FXAtomic<TYPE>& operator=(const FXAtomic<TYPE>& v);
00101
00102
00103 FXAtomic<TYPE>& operator=(const TYPE v);
00104
00105
00106 TYPE operator++();
00107 TYPE operator++(TYPE);
00108
00109
00110 TYPE operator--();
00111 TYPE operator--(TYPE);
00112
00113
00114 TYPE operator+(const TYPE v);
00115
00116
00117 TYPE operator-(const TYPE v);
00118
00119
00120 TYPE operator*(const TYPE v);
00121
00122
00123 TYPE operator/(const TYPE v);
00124
00125
00126 TYPE operator+=(const TYPE v);
00127
00128
00129 TYPE operator-=(const TYPE v);
00130
00131
00132 TYPE operator*=(const TYPE v);
00133
00134
00135 TYPE operator/=(const TYPE v);
00136
00137
00138 friend FXAPI FXbool operator== <TYPE>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00139 friend FXAPI FXbool operator== <TYPE>(FXAtomic<TYPE>& v1,const TYPE v2);
00140 friend FXAPI FXbool operator== <TYPE>(const TYPE v1,FXAtomic<TYPE>& v2);
00141
00142
00143 friend FXAPI FXbool operator!= <TYPE>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00144 friend FXAPI FXbool operator!= <TYPE>(FXAtomic<TYPE>& v1,const TYPE v2);
00145 friend FXAPI FXbool operator!= <TYPE>(const TYPE v1,FXAtomic<TYPE>& v2);
00146
00147
00148 friend FXAPI FXbool operator< <TYPE>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00149 friend FXAPI FXbool operator< <TYPE>(FXAtomic<TYPE>& v1,const TYPE v2);
00150 friend FXAPI FXbool operator< <TYPE>(const TYPE v1,FXAtomic<TYPE>& v2);
00151
00152
00153 friend FXAPI FXbool operator> <TYPE>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00154 friend FXAPI FXbool operator> <TYPE>(FXAtomic<TYPE>& v1,const TYPE v2);
00155 friend FXAPI FXbool operator> <TYPE>(const TYPE v1,FXAtomic<TYPE>& v2);
00156
00157
00158 friend FXAPI FXbool operator<= <TYPE>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00159 friend FXAPI FXbool operator<= <TYPE>(FXAtomic<TYPE>& v1,const TYPE v2);
00160 friend FXAPI FXbool operator<= <TYPE>(const TYPE v1,FXAtomic<TYPE>& v2);
00161
00162
00163 friend FXAPI FXbool operator>= <TYPE>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2);
00164 friend FXAPI FXbool operator>= <TYPE>(FXAtomic<TYPE>& v1,const TYPE v2);
00165 friend FXAPI FXbool operator>= <TYPE>(const TYPE v1,FXAtomic<TYPE>& v2);
00166
00167
00168 friend FXAPI FXStream& operator<< <TYPE>(FXStream& store,const FXAtomic<TYPE>& v);
00169
00170
00171 friend FXAPI FXStream& operator>> <TYPE>(FXStream& store,FXAtomic<TYPE>& v);
00172
00173
00174 ~FXAtomic();
00175 };
00176
00177
00178
00179
00180
00181
00182 template<class TYPE>
00183 FXAtomic<TYPE>::FXAtomic(const TYPE v) : value(v) {
00184 mutex=new FXFastMutex();
00185 }
00186
00187 template<class TYPE>
00188 FXAtomic<TYPE>::~FXAtomic(){
00189 delete mutex;
00190 }
00191
00192
00193 template<class TYPE>
00194 void FXAtomic<TYPE>::setValue(const TYPE v){
00195 mutex->lock();
00196 value=v;
00197 mutex->unlock();
00198 }
00199
00200
00201 template<class TYPE>
00202 TYPE FXAtomic<TYPE>::getValue(void) {
00203 mutex->lock();
00204 TYPE t(value);
00205 mutex->unlock();
00206 return t;
00207 }
00208
00209
00210 template<class TYPE>
00211 FXAtomic<TYPE>::operator TYPE(void){
00212 return getValue();
00213 }
00214
00215
00216 template<class TYPE>
00217 FXAtomic<TYPE>& FXAtomic<TYPE>::operator=(const FXAtomic<TYPE>& v){
00218 setValue(v.getValue());
00219 return *this;
00220 }
00221
00222
00223 template<class TYPE>
00224 FXAtomic<TYPE>& FXAtomic<TYPE>::operator=(const TYPE v){
00225 setValue(v);
00226 return *this;
00227 }
00228
00229
00230 template<class TYPE>
00231 TYPE FXAtomic<TYPE>::operator++(void){
00232 mutex->lock();
00233 TYPE t(++value);
00234 mutex->unlock();
00235 return t;
00236 }
00237
00238
00239 template<class TYPE>
00240 TYPE FXAtomic<TYPE>::operator++(TYPE){
00241 mutex->lock();
00242 TYPE t(value++);
00243 mutex->unlock();
00244 return t;
00245 }
00246
00247
00248 template<class TYPE>
00249 TYPE FXAtomic<TYPE>::operator--(void){
00250 mutex->lock();
00251 TYPE t(--value);
00252 mutex->unlock();
00253 return t;
00254 }
00255
00256
00257 template<class TYPE>
00258 TYPE FXAtomic<TYPE>::operator--(TYPE){
00259 mutex->lock();
00260 TYPE t(value--);
00261 mutex->unlock();
00262 return t;
00263 }
00264
00265
00266 template<class TYPE>
00267 TYPE FXAtomic<TYPE>::operator+(const TYPE v){
00268 mutex->lock();
00269 TYPE t(value);
00270 mutex->unlock();
00271 return t+v;
00272 }
00273
00274
00275 template<class TYPE>
00276 TYPE FXAtomic<TYPE>::operator-(const TYPE v){
00277 mutex->lock();
00278 TYPE t(value);
00279 mutex->unlock();
00280 return t-v;
00281 }
00282
00283
00284 template<class TYPE>
00285 TYPE FXAtomic<TYPE>::operator*(const TYPE v){
00286 mutex->lock();
00287 TYPE t(value);
00288 mutex->unlock();
00289 return t*v;
00290 }
00291
00292
00293 template<class TYPE>
00294 TYPE FXAtomic<TYPE>::operator/(const TYPE v){
00295 mutex->lock();
00296 TYPE t(value);
00297 mutex->unlock();
00298 return t/v;
00299 }
00300
00301
00302 template<class TYPE>
00303 TYPE FXAtomic<TYPE>::operator+=(const TYPE v){
00304 mutex->lock();
00305 value+=v;
00306 TYPE t(value);
00307 mutex->unlock();
00308 return t;
00309 }
00310
00311
00312 template<class TYPE>
00313 TYPE FXAtomic<TYPE>::operator-=(const TYPE v){
00314 mutex->lock();
00315 value-=v;
00316 TYPE t(value);
00317 mutex->unlock();
00318 return t;
00319 }
00320
00321
00322 template<class TYPE>
00323 TYPE FXAtomic<TYPE>::operator*=(const TYPE v){
00324 mutex->lock();
00325 value*=v;
00326 TYPE t(value);
00327 mutex->unlock();
00328 return t;
00329 }
00330
00331
00332 template<class TYPE>
00333 TYPE FXAtomic<TYPE>::operator/=(const TYPE v){
00334 mutex->lock();
00335 value/=v;
00336 TYPE t(value);
00337 mutex->unlock();
00338 return t;
00339 }
00340
00341
00342 template<class TYPE>
00343 FXbool operator==(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2){
00344 return v1.getValue()==v2.getValue();
00345 }
00346
00347
00348 template<class TYPE>
00349 FXbool operator==(FXAtomic<TYPE>& v1,const TYPE v2){
00350 return v1.getValue()==v2;
00351 }
00352
00353
00354 template<class TYPE>
00355 FXbool operator==(const TYPE v1,FXAtomic<TYPE>& v2){
00356 return v1==v2.getValue();
00357 }
00358
00359
00360 template<class TYPE>
00361 FXbool operator!=(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2){
00362 return v1.getValue()!=v2.getValue();
00363 }
00364
00365
00366 template<class TYPE>
00367 FXbool operator!=(FXAtomic<TYPE>& v1,const TYPE v2){
00368 return v1.getValue()!=v2;
00369 }
00370
00371
00372 template<class TYPE>
00373 FXbool operator!=(const TYPE v1,FXAtomic<TYPE>& v2){
00374 return v1!=v2.getValue();
00375 }
00376
00377
00378 template<class TYPE>
00379 FXbool operator>(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2){
00380 return v1.getValue()>v2.getValue();
00381 }
00382
00383
00384 template<class TYPE>
00385 FXbool operator>(FXAtomic<TYPE>& v1,const TYPE v2){
00386 return v1.getValue()>v2;
00387 }
00388
00389
00390 template<class TYPE>
00391 FXbool operator>(const TYPE v1,FXAtomic<TYPE>& v2){
00392 return v1>v2.getValue();
00393 }
00394
00395
00396 template<class TYPE>
00397 FXbool operator<(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2){
00398 return v1.getValue()<v2.getValue();
00399 }
00400
00401
00402 template<class TYPE>
00403 FXbool operator<(FXAtomic<TYPE>& v1,const TYPE v2){
00404 return v1.getValue()<v2;
00405 }
00406
00407
00408 template<class TYPE>
00409 FXbool operator<(const TYPE v1,FXAtomic<TYPE>& v2){
00410 return v1<v2.getValue();
00411 }
00412
00413
00414 template<class TYPE>
00415 FXbool operator>=(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2){
00416 return v1.getValue()>=v2.getValue();
00417 }
00418
00419
00420 template<class TYPE>
00421 FXbool operator>=(FXAtomic<TYPE>& v1,const TYPE v2){
00422 return v1.getValue()>=v2;
00423 }
00424
00425
00426 template<class TYPE>
00427 FXbool operator>=(const TYPE v1,FXAtomic<TYPE>& v2){
00428 return v1>=v2.getValue();
00429 }
00430
00431
00432 template<class TYPE>
00433 FXbool operator<=(FXAtomic<TYPE>& v1,FXAtomic<TYPE>& v2){
00434 return v1.getValue()<=v2.getValue();
00435 }
00436
00437
00438 template<class TYPE>
00439 FXbool operator<=(FXAtomic<TYPE>& v1,const TYPE v2){
00440 return v1.getValue()<=v2;
00441 }
00442
00443
00444 template<class TYPE>
00445 FXbool operator<=(const TYPE v1,FXAtomic<TYPE>& v2){
00446 return v1<=v2.getValue();
00447 }
00448
00449
00450 template<class TYPE>
00451 FXStream& operator<<(FXStream& store,const FXAtomic<TYPE>& v){
00452 store << v.getValue();
00453 return store;
00454 }
00455
00456
00457 template<class TYPE>
00458 FXStream& operator>>(FXStream& store,FXAtomic<TYPE>& v){
00459 TYPE t;
00460 store >> t;
00461 v.setValue(t);
00462 return store;
00463 }
00464
00465 }
00466 #endif // FXATOMIC_H