20namespace Experimental {
23template <
typename T,
typename...
Ts>
30template <
typename...
Ts, std::size_t...
I,
typename A>
31std::tuple<
const Ts &...,
const A &>
34 return std::tuple<
const Ts &...,
const A &>(std::get<I>(t)...,
a);
37template <
typename...
Ts,
typename A>
45template <std::
size_t N>
50 static void Load(
const void *ptr,
void *
ret)
54 static void Store(
void *ptr,
void *val)
58 static void Add(
void *ptr,
const void *val)
78 static void Load(
const void *ptr,
void *
ret)
82 static void Store(
void *ptr,
void *val)
86 static void Add(
void *ptr,
const void *val)
106 static void Load(
const void *ptr,
void *
ret)
110 static void Store(
void *ptr,
void *val)
114 static void Add(
void *ptr,
const void *val)
134 static void Load(
const void *ptr,
void *
ret)
138 static void Store(
void *ptr,
void *val)
142 static void Add(
void *ptr,
const void *val);
165 MSVC::AtomicOps<
sizeof(T)>::Load(ptr,
ret);
172 return ptr->AtomicLoad(
ret);
181 MSVC::AtomicOps<
sizeof(T)>::Load(ptr,
ret);
183 std::atomic_thread_fence(std::memory_order_acquire);
194 std::atomic_thread_fence(std::memory_order_release);
195 MSVC::AtomicOps<
sizeof(T)>::Store(ptr, val);
217 std::atomic_thread_fence(std::memory_order_acquire);
229 std::atomic_thread_fence(std::memory_order_release);
265 AtomicAddCompareExchangeLoop(
static_cast<__int64 *
>(ptr), *
static_cast<const __int64 *
>(val));
272std::enable_if_t<std::is_integral_v<T>>
AtomicAdd(T *ptr, T val)
277 MSVC::AtomicOps<
sizeof(T)>
::Add(ptr, &val);
282std::enable_if_t<std::is_floating_point_v<T>>
AtomicAdd(T *ptr, T val)
294 std::atomic_thread_fence(std::memory_order_release);
295 MSVC::AtomicOps<
sizeof(T)>
::Add(ptr, &val);
318template <
typename T,
typename U>
319auto AtomicAdd(T *ptr,
const U &add) ->
decltype(ptr->AtomicAdd(add))
321 return ptr->AtomicAdd(add);
324template <
typename T,
typename U>
327 return ptr->AtomicAddRelease(add);
333 return ptr->AtomicIncRelease();
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
std::enable_if_t< std::is_arithmetic_v< T > > AtomicIncRelease(T *ptr)
std::enable_if_t< std::is_arithmetic_v< T >, bool > AtomicCompareExchangeRelease(T *ptr, T *expected, T *desired)
std::enable_if_t< std::is_arithmetic_v< T >, bool > AtomicCompareExchange(T *ptr, T *expected, T *desired)
std::enable_if_t< std::is_arithmetic_v< T > > AtomicAddCompareExchangeLoop(T *ptr, T val)
std::enable_if_t< std::is_arithmetic_v< T > > AtomicAddCompareExchangeReleaseLoop(T *ptr, T val)
std::tuple< const Ts &..., const A & > AppendReference(const std::tuple< Ts... > &t, const A &a)
std::enable_if_t< std::is_arithmetic_v< T >, bool > AtomicCompareExchangeAcquire(T *ptr, T *expected, T *desired)
std::enable_if_t< std::is_arithmetic_v< T > > AtomicLoadAcquire(const T *ptr, T *ret)
std::enable_if_t< std::is_arithmetic_v< T > > AtomicStoreRelease(T *ptr, T *val)
std::enable_if_t< std::is_arithmetic_v< T > > AtomicLoad(const T *ptr, T *ret)
std::tuple< const Ts &..., const A & > AppendReferenceImpl(const std::tuple< Ts... > &t, std::index_sequence< I... >, const A &a)
std::enable_if_t< std::is_integral_v< T > > AtomicAdd(T *ptr, T val)
std::enable_if_t< std::is_integral_v< T > > AtomicAddRelease(T *ptr, T val)
TMatrixT< Element > & Add(TMatrixT< Element > &target, Element scalar, const TMatrixT< Element > &source)
Modify addition: target += scalar * source.