658 bool hasBaseYear)
noexcept
661 SupportType support = SupportType::HasStrays;
662 SupportType zone = SupportType::None;
665 for (
const TemporalField &field : range) {
666 const DateTimePart part = field.part();
668 case DateTimePart::None:
670 case DateTimePart::Date:
671 date.setBit(quint8(field.category) - 64);
673 case DateTimePart::Time:
674 time.setBit(quint8(field.category) - 16);
676 case DateTimePart::Zone:
677 if (field.options.testAnyFlags(TemporalFieldFlag::Wide | TemporalFieldFlag::Short)
678 || field.options.testAnyFlags(TemporalFieldFlag::Numeric
679 | TemporalFieldFlag::Standalone
680 | TemporalFieldFlag::Iso8601)) {
681 zone = SupportType::Clear;
682 }
else if (zone == SupportType::None) {
684 zone = SupportType::Partial;
688 if (!wanted.testFlag(part))
692 bool partsSeen = wanted.testFlag(DateTimePart::Zone);
693 support = partsSeen ? zone : SupportType::None;
695 constexpr auto join = [](SupportType lhs, SupportType rhs) -> SupportType {
696 Q_PRE(lhs != SupportType::HasStrays);
697 Q_PRE(rhs != SupportType::HasStrays);
703 return SupportType::Partial;
706 if (wanted.testFlag(DateTimePart::Date)) {
707 const SupportType hasDate = [=]() {
708 constexpr auto bitFor = [](TemporalFieldCategory cat) {
709 return quint8(cat) - 64;
711#define CHECK(field) date.testBit(bitFor(TemporalFieldCategory::field))
714 bool partial =
false;
717 }
else if (
CHECK(YearWithinCentury)) {
732 if (
CHECK(DayOfMonth))
734 else if (
CHECK(DayOfWeek))
737 if (fields == 3 && !partial)
738 return SupportType::Clear;
739 if (fields || partial)
740 return SupportType::Partial;
741 return SupportType::None;
743 support = partsSeen ? join(support, hasDate) : hasDate;
747 if (wanted.testFlag(DateTimePart::Time)) {
748 const SupportType hasTime = [=]() {
749 constexpr auto bitFor = [](TemporalFieldCategory cat) {
750 return quint8(cat) - 16;
752#define CHECK(field) time.testBit(bitFor(TemporalFieldCategory::field))
755 bool partial =
false;
758 }
else if (
CHECK(HourMod12)) {
759 if (
CHECK(PeriodInDay))
763 }
else if (
CHECK(PeriodInDay)) {
771 partial = fields < 2;
772 else if (
CHECK(SecondFraction))
775 if (fields == 2 && !partial)
776 return SupportType::Clear;
777 if (fields || partial)
778 return SupportType::Partial;
779 return SupportType::None;
781 support = partsSeen ? join(support, hasTime) : hasTime;
785 Q_ASSERT(partsSeen || support == SupportType::None);