diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2023-01-16 16:58:27 +0100 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2023-01-19 17:57:04 +0100 |
commit | 2d7b9b02e991aecb51a27467f577b07563fd0e15 (patch) | |
tree | 71c766f66121385712cc27a96e9ceb35d4e90661 | |
parent | 5c40cb0f1a8fad03edb3ef0f97df15e9dd643bdf (diff) |
QRoundingDown: make the numerator a template parameter
It's always a constexpr (or static const that could be constexpr; fix
the cases of this while I'm here) or an integer literal, so we can, so
we might as well.
Change-Id: I61e9bcdb27f4a05f011ccce16b5f15d0dade0782
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
-rw-r--r-- | src/corelib/time/qcalendar.cpp | 2 | ||||
-rw-r--r-- | src/corelib/time/qcalendarmath_p.h | 6 | ||||
-rw-r--r-- | src/corelib/time/qdatetime.cpp | 8 | ||||
-rw-r--r-- | src/corelib/time/qgregoriancalendar.cpp | 24 | ||||
-rw-r--r-- | src/corelib/time/qislamiccivilcalendar.cpp | 16 | ||||
-rw-r--r-- | src/corelib/time/qjalalicalendar.cpp | 14 | ||||
-rw-r--r-- | src/corelib/time/qjuliancalendar.cpp | 16 | ||||
-rw-r--r-- | src/corelib/time/qlocaltime.cpp | 8 | ||||
-rw-r--r-- | src/corelib/time/qmilankoviccalendar.cpp | 30 |
9 files changed, 62 insertions, 62 deletions
diff --git a/src/corelib/time/qcalendar.cpp b/src/corelib/time/qcalendar.cpp index a355df2100..a6801fe725 100644 --- a/src/corelib/time/qcalendar.cpp +++ b/src/corelib/time/qcalendar.cpp @@ -867,7 +867,7 @@ int QCalendarBackend::maximumMonthsInYear() const */ int QCalendarBackend::dayOfWeek(qint64 jd) const { - return QRoundingDown::qMod(jd, 7) + 1; + return QRoundingDown::qMod<7>(jd) + 1; } // Month and week-day name look-ups (implemented in qlocale.cpp): diff --git a/src/corelib/time/qcalendarmath_p.h b/src/corelib/time/qcalendarmath_p.h index 885f5faba8..87609373df 100644 --- a/src/corelib/time/qcalendarmath_p.h +++ b/src/corelib/time/qcalendarmath_p.h @@ -35,11 +35,11 @@ namespace QRoundingDown { when that subtraction would underflow. */ -template<typename Int> constexpr Int qDiv(Int a, unsigned b) +template<unsigned b, typename Int> constexpr Int qDiv(Int a) { return a < 0 ? (a + 1) / int(b) - 1 : a / int(b); } -template<typename Int> constexpr Int qMod(Int a, unsigned b) -{ return a - qDiv(a, b) * b; } +template<unsigned b, typename Int> constexpr Int qMod(Int a) +{ return a - qDiv<b>(a) * b; } } // QRoundingDown diff --git a/src/corelib/time/qdatetime.cpp b/src/corelib/time/qdatetime.cpp index f6e7c511cb..098b47e31a 100644 --- a/src/corelib/time/qdatetime.cpp +++ b/src/corelib/time/qdatetime.cpp @@ -2139,7 +2139,7 @@ QTime QTime::addMSecs(int ms) const { QTime t; if (isValid()) - t.mds = QRoundingDown::qMod(ds() + ms, MSECS_PER_DAY); + t.mds = QRoundingDown::qMod<MSECS_PER_DAY>(ds() + ms); return t; } @@ -2507,7 +2507,7 @@ typedef QDateTimePrivate::QDateTimeData QDateTimeData; // Converts milliseconds since the start of 1970 into a date and/or time: static qint64 msecsToJulianDay(qint64 msecs) { - return JULIAN_DAY_FOR_EPOCH + QRoundingDown::qDiv(msecs, MSECS_PER_DAY); + return JULIAN_DAY_FOR_EPOCH + QRoundingDown::qDiv<MSECS_PER_DAY>(msecs); } static QDate msecsToDate(qint64 msecs) @@ -2517,7 +2517,7 @@ static QDate msecsToDate(qint64 msecs) static QTime msecsToTime(qint64 msecs) { - return QTime::fromMSecsSinceStartOfDay(QRoundingDown::qMod(msecs, MSECS_PER_DAY)); + return QTime::fromMSecsSinceStartOfDay(QRoundingDown::qMod<MSECS_PER_DAY>(msecs)); } // True if combining days with millis overflows; otherwise, stores result in *sumMillis @@ -3053,7 +3053,7 @@ static QPair<QDate, QTime> getDateTime(const QDateTimeData &d) { auto status = getStatus(d); const qint64 msecs = getMSecs(d); - const qint64 days = QRoundingDown::qDiv(msecs, MSECS_PER_DAY); + const qint64 days = QRoundingDown::qDiv<MSECS_PER_DAY>(msecs); return { status.testFlag(QDateTimePrivate::ValidDate) ? QDate::fromJulianDay(JULIAN_DAY_FOR_EPOCH + days) : QDate(), diff --git a/src/corelib/time/qgregoriancalendar.cpp b/src/corelib/time/qgregoriancalendar.cpp index dc5a677f56..7151feeb04 100644 --- a/src/corelib/time/qgregoriancalendar.cpp +++ b/src/corelib/time/qgregoriancalendar.cpp @@ -73,7 +73,7 @@ bool QGregorianCalendar::validParts(int year, int month, int day) int QGregorianCalendar::weekDayOfJulian(qint64 jd) { - return qMod(jd, 7) + 1; + return qMod<7>(jd) + 1; } bool QGregorianCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) const @@ -98,8 +98,8 @@ bool QGregorianCalendar::julianFromParts(int year, int month, int day, qint64 *j int a = month < 3 ? 1 : 0; qint64 y = qint64(year) + 4800 - a; int m = month + 12 * a - 3; - *jd = day + qDiv(153 * m + 2, 5) - 32045 - + 365 * y + qDiv(y, 4) - qDiv(y, 100) + qDiv(y, 400); + *jd = day + qDiv<5>(153 * m + 2) - 32045 + + 365 * y + qDiv<4>(y) - qDiv<100>(y) + qDiv<400>(y); return true; } @@ -107,7 +107,7 @@ int QGregorianCalendar::yearStartWeekDay(int year) { // Equivalent to weekDayOfJulian(julianForParts({year, 1, 1}) const int y = year - (year < 0 ? 800 : 801); - return qMod(y + qDiv(y, 4) - qDiv(y, 100) + qDiv(y, 400), 7) + 1; + return qMod<7>(y + qDiv<4>(y) - qDiv<100>(y) + qDiv<400>(y)) + 1; } int QGregorianCalendar::yearSharingWeekDays(QDate date) @@ -169,19 +169,19 @@ QCalendar::YearMonthDay QGregorianCalendar::partsFromJulian(qint64 jd) * division (round to negative infinity), not c++11 integer division (round to zero) */ qint64 a = jd + 32044; - qint64 b = qDiv(4 * a + 3, 146097); - int c = a - qDiv(146097 * b, 4); + qint64 b = qDiv<146097>(4 * a + 3); + int c = a - qDiv<4>(146097 * b); - int d = qDiv(4 * c + 3, 1461); - int e = c - qDiv(1461 * d, 4); - int m = qDiv(5 * e + 2, 153); + int d = qDiv<1461>(4 * c + 3); + int e = c - qDiv<4>(1461 * d); + int m = qDiv<153>(5 * e + 2); - int y = 100 * b + d - 4800 + qDiv(m, 10); + int y = 100 * b + d - 4800 + qDiv<10>(m); // Adjust for no year 0 int year = y > 0 ? y : y - 1; - int month = m + 3 - 12 * qDiv(m, 10); - int day = e - qDiv(153 * m + 2, 5) + 1; + int month = m + 3 - 12 * qDiv<10>(m); + int day = e - qDiv<5>(153 * m + 2) + 1; return QCalendar::YearMonthDay(year, month, day); } diff --git a/src/corelib/time/qislamiccivilcalendar.cpp b/src/corelib/time/qislamiccivilcalendar.cpp index 238544105f..96b73dcd43 100644 --- a/src/corelib/time/qislamiccivilcalendar.cpp +++ b/src/corelib/time/qislamiccivilcalendar.cpp @@ -58,7 +58,7 @@ bool QIslamicCivilCalendar::isLeapYear(int year) const return false; if (year < 0) ++year; - return qMod(year * 11 + 14, 30) < 11; + return qMod<30>(year * 11 + 14) < 11; } bool QIslamicCivilCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) const @@ -68,20 +68,20 @@ bool QIslamicCivilCalendar::dateToJulianDay(int year, int month, int day, qint64 return false; if (year <= 0) ++year; - *jd = qDiv(10631 * year - 10617, 30) - + qDiv(325 * month - 320, 11) + *jd = qDiv<30>(10631 * year - 10617) + + qDiv<11>(325 * month - 320) + day + 1948439; return true; } QCalendar::YearMonthDay QIslamicCivilCalendar::julianDayToDate(qint64 jd) const { - const qint64 epoch = 1948440; + constexpr qint64 epoch = 1948440; const int32_t k2 = 30 * (jd - epoch) + 15; - const int32_t k1 = 11 * qDiv(qMod(k2, 10631), 30) + 5; - int y = qDiv(k2, 10631) + 1; - const int month = qDiv(k1, 325) + 1; - const int day = qDiv(qMod(k1, 325), 11) + 1; + const int32_t k1 = 11 * qDiv<30>(qMod<10631>(k2)) + 5; + int y = qDiv<10631>(k2) + 1; + const int month = qDiv<325>(k1) + 1; + const int day = qDiv<11>(qMod<325>(k1)) + 1; return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day); } diff --git a/src/corelib/time/qjalalicalendar.cpp b/src/corelib/time/qjalalicalendar.cpp index 3bc38ec1b5..0b51211d15 100644 --- a/src/corelib/time/qjalalicalendar.cpp +++ b/src/corelib/time/qjalalicalendar.cpp @@ -13,16 +13,16 @@ using namespace QRoundingDown; // Constants -static const qint64 cycleDays = 1029983; -static const int cycleYears = 2820; -static const double yearLength = 365.24219858156028368; // 365 + leapRatio; -static const qint64 jalaliEpoch = 2121446; // 475/01/01 AP, start of 2820 cycle +constexpr qint64 cycleDays = 1029983; +constexpr int cycleYears = 2820; +constexpr double yearLength = 365.24219858156028368; // 365 + leapRatio; +constexpr qint64 jalaliEpoch = 2121446; // 475/01/01 AP, start of 2820 cycle // Calendar implementation static inline int cycle(qint64 jdn) { - return qDiv(jdn - jalaliEpoch, cycleDays); + return qDiv<cycleDays>(jdn - jalaliEpoch); } qint64 cycleStart(int cycleNo) @@ -96,7 +96,7 @@ bool QJalaliCalendar::isLeapYear(int year) const return false; if (year < 0) year++; - return qMod((year + 2346) * 683, 2820) < 683; + return qMod<2820>((year + 2346) * 683) < 683; } bool QJalaliCalendar::isLunar() const @@ -121,7 +121,7 @@ bool QJalaliCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) return false; const int y = year - (year < 0 ? 474 : 475); - const int c = qDiv(y, cycleYears); + const int c = qDiv<cycleYears>(y); const int yearInCycle = y - c * cycleYears; int dayInYear = day; for (int i = 1; i < month; ++i) diff --git a/src/corelib/time/qjuliancalendar.cpp b/src/corelib/time/qjuliancalendar.cpp index 627c92c48a..e1ea27b3d5 100644 --- a/src/corelib/time/qjuliancalendar.cpp +++ b/src/corelib/time/qjuliancalendar.cpp @@ -54,7 +54,7 @@ bool QJulianCalendar::isLeapYear(int year) const if (year == QCalendar::Unspecified || !year) return false; - return qMod(year < 0 ? year + 1 : year, 4) == 0; + return qMod<4>(year < 0 ? year + 1 : year) == 0; } // Julian Day 0 was January the first in the proleptic Julian calendar's 4713 BC @@ -67,8 +67,8 @@ bool QJulianCalendar::dateToJulianDay(int year, int month, int day, qint64 *jd) if (year < 0) ++year; const qint64 c0 = month < 3 ? -1 : 0; - const qint64 j1 = qDiv(1461 * (year + c0), 4); - const qint64 j2 = qDiv(153 * month - 1836 * c0 - 457, 5); + const qint64 j1 = qDiv<4>(1461 * (year + c0)); + const qint64 j2 = qDiv<5>(153 * month - 1836 * c0 - 457); *jd = j1 + j2 + day + 1721117; return true; } @@ -77,12 +77,12 @@ QCalendar::YearMonthDay QJulianCalendar::julianDayToDate(qint64 jd) const { const qint64 y2 = jd - 1721118; const qint64 k2 = 4 * y2 + 3; - const qint64 k1 = 5 * qDiv(qMod(k2, 1461), 4) + 2; - const qint64 x1 = qDiv(k1, 153); - const qint64 c0 = qDiv(x1 + 2, 12); - const int y = qint16(qDiv(k2, 1461) + c0); + const qint64 k1 = 5 * qDiv<4>(qMod<1461>(k2)) + 2; + const qint64 x1 = qDiv<153>(k1); + const qint64 c0 = qDiv<12>(x1 + 2); + const int y = qint16(qDiv<1461>(k2) + c0); const int month = quint8(x1 - 12 * c0 + 3); - const int day = qDiv(qMod(k1, 153), 5) + 1; + const int day = qDiv<5>(qMod<153>(k1)) + 1; return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day); } diff --git a/src/corelib/time/qlocaltime.cpp b/src/corelib/time/qlocaltime.cpp index cd3c7e5120..9056695967 100644 --- a/src/corelib/time/qlocaltime.cpp +++ b/src/corelib/time/qlocaltime.cpp @@ -312,7 +312,7 @@ inline bool secondsAndMillisOverflow(qint64 epochSeconds, qint64 millis, qint64 // returns the local milliseconds, offset from UTC and DST status. QDateTimePrivate::ZoneState utcToLocal(qint64 utcMillis) { - const time_t epochSeconds = QRoundingDown::qDiv(utcMillis, MSECS_PER_SEC); + const time_t epochSeconds = QRoundingDown::qDiv<MSECS_PER_SEC>(utcMillis); const int msec = utcMillis - epochSeconds * MSECS_PER_SEC; Q_ASSERT(msec >= 0 && msec < MSECS_PER_SEC); if (qint64(epochSeconds) * MSECS_PER_SEC + msec != utcMillis) // time_t range too narrow @@ -341,7 +341,7 @@ QDateTimePrivate::ZoneState utcToLocal(qint64 utcMillis) QString localTimeAbbbreviationAt(qint64 local, QDateTimePrivate::DaylightStatus dst) { - const qint64 localDays = QRoundingDown::qDiv(local, MSECS_PER_DAY); + const qint64 localDays = QRoundingDown::qDiv<MSECS_PER_DAY>(local); qint64 millis = local - localDays * MSECS_PER_DAY; Q_ASSERT(0 <= millis && millis < MSECS_PER_DAY); // Definition of QRD::qDiv. struct tm tmLocal = timeToTm(localDays, int(millis / MSECS_PER_SEC), dst); @@ -356,7 +356,7 @@ QDateTimePrivate::ZoneState mapLocalTime(qint64 local, QDateTimePrivate::Dayligh { qint64 localSecs = local / MSECS_PER_SEC; qint64 millis = local - localSecs * MSECS_PER_SEC; // 0 or with same sign as local - const qint64 localDays = QRoundingDown::qDiv(localSecs, SECS_PER_DAY); + const qint64 localDays = QRoundingDown::qDiv<SECS_PER_DAY>(localSecs); qint64 daySecs = localSecs - localDays * SECS_PER_DAY; Q_ASSERT(0 <= daySecs && daySecs < SECS_PER_DAY); // Definition of QRD::qDiv. @@ -368,7 +368,7 @@ QDateTimePrivate::ZoneState mapLocalTime(qint64 local, QDateTimePrivate::Dayligh // TODO: for glibc, we could use tmLocal.tm_gmtoff // That would give us offset directly, hence localSecs = offset + utcSecs // Provisional offset, until we have a revised localSeconds: - int offset = QRoundingDown::qDiv(local, MSECS_PER_SEC) - utcSecs; + int offset = QRoundingDown::qDiv<MSECS_PER_SEC>(local) - utcSecs; dst = tmLocal.tm_isdst > 0 ? QDateTimePrivate::DaylightTime : QDateTimePrivate::StandardTime; qint64 jd; if (Q_UNLIKELY(!QGregorianCalendar::julianFromParts( diff --git a/src/corelib/time/qmilankoviccalendar.cpp b/src/corelib/time/qmilankoviccalendar.cpp index 6c72787e36..428b0169d4 100644 --- a/src/corelib/time/qmilankoviccalendar.cpp +++ b/src/corelib/time/qmilankoviccalendar.cpp @@ -53,10 +53,10 @@ bool QMilankovicCalendar::isLeapYear(int year) const return false; if (year <= 0) ++year; - if (qMod(year, 4)) + if (qMod<4>(year)) return false; - if (qMod(year, 100) == 0) { - const qint16 century = qMod(qDiv(year, 100), 9); + if (qMod<100>(year) == 0) { + const qint16 century = qMod<9>(qDiv<100>(year)); if (century != 2 && century != 6) return false; } @@ -73,11 +73,11 @@ bool QMilankovicCalendar::dateToJulianDay(int year, int month, int day, qint64 * const qint16 c0 = month < 3 ? -1 : 0; const qint16 x1 = month - 12 * c0 - 3; const qint16 x4 = year + c0; - const qint16 x3 = qDiv(x4, 100); - const qint16 x2 = qMod(x4, 100); - *jd = qDiv(328718 * x3 + 6, 9) - + qDiv(36525 * x2 , 100) - + qDiv(153 * x1 + 2 , 5) + const qint16 x3 = qDiv<100>(x4); + const qint16 x2 = qMod<100>(x4); + *jd = qDiv<9>(328718 * x3 + 6) + + qDiv<100>(36525 * x2) + + qDiv<5>(153 * x1 + 2) + day + 1721119; return true; } @@ -85,15 +85,15 @@ bool QMilankovicCalendar::dateToJulianDay(int year, int month, int day, qint64 * QCalendar::YearMonthDay QMilankovicCalendar::julianDayToDate(qint64 jd) const { const qint64 k3 = 9 * (jd - 1721120) + 2; - const qint64 x3 = qDiv(k3, 328718); - const qint64 k2 = 100 * qDiv(qMod(k3, 328718), 9) + 99; - const qint64 k1 = qDiv(qMod(k2, 36525), 100) * 5 + 2; - const qint64 x2 = qDiv(k2, 36525); - const qint64 x1 = qDiv(5 * qDiv(qMod(k2, 36525), 100) + 2, 153); - const qint64 c0 = qDiv(x1 + 2, 12); + const qint64 x3 = qDiv<328718>(k3); + const qint64 k2 = 100 * qDiv<9>(qMod<328718>(k3)) + 99; + const qint64 k1 = qDiv<100>(qMod<36525>(k2)) * 5 + 2; + const qint64 x2 = qDiv<36525>(k2); + const qint64 x1 = qDiv<153>(5 * qDiv<100>(qMod<36525>(k2)) + 2); + const qint64 c0 = qDiv<12>(x1 + 2); const int y = 100 * x3 + x2 + c0; const int month = x1 - 12 * c0 + 3; - const int day = qDiv(qMod(k1, 153), 5) + 1; + const int day = qDiv<5>(qMod<153>(k1)) + 1; return QCalendar::YearMonthDay(y > 0 ? y : y - 1, month, day); } |