traits.hpp serif/dimensions/quantities.hpp serif/dimensions/partial.hpp serif/eos/relations/concepts.hpp src/compile_time_checks/serif/eos/models/traits.cpp src/include/serif/eos/models/concepts.hpp serif::eos::models::ImplementsRelation_t serif::eos::models::ImplementsRelationCatalog_t serif::eos::models::ImplementsRelationCatalog_t< EOS, relations::RelationCatalog< Relations... > > serif::eos::models::IsEquationOfStateModel_t serif::eos::models::IsEquationOfStateModel_t< EOSCandidate, std::void_t< typename std::remove_cvref_t< EOSCandidate >::Relations > > serif::eos::models::ImplementsPartialDerivative_t serif::eos::models::ImplementsSecondPartialDerivative_t serif serif::eos serif::eos::models File containing the traits for the eos module. These traits are used to determine if a type is an equation of state model and if it supports a given relation or partial derivative. Emily M. Boudreaux #pragmaonce #include"serif/dimensions/quantities.hpp" #include"serif/dimensions/partial.hpp" #include"serif/eos/relations/concepts.hpp" namespaceserif::eos::models{ template<typenameEOS,typenameRelationT> structImplementsRelation_t:std::false_type{}; template<typenameEOS,typenameOutput,typename...Inputs>\ structImplementsRelation_t<EOS,relations::Relation<Output,Inputs...>>: std::bool_constant< requires(conststd::remove_cvref_t<EOS>&eos,dimensions::QuantityValue<Inputs>...inputValues){ { eos.evaluate(relations::Relation<Output,Inputs...>{},inputValues...) }->std::same_as<dimensions::QuantityValue<Output>>;}>{};//ReadthisasarequirementthatwhenevaluatingthetemplatesEOSwiththegivenrelationandinputsthereturnedvalueisofthecorrectoutputtype. template<typenameEOS,typenameCatalog> structImplementsRelationCatalog_t:std::false_type{}; template<typenameEOS,typename...Relations> structImplementsRelationCatalog_t<EOS,relations::RelationCatalog<Relations...>>: std::bool_constant< (ImplementsRelation_t<EOS,Relations>::value&&...)>{};//FoldoverallrelationsinacatalogandensuretheEOSimplementsallofthem. template<typenameEOSCandidate,typename=void> structIsEquationOfStateModel_t:std::false_type{}; template<typenameEOSCandidate> structIsEquationOfStateModel_t<EOSCandidate,std::void_t<typenamestd::remove_cvref_t<EOSCandidate>::Relations>>: std::bool_constant< relations::ValidRelationCatalog<typenamestd::remove_cvref_t<EOSCandidate>::Relations>&&//Firstensuretherelationcatalogisitselfvalid ImplementsRelationCatalog_t<//ThenensurethattheEOSCandidateimplementsallrelationsinthecatalog std::remove_cvref_t<EOSCandidate>, typenamestd::remove_cvref_t<EOSCandidate>::Relations>::value>{}; template<typenameEOS,typenameRelationT,typenameInputQuantity> structImplementsPartialDerivative_t:std::false_type{}; template<typenameEOS,typenameOutput,typename...Inputs,typenameInputQuantity> structImplementsPartialDerivative_t<EOS,relations::Relation<Output,Inputs...>,InputQuantity>: std::bool_constant< (std::same_as<InputQuantity,Inputs>||...)&& requires(conststd::remove_cvref_t<EOS>&eos,dimensions::QuantityValue<Inputs>...inputValues){ {eos.partial_derivative(relations::Relation<Output,Inputs...>{},dimensions::WithRespectTo<InputQuantity>{},inputValues...)}->std::same_as<dimensions::PartialDerivative<Output,InputQuantity>>; }>{}; template<typenameEOSCandidate> inlineconstexprboolis_equation_of_state_model_v=IsEquationOfStateModel_t<std::remove_cvref_t<EOSCandidate>>::value; template<typenameEOS,typenameRelationT,typenameFirstInput,typenameSecondInput> structImplementsSecondPartialDerivative_t:std::false_type{}; template<typenameEOS,typenameOutput,typename...Inputs,typenameFirstInput,typenameSecondInput> structImplementsSecondPartialDerivative_t<EOS,relations::Relation<Output,Inputs...>,FirstInput,SecondInput>: std::bool_constant< (std::same_as<FirstInput,Inputs>||...)&&(std::same_as<SecondInput,Inputs>||...)&& requires(conststd::remove_cvref_t<EOS>&eos,dimensions::QuantityValue<Inputs>...inputs){ {eos.second_partial_derivative(relations::Relation<Output,Inputs...>{}, dimensions::WithRespectTo<FirstInput>{},dimensions::WithRespectTo<SecondInput>{},inputs...)} ->std::same_as<dimensions::SecondPartialDerivative<Output,FirstInput,SecondInput>>; }>{}; template<typenameEOS,typenameRelationT> inlineconstexprboolsupports_relation_v=is_equation_of_state_model_v<EOS>&&ImplementsRelation_t<std::remove_cvref_t<EOS>,std::remove_cvref_t<RelationT>>::value; template<typenameEOS,typenameRelationT,typenameInputQuantity> inlineconstexprboolsupports_partial_derivative_v=is_equation_of_state_model_v<EOS>&&ImplementsPartialDerivative_t<std::remove_cvref_t<EOS>,std::remove_cvref_t<RelationT>,InputQuantity>::value; }