concepts.hpp cstddef string_view span array format numeric serif/discretization/domain/types.hpp serif/utils/misc/std_helper/cleaning.hpp serif/utils/misc/std_helper/variadic_cleaning.hpp src/include/serif/backend/mfem/discretization/quadrature/mfem_resolver.hpp src/include/serif/backend/mfem/discretization/schema.hpp src/include/serif/discretization/blocks/fields.hpp src/include/serif/discretization/domain/ids/boundary.hpp src/include/serif/discretization/domain/ids/domain.hpp src/include/serif/discretization/domain/physical_domains.hpp src/include/serif/discretization/domain/relation/relations.hpp src/include/serif/discretization/domain/relation/validation/validation.hpp src/include/serif/discretization/domain/resolver.hpp src/include/serif/discretization/domain/schema/domain_schema.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::DomainSet serif::discretization::domain::DomainOrSet serif::discretization::domain::BoundarySet serif::discretization::domain::DomainOrSetList std::formatter< serif::discretization::domain::DomainOrSet > serif serif::discretization serif::discretization::domain File containing concepts for the domain module. These concepts are used to constrain template parameters in the domain module. Emily M. Boudreaux #pragmaonce #include<cstddef> #include<string_view> #include<span> #include<array> #include<format> #include<numeric> #include"serif/discretization/domain/types.hpp" #include"serif/utils/misc/std_helper/cleaning.hpp" #include"serif/utils/misc/std_helper/variadic_cleaning.hpp" namespaceserif::discretization::domain{ usingutils::misc::std_helper::AIsBaseClassOfB; usingutils::misc::std_helper::CountVariadicArguments; template<typenameT> conceptIsDomain=AIsBaseClassOfB<T, Domain>; template<typenameT> conceptIsBoundary=AIsBaseClassOfB<T, Boundary>; template<IsDomain...DomainTs> structDomainSet{ staticconstexprstd::size_tcount=CountVariadicArguments<DomainTs...>(); staticinlineconststd::array<std::string_view,count>names{DomainTs::name...}; }; classDomainOrSetfinal{ public: template<IsDomainDomainT> //ReSharperdisableonceCppNonExplicitConvertingConstructor constexprDomainOrSet(DomainT)noexcept:m_domains(&DomainT::name,1){} template<IsDomain...DomainTs> //ReSharperdisableonceCppNonExplicitConvertingConstructor constexprDomainOrSet(DomainSet<DomainTs...>)noexcept:m_domains(DomainSet<DomainTs...>::names){} [[nodiscard]]constexprstd::span<conststd::string_view>domains()constnoexcept{ returnm_domains; } private: std::span<conststd::string_view>m_domains; }; template<IsBoundary...BoundaryTs> structBoundarySet{ staticconstexprstd::size_tcount=CountVariadicArguments<BoundaryTs...>(); }; template<typenameT> constexprboolis_domain_set_v=false; template<IsDomain...DomainTs> constexprboolis_domain_set_v<DomainSet<DomainTs...>>=true; template<typenameT> conceptIsDomainSet=is_domain_set_v<T>; template<typenameT> conceptIsDomainOrSet=IsDomain<T>||IsDomainSet<T>; template<IsDomainOrSet...DomainTs> structDomainOrSetList{ staticconstexprstd::size_tcount=CountVariadicArguments<DomainTs...>(); }; template<typenameDomainT,typenameDomainIDT> conceptDomainIsIdentifiedBy=utils::misc::std_helper::SameType<DomainT, typename DomainIDT::domain_type>; template<typenameBoundaryT,typenameBoundaryIDT> conceptBoundaryIsIdentifiedBy=utils::misc::std_helper::SameType<BoundaryT, typename BoundaryIDT::boundary_type>; } template<> structstd::formatter<serif::discretization::domain::DomainOrSet>:std::formatter<std::string_view>{ template<typenameFormatContext> autoformat(constserif::discretization::domain::DomainOrSet&dos,FormatContext&ctx)const{ autojoin=[&](std::span<conststd::string_view>strings,std::string_viewdelimiter){ returnstd::accumulate( strings.begin(), strings.end(), std::string{}, [delimiter](std::stringacc,std::string_views){ if(!acc.empty()){ acc+=delimiter; } acc+=s; returnacc; } ); }; returnstd::formatter<std::string_view>::format(std::format("DomainOrSet(domains=[{}])",join(dos.domains(),",")),ctx); } };