16 #ifndef dealii_template_constraints_h
17 #define dealii_template_constraints_h
26 #include <type_traits>
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
173 template <
bool... Values>
185 template <
bool... Values>
198 template <
bool... Values>
202 template <
bool V1,
bool... Values>
212 static constexpr
bool value =
false;
223 template <
class Base,
class... Derived>
227 std::is_base_of<Base, Derived>::value...>
::value;
238 template <
class Type,
class... Types>
242 std::is_same<Type, Types>::value...>
::value;
253 template <
class Type,
class... Types>
257 std::is_same<Type, Types>::value...>
::value;
287 template <
bool... Values>
289 : std::enable_if<internal::TemplateConstraints::all_true<Values...>::value>
319 template <
bool... Values>
328 template <
typename T>
332 template <
typename T>
334 internal::is_supported_operation<begin_and_end_t, T>;
344 template <
typename T>
353 template <
typename ArgType,
typename ValueType>
388 template <
typename T>
402 template <
typename T,
typename U>
424 template <
typename T,
typename U>
427 using type = decltype(std::declval<T>() * std::declval<U>());
480 template <
typename T,
typename U>
485 typename std::decay<U>::type>
::type;
495 template <
typename T>
501 template <
typename T,
typename U>
504 using type = std::complex<typename ProductType<T, U>::type>;
507 template <
typename U>
510 using type = std::complex<typename ProductType<double, U>::type>;
513 template <
typename T>
516 using type = std::complex<typename ProductType<T, double>::type>;
519 template <
typename U>
522 using type = std::complex<typename ProductType<float, U>::type>;
525 template <
typename T>
528 using type = std::complex<typename ProductType<T, float>::type>;
590 template <
typename T>
624 template <
typename T>
632 template <
typename Number>
635 template <
typename Number>
640 template <
typename Number>
643 template <
typename Number>
646 namespace distributed
648 template <
typename Number,
typename MemorySpace>
651 template <
typename Number>
656 #ifdef DEAL_II_WITH_PETSC
670 #ifdef DEAL_II_WITH_TRILINOS
682 namespace EpetraWrappers
687 # ifdef DEAL_II_TRILINOS_WITH_TPETRA
688 namespace TpetraWrappers
690 template <
typename Number>
705 #if defined(DEAL_II_HAVE_CXX20) || defined(DOXYGEN)
715 template <
int dim,
int spacedim>
727 template <
typename T>
730 template <
typename Number>
731 inline constexpr
bool is_dealii_vector_type<::Vector<Number>> =
true;
733 template <
typename Number>
734 inline constexpr
bool is_dealii_vector_type<::BlockVector<Number>> =
737 template <
typename Number>
738 inline constexpr
bool
739 is_dealii_vector_type<::LinearAlgebra::Vector<Number>> =
true;
741 template <
typename Number>
742 inline constexpr
bool
743 is_dealii_vector_type<::LinearAlgebra::BlockVector<Number>> =
true;
745 template <
typename Number,
typename MemorySpace>
749 template <
typename Number>
753 # ifdef DEAL_II_WITH_PETSC
755 inline constexpr
bool is_dealii_vector_type<::PETScWrappers::Vector> =
759 inline constexpr
bool
760 is_dealii_vector_type<::PETScWrappers::BlockVector> =
true;
763 inline constexpr
bool
764 is_dealii_vector_type<::PETScWrappers::MPI::Vector> =
true;
767 inline constexpr
bool
768 is_dealii_vector_type<::PETScWrappers::MPI::BlockVector> =
true;
771 # ifdef DEAL_II_WITH_TRILINOS
773 inline constexpr
bool
774 is_dealii_vector_type<::TrilinosWrappers::MPI::Vector> =
true;
777 inline constexpr
bool
778 is_dealii_vector_type<::TrilinosWrappers::MPI::BlockVector> =
true;
781 inline constexpr
bool
782 is_dealii_vector_type<::LinearAlgebra::EpetraWrappers::Vector> =
785 # ifdef DEAL_II_TRILINOS_WITH_TPETRA
786 template <
typename Number>
805 template <
typename VectorType>
807 internal::is_dealii_vector_type<std::remove_cv_t<VectorType>>;
818 template <
typename VectorType>
820 (std::is_const_v<VectorType> ==
827 template <
int dim,
int spacedim>
831 template <
int dim,
int spacedim>
837 namespace distributed
839 template <
int dim,
int spacedim>
844 template <
int dim,
int spacedim>
847 namespace fullydistributed
849 template <
int dim,
int spacedim>
856 #if defined(DEAL_II_HAVE_CXX20) || defined(DOXYGEN)
859 template <
typename T>
862 template <
int dim,
int spacedim>
863 inline constexpr
bool
864 is_triangulation_or_dof_handler<Triangulation<dim, spacedim>> =
true;
866 template <
int dim,
int spacedim>
870 template <
int dim,
int spacedim>
874 template <
int dim,
int spacedim>
878 template <
int dim,
int spacedim>
879 inline constexpr
bool
880 is_triangulation_or_dof_handler<DoFHandler<dim, spacedim>> =
true;
891 template <
typename MeshType>
893 internal::is_triangulation_or_dof_handler<MeshType>;
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
VectorType::value_type * begin(VectorType &V)
VectorType::value_type * end(VectorType &V)
constexpr bool is_triangulation_or_dof_handler
constexpr bool is_dealii_vector_type
concept is_writable_dealii_vector_type
concept is_triangulation_or_dof_handler
concept is_dealii_vector_type
concept is_valid_dim_spacedim
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
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