specification_endpoints.hpp serif/model/specification.hpp serif/model/specifications/physical_names.hpp serif/utils/dependencies/binding.hpp serif/utils/dependencies/key_list_operations.hpp serif/utils/misc/concepts/filter.hpp src/include/serif/model/validation.hpp serif::model::detail::EndpointOwner serif::model::detail::EndpointOwner< GeneratedCoordinateOf< Specification > > serif::model::detail::EndpointOwner< ConstraintOf< Specification > > serif::model::detail::ResolvedEndpoints< Owner, utils::types::TypeList< Endpoints... >, Bindings > serif::model::detail::EnforcementDependencies serif::model::detail::EnforcementDependencies< Specification, Bindings, true > serif::model::detail::ResolvedSpecification serif serif::model serif::model::detail #pragmaonce #include"serif/model/specification.hpp" #include"serif/model/specifications/physical_names.hpp" #include"serif/utils/dependencies/binding.hpp" #include"serif/utils/dependencies/key_list_operations.hpp" #include"serif/utils/misc/concepts/filter.hpp" namespaceserif::model::detail { template<typenameSpecification> usingGeneratesState=std::bool_constant<Specification::ModelDefinition::generated_state_kind!=GeneratedStateKind::none>; template<typenameModel> usingGeneratedSpecifications=utils::misc::concepts::FilterT<typename Model::SpecificationTypes, GeneratesState>; template<typenameEndpoint> structEndpointOwner{usingType=void;}; template<typenameSpecification> structEndpointOwner<GeneratedCoordinateOf<Specification>>{usingType=Specification;}; template<typenameSpecification> structEndpointOwner<ConstraintOf<Specification>>{usingType=Specification;}; template<typenameOwner,typenameEndpoint,typenameBindings> [[nodiscard]]constevalautoresolved_endpoint() { usingnamespaceutils::dependencies; ifconstexpr(std::same_as<Endpoint,state::OwnGeneratedCoordinate>) { returnresolved_endpoint<Owner, GeneratedCoordinateOf<Owner>,Bindings>(); } elseifconstexpr(std::same_as<Endpoint,equation::OwnConstraint>) { returnresolved_endpoint<Owner, ConstraintOf<Owner>,Bindings>(); } elseifconstexpr(!std::same_as<typenameEndpointOwner<Endpoint>::Type,void>&& BindingsWithBinding<Bindings,EnforcementOf<typenameEndpointOwner<Endpoint>::Type>>) { usingSpecification=typenameEndpointOwner<Endpoint>::Type; usingEnforcement=bound_type_t<Bindings,EnforcementOf<Specification>>; ifconstexpr(std::same_as<Endpoint,GeneratedCoordinateOf<Specification>>) { returnstd::type_identity<typenameEnforcement::Coordinate>{}; } else { returnstd::type_identity<typenameEnforcement::Constraint>{}; } } elseifconstexpr(BindingsWithBinding<Bindings,Endpoint>) { returnstd::type_identity<bound_type_t<Bindings,Endpoint>>{}; } else { returnstd::type_identity<Endpoint>{}; } } template<typenameOwner,typenameEndpoint,typenameBindings> usingResolvedEndpoint=typenamedecltype(resolved_endpoint<Owner, Endpoint, Bindings>())::type; template<typenameModel,typenameEndpoint> [[nodiscard]]constevalboolendpoint_owner_present() { ifconstexpr(requires{typenameEndpoint::SpecificationType;}) { returnModel::templatecontains_specification<typenameEndpoint::SpecificationType>&&DimensionalScalarSpecification<typenameEndpoint::SpecificationType>; } returntrue; } template<typenameOwner,typenameEndpoints,typenameBindings> structResolvedEndpoints; template<typenameOwner,typename...Endpoints,typenameBindings> structResolvedEndpoints<Owner,utils::types::TypeList<Endpoints...>,Bindings> { usingKeys=utils::dependencies::CombinedKeyList<utils::dependencies::KeyList<ResolvedEndpoint<Owner, Endpoints, Bindings>>...>; template<typenameModel> staticconstexprboolowners_present=(endpoint_owner_present<Model, Endpoints>()&&...); }; template<typenameSpecification,typenameBindings,bool=utils::dependencies::BindingsWithBinding<Bindings,EnforcementOf<Specification>>> structEnforcementDependencies { usingType=typenameSpecification::ModelDefinition; }; template<typenameSpecification,typenameBindings> structEnforcementDependencies<Specification,Bindings,true> { usingType=utils::dependencies::bound_type_t<Bindings, EnforcementOf<Specification>>; }; template<DimensionalScalarSpecificationSpecification,typenameBindings> structResolvedSpecification { usingCoordinate=ResolvedEndpoint<Specification, GeneratedCoordinateOf<Specification>,Bindings>; usingConstraint=ResolvedEndpoint<Specification, ConstraintOf<Specification>,Bindings>; usingEnforcement=typenameEnforcementDependencies<Specification, Bindings>::Type; usingReads=ResolvedEndpoints<Specification, typename Enforcement::DependsOn, Bindings>; usingChanges=ResolvedEndpoints<Specification, typename Enforcement::Affects, Bindings>; }; }