summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qdatetime.cpp55
-rw-r--r--src/corelib/tools/qdatetime.h2
-rw-r--r--src/corelib/tools/qdatetime_p.h14
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h1
-rw-r--r--src/corelib/tools/qstringalgorithms_p.h2
5 files changed, 38 insertions, 36 deletions
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index eeefea8137..e5fbf5af5e 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -2607,7 +2607,6 @@ QDateTimePrivate::QDateTimePrivate(const QDate &toDate, const QTime &toTime,
void QDateTimePrivate::setTimeSpec(Qt::TimeSpec spec, int offsetSeconds)
{
clearValidDateTime();
- clearTimeZoneCached();
clearSetToDaylightStatus();
#ifndef QT_BOOTSTRAPPED
@@ -2707,27 +2706,44 @@ QDateTimePrivate::DaylightStatus QDateTimePrivate::daylightStatus() const
return UnknownDaylightTime;
}
+qint64 QDateTimePrivate::toMSecsSinceEpoch() const
+{
+ switch (m_spec) {
+ case Qt::OffsetFromUTC:
+ case Qt::UTC:
+ return (m_msecs - (m_offsetFromUtc * 1000));
+
+ case Qt::LocalTime:
+ // recalculate the local timezone
+ return localMSecsToEpochMSecs(m_msecs);
+
+ case Qt::TimeZone:
+#ifndef QT_BOOTSTRAPPED
+ return zoneMSecsToEpochMSecs(m_msecs, m_timeZone);
+#endif
+ break;
+ }
+ Q_UNREACHABLE();
+ return 0;
+}
+
// Check the UTC / offsetFromUTC validity
void QDateTimePrivate::checkValidDateTime()
{
switch (m_spec) {
case Qt::OffsetFromUTC:
case Qt::UTC:
+ // for these, a valid date and a valid time imply a valid QDateTime
if (isValidDate() && isValidTime())
setValidDateTime();
else
clearValidDateTime();
break;
case Qt::TimeZone:
- // Defer checking until required as can be expensive
- clearValidDateTime();
- clearTimeZoneCached();
- m_offsetFromUtc = 0;
- break;
case Qt::LocalTime:
- // Defer checking until required as can be expensive
- clearValidDateTime();
- m_offsetFromUtc = 0;
+ // for these, we need to check whether the timezone is valid and whether
+ // the time is valid in that timezone. Expensive, but no other option.
+ refreshDateTime();
break;
}
}
@@ -2741,12 +2757,6 @@ void QDateTimePrivate::refreshDateTime()
// Always set by setDateTime so just return
return;
case Qt::TimeZone:
- // If already cached then don't need to refresh as tz won't change
- if (isTimeZoneCached())
- return;
- // Flag that will have a cached result after calculations
- setTimeZoneCached();
- break;
case Qt::LocalTime:
break;
}
@@ -3082,7 +3092,6 @@ bool QDateTime::isNull() const
bool QDateTime::isValid() const
{
- d->refreshDateTime();
return (d->isValidDateTime());
}
@@ -3143,13 +3152,11 @@ Qt::TimeSpec QDateTime::timeSpec() const
QTimeZone QDateTime::timeZone() const
{
switch (d->m_spec) {
- case Qt::OffsetFromUTC:
- if (!d->m_timeZone.isValid())
- d->m_timeZone = QTimeZone(d->m_offsetFromUtc);
- return d->m_timeZone;
case Qt::UTC:
return QTimeZone::utc();
+ case Qt::OffsetFromUTC:
case Qt::TimeZone:
+ Q_ASSERT(d->m_timeZone.isValid());
return d->m_timeZone;
case Qt::LocalTime:
return QTimeZone::systemTimeZone();
@@ -3178,7 +3185,6 @@ QTimeZone QDateTime::timeZone() const
int QDateTime::offsetFromUtc() const
{
- d->refreshDateTime();
return d->m_offsetFromUtc;
}
@@ -3350,7 +3356,7 @@ void QDateTime::setTimeZone(const QTimeZone &toZone)
d->m_spec = Qt::TimeZone;
d->m_offsetFromUtc = 0;
d->m_timeZone = toZone;
- d->m_status = d->m_status & ~QDateTimePrivate::ValidDateTime & ~QDateTimePrivate::TimeZoneCached;
+ d->refreshDateTime();
}
#endif // QT_BOOTSTRAPPED
@@ -3371,7 +3377,6 @@ void QDateTime::setTimeZone(const QTimeZone &toZone)
*/
qint64 QDateTime::toMSecsSinceEpoch() const
{
- d->refreshDateTime();
return d->toMSecsSinceEpoch();
}
@@ -3453,8 +3458,8 @@ void QDateTime::setMSecsSinceEpoch(qint64 msecs)
d->m_status = d->m_status
| QDateTimePrivate::ValidDate
| QDateTimePrivate::ValidTime
- | QDateTimePrivate::ValidDateTime
- | QDateTimePrivate::TimeZoneCached;
+ | QDateTimePrivate::ValidDateTime;
+ d->refreshDateTime();
#endif // QT_BOOTSTRAPPED
break;
case Qt::LocalTime: {
diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h
index 784aced71a..88288872df 100644
--- a/src/corelib/tools/qdatetime.h
+++ b/src/corelib/tools/qdatetime.h
@@ -326,7 +326,7 @@ private:
// ### Qt6: Using a private here has high impact on runtime
// on users such as QFileInfo. In Qt 6, the data members
// should be inlined.
- QExplicitlySharedDataPointer<QDateTimePrivate> d;
+ QSharedDataPointer<QDateTimePrivate> d;
#ifndef QT_NO_DATASTREAM
friend Q_CORE_EXPORT QDataStream &operator<<(QDataStream &, const QDateTime &);
diff --git a/src/corelib/tools/qdatetime_p.h b/src/corelib/tools/qdatetime_p.h
index a139390a9d..b8934f7f70 100644
--- a/src/corelib/tools/qdatetime_p.h
+++ b/src/corelib/tools/qdatetime_p.h
@@ -79,10 +79,9 @@ public:
enum StatusFlag {
NullDate = 0x01,
NullTime = 0x02,
- ValidDate = 0x04,
- ValidTime = 0x08,
- ValidDateTime = 0x10,
- TimeZoneCached = 0x20,
+ ValidDate = 0x04, // just the date field
+ ValidTime = 0x08, // just the time field
+ ValidDateTime = 0x10, // the whole object (including timezone)
SetToStandardTime = 0x40,
SetToDaylightTime = 0x80
};
@@ -120,7 +119,7 @@ public:
DaylightStatus daylightStatus() const;
// Returns msecs since epoch, assumes offset value is current
- inline qint64 toMSecsSinceEpoch() const { return (m_msecs - (m_offsetFromUtc * 1000)); }
+ inline qint64 toMSecsSinceEpoch() const;
void checkValidDateTime();
void refreshDateTime();
@@ -133,14 +132,11 @@ public:
inline bool isValidDateTime() const { return m_status & ValidDateTime; }
inline void setValidDateTime() { m_status |= ValidDateTime; }
inline void clearValidDateTime() { m_status &= ~ValidDateTime; }
- inline bool isTimeZoneCached() const { return m_status & TimeZoneCached; }
- inline void setTimeZoneCached() { m_status |= TimeZoneCached; }
- inline void clearTimeZoneCached() { m_status &= ~TimeZoneCached; }
inline void clearSetToDaylightStatus() { m_status &= ~(SetToStandardTime | SetToDaylightTime); }
#ifndef QT_BOOTSTRAPPED
static qint64 zoneMSecsToEpochMSecs(qint64 msecs, const QTimeZone &zone,
- QDate *localDate, QTime *localTime);
+ QDate *localDate = 0, QTime *localTime = 0);
#endif // QT_BOOTSTRAPPED
static inline qint64 minJd() { return QDate::minJd(); }
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index 8cccc83e9d..9e6b48a97d 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -247,6 +247,7 @@ namespace QtSharedPointer {
ExternalRefCountWithContiguousData *that =
static_cast<ExternalRefCountWithContiguousData *>(self);
that->data.~T();
+ Q_UNUSED(that); // MSVC warns if T has a trivial destructor
}
static void safetyCheckDeleter(ExternalRefCountData *self)
{
diff --git a/src/corelib/tools/qstringalgorithms_p.h b/src/corelib/tools/qstringalgorithms_p.h
index 1481b194eb..b4be5c7ec7 100644
--- a/src/corelib/tools/qstringalgorithms_p.h
+++ b/src/corelib/tools/qstringalgorithms_p.h
@@ -114,7 +114,7 @@ template <typename StringType> struct QStringAlgorithms
return str;
const Char *src = str.cbegin();
const Char *end = str.cend();
- NakedStringType result = isConst ?
+ NakedStringType result = isConst || !str.isDetached() ?
StringType(str.size(), Qt::Uninitialized) :
qMove(str);