16#ifndef dealii_template_constraints_h
17#define dealii_template_constraints_h
38 namespace SupportsOperation
49 template <
class Default,
72 template <
class Default,
template <
class...>
class Op,
class... Args>
99 template <
class Default,
template <
class...>
class Op,
class... Args>
102 template <
template <
class...>
class Op,
class... Args>
105 template <
template <
class...>
class Op,
class... Args>
108 template <
class Default,
template <
class...>
class Op,
class... Args>
111 template <
class Expected,
template <
class...>
class Op,
class... Args>
114 template <
class To,
template <
class...>
class Op,
class... Args>
116 std::is_convertible<
detected_t<Op, Args...>, To>;
154 template <
template <
class...>
class Op,
class... Args>
163 namespace TemplateConstraints
170 template <
bool... Values>
182 template <
bool... Values>
195 template <
bool... Values>
199 template <
bool V1,
bool... Values>
209 static constexpr bool value =
false;
220template <
class Base,
class... Derived>
224 std::is_base_of<Base, Derived>::value...>
::value;
235template <
class Type,
class... Types>
239 std::is_same<Type, Types>::value...>
::value;
250template <
class Type,
class... Types>
254 std::is_same<Type, Types>::value...>
::value;
264template <
bool... Values>
266 : std::enable_if<internal::TemplateConstraints::all_true<Values...>::value>
278 decltype(std::begin(std::declval<T>()), std::end(std::declval<T>()));
282 internal::is_supported_operation<begin_and_end_t, T>;
356template <
typename ArgType,
typename ValueType>
391 template <
typename T>
405 template <
typename T,
typename U>
427 template <
typename T,
typename U>
430 using type =
decltype(std::declval<T>() * std::declval<U>());
483template <
typename T,
typename U>
488 typename std::decay<U>::type>
::type;
498 template <
typename T>
504 template <
typename T,
typename U>
507 using type = std::complex<typename ProductType<T, U>::type>;
510 template <
typename U>
513 using type = std::complex<typename ProductType<double, U>::type>;
516 template <
typename T>
519 using type = std::complex<typename ProductType<T, double>::type>;
522 template <
typename U>
525 using type = std::complex<typename ProductType<float, U>::type>;
528 template <
typename T>
531 using type = std::complex<typename ProductType<T, float>::type>;
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
typename detected_or< Default, Op, Args... >::type detected_or_t
std::is_convertible< detected_t< Op, Args... >, To > is_detected_convertible
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
typename detected_or< nonesuch, Op, Args... >::type detected_t
std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
constexpr bool is_supported_operation
static bool equal(const T *p1, const T *p2)
static bool equal(const T *, const U *)
typename internal::ProductTypeImpl< typename std::decay< T >::type, typename std::decay< U >::type >::type type
static constexpr bool value
ValueType operator()(const ArgType &)
std::complex< typename ProductType< double, U >::type > type
std::complex< typename ProductType< float, U >::type > type
std::complex< typename ProductType< T, double >::type > type
std::complex< typename ProductType< T, float >::type > type
std::complex< typename ProductType< T, U >::type > type
decltype(std::declval< T >() *std::declval< U >()) type
nonesuch(nonesuch const &)=delete
void operator=(nonesuch const &)=delete
static constexpr bool value
static constexpr bool value
static constexpr bool value
decltype(std::begin(std::declval< T >()), std::end(std::declval< T >())) begin_and_end_t
constexpr bool has_begin_and_end