4#ifndef QV4DATEOBJECT_P_H
5#define QV4DATEOBJECT_P_H
21#include <QtCore/private/qnumeric_p.h>
22#include <QtCore/qdatetime.h>
34 void init() { storage = InvalidDateVal; }
35 void init(
Date date) { storage = date.storage; }
36 void init(
double value);
37 void init(
const QDateTime &dateTime);
38 void init(QDate date);
39 void init(QTime time, ExecutionEngine *engine);
43 storage = (storage & (HasQDate | HasQTime)) | encode(value);
49 const quint64 raw = (storage & ~(HasQDate | HasQTime));
54 return double(raw - MaxDateVal - Extra);
56 return double(raw) -
double(MaxDateVal) -
double(Extra);
64 template<
typename Function>
67 switch (storage & (HasQDate | HasQTime)) {
69 QDate date = toQDate();
70 return function(&date);
73 QTime time = toQTime();
74 return function(&time);
76 case (HasQTime | HasQDate): {
77 QDateTime dateTime = toQDateTime();
78 return function(&dateTime);
87 template<
typename Function>
90 switch (storage & (HasQDate | HasQTime)) {
93 if (function(&date)) {
101 if (function(&time)) {
107 case (HasQTime | HasQDate): {
109 if (function(&dateTime)) {
127 static constexpr quint64 InvalidDateVal = 0;
128 static constexpr quint64 Extra = 1;
129 static constexpr quint64 HasQDate = 1ull << 63;
130 static constexpr quint64 HasQTime = 1ull << 62;
133 static_assert(((MaxDateVal * 2 + Extra) & (HasQDate | HasQTime)) == 0ull);
135 static quint64 encode(
double value);
136 static quint64 encode(
const QDateTime &dateTime);
143#define DateObjectMembers(class, Member)
145 DECLARE_MARKOBJECTS(DateObject);
149 if (CppStackFrame *frame = internalClass->engine->currentStackFrame)
150 setLocation(frame->v4Function, frame->statementNumber());
155 ReferenceObject::init(
nullptr, -1, {});
161 ReferenceObject::init(
nullptr, -1, {});
165 void init(
double dateTime)
167 ReferenceObject::init(
nullptr, -1, {});
168 m_date.init(dateTime);
171 void init(
const QDateTime &dateTime)
173 ReferenceObject::init(
nullptr, -1, {});
174 m_date.init(dateTime);
177 void init(
const QDateTime &dateTime, Heap::Object *parent,
int property, Flags flags)
179 ReferenceObject::init(parent, property, flags | EnforcesLocation);
181 m_date.init(dateTime);
184 void init(QDate date, Heap::Object *parent,
int property, Flags flags)
186 ReferenceObject::init(parent, property, flags | EnforcesLocation);
191 void init(QTime time, Heap::Object *parent,
int property, Flags flags)
193 ReferenceObject::init(parent, property, flags | EnforcesLocation);
195 m_date.init(time, internalClass->engine);
198 DateObject *detached()
const;
199 bool setVariant(
const QVariant &variant);
201 void setDate(
double newDate)
204 if (isAttachedToProperty())
213 QVariant toVariant()
const {
return m_date.toVariant(); }
214 QDateTime toQDateTime()
const {
return m_date.toQDateTime(); }
224 QV4::Scope scope(internalClass->engine);
225 QV4::ScopedObject o(scope, object());
227 if (!isConnected() && QV4::ReferenceObject::shouldConnect(
this))
228 QV4::ReferenceObject::connect(
this);
230 bool wasRead =
false;
233 void *a[] = { &variant };
234 wasRead = o->metacall(QMetaObject::ReadProperty, property(), a)
235 && setVariant(variant);
237 wasRead = m_date.withWriteonlyStoragePointer([&](
void *storagePointer) {
238 void *a[] = { storagePointer };
239 return o->metacall(QMetaObject::ReadProperty, property(), a);
243 setDirty(!isConnected() || !wasRead);
247 bool writeBack(
int internalIndex = QV4::ReferenceObject::AllProperties)
249 if (!object() || !canWriteBack())
252 QV4::Scope scope(internalClass->engine);
253 QV4::ScopedObject o(scope, object());
258 QVariant variant = toVariant();
259 void *a[] = { &variant,
nullptr, &status, &flags, &internalIndex };
260 return o->metacall(QMetaObject::WriteProperty, property(), a);
263 return m_date.withReadonlyStoragePointer([&](
void *storagePointer) {
264 void *a[] = { storagePointer,
nullptr, &status, &flags, &internalIndex };
265 return o->metacall(QMetaObject::WriteProperty, property(), a);
275 void init(
QV4::ExecutionEngine *engine);
283 V4_PROTOTYPE(datePrototype)
291 static QString
dateTimeToString(
const QDateTime &dateTime, ExecutionEngine *engine);
294 static QDateTime
stringToDateTime(
const QString &string, ExecutionEngine *engine);
297 double year,
double month,
double day,
298 double hours,
double mins,
double secs,
double ms,
299 ExecutionEngine *v4);
309 V4_OBJECT2(
DateCtor, FunctionObject)
317 V4_PROTOTYPE(objectPrototype)
321 static double getThisDate(ExecutionEngine *v4,
const Value *thisObject);
380 return ref->readReference();
386 return ref->writeBack(internalIndex);
Combined button and popup list for selecting options.
DECLARE_HEAP_OBJECT(DateObject, ReferenceObject)
bool ReferenceObject::readReference< Heap::DateObject >(Heap::DateObject *ref)
bool ReferenceObject::writeBack< Heap::DateObject >(Heap::DateObject *ref, int internalIndex)
DEFINE_OBJECT_VTABLE(DateObject)
DEFINE_OBJECT_VTABLE(DateCtor)
static bool InLeapYear(double t)
static const double msPerDay
static double DayFromYear(double y)
static QString ToString(double t, double localTZA)
static double UTC(double t, double localTZA)
static const double msPerSecond
static double ParseString(const QString &s, double localTZA)
static QString ToUTCString(double t)
static int msFromTime(double t)
static double DaysInYear(double y)
static QString ToLocaleTimeString(double t)
static const double msPerHour
static double YearFromTime(double t)
static QDateTime ToDateTime(double t, QTimeZone zone)
static QString ToTimeString(double t)
static double getLocalTZA()
static double TimeWithinDay(double t)
static double TimeFromYear(double y)
static QString ToLocaleDateString(double t)
static double DayFromMonth(double month, double leap)
static double WeekDay(double t)
static const double SecondsPerMinute
static double MakeDate(double day, double time)
static double MakeDay(double year, double month, double day)
static double DaylightSavingTA(double t, double localTZA)
static QString ToLocaleString(double t)
static double DayWithinYear(double t)
static const double HoursPerDay
static void addZeroPrefixedInt(QString &str, int num, int nDigits)
static double MonthFromTime(double t)
static int HourFromTime(double t)
static int SecFromTime(double t)
static double Day(double t)
static double TimeClip(double t)
static int MinFromTime(double t)
static QString ToDateString(double t)
static double MakeTime(double hour, double min, double sec, double ms)
static const double msPerMinute
static double DateFromTime(double t)
static double LocalTime(double t, double localTZA)
static const double MinutesPerHour
static double currentTime()
#define Q_MANAGED_TYPE(type)
static ReturnedValue virtualCall(const FunctionObject *f, const Value *thisObject, const Value *argv, int)
static QDate dateTimeToDate(const QDateTime &dateTime)
static QString dateTimeToString(const QDateTime &dateTime, ExecutionEngine *engine)
static QDateTime timestampToDateTime(double timestamp, QTimeZone zone=QTimeZone::LocalTime)
static QDateTime stringToDateTime(const QString &string, ExecutionEngine *engine)
static double dateTimeToNumber(const QDateTime &dateTime)
static double componentsToTimestamp(double year, double month, double day, double hours, double mins, double secs, double ms, ExecutionEngine *v4)
static ReturnedValue method_setMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_UTC(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toTimeString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getTimezoneOffset(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleDateString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getDay(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleTimeString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCDay(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setTime(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toISOString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static void timezoneUpdated(ExecutionEngine *e)
static ReturnedValue method_setUTCFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toDateString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCMonth(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_symbolToPrimitive(const FunctionObject *f, const Value *thisObject, const Value *, int)
static ReturnedValue method_getTime(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_valueOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_parse(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toJSON(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toUTCString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toLocaleString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getDate(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUTCFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getFullYear(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_now(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getMilliseconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHours(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUTCMinutes(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static double getThisDate(ExecutionEngine *v4, const Value *thisObject)
static ReturnedValue method_setSeconds(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
bool withReadonlyStoragePointer(Function function)
QVariant toVariant() const
bool withWriteonlyStoragePointer(Function function, ExecutionEngine *engine)
void init(QTime time, ExecutionEngine *engine)
static constexpr quint64 MaxDateVal
void init(const QDateTime &dateTime)
Date & operator=(double value)
QDateTime toQDateTime() const
void init(QV4::ExecutionEngine *engine)
An object that keeps track of the provenance of its owned value, allowing to reflect mutations on the...