preparation.hpp algorithm array cstddef unordered_map string_view serif/utils/dependencies/detail/type_lists.hpp serif/meta/enums.hpp src/include/serif/backend/mfem/operators/preparation.hpp src/include/serif/utils/dependencies/computation_cache.hpp serif::utils::dependencies::PreparationFailure serif::utils::dependencies::PreparationReport serif serif::utils serif::utils::dependencies #pragmaonce #include<algorithm> #include<array> #include<cstddef> #include<unordered_map> #include<string_view> #include"serif/utils/dependencies/detail/type_lists.hpp" #include"serif/meta/enums.hpp" namespaceserif::utils::dependencies{ enumclassPreparationMode{ reuse_unchanged, rebuild }; enumclassPreparationStatus{ not_required, reused, computed }; inlinestd::unordered_map<PreparationStatus,std::string_view>preparation_status_name_map=meta::enum_to_enum_string_map<PreparationStatus>(); inlinestd::unordered_map<PreparationMode,std::string_view>preparation_mode_name_map=meta::enum_to_enum_string_map<PreparationMode>(); template<typenameErrorT> structPreparationFailure{ std::size_tcomputation_index; ErrorTerror; }; template<IsKeyListResultsT,IsKeyListSourcesT> structPreparationReport{ std::array<PreparationStatus,detail::KeyListSize<ResultsT>::value>statuses{}; std::array<bool,detail::KeyListSize<SourcesT>::value>changed_sources{}; template<typenameKeyT>requiresdetail::contains_key_v<KeyT, ResultsT> [[nodiscard]]PreparationStatusstatus()const{ returnstatuses[detail::type_index<KeyT>(typenameResultsT::Keys{})]; } template<typenameKeyT>requiresdetail::contains_key_v<KeyT, SourcesT> [[nodiscard]]boolsource_changed()const{ returnchanged_sources[detail::type_index<KeyT>(typenameSourcesT::Keys{})]; } [[nodiscard]]std::size_tcomputed_count()const{returnstd::count(statuses.begin(),statuses.end(),PreparationStatus::computed);} [[nodiscard]]std::size_treused_count()const{returnstd::count(statuses.begin(),statuses.end(),PreparationStatus::reused);} }; }