Move the QDateTime file static functions to their right place
The file has an organization, so let's follow it. This commit has no other changes besides moving code around. Change-Id: I06bae9392f534e45b3f1ffff144e0b1f6dd72622 Reviewed-by: Edward Welbourne <edward.welbourne@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
parent
fb498a6519
commit
d1395b76cf
@ -2543,125 +2543,90 @@ static inline Qt::TimeSpec getSpec(const QDateTimeData &d)
|
|||||||
return extractSpec(getStatus(d));
|
return extractSpec(getStatus(d));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
// Refresh the LocalTime validity and offset
|
||||||
QDateTime::Data member functions
|
static void refreshDateTime(QDateTimeData &d)
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
inline QDateTime::Data::Data(Qt::TimeSpec spec)
|
|
||||||
{
|
{
|
||||||
if (CanBeSmall && Q_LIKELY(spec == Qt::LocalTime || spec == Qt::UTC)) {
|
auto status = getStatus(d);
|
||||||
d = reinterpret_cast<QDateTimePrivate *>(int(mergeSpec(QDateTimePrivate::ShortData, spec)));
|
const auto spec = extractSpec(status);
|
||||||
} else {
|
const qint64 msecs = getMSecs(d);
|
||||||
// the structure is too small, we need to detach
|
qint64 epochMSecs = 0;
|
||||||
d = new QDateTimePrivate;
|
int offsetFromUtc = 0;
|
||||||
d->ref.ref();
|
QDate testDate;
|
||||||
d->m_status = mergeSpec(0, spec);
|
QTime testTime;
|
||||||
}
|
Q_ASSERT(spec == Qt::TimeZone || spec == Qt::LocalTime);
|
||||||
}
|
|
||||||
|
|
||||||
inline QDateTime::Data::Data(const Data &other)
|
|
||||||
: d(other.d)
|
|
||||||
{
|
|
||||||
if (!isShort())
|
|
||||||
d->ref.ref();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline QDateTime::Data &QDateTime::Data::operator=(const Data &other)
|
|
||||||
{
|
|
||||||
if (d == other.d)
|
|
||||||
return *this;
|
|
||||||
|
|
||||||
auto x = d;
|
|
||||||
d = other.d;
|
|
||||||
if (!other.isShort())
|
|
||||||
other.d->ref.ref();
|
|
||||||
|
|
||||||
if (!(CanBeSmall && quintptr(x) & QDateTimePrivate::ShortData) && !x->ref.deref())
|
|
||||||
delete x;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline QDateTime::Data::~Data()
|
|
||||||
{
|
|
||||||
if (!isShort() && !d->ref.deref())
|
|
||||||
delete d;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool QDateTime::Data::isShort() const
|
|
||||||
{
|
|
||||||
return CanBeSmall && quintptr(d) & QDateTimePrivate::ShortData;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void QDateTime::Data::detach()
|
|
||||||
{
|
|
||||||
QDateTimePrivate *x;
|
|
||||||
bool wasShort = isShort();
|
|
||||||
if (wasShort) {
|
|
||||||
// force enlarging
|
|
||||||
x = new QDateTimePrivate;
|
|
||||||
x->m_status = QDateTimePrivate::StatusFlag(data.status & ~QDateTimePrivate::ShortData);
|
|
||||||
x->m_msecs = data.msecs;
|
|
||||||
} else {
|
|
||||||
if (d->ref.load() == 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
x = new QDateTimePrivate(*d);
|
|
||||||
}
|
|
||||||
|
|
||||||
x->ref.store(1);
|
|
||||||
if (!wasShort && !d->ref.deref())
|
|
||||||
delete d;
|
|
||||||
d = x;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline const QDateTimePrivate *QDateTime::Data::operator->() const
|
|
||||||
{
|
|
||||||
Q_ASSERT(!isShort());
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline QDateTimePrivate *QDateTime::Data::operator->()
|
|
||||||
{
|
|
||||||
// should we attempt to detach here?
|
|
||||||
Q_ASSERT(!isShort());
|
|
||||||
Q_ASSERT(d->ref.load() == 1);
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
QDateTimePrivate member functions
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds);
|
|
||||||
static void setDateTime(QDateTimeData &d, const QDate &date, const QTime &time);
|
|
||||||
static QPair<QDate, QTime> getDateTime(const QDateTimeData &d);
|
|
||||||
static void checkValidDateTime(QDateTimeData &d);
|
|
||||||
static void refreshDateTime(QDateTimeData &d);
|
|
||||||
|
|
||||||
Q_NEVER_INLINE
|
|
||||||
QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec,
|
|
||||||
int offsetSeconds)
|
|
||||||
{
|
|
||||||
QDateTime::Data result(toSpec);
|
|
||||||
setTimeSpec(result, toSpec, offsetSeconds);
|
|
||||||
setDateTime(result, toDate, toTime);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef QT_BOOTSTRAPPED
|
#ifndef QT_BOOTSTRAPPED
|
||||||
inline QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime,
|
// If not valid time zone then is invalid
|
||||||
const QTimeZone &toTimeZone)
|
if (spec == Qt::TimeZone) {
|
||||||
{
|
if (!d->m_timeZone.isValid())
|
||||||
QDateTime::Data result(Qt::TimeZone);
|
status &= ~QDateTimePrivate::ValidDateTime;
|
||||||
Q_ASSERT(!result.isShort());
|
else
|
||||||
|
epochMSecs = QDateTimePrivate::zoneMSecsToEpochMSecs(msecs, d->m_timeZone, &testDate, &testTime);
|
||||||
result.d->m_status = mergeSpec(result.d->m_status, Qt::TimeZone);
|
}
|
||||||
result.d->m_timeZone = toTimeZone;
|
|
||||||
setDateTime(result, toDate, toTime);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
#endif // QT_BOOTSTRAPPED
|
#endif // QT_BOOTSTRAPPED
|
||||||
|
|
||||||
|
// If not valid date and time then is invalid
|
||||||
|
if (!(status & QDateTimePrivate::ValidDate) || !(status & QDateTimePrivate::ValidTime)) {
|
||||||
|
status &= ~QDateTimePrivate::ValidDateTime;
|
||||||
|
if (status & QDateTimePrivate::ShortData) {
|
||||||
|
d.data.status = status;
|
||||||
|
} else {
|
||||||
|
d->m_status = status;
|
||||||
|
d->m_offsetFromUtc = 0;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating
|
||||||
|
// LocalTime and TimeZone might fall into a "missing" DST transition hour
|
||||||
|
// Calling toEpochMSecs will adjust the returned date/time if it does
|
||||||
|
if (spec == Qt::LocalTime) {
|
||||||
|
auto dstStatus = extractDaylightStatus(status);
|
||||||
|
epochMSecs = localMSecsToEpochMSecs(msecs, &dstStatus, &testDate, &testTime);
|
||||||
|
}
|
||||||
|
if (timeToMSecs(testDate, testTime) == msecs) {
|
||||||
|
status |= QDateTimePrivate::ValidDateTime;
|
||||||
|
// Cache the offset to use in offsetFromUtc()
|
||||||
|
offsetFromUtc = (msecs - epochMSecs) / 1000;
|
||||||
|
} else {
|
||||||
|
status &= ~QDateTimePrivate::ValidDateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status & QDateTimePrivate::ShortData) {
|
||||||
|
d.data.status = status;
|
||||||
|
} else {
|
||||||
|
d->m_status = status;
|
||||||
|
d->m_offsetFromUtc = offsetFromUtc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the UTC / offsetFromUTC validity
|
||||||
|
static void checkValidDateTime(QDateTimeData &d)
|
||||||
|
{
|
||||||
|
auto status = getStatus(d);
|
||||||
|
auto spec = extractSpec(status);
|
||||||
|
switch (spec) {
|
||||||
|
case Qt::OffsetFromUTC:
|
||||||
|
case Qt::UTC:
|
||||||
|
// for these, a valid date and a valid time imply a valid QDateTime
|
||||||
|
if ((status & QDateTimePrivate::ValidDate) && (status & QDateTimePrivate::ValidTime))
|
||||||
|
status |= QDateTimePrivate::ValidDateTime;
|
||||||
|
else
|
||||||
|
status &= ~QDateTimePrivate::ValidDateTime;
|
||||||
|
if (status & QDateTimePrivate::ShortData)
|
||||||
|
d.data.status = status;
|
||||||
|
else
|
||||||
|
d->m_status = status;
|
||||||
|
break;
|
||||||
|
case Qt::TimeZone:
|
||||||
|
case Qt::LocalTime:
|
||||||
|
// 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(d);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds)
|
static void setTimeSpec(QDateTimeData &d, Qt::TimeSpec spec, int offsetSeconds)
|
||||||
{
|
{
|
||||||
auto status = getStatus(d);
|
auto status = getStatus(d);
|
||||||
@ -2760,91 +2725,118 @@ static QPair<QDate, QTime> getDateTime(const QDateTimeData &d)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check the UTC / offsetFromUTC validity
|
/*****************************************************************************
|
||||||
static void checkValidDateTime(QDateTimeData &d)
|
QDateTime::Data member functions
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
inline QDateTime::Data::Data(Qt::TimeSpec spec)
|
||||||
{
|
{
|
||||||
auto status = getStatus(d);
|
if (CanBeSmall && Q_LIKELY(spec == Qt::LocalTime || spec == Qt::UTC)) {
|
||||||
auto spec = extractSpec(status);
|
d = reinterpret_cast<QDateTimePrivate *>(int(mergeSpec(QDateTimePrivate::ShortData, spec)));
|
||||||
switch (spec) {
|
} else {
|
||||||
case Qt::OffsetFromUTC:
|
// the structure is too small, we need to detach
|
||||||
case Qt::UTC:
|
d = new QDateTimePrivate;
|
||||||
// for these, a valid date and a valid time imply a valid QDateTime
|
d->ref.ref();
|
||||||
if ((status & QDateTimePrivate::ValidDate) && (status & QDateTimePrivate::ValidTime))
|
d->m_status = mergeSpec(0, spec);
|
||||||
status |= QDateTimePrivate::ValidDateTime;
|
|
||||||
else
|
|
||||||
status &= ~QDateTimePrivate::ValidDateTime;
|
|
||||||
if (status & QDateTimePrivate::ShortData)
|
|
||||||
d.data.status = status;
|
|
||||||
else
|
|
||||||
d->m_status = status;
|
|
||||||
break;
|
|
||||||
case Qt::TimeZone:
|
|
||||||
case Qt::LocalTime:
|
|
||||||
// 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(d);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh the LocalTime validity and offset
|
inline QDateTime::Data::Data(const Data &other)
|
||||||
static void refreshDateTime(QDateTimeData &d)
|
: d(other.d)
|
||||||
{
|
{
|
||||||
auto status = getStatus(d);
|
if (!isShort())
|
||||||
const auto spec = extractSpec(status);
|
d->ref.ref();
|
||||||
const qint64 msecs = getMSecs(d);
|
}
|
||||||
qint64 epochMSecs = 0;
|
|
||||||
int offsetFromUtc = 0;
|
|
||||||
QDate testDate;
|
|
||||||
QTime testTime;
|
|
||||||
Q_ASSERT(spec == Qt::TimeZone || spec == Qt::LocalTime);
|
|
||||||
|
|
||||||
#ifndef QT_BOOTSTRAPPED
|
inline QDateTime::Data &QDateTime::Data::operator=(const Data &other)
|
||||||
// If not valid time zone then is invalid
|
{
|
||||||
if (spec == Qt::TimeZone) {
|
if (d == other.d)
|
||||||
if (!d->m_timeZone.isValid())
|
return *this;
|
||||||
status &= ~QDateTimePrivate::ValidDateTime;
|
|
||||||
else
|
|
||||||
epochMSecs = QDateTimePrivate::zoneMSecsToEpochMSecs(msecs, d->m_timeZone, &testDate, &testTime);
|
|
||||||
}
|
|
||||||
#endif // QT_BOOTSTRAPPED
|
|
||||||
|
|
||||||
// If not valid date and time then is invalid
|
auto x = d;
|
||||||
if (!(status & QDateTimePrivate::ValidDate) || !(status & QDateTimePrivate::ValidTime)) {
|
d = other.d;
|
||||||
status &= ~QDateTimePrivate::ValidDateTime;
|
if (!other.isShort())
|
||||||
if (status & QDateTimePrivate::ShortData) {
|
other.d->ref.ref();
|
||||||
d.data.status = status;
|
|
||||||
|
if (!(CanBeSmall && quintptr(x) & QDateTimePrivate::ShortData) && !x->ref.deref())
|
||||||
|
delete x;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QDateTime::Data::~Data()
|
||||||
|
{
|
||||||
|
if (!isShort() && !d->ref.deref())
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool QDateTime::Data::isShort() const
|
||||||
|
{
|
||||||
|
return CanBeSmall && quintptr(d) & QDateTimePrivate::ShortData;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void QDateTime::Data::detach()
|
||||||
|
{
|
||||||
|
QDateTimePrivate *x;
|
||||||
|
bool wasShort = isShort();
|
||||||
|
if (wasShort) {
|
||||||
|
// force enlarging
|
||||||
|
x = new QDateTimePrivate;
|
||||||
|
x->m_status = QDateTimePrivate::StatusFlag(data.status & ~QDateTimePrivate::ShortData);
|
||||||
|
x->m_msecs = data.msecs;
|
||||||
} else {
|
} else {
|
||||||
d->m_status = status;
|
if (d->ref.load() == 1)
|
||||||
d->m_offsetFromUtc = 0;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
x = new QDateTimePrivate(*d);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We have a valid date and time and a Qt::LocalTime or Qt::TimeZone that needs calculating
|
x->ref.store(1);
|
||||||
// LocalTime and TimeZone might fall into a "missing" DST transition hour
|
if (!wasShort && !d->ref.deref())
|
||||||
// Calling toEpochMSecs will adjust the returned date/time if it does
|
delete d;
|
||||||
if (spec == Qt::LocalTime) {
|
d = x;
|
||||||
auto dstStatus = extractDaylightStatus(status);
|
}
|
||||||
epochMSecs = localMSecsToEpochMSecs(msecs, &dstStatus, &testDate, &testTime);
|
|
||||||
}
|
|
||||||
if (timeToMSecs(testDate, testTime) == msecs) {
|
|
||||||
status |= QDateTimePrivate::ValidDateTime;
|
|
||||||
// Cache the offset to use in offsetFromUtc()
|
|
||||||
offsetFromUtc = (msecs - epochMSecs) / 1000;
|
|
||||||
} else {
|
|
||||||
status &= ~QDateTimePrivate::ValidDateTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status & QDateTimePrivate::ShortData) {
|
inline const QDateTimePrivate *QDateTime::Data::operator->() const
|
||||||
d.data.status = status;
|
{
|
||||||
} else {
|
Q_ASSERT(!isShort());
|
||||||
d->m_status = status;
|
return d;
|
||||||
d->m_offsetFromUtc = offsetFromUtc;
|
}
|
||||||
}
|
|
||||||
|
inline QDateTimePrivate *QDateTime::Data::operator->()
|
||||||
|
{
|
||||||
|
// should we attempt to detach here?
|
||||||
|
Q_ASSERT(!isShort());
|
||||||
|
Q_ASSERT(d->ref.load() == 1);
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
QDateTimePrivate member functions
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
Q_NEVER_INLINE
|
||||||
|
QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime, Qt::TimeSpec toSpec,
|
||||||
|
int offsetSeconds)
|
||||||
|
{
|
||||||
|
QDateTime::Data result(toSpec);
|
||||||
|
setTimeSpec(result, toSpec, offsetSeconds);
|
||||||
|
setDateTime(result, toDate, toTime);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef QT_BOOTSTRAPPED
|
#ifndef QT_BOOTSTRAPPED
|
||||||
|
inline QDateTime::Data QDateTimePrivate::create(const QDate &toDate, const QTime &toTime,
|
||||||
|
const QTimeZone &toTimeZone)
|
||||||
|
{
|
||||||
|
QDateTime::Data result(Qt::TimeZone);
|
||||||
|
Q_ASSERT(!result.isShort());
|
||||||
|
|
||||||
|
result.d->m_status = mergeSpec(result.d->m_status, Qt::TimeZone);
|
||||||
|
result.d->m_timeZone = toTimeZone;
|
||||||
|
setDateTime(result, toDate, toTime);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
// Convert a TimeZone time expressed in zone msecs encoding into a UTC epoch msecs
|
// Convert a TimeZone time expressed in zone msecs encoding into a UTC epoch msecs
|
||||||
inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QTimeZone &zone,
|
inline qint64 QDateTimePrivate::zoneMSecsToEpochMSecs(qint64 zoneMSecs, const QTimeZone &zone,
|
||||||
QDate *localDate, QTime *localTime)
|
QDate *localDate, QTime *localTime)
|
||||||
|
Loading…
Reference in New Issue
Block a user