cache_traits.hpp concepts cstddef type_traits utility variant serif/utils/dependencies/detail/schema.hpp serif/utils/misc/concepts/filter.hpp src/include/serif/utils/dependencies/detail/cache_storage.hpp serif::utils::dependencies::detail::UsedResource serif::utils::dependencies::detail::UsedResource::Predicate serif::utils::dependencies::detail::ResourceKeys< types::TypeList< Resources... > > serif::utils::dependencies::detail::ComputationCacheTraits serif::utils::dependencies::detail::ComputationCacheTraits< GraphT, ContextT, ErrorT, true > serif serif::utils serif::utils::dependencies serif::utils::dependencies::detail #pragmaonce #include<concepts> #include<cstddef> #include<type_traits> #include<utility> #include<variant> #include"serif/utils/dependencies/detail/schema.hpp" #include"serif/utils/misc/concepts/filter.hpp" namespaceserif::utils::dependencies::detail{ template<typenameGraphT> structUsedResource{ template<typenameResourceT> structPredicate:std::bool_constant<contains_key_v<typenameResourceT::Key,typenameGraphT::Inputs>>{}; }; template<typenameGraphT,typenameContextT> usingUsedResources=misc::concepts::FilterT<typename ContextT::Resources, UsedResource<GraphT>::templatePredicate>; template<typenameResourcesT> structResourceKeys; template<typename...Resources> structResourceKeys<types::TypeList<Resources...>>{ usingtype=KeyList<typenameResources::Key...>; staticconstexprbooltrackable=(SnapshotPolicyFor<typename Resources::Policy, typename Resources::Target>&&...); }; template<typenameSource,typenameTarget> inlineconstexprboolcompatible_error_v=std::same_as<Source,Target>; template<typenameSource,typename...Alternatives> inlineconstexprboolcompatible_error_v<Source,std::variant<Alternatives...>>= std::same_as<Source,std::variant<Alternatives...>>||((std::same_as<Source,Alternatives>||...)&&std::constructible_from<std::variant<Alternatives...>,Source>); template<typenameGraphT,typenameBindingsT,typenameErrorT,std::size_t...Indices> [[nodiscard]]constevalboolcompatible_errors(std::index_sequence<Indices...>){ return((std::is_void_v<typenameResolveComputation<typenameGraphT::templateComputationAt<Indices>,BindingsT>::Error>|| compatible_error_v<typenameResolveComputation<typenameGraphT::templateComputationAt<Indices>,BindingsT>::Error,ErrorT>)&&...); } template<typenameGraphT,typenameContextT,typenameErrorT,boolValid=ComputationGraphFor<GraphT,ContextT>> structComputationCacheTraits{ staticconstexprboolvalid=false; }; template<typenameGraphT,typenameContextT,typenameErrorT> structComputationCacheTraits<GraphT,ContextT,ErrorT,true>{ usingBindings=typenameComputationGraphSchema<GraphT, ContextT>::ResolvedBindings; usingResources=UsedResources<GraphT, ContextT>; usingSources=typenameResourceKeys<Resources>::type; staticconstexprboolvalid=ResourceKeys<Resources>::trackable&&std::is_object_v<ErrorT>&&std::move_constructible<ErrorT>&& compatible_errors<GraphT, Bindings, ErrorT>(std::make_index_sequence<GraphT::size>{}); }; } namespaceserif::utils::dependencies{ template<typenameGraphT,typenameContextT,typenameErrorT> conceptCanPrepare=detail::ComputationCacheTraits<std::remove_cvref_t<GraphT>,std::remove_cvref_t<ContextT>,ErrorT>::valid; }