720 bool hasBaseYear)
noexcept
723 SupportType support = SupportType::HasStrays;
724 SupportType zone = SupportType::None;
725 EnumIndexedBitSet<TemporalFieldCategory, EndTemporalFieldCategories> categories;
726 for (
const TemporalField &field : range) {
727 const DateTimePart part = field.part();
729 case DateTimePart::None:
731 case DateTimePart::Date:
732 case DateTimePart::Time:
733 categories.set(field.category);
735 case DateTimePart::Zone:
736 if (field.options.testAnyFlags(TemporalFieldFlag::Wide | TemporalFieldFlag::Short)
737 || field.options.testAnyFlags(TemporalFieldFlag::Numeric
738 | TemporalFieldFlag::Standalone
739 | TemporalFieldFlag::Iso8601)) {
740 zone = SupportType::Clear;
741 }
else if (zone == SupportType::None) {
743 zone = SupportType::Partial;
747 if (!wanted.testFlag(part))
751 bool partsSeen = wanted.testFlag(DateTimePart::Zone);
752 support = partsSeen ? zone : SupportType::None;
754 constexpr auto join = [](SupportType lhs, SupportType rhs) -> SupportType {
755 Q_PRE(lhs != SupportType::HasStrays);
756 Q_PRE(rhs != SupportType::HasStrays);
762 return SupportType::Partial;
765#define CHECK(field) (categories.test(TemporalFieldCategory::field))
767 if (wanted.testFlag(DateTimePart::Date)) {
768 const SupportType hasDate = [&] {
771 bool partial =
false;
774 }
else if (
CHECK(YearWithinCentury)) {
789 if (
CHECK(DayOfMonth))
791 else if (
CHECK(DayOfWeek))
793 if (fields == 3 && !partial)
794 return SupportType::Clear;
795 if (fields || partial)
796 return SupportType::Partial;
797 return SupportType::None;
799 support = partsSeen ? join(support, hasDate) : hasDate;
803 if (wanted.testFlag(DateTimePart::Time)) {
804 const SupportType hasTime = [&] {
807 bool partial =
false;
810 }
else if (
CHECK(HourMod12)) {
811 if (
CHECK(PeriodInDay))
815 }
else if (
CHECK(PeriodInDay)) {
823 partial = fields < 2;
824 else if (
CHECK(SecondFraction))
826 if (fields == 2 && !partial)
827 return SupportType::Clear;
828 if (fields || partial)
829 return SupportType::Partial;
830 return SupportType::None;
832 support = partsSeen ? join(support, hasTime) : hasTime;
839 Q_ASSERT(partsSeen || support == SupportType::None);