#ifndef SGAtomic_HXX
#define SGAtomic_HXX
-#if defined(__GNUC__) && (4 <= __GNUC__) && (1 <= __GNUC_MINOR__) \
+#if defined(__GNUC__) && ((4 < __GNUC__)||(4 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
&& (defined(__i386__) || defined(__x86_64__))
// No need to include something. Is a Compiler API ...
# define SGATOMIC_USE_GCC4_BUILTINS
#elif defined(__sgi) && defined(_COMPILER_VERSION) && (_COMPILER_VERSION>=730)
// No need to include something. Is a Compiler API ...
# define SGATOMIC_USE_MIPSPRO_BUILTINS
-#elif defined(WIN32) && !defined ( __CYGWIN__ )
+#elif defined(_WIN32)
# include <windows.h>
# define SGATOMIC_USE_WIN32_INTERLOCKED
#else
unsigned mValue;
};
+namespace simgear
+{
+// Typesafe wrapper around SGSwappable
+template <typename T>
+class Swappable : private SGAtomic
+{
+public:
+ Swappable(const T& value) : SGAtomic(static_cast<unsigned>(value))
+ {
+ }
+ T operator() () const
+ {
+ return static_cast<T>(SGAtomic::operator unsigned ());
+ }
+ Swappable& operator=(const Swappable& rhs)
+ {
+ for (unsigned oldval = unsigned(*this);
+ !compareAndExchange(oldval, unsigned(rhs));
+ oldval = unsigned(*this))
+ ;
+ return *this;
+ }
+ bool compareAndSwap(const T& oldVal, const T& newVal)
+ {
+ return SGAtomic::compareAndExchange(static_cast<unsigned>(oldVal),
+ static_cast<unsigned>(newVal));
+ }
+};
+}
#endif