concepts.hpp concepts string_view serif/equations/contributions.hpp serif/equations/point.hpp src/include/serif/equations/equations.hpp src/include/serif/equations/registry.hpp src/include/serif/operators/concepts.hpp src/include/serif/operators/contributions.hpp serif::equations::ValidContributions serif::equations::ValidContributions< RowT, std::tuple< C... > > serif serif::equations Concepts for equations, contributions, and pointwise evaluation. Emily M. Boudreaux #pragmaonce #include<concepts> #include<string_view> #include"serif/equations/contributions.hpp" #include"serif/equations/point.hpp" namespaceserif::equations{ template<typenameT> conceptPointEquation= requires{ typenameT::Test; typenameT::Operands; }&& (discretization::blocks::SpatialTerm<typename T::Test>||discretization::blocks::GlobalScalarTerm<typename T::Test>)&& discretization::blocks::HasResidualBlock<typename T::Test>&& discretization::forms::IsOperand<TestOperandOf<T>>&& std::same_as<typenameTestOperandOf<T>::term_type,typenameT::Test>&& requires(constT&equation,constEquationPoint<typename T::Operands>&point){ { equation.evaluate(point) }->std::same_as<PointLinearization<typenameT::Operands,discretization::forms::OperandValue<TestOperandOf<T>>>>; }; template<typenameRowT,typenameTupleT> structValidContributions:std::false_type{}; template<typenameRowT,typename...C> structValidContributions<RowT,std::tuple<C...>>:std::bool_constant< sizeof...(C)!=0&&(requires{ requiresPointEquation<C>; requiresstd::same_as<RowT,typenameC::Test>;}&&...)>{}; template<typenameT> conceptEquation=requires{ typenameT::Test; {T::name}->std::convertible_to<std::string_view>; }&&ValidContributions<typename T::Test, ContributionsOf<T>>::value; }//namespaceserif::equations