validator.hpp cstddef serif/discretization/domain/mesh/topology.hpp serif/discretization/domain/relation/concepts.hpp serif/discretization/domain/relation/lists/relation_list.hpp serif/discretization/domain/relation/validation/runtime.hpp serif/discretization/domain/schema/concepts.hpp serif/discretization/domain/schema/validation/results.hpp src/include/serif/discretization/domain/schema/validation/all.hpp src/include/serif/discretization/domain/schema/validation/boundary.hpp src/include/serif/discretization/domain/schema/validation/connected.hpp src/include/serif/discretization/domain/schema/validation/inscribed.hpp serif::discretization::domain::schema::validation::SchemaRelationValidator< SchemaT, relation::lists::RelationList< RelationTs... > > serif serif::discretization serif::discretization::domain serif::discretization::domain::schema serif::discretization::domain::schema::validation File containing the primary RelationValidator template, plus the fold that runs one validator per declared relation. Emily M. Boudreaux Every relation kind is validated by an explicit specialization of RelationValidator, and those specializations live in sibling headers (inscribed.hpp, connected.hpp, boundary.hpp). Under headers, instantiating SchemaRelationValidator in a translation unit that has not yet seen all of those specializations is ill-formed with no diagnostic required. That is why validate_schema lives in all.hpp, which includes this header and every specialization. Include all.hpp, not this header, to validate a mesh. #pragmaonce #include<cstddef> #include"serif/discretization/domain/mesh/topology.hpp" #include"serif/discretization/domain/relation/concepts.hpp" #include"serif/discretization/domain/relation/lists/relation_list.hpp" #include"serif/discretization/domain/relation/validation/runtime.hpp" #include"serif/discretization/domain/schema/concepts.hpp" #include"serif/discretization/domain/schema/validation/results.hpp" namespaceserif::discretization::domain::schema::validation{ usingrelation::IsRelation; template<IsRelationRelationT> structRelationValidator; template<IsSchemaSchemaT,typenameRelationListT> structSchemaRelationValidator; template<IsSchemaSchemaT,IsRelation...RelationTs> structSchemaRelationValidator<SchemaT,relation::lists::RelationList<RelationTs...>>{ [[nodiscard]]staticSchemaValidationResultvalidate(constmesh::MeshTopology&topology){ SchemaValidationResultschemaResult; schemaResult.relationResults.reserve(sizeof...(RelationTs)); std::size_trelationIndex=0; (schemaResult.relationResults.push_back(SchemaRelationValidationResult{ .relationIndex=relationIndex++, .relationName=RelationTs::name, .result=RelationValidator<RelationTs>::templatevalidate<SchemaT>(topology) }),...);//Foldovertheparameterpackofrelations,runningonevalidatorperrelation. returnschemaResult; } }; }