tahoma2d/toonz/sources/include/tatomicvar.h
2016-06-17 12:20:41 +02:00

71 lines
1.5 KiB
C++

#pragma once
#ifndef TATOMICVAR_H
#define TATOMICVAR_H
#undef DVAPI
#undef DVVAR
#ifdef TNZCORE_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif
#include <atomic>
typedef std::atomic<int> atomic_t;
static __inline__ void atomic_set(atomic_t *v, const int value) {
v->store(value);
}
static __inline__ int atomic_inc_return(atomic_t *v) {
return v->fetch_add(1) + 1; // post increment atomic
}
static __inline__ int atomic_dec_return(atomic_t *v) {
return v->fetch_sub(1) - 1; // post decriment atomic
}
static __inline__ int atomic_read(const atomic_t *v) { return v->load(); }
static __inline__ int atomic_add(int num, const atomic_t *v) {
return const_cast<atomic_t *>(v)->fetch_add(num) +
num; /* なんで const つけた? */
}
class DVAPI TAtomicVar {
public:
TAtomicVar() : m_var(0) {}
long operator++() {
return m_var++ + 1;
}
long operator+=(long value) {
m_var += value;
return m_var;
}
long operator--() {
return m_var-- - 1;
}
bool operator<=(const long &rhs) {
return m_var <= rhs;
};
operator long() const {
return m_var;
};
atomic_t m_var;
#if !defined(LINUX) || defined(LINUX) && (__GNUC__ == 3) && (__GNUC_MINOR__ > 1)
private: // to avoid well known bug in gcc3 ... fixed in later versions..
#endif
TAtomicVar &operator=(const TAtomicVar &); // not implemented
TAtomicVar(const TAtomicVar &v); // not implemented
};
#endif