]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/SGAtomic.hxx
Improve subsystem manager's timing statistics
[simgear.git] / simgear / structure / SGAtomic.hxx
index 1ff9a44d05213f08c4cfd3ab7337c99e86d6ee7a..d4611d11c078c0e8c5ef3cbb6332d68047d7ffad 100644 (file)
@@ -28,7 +28,7 @@
 #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
@@ -113,4 +113,33 @@ private:
   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