parameters.hpp array concepts expected ranges string string_view type_traits serif/dimensions/quantities.hpp serif/utils/dependencies/key_list_operations.hpp src/include/serif/solver/continuation/family.hpp src/include/serif/solver/continuation/identified_equations.hpp src/include/serif/solver/continuation/stellar_parameters.hpp serif::solver::continuation::Failure serif::solver::continuation::ParameterDescriptor serif::solver::continuation::SpecificationTraits serif::solver::continuation::detail::ParameterCatalog serif::solver::continuation::detail::ParameterCatalog< Owner, std::void_t< typename Owner::ContinuationParameters > > serif::solver::continuation::detail::Catalog serif::solver::continuation::detail::Catalog< Owner, std::void_t< typename SpecificationTraits< Owner >::Parameters > > serif::solver::continuation::detail::RequiredDependents serif::solver::continuation::detail::RequiredDependents< Parameter, std::void_t< typename Parameter::RequiredDependentParameters > > serif serif::solver serif::solver::continuation serif::solver::continuation::detail #pragmaonce #include<array> #include<concepts> #include<expected> #include<ranges> #include<string> #include<string_view> #include<type_traits> #include"serif/dimensions/quantities.hpp" #include"serif/utils/dependencies/key_list_operations.hpp" namespaceserif::solver::continuation{ template<typename...Parameters> usingParameterList=utils::dependencies::KeyList<Parameters...>; structFailurefinal{ std::stringmessage; }; structParameterDescriptorfinal{ std::string_viewname; std::string_viewstable_id; }; template<typenameSpecification> structSpecificationTraits{ [[nodiscard]]staticautoidentity(constSpecification&value) requiresrequires{value.continuation_identity();}{ returnvalue.continuation_identity(); } template<typenameValues> [[nodiscard]]staticSpecificationrebuild(constSpecification&value,constValues&parameters) requiresrequires{{value.with_continuation_parameters(parameters)}->std::same_as<Specification>;}{ returnvalue.with_continuation_parameters(parameters); } [[nodiscard]]staticSpecificationclone(constSpecification&value){ ifconstexpr(requires{{value.clone_for_continuation()}->std::same_as<Specification>;}){ returnvalue.clone_for_continuation(); }else{ returnvalue; } } }; template<typenameValue> conceptCoordinateValue=std::same_as<Value,double>||dimensions::QuantityValueType<Value>; template<CoordinateValueValue> [[nodiscard]]constexprdoublecoordinate_value(Valuevalue)noexcept{ ifconstexpr(std::same_as<Value,double>){ returnvalue; }else{ returnvalue.value(); } } namespacedetail{ template<typenameOwner,typename=void> structParameterCatalog{usingType=ParameterList<>;}; template<typenameOwner> structParameterCatalog<Owner,std::void_t<typenameOwner::ContinuationParameters>>{usingType=typenameOwner::ContinuationParameters;}; template<typenameOwner,typename=void> structCatalog:ParameterCatalog<Owner>{}; template<typenameOwner> structCatalog<Owner,std::void_t<typenameSpecificationTraits<Owner>::Parameters>>{usingType=typenameSpecificationTraits<Owner>::Parameters;}; template<typenameParameter,typename=void> structRequiredDependents{usingType=ParameterList<>;}; template<typenameParameter> structRequiredDependents<Parameter,std::void_t<typenameParameter::RequiredDependentParameters>>{ usingType=typenameParameter::RequiredDependentParameters; }; } template<typenameParameter> conceptPhysicalParameter=requires(consttypenameParameter::Specification&specification,typenameParameter::Valuevalue){ requiresCoordinateValue<typename Parameter::Value>; {Parameter::name}->std::convertible_to<std::string_view>; {Parameter::stable_id}->std::convertible_to<std::string_view>; {Parameter::read(specification)}->std::same_as<typenameParameter::Value>; {Parameter::valid(value)}->std::same_as<bool>; requiresutils::dependencies::ContainsKey<Parameter, typename detail::Catalog<typename Parameter::Specification>::Type>; }; template<typenameSpecification> conceptIdentifiedSpecification=requires(constSpecification&value){ SpecificationTraits<Specification>::identity(value); requiresstd::ranges::forward_range<decltype(SpecificationTraits<Specification>::identity(value))>; requiresstd::ranges::sized_range<decltype(SpecificationTraits<Specification>::identity(value))>; requiresstd::same_as<std::ranges::range_value_t<decltype(SpecificationTraits<Specification>::identity(value))>,double>; }; }