diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2023-04-26 20:43:24 +0200 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2023-05-04 14:06:07 +0200 |
commit | 4c93b9c1d082842f2279869d9f289dad19155453 (patch) | |
tree | 333a7ccd058d84bf1a8964b1960cd52e301d08e7 /src/corelib/time/qdatetime.cpp | |
parent | 22909abeaec11c89b93cf45ec39bf62a9f9d9290 (diff) |
Refactor QGregorianCalendar::julianFromParts to return std::optional
It's a private static used to optimize internal use, so we can freely
get rid of its out parameter this way.
Change-Id: Id62612987f10ecbbd9702610fd172286adbfd442
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/time/qdatetime.cpp')
-rw-r--r-- | src/corelib/time/qdatetime.cpp | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index 59da4cb730..55c9f120a1 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -63,9 +63,9 @@ static inline QDate fixedDate(QCalendar::YearMonthDay parts) { if (parts.year) { parts.day = qMin(parts.day, QGregorianCalendar::monthLength(parts.month, parts.year)); - qint64 jd; - if (QGregorianCalendar::julianFromParts(parts.year, parts.month, parts.day, &jd)) - return QDate::fromJulianDay(jd); + const auto jd = QGregorianCalendar::julianFromParts(parts.year, parts.month, parts.day); + if (jd) + return QDate::fromJulianDay(*jd); } return QDate(); } @@ -437,9 +437,7 @@ QDate::QDate(int y, int m, int d) { static_assert(QDate::maxJd() == JulianDayMax); static_assert(QDate::minJd() == JulianDayMin); - - if (!QGregorianCalendar::julianFromParts(y, m, d, &jd)) - jd = nullJd(); + jd = QGregorianCalendar::julianFromParts(y, m, d).value_or(nullJd()); } QDate::QDate(int y, int m, int d, QCalendar cal) @@ -698,9 +696,8 @@ int QDate::dayOfYear(QCalendar cal) const int QDate::dayOfYear() const { if (isValid()) { - qint64 first; - if (QGregorianCalendar::julianFromParts(year(), 1, 1, &first)) - return jd - first + 1; + if (const auto first = QGregorianCalendar::julianFromParts(year(), 1, 1)) + return jd - *first + 1; } return 0; } @@ -1303,11 +1300,9 @@ QString QDate::toString(QStringView format, QCalendar cal) const */ bool QDate::setDate(int year, int month, int day) { - if (QGregorianCalendar::julianFromParts(year, month, day, &jd)) - return true; - - jd = nullJd(); - return false; + const auto maybe = QGregorianCalendar::julianFromParts(year, month, day); + jd = maybe.value_or(nullJd()); + return bool(maybe); } /*! @@ -2698,10 +2693,11 @@ QDateTimePrivate::ZoneState QDateTimePrivate::expressUtcAsLocal(qint64 utcMSecs) // dates might be right, and adjust by the number of days that was off: const qint64 jd = msecsToJulianDay(utcMSecs); const auto ymd = QGregorianCalendar::partsFromJulian(jd); - qint64 fakeJd, diffMillis, fakeUtc; - if (Q_UNLIKELY(!QGregorianCalendar::julianFromParts(systemTimeYearMatching(ymd.year), - ymd.month, ymd.day, &fakeJd) - || mul_overflow(jd - fakeJd, std::integral_constant<qint64, MSECS_PER_DAY>(), + qint64 diffMillis, fakeUtc; + const auto fakeJd = QGregorianCalendar::julianFromParts(systemTimeYearMatching(ymd.year), + ymd.month, ymd.day); + if (Q_UNLIKELY(!fakeJd + || mul_overflow(jd - *fakeJd, std::integral_constant<qint64, MSECS_PER_DAY>(), &diffMillis) || sub_overflow(utcMSecs, diffMillis, &fakeUtc))) { return result; @@ -2724,11 +2720,11 @@ static auto millisToWithinRange(qint64 millis) qint64 shifted = 0; bool good = false; } result; - qint64 jd = msecsToJulianDay(millis), fakeJd; + qint64 jd = msecsToJulianDay(millis); auto ymd = QGregorianCalendar::partsFromJulian(jd); - result.good = QGregorianCalendar::julianFromParts(systemTimeYearMatching(ymd.year), - ymd.month, ymd.day, &fakeJd) - && !daysAndMillisOverflow(fakeJd - jd, millis, &result.shifted); + const auto fakeJd = QGregorianCalendar::julianFromParts(systemTimeYearMatching(ymd.year), + ymd.month, ymd.day); + result.good = fakeJd && !daysAndMillisOverflow(*fakeJd - jd, millis, &result.shifted); return result; } |