computation_graph.hpp concepts cstddef tuple type_traits utility serif/utils/dependencies/computation.hpp serif/utils/dependencies/key_list_operations.hpp serif/utils/dependencies/detail/graph.hpp src/include/serif/backend/mfem/solver/preconditioner/graph.hpp src/include/serif/geometry/deformation/computations.hpp src/include/serif/geometry/surface/computations.hpp src/include/serif/utils/dependencies/dependencies.hpp src/include/serif/utils/dependencies/detail/schema.hpp serif::utils::dependencies::ComputationGraph serif serif::utils serif::utils::dependencies serif::utils::dependencies::detail #pragmaonce #include<concepts> #include<cstddef> #include<tuple> #include<type_traits> #include<utility> #include"serif/utils/dependencies/computation.hpp" #include"serif/utils/dependencies/key_list_operations.hpp" #include"serif/utils/dependencies/detail/graph.hpp" namespaceserif::utils::dependencies{ namespacedetail{ template<typenameComputationT,typenameResultKeysT> inlineconstexprboolvalid_input_ownership_v=!std::remove_cvref_t<ComputationT>::owns_inputs|| key_list_subset_v<typename std::remove_cvref_t<ComputationT>::Inputs,ResultKeysT>; } template<typename...Computations> conceptCompatibleComputations= (IsComputation<Computations>&&...)&& misc::traits::all_unique_types_v<typename std::remove_cvref_t<Computations>::Key...>&& (detail::valid_input_ownership_v<Computations, KeyList<typename std::remove_cvref_t<Computations>::Key...>>&&...)&& detail::Graph<std::remove_cvref_t<Computations>...>::acyclic(); template<IsComputation...Computations>requiresCompatibleComputations<Computations...> classComputationGraph{ public: usingResults=KeyList<typenameComputations::Key...>; usingInputs=CombinedKeyList<typenameComputations::Inputs...>; usingDependencies=detail::Graph<Computations...>; staticconstexprstd::size_tsize=sizeof...(Computations); template<std::size_tIndex> usingComputationAt=std::tuple_element_t<Index,std::tuple<Computations...>>; explicitComputationGraph(Computations...computations):m_computations(std::move(computations)...){} template<std::size_tIndex>requires(Index<size) [[nodiscard]]constauto&computation()const{ returnstd::get<Index>(m_computations); } template<typenameKeyT>requiresdetail::contains_key_v<KeyT, Results> [[nodiscard]]staticconstevalstd::size_tindex(){ returndetail::type_index<KeyT>(typenameResults::Keys{}); } private: std::tuple<Computations...>m_computations; }; template<typenameT> inlineconstexprboolis_computation_graph_v=false; template<typename...Computations> inlineconstexprboolis_computation_graph_v<ComputationGraph<Computations...>>=true; template<typenameT> conceptIsComputationGraph=is_computation_graph_v<std::remove_cvref_t<T>>; template<typename...Computations> requiresCompatibleComputations<Computations...>&& (std::constructible_from<std::remove_cvref_t<Computations>,Computations>&&...) [[nodiscard]]automake_computation_graph(Computations&&...computations){ returnComputationGraph<std::remove_cvref_t<Computations>...>(std::forward<Computations>(computations)...); } }