mixed_errors.cpp concepts expected memory string variant serif/utils/dependencies/computation_cache.hpp #include<concepts> #include<expected> #include<memory> #include<string> #include<variant> #include"serif/utils/dependencies/computation_cache.hpp" namespace{ namespacedependencies=serif::utils::dependencies; structSource{}; structFirst{}; structSecond{}; structOutput{}; structInputFailure{}; structPhysicsFailure{}; structOwnedFailure{ std::unique_ptr<int>value; }; template<typenameFailure> structFallible{ [[nodiscard]]constexprstd::expected<int,Failure>operator()(intvalue)const{ returnvalue; } }; structInfallible{ [[nodiscard]]constexprintoperator()(intvalue)const{ returnvalue; } }; usingContext=decltype(dependencies::make_dependency_context(dependencies::own<Source>(1))); template<typenameFailure> usingFirstCalculation=dependencies::Computation<First,dependencies::InputList<Source>,Fallible<Failure>>; template<typenameFailure> usingSecondCalculation=dependencies::Computation<Second,dependencies::InputList<First>,Fallible<Failure>>; usingOutputCalculation=dependencies::Computation<Output,dependencies::InputList<Second>,Infallible>; usingMixedGraph=dependencies::ComputationGraph<FirstCalculation<InputFailure>,SecondCalculation<PhysicsFailure>,OutputCalculation>; usingFailureUnion=std::variant<InputFailure,PhysicsFailure>; static_assert(dependencies::CanPrepare<MixedGraph,Context,FailureUnion>); static_assert(dependencies::CanPrepare<constMixedGraph&,constContext&,FailureUnion>); static_assert(dependencies::CanPrepare<MixedGraph,Context,std::variant<PhysicsFailure,InputFailure>>); static_assert(dependencies::CanPrepare<MixedGraph,Context,std::variant<std::monostate,InputFailure,PhysicsFailure>>); static_assert(!dependencies::CanPrepare<MixedGraph,Context,InputFailure>); static_assert(!dependencies::CanPrepare<MixedGraph,Context,std::variant<InputFailure>>); static_assert(!dependencies::CanPrepare<MixedGraph,Context,std::variant<PhysicsFailure>>); static_assert(!dependencies::CanPrepare<MixedGraph,Context,std::variant<InputFailure,int>>); static_assert(!dependencies::CanPrepare<MixedGraph,Context,std::variant<InputFailure,InputFailure,PhysicsFailure>>); static_assert(!dependencies::CanPrepare<MixedGraph,Context,std::variant<InputFailure,PhysicsFailure,PhysicsFailure>>); static_assert(!dependencies::CanPrepare<MixedGraph,Context,void>); usingSameErrorGraph=dependencies::ComputationGraph<FirstCalculation<InputFailure>,SecondCalculation<InputFailure>,OutputCalculation>; static_assert(dependencies::CanPrepare<SameErrorGraph,Context,InputFailure>); static_assert(dependencies::CanPrepare<SameErrorGraph,Context,FailureUnion>); static_assert(!dependencies::CanPrepare<SameErrorGraph,Context,PhysicsFailure>); usingExistingUnionGraph=dependencies::ComputationGraph<FirstCalculation<FailureUnion>>; static_assert(dependencies::CanPrepare<ExistingUnionGraph,Context,FailureUnion>); usingTextErrorGraph=dependencies::ComputationGraph<FirstCalculation<constchar*>>; static_assert(std::constructible_from<std::string,constchar*>); static_assert(std::constructible_from<std::variant<std::string,int>,constchar*>); static_assert(!dependencies::CanPrepare<TextErrorGraph,Context,std::string>); static_assert(!dependencies::CanPrepare<TextErrorGraph,Context,std::variant<std::string,int>>); static_assert(dependencies::CanPrepare<TextErrorGraph,Context,std::variant<constchar*,std::string>>); usingOwnedErrorGraph=dependencies::ComputationGraph<FirstCalculation<InputFailure>,SecondCalculation<OwnedFailure>,OutputCalculation>; usingOwnedErrorUnion=std::variant<InputFailure,OwnedFailure>; static_assert(std::move_constructible<OwnedErrorUnion>); static_assert(!std::copy_constructible<OwnedErrorUnion>); static_assert(dependencies::CanPrepare<OwnedErrorGraph,Context,OwnedErrorUnion>); }