diff --git a/src/corelib/kernel/qdeadlinetimer.h b/src/corelib/kernel/qdeadlinetimer.h index 11868e5e5c..37111215a1 100644 --- a/src/corelib/kernel/qdeadlinetimer.h +++ b/src/corelib/kernel/qdeadlinetimer.h @@ -91,16 +91,11 @@ public: { setDeadline(deadline_); return *this; } template - void setDeadline(std::chrono::time_point deadline_, - Qt::TimerType type_ = Qt::CoarseTimer) - { setRemainingTime(deadline_ == deadline_.max() ? Duration::max() : deadline_ - Clock::now(), type_); } + void setDeadline(std::chrono::time_point tp, + Qt::TimerType type_ = Qt::CoarseTimer); template - std::chrono::time_point deadline() const - { - auto val = std::chrono::nanoseconds(rawRemainingTimeNSecs()) + Clock::now(); - return std::chrono::time_point_cast(val); - } + std::chrono::time_point deadline() const; template QDeadlineTimer(std::chrono::duration remaining, Qt::TimerType type_ = Qt::CoarseTimer) @@ -148,26 +143,32 @@ private: qint64 rawRemainingTimeNSecs() const noexcept; }; -template <> inline std::chrono::steady_clock::time_point -QDeadlineTimer::deadline() const +template +std::chrono::time_point QDeadlineTimer::deadline() const { - return std::chrono::steady_clock::time_point(std::chrono::nanoseconds(deadlineNSecs())); + using namespace std::chrono; + if constexpr (std::is_same_v) { + auto val = duration_cast(nanoseconds(deadlineNSecs())); + return time_point(val); + } else { + auto val = nanoseconds(rawRemainingTimeNSecs()) + Clock::now(); + return time_point_cast(val); + } } -template <> inline void -QDeadlineTimer::setDeadline(std::chrono::steady_clock::time_point tp, Qt::TimerType type_) +template +void QDeadlineTimer::setDeadline(std::chrono::time_point tp, Qt::TimerType type_) { using namespace std::chrono; if (tp == tp.max()) { *this = Forever; type = type_; - } else if (type_ != Qt::PreciseTimer) { - // if we aren't using PreciseTimer, then we need to convert - setPreciseRemainingTime(0, duration_cast(tp - steady_clock::now()).count(), type_); - } else { + } else if constexpr (std::is_same_v) { setPreciseDeadline(0, duration_cast(tp.time_since_epoch()).count(), type_); + } else { + setPreciseRemainingTime(0, duration_cast(tp - Clock::now()).count(), type_); } } diff --git a/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp b/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp index 2627d6beca..ab8adfc75b 100644 --- a/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp +++ b/tests/auto/corelib/kernel/qdeadlinetimer/tst_qdeadlinetimer.cpp @@ -679,6 +679,14 @@ void tst_QDeadlineTimer::stdchrono() QCOMPARE_LT(deadline.deadline(), (steady_clock::now() + 5ms * minResolution)); QCOMPARE_GT(deadline.deadline(), (system_clock::now() + 3ms * minResolution)); QCOMPARE_LT(deadline.deadline(), (system_clock::now() + 5ms * minResolution)); + QCOMPARE_GT((deadline.deadline()), + steady_clock::now() + 3ms * minResolution); + QCOMPARE_LT((deadline.deadline()), + steady_clock::now() + 5ms * minResolution); + QCOMPARE_GT((deadline.deadline()), + system_clock::now() + 3ms * minResolution); + QCOMPARE_LT((deadline.deadline()), + system_clock::now() + 5ms * minResolution); if (timerType == Qt::CoarseTimer) { QCOMPARE_GT(deadline, now + 3ms * minResolution); QCOMPARE_LT(deadline, now + 5ms * minResolution);