traits.hpp serif/eos/relations/catalog.hpp src/include/serif/eos/relations/concepts.hpp serif::eos::relations::CatalogContainsRelation serif::eos::relations::CatalogContainsRelation< RelationCatalog< Relations... >, RelationT > serif::eos::relations::RelationContainsInput serif::eos::relations::RelationContainsInput< Relation< Output, Inputs... >, Quantity > serif::eos::relations::IsThermodynamicRelation serif::eos::relations::IsThermodynamicRelation< Relation< Output, Inputs... > > serif::eos::relations::IsValidRelationCatalog serif::eos::relations::IsValidRelationCatalog< RelationCatalog< Relations... > > serif serif::eos serif::eos::relations File containing traits for the eos relations module. These traits are used to determine if a type is a valid thermodynamic relation or a valid relation catalog. Emily M. Boudreaux #pragmaonce #include"serif/eos/relations/catalog.hpp" namespaceserif::eos::relations{ template<typenameCatalog,typenameRelationT> structCatalogContainsRelation:std::false_type{}; template<typename...Relations,typenameRelationT> structCatalogContainsRelation<RelationCatalog<Relations...>,RelationT>: std::bool_constant<(std::same_as<RelationT,Relations>||...)>{};//FoldoverallRelationsandreturntruetypeifanyofthemmatchRelationT template<typenameRelationT,typenameQuantity> structRelationContainsInput:std::false_type{}; template<typenameOutput,typename...Inputs,typenameQuantity> structRelationContainsInput<Relation<Output,Inputs...>,Quantity>: std::bool_constant<(std::same_as<Quantity,Inputs>||...)>{}; template<typenameRelationCandidate> structIsThermodynamicRelation:std::false_type{}; template<typenameOutput,typename...Inputs> structIsThermodynamicRelation<Relation<Output,Inputs...>>: std::bool_constant< dimensions::ThermodynamicQuantityType<Output>&&//EnsuretheOutputQuantityisavalidthermodynamicquantity (dimensions::ThermodynamicQuantityType<Inputs>&&...)&&//FoldoverallInputQuantitiestoensuretheyarevalidthermodynamicquantities AllTypesAreUnique<Inputs...>>{};//EnsureallInputQuantitiesareuniquetypes template<typenameCandidateCatalog> structIsValidRelationCatalog:std::false_type{}; template<typename...Relations> structIsValidRelationCatalog<RelationCatalog<Relations...>>: std::bool_constant< (sizeof...(Relations)>0)&&//Ensurethecatalogisnotempty (IsThermodynamicRelation<Relations>::value&&...)&&//FoldoverallRelationsandensuretheyareallvalid AllTypesAreUnique<Relations...>>{};//EnsureallRelationsareuniquetypes(e.g.noduplicaterelations) template<typenameCatalog,typenameRelationT> inlineconstexprboolrelation_catalog_contains_relation_v=CatalogContainsRelation<std::remove_cv_t<Catalog>,std::remove_cv_t<RelationT>>::value; template<typenameRelationT,typenameQuantity> inlineconstexprboolrelation_contains_input_v=RelationContainsInput<std::remove_cv_t<RelationT>,std::remove_cv_t<Quantity>>::value; template<typenameRelationCandidate> constexprboolis_thermodynamic_relation_v=IsThermodynamicRelation<RelationCandidate>::value; template<typenameCatalogCandidate> constexprboolis_valid_relation_catalog_v=IsValidRelationCatalog<CatalogCandidate>::value; }