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>
155 template <
class...>
using Void_t = void;
159 ~Nonesuch() =
delete;
160 Nonesuch(Nonesuch
const&) =
delete;
161 Nonesuch(Nonesuch &&) =
delete;
162 void operator=(Nonesuch
const&) =
delete;
163 void operator=(Nonesuch &&) =
delete;
166 template <
class Default,
class AlwaysVoid,
template <
class...>
class Op,
169 using value_t = std::false_type;
170 using type = Default;
173 template <
class Default,
template <
class...>
class Op,
class... Args>
174 struct Detector<
Default, Void_t<Op<Args...>>, Op, Args...> {
175 using value_t = std::true_type;
176 using type = Op<Args...>;
181 template <
template <
class...>
class Op,
class... Args>
182 using IsDetected =
typename detail::Detector<detail::Nonesuch, void, Op, Args...>::value_t;
184 template <
template <
class...>
class Op,
class... Args>
185 using Detected_t =
typename detail::Detector<detail::Nonesuch, void, Op, Args...>::type;
187 template <
class Default,
template <
class...>
class Op,
class... Args>
190 template <
class Expected,
template <
typename...>
class Op,
class... Args>
198 template <
typename T,
typename... Args>
199 using call_result_t =
decltype(std::declval<T>()(std::declval<Args>()...));
212 template <
typename T,
typename... Args>
218 template <
typename R,
typename T,
typename... Args>
228#if defined(__cpp_lib_logical_traits)
229 template <
typename... Args>
using Conjunction = std::conjunction<Args...>;
230 template <
typename... Args>
using Disjunction = std::disjunction<Args...>;
231 template <
typename... Args>
using Negation = std::negation<Args...>;
232#elif defined(__cpp_lib_experimental_logical_traits)
233 template <
typename... Args>
using Conjunction = std::experimental::conjunction<Args...>;
234 template <
typename... Args>
using Disjunction = std::experimental::disjunction<Args...>;
235 template <
typename... Args>
using Negation = std::experimental::negation<Args...>;
239 template <
class B1,
class... Bn>
241 : std::conditional_t<bool(B1::value), Conjunction<Bn...>, B1> {};
245 template <
class B1,
class... Bn>
247 : std::conditional_t<bool(B1::value), B1, Disjunction<Bn...>> {};
250 using Negation = std::integral_constant<bool, !bool(B::value)>;
259 inline constexpr bool is_convertible(T) {
return true;}
261 template <
typename T,
typename U,
typename Enable =
void>
262 struct IsConvertibleImp : std::false_type {};
264 template <
typename T,
typename U>
265 struct IsConvertibleImp<T, U, std::enable_if_t<is_convertible<T>(U{})>> : std::true_type {};
270 template <
typename T,
typename... Args>
272 static constexpr bool value = (... && detail::IsConvertibleImp<T, Args>::value);
275 template <
typename T,
typename... Args>
279 template <
class T,
class Enable =
void>
284 std::is_arithmetic_v<T>
285 && sizeof(T) <= 8 > >
288 template <
class T,
class Enable =
void>
289 struct IsStdVector : std::false_type {};
292 struct IsStdVector<T, std::enable_if_t<std::is_base_of_v<std::vector<typename T::value_type,
293 typename T::allocator_type>,
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:63
Definition AMReX_ParticleContainerBase.H:23
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:250
constexpr bool IsMultiFabLike_v
Definition AMReX_TypeTraits.H:49
typename detail::Detector< detail::Nonesuch, void, Op, Args... >::type Detected_t
Definition AMReX_TypeTraits.H:185
constexpr bool IsConvertible_v
Definition AMReX_TypeTraits.H:276
constexpr bool IsBaseFab_v
Definition AMReX_TypeTraits.H:27
typename detail::Detector< Default, void, Op, Args... >::type DetectedOr
Definition AMReX_TypeTraits.H:188
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:182
std::is_same< Expected, Detected_t< Op, Args... > > IsDetectedExact
Definition AMReX_TypeTraits.H:191
Logical traits let us combine multiple type requirements in one enable_if_t clause.
Definition AMReX_TypeTraits.H:237
Definition AMReX_TypeTraits.H:99
Definition AMReX_TypeTraits.H:243
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:219
Test if a given type T is callable with arguments of type Args...
Definition AMReX_TypeTraits.H:213
Test if all the types Args... are automatically convertible to type T.
Definition AMReX_TypeTraits.H:271
static constexpr bool value
Definition AMReX_TypeTraits.H:272
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:280
Definition AMReX_TypeTraits.H:104
Definition AMReX_TypeTraits.H:107
Definition AMReX_TypeTraits.H:138
static constexpr bool value
Definition AMReX_TypeTraits.H:139