6 #ifndef EASTL_ATOMIC_INTERNAL_CASTS_H
7 #define EASTL_ATOMIC_INTERNAL_CASTS_H
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
14 #include <EASTL/internal/type_transformations.h>
26 EASTL_FORCE_INLINE
volatile T* AtomicVolatileCast(T* ptr) EA_NOEXCEPT
31 return reinterpret_cast<volatile T*
>(ptr);
54 template <
typename Integral,
typename T>
55 EASTL_FORCE_INLINE
volatile Integral* AtomicVolatileIntegralCast(T* ptr) EA_NOEXCEPT
60 static_assert(
sizeof(Integral) ==
sizeof(T),
"eastl::atomic<T> : Integral and T must be same size for casting!");
62 return reinterpret_cast<volatile Integral*
>(ptr);
65 template <
typename Integral,
typename T>
66 EASTL_FORCE_INLINE Integral* AtomicIntegralCast(T* ptr) EA_NOEXCEPT
69 static_assert(
sizeof(Integral) ==
sizeof(T),
"eastl::atomic<T> : Integral and T must be same size for casting!");
71 return reinterpret_cast<Integral*
>(ptr);
84 template <
typename ToType,
typename FromType>
85 EASTL_FORCE_INLINE
volatile ToType* AtomicVolatileTypeCast(FromType* ptr) EA_NOEXCEPT
90 return reinterpret_cast<volatile ToType*
>(ptr);
93 template <
typename ToType,
typename FromType>
94 EASTL_FORCE_INLINE ToType* AtomicTypeCast(FromType* ptr) EA_NOEXCEPT
96 return reinterpret_cast<ToType*
>(ptr);
117 template <
typename Pun,
typename T, eastl::enable_if_t<!eastl::is_same_v<Pun, T>,
int> = 0>
118 EASTL_FORCE_INLINE Pun AtomicTypePunCast(
const T& fromType) EA_NOEXCEPT
120 static_assert(
sizeof(Pun) ==
sizeof(T),
"eastl::atomic<T> : Pun and T must be the same size for type punning!");
128 return reinterpret_cast<Pun&
>(ret);
131 template <
typename Pun,
typename T, eastl::enable_if_t<eastl::is_same_v<Pun, T>,
int> = 0>
132 EASTL_FORCE_INLINE Pun AtomicTypePunCast(
const T& fromType) EA_NOEXCEPT
138 template <
typename T>
139 EASTL_FORCE_INLINE T AtomicNegateOperand(T val) EA_NOEXCEPT
144 return static_cast<T
>(0U -
static_cast<eastl::make_unsigned_t<T>
>(val));
147 EASTL_FORCE_INLINE ptrdiff_t AtomicNegateOperand(ptrdiff_t val) EA_NOEXCEPT
165 #define EASTL_ATOMIC_VOLATILE_CAST(ptr) \
166 eastl::internal::AtomicVolatileCast((ptr))
168 #define EASTL_ATOMIC_VOLATILE_INTEGRAL_CAST(IntegralType, ptr) \
169 eastl::internal::AtomicVolatileIntegralCast<IntegralType>((ptr))
171 #define EASTL_ATOMIC_INTEGRAL_CAST(IntegralType, ptr) \
172 eastl::internal::AtomicIntegralCast<IntegralType>((ptr))
174 #define EASTL_ATOMIC_VOLATILE_TYPE_CAST(ToType, ptr) \
175 eastl::internal::AtomicVolatileTypeCast<ToType>((ptr))
177 #define EASTL_ATOMIC_TYPE_CAST(ToType, ptr) \
178 eastl::internal::AtomicTypeCast<ToType>((ptr))
180 #define EASTL_ATOMIC_TYPE_PUN_CAST(PunType, fromType) \
181 eastl::internal::AtomicTypePunCast<PunType>((fromType))
183 #define EASTL_ATOMIC_NEGATE_OPERAND(val) \
184 eastl::internal::AtomicNegateOperand((val))
EA Standard Template Library.
Definition: algorithm.h:288
T * addressof(T &value) EA_NOEXCEPT
Definition: memory_base.h:29
Definition: type_transformations.h:615
Definition: type_fundamental.h:148
Definition: type_traits.h:650