computation.hpp concepts functional type_traits utility serif/utils/dependencies/key_list.hpp src/include/serif/backend/mfem/model/computations/physical_blocks.hpp src/include/serif/backend/mfem/model/computations/solver_layout.hpp src/include/serif/backend/mfem/solver/normalization/metric_computations.hpp src/include/serif/backend/mfem/solver/preconditioner/computations/coupling.hpp src/include/serif/backend/mfem/solver/preconditioner/computations/ordering.hpp src/include/serif/backend/mfem/solver/preconditioner/computations/physical_blocks.hpp src/include/serif/solver/normalization/detail/factor_computations.hpp src/include/serif/utils/dependencies/computation_graph.hpp src/include/serif/utils/dependencies/dependencies.hpp serif::utils::dependencies::Computation serif serif::utils serif::utils::dependencies #pragmaonce #include<concepts> #include<functional> #include<type_traits> #include<utility> #include"serif/utils/dependencies/key_list.hpp" namespaceserif::utils::dependencies{ template<typenameKeyT,IsKeyListInputsT,typenameFunctionT,boolOwnsInputs=false> classComputation{ public: usingKey=KeyT; usingInputs=std::remove_cvref_t<InputsT>; usingFunction=FunctionT; staticconstexprboolowns_inputs=OwnsInputs; explicitComputation(FunctionTfunction):m_function(std::move(function)){ } template<typename...Arguments>requiresstd::invocable<constFunctionT&,constArguments&...> [[nodiscard]]decltype(auto)evaluate(constArguments&...arguments)const{ returnstd::invoke(m_function,arguments...); } private: FunctionTm_function; }; template<typenameT> inlineconstexprboolis_computation_v=false; template<typenameKeyT,typenameInputsT,typenameFunctionT,boolOwnsInputs> inlineconstexprboolis_computation_v<Computation<KeyT, InputsT, FunctionT, OwnsInputs>>=true; template<typenameT> conceptIsComputation=is_computation_v<std::remove_cvref_t<T>>; template<typenameKeyT,IsKeyListInputsT,typenameFunctionT> requiresstd::constructible_from<std::decay_t<FunctionT>,FunctionT> [[nodiscard]]automake_computation(FunctionT&&function){ returnComputation<KeyT, std::remove_cvref_t<InputsT>,std::decay_t<FunctionT>>(std::forward<FunctionT>(function)); } template<typenameKeyT,IsKeyListInputsT,typenameFunctionT> requiresstd::constructible_from<std::decay_t<FunctionT>,FunctionT> [[nodiscard]]automake_owning_computation(FunctionT&&function){ returnComputation<KeyT, std::remove_cvref_t<InputsT>,std::decay_t<FunctionT>,true>(std::forward<FunctionT>(function)); } }