13#ifndef dealii_template_constraints_h
14#define dealii_template_constraints_h
41 namespace SupportsOperation
52 template <
class Default,
75 template <
class Default,
template <
class...>
class Op,
class... Args>
102 template <
class Default,
template <
class...>
class Op,
class... Args>
105 template <
template <
class...>
class Op,
class... Args>
108 template <
template <
class...>
class Op,
class... Args>
111 template <
class Default,
template <
class...>
class Op,
class... Args>
114 template <
class Expected,
template <
class...>
class Op,
class... Args>
117 template <
class To,
template <
class...>
class Op,
class... Args>
119 std::is_convertible<
detected_t<Op, Args...>, To>;
157 template <
template <
class...>
class Op,
class... Args>
166 namespace TemplateConstraints
176 template <
bool... Values>
179 static constexpr bool value = (Values && ...);
187 template <
bool... Values>
190 static constexpr bool value = (Values || ...);
201template <
class Base,
class... Derived>
205 std::is_base_of_v<Base, Derived>...>
::value;
216template <
typename Type,
class... Types>
220 std::is_same_v<Type, Types>...>
::value;
231template <
typename Type,
class... Types>
235 std::is_same_v<Type, Types>...>
::value;
265template <
bool... Values>
267 : std::enable_if<internal::TemplateConstraints::all_true<Values...>::value>
297template <
bool... Values>
308 decltype(std::begin(std::declval<T>()), std::end(std::declval<T>()));
312 internal::is_supported_operation<begin_and_end_t, T>;
320template <
typename ArgType,
typename ValueType>
355 template <
typename T>
369 template <
typename T,
typename U>
391 template <
typename T,
typename U>
394 using type =
decltype(std::declval<T>() * std::declval<U>());
447template <
typename T,
typename U>
461 template <
typename T>
467 template <
typename T,
typename U>
470 using type = std::complex<typename ProductType<T, U>::type>;
473 template <
typename U>
476 using type = std::complex<typename ProductType<double, U>::type>;
479 template <
typename T>
482 using type = std::complex<typename ProductType<T, double>::type>;
485 template <
typename U>
488 using type = std::complex<typename ProductType<float, U>::type>;
491 template <
typename T>
494 using type = std::complex<typename ProductType<T, float>::type>;
598template <
typename Number>
601template <
typename Number>
606 template <
typename Number>
609 namespace distributed
611 template <
typename Number,
typename MemorySpace>
614 template <
typename Number,
typename MemorySpace>
619#ifdef DEAL_II_WITH_PETSC
637#ifdef DEAL_II_WITH_TRILINOS
638# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
650 namespace EpetraWrappers
657# ifdef DEAL_II_TRILINOS_WITH_TPETRA
660 namespace TpetraWrappers
662 template <
typename Number,
typename MemorySpace>
665 template <
typename Number,
typename MemorySpace>
680#if defined(DEAL_II_HAVE_CXX20) || defined(DOXYGEN)
691 template <
typename C>
711 template <
int dim,
int spacedim>
713 (dim >= 1 && spacedim <= 3 && dim <= spacedim);
723 template <
typename T>
726 template <
typename Number>
729 template <
typename Number>
733 template <
typename Number>
734 inline constexpr bool
738 template <
typename Number,
typename MemorySpace>
742 template <
typename Number,
typename MemorySpace>
747# ifdef DEAL_II_WITH_PETSC
753 inline constexpr bool
757 inline constexpr bool
761 inline constexpr bool
765# ifdef DEAL_II_WITH_TRILINOS
766# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
768 inline constexpr bool
772 inline constexpr bool
776 inline constexpr bool
781# ifdef DEAL_II_TRILINOS_WITH_TPETRA
782 template <
typename Number,
typename MemorySpace>
787 template <
typename Number,
typename MemorySpace>
802 template <
typename T>
805# ifdef DEAL_II_WITH_PETSC
807 inline constexpr bool
811 inline constexpr bool
815 inline constexpr bool
819 inline constexpr bool
823 inline constexpr bool
836 template <
typename T>
839# ifdef DEAL_II_WITH_PETSC
841 inline constexpr bool
863 template <
typename VectorType>
865 internal::is_dealii_vector_type<std::remove_cv_t<VectorType>>;
876 template <
typename VectorType>
888 template <
typename VectorType>
890 internal::is_dealii_petsc_vector_type<VectorType>;
900 template <
typename VectorType>
902 internal::is_dealii_petsc_matrix_type<VectorType>;
907template <
int dim,
int spacedim>
911template <
int dim,
int spacedim>
917 namespace distributed
919 template <
int dim,
int spacedim>
925 template <
int dim,
int spacedim>
929 namespace fullydistributed
931 template <
int dim,
int spacedim>
952 template <
typename Number,
typename MemorySpace>
956 template <
typename Number,
typename MemorySpace>
961#ifdef DEAL_II_TRILINOS_WITH_EPETRA
963 inline constexpr bool
964 is_distributed_vector_type<::TrilinosWrappers::MPI::Vector> =
true;
967 inline constexpr bool
968 is_distributed_vector_type<::TrilinosWrappers::MPI::BlockVector> =
972#ifdef DEAL_II_WITH_PETSC
974 inline constexpr bool
975 is_distributed_vector_type<::PETScWrappers::MPI::Vector> =
true;
978 inline constexpr bool
979 is_distributed_vector_type<::PETScWrappers::MPI::BlockVector> =
984#if defined(DEAL_II_HAVE_CXX20) || defined(DOXYGEN)
987 template <
typename T>
990 template <
int dim,
int spacedim>
991 inline constexpr bool
994 template <
int dim,
int spacedim>
998 template <
int dim,
int spacedim>
1002 template <
int dim,
int spacedim>
1006 template <
int dim,
int spacedim>
1007 inline constexpr bool
1019 template <
typename MeshType>
1021 internal::is_triangulation_or_dof_handler<MeshType>;
1029 template <
typename VectorType>
1033 typename VectorType::value_type a,
1034 typename VectorType::value_type b,
1035 typename VectorType::value_type s,
1038 typename VectorType::value_type;
1039 typename VectorType::size_type;
1040 typename VectorType::real_type;
1070 } -> std::convertible_to<typename VectorType::value_type>;
1074 } -> std::convertible_to<typename VectorType::real_type>;
1078 } -> std::convertible_to<typename VectorType::real_type>;
1082 } -> std::convertible_to<typename VectorType::real_type>;
1087 } -> std::convertible_to<typename VectorType::value_type>;
1090 U.add_and_dot(a, V, W)
1091 } -> std::convertible_to<typename VectorType::value_type>;
1096 } -> std::convertible_to<typename VectorType::size_type>;
1100 } -> std::same_as<bool>;
1103 U.get_mpi_communicator()
1104 } -> std::same_as<MPI_Comm>;
1108 U.compress(operation)
1109 } -> std::same_as<void>;
1121 template <
typename MatrixType,
typename VectorType>
1123 requires(
const MatrixType &A, VectorType &dst,
const VectorType &src) {
1136 template <
typename MatrixType,
typename VectorType>
1138 requires(
const MatrixType &A, VectorType &dst,
const VectorType &src) {
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
constexpr bool is_distributed_vector_type
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< std::decay_t< T >, std::decay_t< U > >::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
void operator=(const nonesuch &)=delete
nonesuch(const nonesuch &)=delete
static constexpr bool value
static constexpr bool value
static constexpr bool value
static constexpr bool value
typename enable_if_all< Values... >::type enable_if_all_t
decltype(std::begin(std::declval< T >()), std::end(std::declval< T >())) begin_and_end_t
constexpr bool has_begin_and_end