| 12345678910111213141516171819202122232425262728293031323334353637383940 | 
							- #pragma once
 
- #include <type_traits>
 
- #include <atomic>
 
- namespace prometheus {
 
-   template <typename FloatingType>
 
-   inline std::atomic<FloatingType>& atomic_add_for_floating_types(std::atomic<FloatingType>& value,
 
-     const FloatingType& add) {
 
-     FloatingType desired;
 
-     FloatingType expected = value.load(std::memory_order_relaxed);
 
-     do {
 
-       desired = expected + add;
 
-     } while (!value.compare_exchange_weak(expected, desired));
 
-     return value;
 
-   }
 
-   template <typename FloatingType, class = typename std::enable_if<std::is_floating_point<FloatingType>::value, int>::type>
 
-   inline std::atomic<FloatingType>& operator++(std::atomic<FloatingType>& value) {
 
-     return atomic_add_for_floating_types(value, 1.0);
 
-   }
 
-   template <typename FloatingType, class = typename std::enable_if<std::is_floating_point<FloatingType>::value, int>::type>
 
-   inline std::atomic<FloatingType>& operator+=(std::atomic<FloatingType>& value, const FloatingType& val) {
 
-     return atomic_add_for_floating_types(value, val);
 
-   }
 
-   template <typename FloatingType, class = typename std::enable_if<std::is_floating_point<FloatingType>::value, int>::type>
 
-   inline std::atomic<FloatingType>& operator--(std::atomic<FloatingType>& value) {
 
-     return atomic_add_for_floating_types(value, -1.0);
 
-   }
 
-   template <typename FloatingType, class = typename std::enable_if<std::is_floating_point<FloatingType>::value, int>::type>
 
-   inline std::atomic<FloatingType>& operator-=(std::atomic<FloatingType>& value, const FloatingType& val) {
 
-     return atomic_add_for_floating_types(value, -val);
 
-   }
 
- }
 
 
  |