1#ifndef BL_TYPETRAITS_H_
2#define BL_TYPETRAITS_H_
3#include <AMReX_Config.H>
10#define AMREX_IS_TRIVIALLY_COPYABLE(T) std::is_trivially_copyable_v<T>
11#define AMREX_IS_TRIVIALLY_DEFAULT_CONSTRUCTIBLE(T) std::is_trivially_default_constructible_v<T>
15 template <
class T>
class BaseFab;
16 template <
class FAB>
class FabArray;
18 template <
class A,
class Enable =
void>
struct IsBaseFab : std::false_type {};
22 std::is_base_of_v<BaseFab<typename D::value_type>,
29 template <
class A,
class Enable =
void>
struct IsFabArray : std::false_type {};
33 std::is_base_of_v<FabArray<typename D::FABType::value_type>,
40 template <
class M,
class Enable =
void>
45 IsBaseFab_v<typename M::fab_type> > >
52 template <
bool B,
class T =
void>
55 template <
class T,
class Enable =
void>
60 template <>
struct HasAtomicAdd<unsigned long long> : std::true_type {};
65 template <
class T,
class Enable =
void>
69 struct IsAddAssignable<T, std::void_t<decltype(std::declval<T&>() += std::declval<T>())>>
98 template <
class T,
class Enable =
void>
103 template <
class T,
class Enable =
void>
106 template <
class T,
class Enable =
void>
109#if defined(AMREX_USE_CUDA) && defined(__NVCC__)
113 : std::false_type {};
116 struct DefinitelyNotHostRunnable<T, std::enable_if_t<__nv_is_extended_device_lambda_closure_type(T)> >
119#elif defined(AMREX_USE_HIP)
127 template <
typename T,
typename U1,
typename... Us>
130 template <
typename T,
typename U>
133 static constexpr bool value = std::is_same_v<T,U>;
136 template <
typename T,
typename U1,
typename... Us>
165 template <
class Default,
class AlwaysVoid,
template <
class...>
class Op,
172 template <
class Default,
template <
class...>
class Op,
class... Args>
179 template <
template <
class...>
class Op,
class... Args>
182 template <
template <
class...>
class Op,
class... Args>
185 template <
class Default,
template <
class...>
class Op,
class... Args>
188 template <
class Expected,
template <
typename...>
class Op,
class... Args>
195 template <
typename T,
typename... Args>
208 template <
typename T,
typename... Args>
214 template <
typename R,
typename T,
typename... Args>
224#if defined(__cpp_lib_logical_traits)
225 template <
typename... Args>
using Conjunction = std::conjunction<Args...>;
226 template <
typename... Args>
using Disjunction = std::disjunction<Args...>;
227 template <
typename... Args>
using Negation = std::negation<Args...>;
228#elif defined(__cpp_lib_experimental_logical_traits)
229 template <
typename... Args>
using Conjunction = std::experimental::conjunction<Args...>;
230 template <
typename... Args>
using Disjunction = std::experimental::disjunction<Args...>;
231 template <
typename... Args>
using Negation = std::experimental::negation<Args...>;
235 template <
class B1,
class... Bn>
237 : std::conditional_t<bool(B1::value), Conjunction<Bn...>, B1> {};
241 template <
class B1,
class... Bn>
243 : std::conditional_t<bool(B1::value), B1, Disjunction<Bn...>> {};
246 using Negation = std::integral_constant<bool, !bool(B::value)>;
256 template <
typename T,
typename U,
typename Enable =
void>
259 template <
typename T,
typename U>
260 struct IsConvertibleImp<T, U, std::enable_if_t<is_convertible<T>(U{})>> : std::true_type {};
264 template <
typename T,
typename... Args>
269 template <
typename T,
typename... Args>
273 template <
class T,
class Enable =
void>
278 std::is_arithmetic_v<T>
279 && sizeof(T) <= 8 > >
282 template <
class T,
class Enable =
void>
283 struct IsStdVector : std::false_type {};
286 struct IsStdVector<T, std::enable_if_t<std::is_base_of_v<std::vector<typename T::value_type,
287 typename T::allocator_type>,
Definition AMReX_MFIter.H:57
Definition AMReX_ParticleContainerBase.H:23
void Void_t
Definition AMReX_TypeTraits.H:154
constexpr bool is_convertible(T)
Definition AMReX_TypeTraits.H:254
decltype(std::declval< T >()(std::declval< Args >()...)) call_result_t
Definition AMReX_TypeTraits.H:196
Definition AMReX_Amr.cpp:49
constexpr bool IsFabArray_v
Definition AMReX_TypeTraits.H:38
std::integral_constant< bool, !bool(B::value)> Negation
Definition AMReX_TypeTraits.H:246
constexpr bool IsMultiFabLike_v
Definition AMReX_TypeTraits.H:49
typename detail::Detector< detail::Nonesuch, void, Op, Args... >::type Detected_t
Definition AMReX_TypeTraits.H:183
constexpr bool IsConvertible_v
Definition AMReX_TypeTraits.H:270
constexpr bool IsBaseFab_v
Definition AMReX_TypeTraits.H:27
typename detail::Detector< Default, void, Op, Args... >::type DetectedOr
Definition AMReX_TypeTraits.H:186
std::enable_if_t< B, T > EnableIf_t
Definition AMReX_TypeTraits.H:53
typename detail::Detector< detail::Nonesuch, void, Op, Args... >::value_t IsDetected
Definition AMReX_TypeTraits.H:180
std::is_same< Expected, Detected_t< Op, Args... > > IsDetectedExact
Definition AMReX_TypeTraits.H:189
Definition AMReX_FabArrayCommI.H:1000
Logical traits let us combine multiple type requirements in one enable_if_t clause.
Definition AMReX_TypeTraits.H:233
Definition AMReX_TypeTraits.H:99
Definition AMReX_TypeTraits.H:239
Definition AMReX_TypeTraits.H:56
Definition AMReX_TypeTraits.H:66
Definition AMReX_TypeTraits.H:18
Test if a given type T is callable with arguments of type Args...
Definition AMReX_TypeTraits.H:215
Test if a given type T is callable with arguments of type Args...
Definition AMReX_TypeTraits.H:209
Test if all the types Args... are automatically convertible to type T.
Definition AMReX_TypeTraits.H:265
static constexpr bool value
Definition AMReX_TypeTraits.H:266
Definition AMReX_TypeTraits.H:29
Definition AMReX_TypeTraits.H:74
Definition AMReX_TypeTraits.H:41
Definition AMReX_TypeTraits.H:95
Definition AMReX_TypeTraits.H:92
Definition AMReX_TypeTraits.H:274
Definition AMReX_TypeTraits.H:104
Definition AMReX_TypeTraits.H:107
Definition AMReX_TypeTraits.H:138
static constexpr bool value
Definition AMReX_TypeTraits.H:139
std::true_type value_t
Definition AMReX_TypeTraits.H:174
Op< Args... > type
Definition AMReX_TypeTraits.H:175
Definition AMReX_TypeTraits.H:167
std::false_type value_t
Definition AMReX_TypeTraits.H:168
Default type
Definition AMReX_TypeTraits.H:169
Definition AMReX_TypeTraits.H:257
Definition AMReX_TypeTraits.H:156
void operator=(Nonesuch &&)=delete
void operator=(Nonesuch const &)=delete
Nonesuch(Nonesuch const &)=delete
Nonesuch(Nonesuch &&)=delete