forked from OctaForge/libostd
remove macros
This commit is contained in:
parent
084139b731
commit
897f1873f7
|
@ -260,64 +260,59 @@ namespace octa {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool __octa_msvc_atomic_compare_exchange8(
|
template<typename T, size_t N = sizeof(T)>
|
||||||
volatile int8_t *dst, int8_t *exp, int8_t src
|
struct __OctaMsvcAtomicCompareExchange;
|
||||||
) {
|
|
||||||
int8_t prev = _InterlockedCompareExchange8(dst, src, *exp);
|
|
||||||
if (prev == *exp) return true;
|
|
||||||
*exp = prev; return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool __octa_msvc_atomic_compare_exchange16(
|
template<typename T>
|
||||||
volatile int16_t *dst, int16_t *exp, int16_t src
|
struct __OctaMsvcAtomicCompareExchange<T, 1> {
|
||||||
) {
|
static inline bool exchange(volatile T *dst, T *exp, T src)
|
||||||
int16_t prev = InterlockedCompareExchange16(dst, src, *exp);
|
noexcept {
|
||||||
if (prev == *exp) return true;
|
int8_t prev = _InterlockedCompareExchange8((volatile int8_t *)dst,
|
||||||
*exp = prev; return false;
|
(int8_t)src, (int8_t)*exp);
|
||||||
|
if (prev == (int8_t)*exp) return true;
|
||||||
|
*exp = (T)prev; return false;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static inline bool __octa_msvc_atomic_compare_exchange32(
|
template<typename T>
|
||||||
volatile int32_t *dst, int32_t *exp, int32_t src
|
struct __OctaMsvcAtomicCompareExchange<T, 2> {
|
||||||
) {
|
static inline bool exchange(volatile T *dst, T *exp, T src)
|
||||||
int32_t prev = InterlockedCompareExchange(dst, src, *exp);
|
noexcept {
|
||||||
if (prev == *exp) return true;
|
int16_t prev = _InterlockedCompareExchange16((volatile int16_t *)dst,
|
||||||
*exp = prev; return false;
|
(int16_t)src, (int16_t)*exp);
|
||||||
|
if (prev == (int16_t)*exp) return true;
|
||||||
|
*exp = (T)prev; return false;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static inline bool __octa_msvc_atomic_compare_exchange64(
|
template<typename T>
|
||||||
volatile int64_t *dst, int64_t *exp, int64_t src
|
struct __OctaMsvcAtomicCompareExchange<T, 4> {
|
||||||
) {
|
static inline bool exchange(volatile T *dst, T *exp, T src)
|
||||||
int64_t prev = InterlockedCompareExchange64(dst, src, *exp);
|
noexcept {
|
||||||
if (prev == *exp) return true;
|
int32_t prev = _InterlockedCompareExchange((volatile int32_t *)dst,
|
||||||
*exp = prev; return false;
|
(int32_t)src, (int32_t)*exp);
|
||||||
|
if (prev == (int32_t)*exp) return true;
|
||||||
|
*exp = (T)prev; return false;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static inline bool __octa_msvc_atomic_compare_exchange_unreachable() {
|
template<typename T>
|
||||||
static_assert(false, "atomic operation with size > 8 bytes");
|
struct __OctaMsvcAtomicCompareExchange<T, 8> {
|
||||||
return true;
|
static inline bool exchange(volatile T *dst, T *exp, T src)
|
||||||
|
noexcept {
|
||||||
|
int64_t prev = _InterlockedCompareExchange64((volatile int64_t *)dst,
|
||||||
|
(int64_t)src, (int64_t)*exp);
|
||||||
|
if (prev == (int64_t)*exp) return true;
|
||||||
|
*exp = (T)prev; return false;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
#define __OCTA_MSVC_ATOMIC_COMPARE_EXCHANGE(dst, exp, src) \
|
|
||||||
((sizeof(*dst) == 1) ? \
|
|
||||||
__octa_msvc_atomic_compare_exchange8((volatile int8_t *)(dst), \
|
|
||||||
(int8_t *)(exp), (int8_t)(src)); \
|
|
||||||
: ((sizeof(*dst) == 2) ? \
|
|
||||||
__octa_msvc_atomic_compare_exchange16((volatile int16_t *)(dst), \
|
|
||||||
(int16_t *)(exp), (int16_t)(src)); \
|
|
||||||
: ((sizeof(*dst) == 4) ? \
|
|
||||||
__octa_msvc_atomic_compare_exchange32((volatile int32_t *)(dst), \
|
|
||||||
(int32_t *)(exp), (int32_t)(src)); \
|
|
||||||
: ((sizeof(*dst) == 8) ? \
|
|
||||||
__octa_msvc_atomic_compare_exchange64((volatile int64_t *)(dst), \
|
|
||||||
(int64_t *)(exp), (int64_t)(src)); \
|
|
||||||
: __octa_msvc_atomic_compare_exchange_unreachable()))));
|
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static inline bool __octa_atomic_compare_exchange_strong(
|
static inline bool __octa_atomic_compare_exchange_strong(
|
||||||
volatile __OctaAtomicBase<T> *a, T *expected, T v,
|
volatile __OctaAtomicBase<T> *a, T *expected, T v,
|
||||||
memory_order, memory_order
|
memory_order, memory_order
|
||||||
) {
|
) {
|
||||||
return __OCTA_MSVC_ATOMIC_COMPARE_EXCHANGE(&a->value, expected, v);
|
return __OctaMsvcAtomicCompareExchange<T>::exchange(&a->value, expected, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -325,7 +320,7 @@ namespace octa {
|
||||||
__OctaAtomicBase<T> *a, T *expected, T v,
|
__OctaAtomicBase<T> *a, T *expected, T v,
|
||||||
memory_order, memory_order
|
memory_order, memory_order
|
||||||
) {
|
) {
|
||||||
return __OCTA_MSVC_ATOMIC_COMPARE_EXCHANGE(&a->value, expected, v);
|
return __OctaMsvcAtomicCompareExchange<T>::exchange(&a->value, expected, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -333,7 +328,7 @@ namespace octa {
|
||||||
volatile __OctaAtomicBase<T> *a, T *expected, T v,
|
volatile __OctaAtomicBase<T> *a, T *expected, T v,
|
||||||
memory_order, memory_order
|
memory_order, memory_order
|
||||||
) {
|
) {
|
||||||
return __OCTA_MSVC_ATOMIC_COMPARE_EXCHANGE(&a->value, expected, v);
|
return __OctaMsvcAtomicCompareExchange<T>::exchange(&a->value, expected, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -341,11 +336,9 @@ namespace octa {
|
||||||
__OctaAtomicBase<T> *a, T *expected, T v,
|
__OctaAtomicBase<T> *a, T *expected, T v,
|
||||||
memory_order, memory_order
|
memory_order, memory_order
|
||||||
) {
|
) {
|
||||||
return __OCTA_MSVC_ATOMIC_COMPARE_EXCHANGE(&a->value, expected, v);
|
return __OctaMsvcAtomicCompareExchange<T>::exchange(&a->value, expected, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef __OCTA_MSVC_ATOMIC_COMPARE_EXCHANGE
|
|
||||||
|
|
||||||
#define __OCTA_MSVC_ATOMIC_FETCH_OP(opn, dst, val, ret) \
|
#define __OCTA_MSVC_ATOMIC_FETCH_OP(opn, dst, val, ret) \
|
||||||
if (sizeof(*dst) == 1) { \
|
if (sizeof(*dst) == 1) { \
|
||||||
*(ret) = _InterlockedExchange##opn##8((volatile int8_t *)dst, (int8_t)val); \
|
*(ret) = _InterlockedExchange##opn##8((volatile int8_t *)dst, (int8_t)val); \
|
||||||
|
|
Loading…
Reference in a new issue