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>
struct IsBaseFab : std::false_type {};
21 requires (std::is_base_of_v<BaseFab<typename D::value_type>, D>)
27 template <
class A>
struct IsFabArray : std::false_type {};
30 requires (std::is_base_of_v<FabArray<typename D::FABType::value_type>, D>)
40 requires (IsFabArray_v<M> && IsBaseFab_v<typename M::fab_type>)
47 template <
bool B,
class T =
void>
50 template <
class T,
class Enable =
void>
55 template <>
struct HasAtomicAdd<unsigned long long> : std::true_type {};
60 template <
class T,
class Enable =
void>
64 struct IsAddAssignable<T, std::void_t<decltype(std::declval<T&>() += std::declval<T>())>>
104#if defined(AMREX_USE_CUDA) && defined(__NVCC__)
107 requires (__nv_is_extended_device_lambda_closure_type(T))
111 requires (__nv_is_extended_device_lambda_closure_type(T))
114#elif defined(AMREX_USE_HIP)
122 template <
typename T,
typename U1,
typename... Us>
125 template <
typename T,
typename U>
128 static constexpr bool value = std::is_same_v<T,U>;
131 template <
typename T,
typename U1,
typename... Us>
150 template <
class...>
using Void_t = void;
154 ~Nonesuch() =
delete;
155 Nonesuch(Nonesuch
const&) =
delete;
156 Nonesuch(Nonesuch &&) =
delete;
157 void operator=(Nonesuch
const&) =
delete;
158 void operator=(Nonesuch &&) =
delete;
161 template <
class Default,
class AlwaysVoid,
template <
class...>
class Op,
164 using value_t = std::false_type;
165 using type = Default;
168 template <
class Default,
template <
class...>
class Op,
class... Args>
169 struct Detector<
Default, Void_t<Op<Args...>>, Op, Args...> {
170 using value_t = std::true_type;
171 using type = Op<Args...>;
176 template <
template <
class...>
class Op,
class... Args>
177 using IsDetected =
typename detail::Detector<detail::Nonesuch, void, Op, Args...>::value_t;
179 template <
template <
class...>
class Op,
class... Args>
180 using Detected_t =
typename detail::Detector<detail::Nonesuch, void, Op, Args...>::type;
182 template <
class Default,
template <
class...>
class Op,
class... Args>
185 template <
class Expected,
template <
typename...>
class Op,
class... Args>
193 template <
typename T,
typename... Args>
194 using call_result_t =
decltype(std::declval<T>()(std::declval<Args>()...));
207 template <
typename T,
typename... Args>
213 template <
typename R,
typename T,
typename... Args>
223#if defined(__cpp_lib_logical_traits)
224 template <
typename... Args>
using Conjunction = std::conjunction<Args...>;
225 template <
typename... Args>
using Disjunction = std::disjunction<Args...>;
226 template <
typename... Args>
using Negation = std::negation<Args...>;
227#elif defined(__cpp_lib_experimental_logical_traits)
228 template <
typename... Args>
using Conjunction = std::experimental::conjunction<Args...>;
229 template <
typename... Args>
using Disjunction = std::experimental::disjunction<Args...>;
230 template <
typename... Args>
using Negation = std::experimental::negation<Args...>;
234 template <
class B1,
class... Bn>
236 : std::conditional_t<bool(B1::value), Conjunction<Bn...>, B1> {};
240 template <
class B1,
class... Bn>
242 : std::conditional_t<bool(B1::value), B1, Disjunction<Bn...>> {};
245 using Negation = std::integral_constant<bool, !bool(B::value)>;
252 template <
typename T,
typename... Args>
255 template <
typename T,
typename... Args>
259 template <
typename T,
typename U,
typename Enable =
void>
260 struct IsNarrowingConversionImp : std::true_type {};
262 template <
typename T,
typename U>
263 struct IsNarrowingConversionImp<T, U, std::void_t<decltype(U{std::declval<T>()})>> : std::false_type {};
266 template <
typename From,
typename To>
269 template <
typename From,
typename To>
272 template <
typename From,
typename To>
280 requires (std::is_arithmetic_v<T> &&
sizeof(T) <= 8)
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
Definition AMReX_ParticleContainerBase.H:43
Definition AMReX_Amr.cpp:50
constexpr bool IsNarrowingConversion_v
Definition AMReX_TypeTraits.H:270
constexpr bool IsFabArray_v
Definition AMReX_TypeTraits.H:34
std::integral_constant< bool, !bool(B::value)> Negation
Definition AMReX_TypeTraits.H:245
constexpr bool IsMultiFabLike_v
Definition AMReX_TypeTraits.H:44
typename detail::Detector< detail::Nonesuch, void, Op, Args... >::type Detected_t
Definition AMReX_TypeTraits.H:180
std::conjunction< std::is_convertible< Args, T >... > IsConvertible
Test if all the types Args... are automatically convertible to type T.
Definition AMReX_TypeTraits.H:253
constexpr bool IsNonNarrowingConversion_v
Definition AMReX_TypeTraits.H:273
constexpr bool IsConvertible_v
Definition AMReX_TypeTraits.H:256
constexpr bool IsBaseFab_v
Definition AMReX_TypeTraits.H:25
typename detail::Detector< Default, void, Op, Args... >::type DetectedOr
Definition AMReX_TypeTraits.H:183
const int[]
Definition AMReX_BLProfiler.cpp:1664
std::enable_if_t< B, T > EnableIf_t
Definition AMReX_TypeTraits.H:48
typename detail::Detector< detail::Nonesuch, void, Op, Args... >::value_t IsDetected
Definition AMReX_TypeTraits.H:177
std::is_same< Expected, Detected_t< Op, Args... > > IsDetectedExact
Definition AMReX_TypeTraits.H:186
Logical traits let us combine multiple type requirements.
Definition AMReX_TypeTraits.H:232
Definition AMReX_TypeTraits.H:94
Definition AMReX_TypeTraits.H:238
Definition AMReX_TypeTraits.H:51
Definition AMReX_TypeTraits.H:61
Definition AMReX_TypeTraits.H:18
Test if a given type T is callable with arguments of type Args...
Definition AMReX_TypeTraits.H:214
Test if a given type T is callable with arguments of type Args...
Definition AMReX_TypeTraits.H:208
Definition AMReX_TypeTraits.H:27
Definition AMReX_TypeTraits.H:69
Definition AMReX_TypeTraits.H:37
Definition AMReX_TypeTraits.H:267
Definition AMReX_TypeTraits.H:90
Definition AMReX_TypeTraits.H:87
Definition AMReX_TypeTraits.H:277
Definition AMReX_TypeTraits.H:99
Definition AMReX_TypeTraits.H:102
Definition AMReX_TypeTraits.H:133
static constexpr bool value
Definition AMReX_TypeTraits.H:134