659 bool hasBaseYear)
noexcept
662 SupportType support = SupportType::HasStrays;
663 SupportType zone = SupportType::None;
664 std::bitset<40> date;
665 std::bitset<24> time;
666 for (
const TemporalField &field : range) {
667 const DateTimePart part = field.part();
669 case DateTimePart::None:
671 case DateTimePart::Date:
672 date[quint8(field.category) - 64] =
true;
674 case DateTimePart::Time:
675 time[quint8(field.category) - 16] =
true;
677 case DateTimePart::Zone:
678 if (field.options.testAnyFlags(TemporalFieldFlag::Wide | TemporalFieldFlag::Short)
679 || field.options.testAnyFlags(TemporalFieldFlag::Numeric
680 | TemporalFieldFlag::Standalone
681 | TemporalFieldFlag::Iso8601)) {
682 zone = SupportType::Clear;
683 }
else if (zone == SupportType::None) {
685 zone = SupportType::Partial;
689 if (!wanted.testFlag(part))
693 bool partsSeen = wanted.testFlag(DateTimePart::Zone);
694 support = partsSeen ? zone : SupportType::None;
696 constexpr auto join = [](SupportType lhs, SupportType rhs) -> SupportType {
697 Q_PRE(lhs != SupportType::HasStrays);
698 Q_PRE(rhs != SupportType::HasStrays);
704 return SupportType::Partial;
707 if (wanted.testFlag(DateTimePart::Date)) {
708 const SupportType hasDate = [&] {
709 constexpr auto bitFor = [](TemporalFieldCategory cat) {
710 return quint8(cat) - 64;
712#define CHECK(field) (date[bitFor(TemporalFieldCategory::field)])
715 bool partial =
false;
718 }
else if (
CHECK(YearWithinCentury)) {
733 if (
CHECK(DayOfMonth))
735 else if (
CHECK(DayOfWeek))
738 if (fields == 3 && !partial)
739 return SupportType::Clear;
740 if (fields || partial)
741 return SupportType::Partial;
742 return SupportType::None;
744 support = partsSeen ? join(support, hasDate) : hasDate;
748 if (wanted.testFlag(DateTimePart::Time)) {
749 const SupportType hasTime = [&] {
750 constexpr auto bitFor = [](TemporalFieldCategory cat) {
751 return quint8(cat) - 16;
753#define CHECK(field) (time[bitFor(TemporalFieldCategory::field)])
756 bool partial =
false;
759 }
else if (
CHECK(HourMod12)) {
760 if (
CHECK(PeriodInDay))
764 }
else if (
CHECK(PeriodInDay)) {
772 partial = fields < 2;
773 else if (
CHECK(SecondFraction))
776 if (fields == 2 && !partial)
777 return SupportType::Clear;
778 if (fields || partial)
779 return SupportType::Partial;
780 return SupportType::None;
782 support = partsSeen ? join(support, hasTime) : hasTime;
786 Q_ASSERT(partsSeen || support == SupportType::None);