#ifndef FEELPP_VF_CONCEPTS_HPP
#define FEELPP_VF_CONCEPTS_HPP 1
#include <concepts>
#include <map>
#include <string>
#include <utility>
{
template <typename T>
concept VfExpr = requires(T t) {
typename T::value_type;
{ t.context };
{ t.is_terminal };
};
template <typename T>
concept EvaluableExpr = VfExpr<T> && requires(T t) {
{ t.evaluate(true) };
};
template <typename T>
concept ParametricExpr = VfExpr<T> && requires(T t, std::map<std::string, double> params) {
{ t.setParameterValues(params) };
};
template <typename T, typename SymbolExprType = T>
concept DifferentiableExpr = VfExpr<T> && requires(T t, std::string varname, SymbolExprType se) {
{ t.hasSymbolDependency(varname, se) } -> std::convertible_to<bool>;
};
template <typename T>
concept HasSymbolDependency = VfExpr<T> && requires(T const& t, std::string varname) {
{ t.hasSymbolDependency(varname) } -> std::convertible_to<bool>;
};
template <typename T, typename SymbolExprType>
concept HasSymbolDependencyWith = VfExpr<T> && requires(T const& t, std::string varname, SymbolExprType const& se) {
{ t.hasSymbolDependency(varname, se) } -> std::convertible_to<bool>;
};
template <typename T, typename SymbolExprType>
concept AppliesSymbolExpr = VfExpr<T> && requires(T const& t, SymbolExprType const& se) {
t.applySymbolsExpr(se);
};
template <typename T>
concept ParametricSymbolExpr = ParametricExpr<T>;
template <typename T>
concept SymbolicallyDifferentiableExpr = VfExpr<T> && requires(T const& t, std::string varname) {
t.template diff<1>(varname);
};
template <typename T>
concept ScalarExpr = VfExpr<T> && requires {
requires T::nComponents == 1;
};
template <typename T>
concept VectorExpr = VfExpr<T> && requires {
requires T::nComponents > 1;
};
template <typename T>
concept MatrixExpr = VfExpr<T> && requires {
};
template <typename T>
concept TensorExpr = VfExpr<T> && requires {
{
T::rank } -> std::convertible_to<int>;
};
template <typename T>
concept RangeConcept = requires(T t) {
{ t.begin() };
{ t.end() };
};
template <typename T>
concept Quadrature = requires {
typename T::return_type;
{ T::Degree } -> std::convertible_to<int>;
} || std::integral<T>;
template <typename T>
concept BilinearFormConcept = requires(T t) {
typename T::test_space_type;
typename T::trial_space_type;
{ t.matrix() };
};
template <typename T>
concept LinearFormConcept = requires(T t) {
typename T::test_space_type;
{ t.vector() };
};
template <typename T>
concept ElementRange = RangeConcept<T> && requires(T t) {
typename std::decay_t<decltype(*t.begin())>::mesh_type;
};
template <typename T>
concept FaceRange = RangeConcept<T> && requires {
requires requires(T t) { typename std::decay_t<decltype(*t.begin())>::mesh_type; };
};
template <typename T>
concept BackendConcept = requires(T t) {
typename T::vector_type;
typename T::sparse_matrix_type;
};
template <typename T>
concept PreconditionerConcept = requires(T t) {
typename T::backend_type;
{ t.setMatrix(std::declval<typename T::backend_type::sparse_matrix_type>()) };
};
template <typename Op, typename Expr>
concept UnaryOperator = VfExpr<Expr> && requires(Op op, Expr e) {
{ op(e) } -> VfExpr;
};
template <typename Op, typename E1, typename E2>
concept BinaryOperator = VfExpr<E1> && VfExpr<E2> && requires(Op op, E1 e1, E2 e2) {
{ op(e1, e2) } -> VfExpr;
};
#ifdef FEELPP_ENABLE_CONCEPT_COMPATIBILITY
template <typename T>
constexpr bool is_vf_expr_v = VfExpr<T>;
template <typename T>
constexpr bool has_evaluate_without_context_v = EvaluableExpr<T>;
template <typename T>
constexpr bool has_symbolic_parameter_values_v = ParametricExpr<T>;
#endif
}
#endif
C++20 concepts for Feel++ core types.
-*- mode: c++; coding: utf-8; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; show-trailing-w...
Definition: about.cpp:37
rank_type rank(RangeT const &range)
get the rank of a range of entities
Definition: filters.hpp:79