116 inline T fromVariant(
const QVariant &value)
118 if constexpr (std::is_same_v<T, QVariant>)
121 const QMetaType sourceType = value.metaType();
122 const QMetaType targetType = QMetaType::fromType<T>();
123 if (sourceType == targetType)
124 return *
reinterpret_cast<
const T *>(value.constData());
126 if constexpr (std::is_same_v<T,std::remove_const_t<std::remove_pointer_t<T>>
const *>) {
127 using nonConstT = std::remove_const_t<std::remove_pointer_t<T>> *;
128 const QMetaType nonConstTargetType = QMetaType::fromType<nonConstT>();
129 if (value.metaType() == nonConstTargetType)
130 return *
reinterpret_cast<
const nonConstT *>(value.constData());
133 if constexpr (std::is_same_v<T, QJSValue>)
134 return toScriptValue(value);
136 if constexpr (std::is_same_v<T, QJSManagedValue>)
137 return toManagedValue(value);
139 if constexpr (std::is_same_v<T, QJSPrimitiveValue>)
140 return toPrimitiveValue(value);
142 if constexpr (std::is_same_v<T, QString>) {
143 if (sourceType.flags() & QMetaType::PointerToQObject) {
144 return convertQObjectToString(
145 *
reinterpret_cast<QObject *
const *>(value.constData()));
149 if constexpr (std::is_same_v<T,
double>) {
150 if (sourceType == QMetaType::fromType<
int>())
151 return double(*
static_cast<
const int *>(value.constData()));
154 if constexpr (std::is_same_v<T,
int>) {
155 if (sourceType == QMetaType::fromType<
double>()) {
156 return QJSNumberCoercion::toInteger(
157 *
static_cast<
const double *>(value.constData()));
161 if constexpr (std::is_same_v<QObject, std::remove_const_t<std::remove_pointer_t<T>>>) {
162 if (sourceType.flags() & QMetaType::PointerToQObject) {
163 return *
static_cast<QObject *
const *>(value.constData());
170 if (sourceType == QMetaType::fromType<QJSValue>())
171 return fromScriptValue<T>(*
reinterpret_cast<
const QJSValue *>(value.constData()));
173 if (sourceType == QMetaType::fromType<QJSManagedValue>()) {
174 return fromManagedValue<T>(
175 *
reinterpret_cast<
const QJSManagedValue *>(value.constData()));
178 if (sourceType == QMetaType::fromType<QJSPrimitiveValue>()) {
179 return fromPrimitiveValue<T>(
180 *
reinterpret_cast<
const QJSPrimitiveValue *>(value.constData()));
185 if (value.metaType() == QMetaType::fromType<QString>()) {
186 if (convertString(value.toString(), targetType, &t))
188 }
else if (convertVariant(value, targetType, &t)) {
192 QMetaType::convert(value.metaType(), value.constData(), targetType, &t);
198 inline To coerceValue(
const From &from)
200 if constexpr (std::is_base_of_v<To, From>)
203 if constexpr (std::is_same_v<To, QJSValue>)
204 return toScriptValue(from);
206 if constexpr (std::is_same_v<From, QJSValue>)
207 return fromScriptValue<To>(from);
209 if constexpr (std::is_same_v<To, QJSManagedValue>)
210 return toManagedValue(from);
212 if constexpr (std::is_same_v<From, QJSManagedValue>)
213 return fromManagedValue<To>(from);
215 if constexpr (std::is_same_v<To, QJSPrimitiveValue>)
216 return toPrimitiveValue(from);
218 if constexpr (std::is_same_v<From, QJSPrimitiveValue>)
219 return fromPrimitiveValue<To>(from);
221 if constexpr (std::is_same_v<From, QVariant>)
222 return fromVariant<To>(from);
224 if constexpr (std::is_same_v<To, QVariant>)
225 return QVariant::fromValue(from);
227 if constexpr (std::is_same_v<To, QString>) {
228 if constexpr (std::is_base_of_v<QObject, std::remove_const_t<std::remove_pointer_t<From>>>)
229 return convertQObjectToString(from);
232 if constexpr (std::is_same_v<From, QDateTime>) {
233 if constexpr (std::is_same_v<To, QDate>)
234 return convertDateTimeToDate(from.toLocalTime());
235 if constexpr (std::is_same_v<To, QTime>)
236 return from.toLocalTime().time();
237 if constexpr (std::is_same_v<To, QString>)
238 return convertDateTimeToString(from.toLocalTime());
239 if constexpr (std::is_same_v<To,
double>)
240 return convertDateTimeToNumber(from.toLocalTime());
243 if constexpr (std::is_same_v<From, QDate>) {
244 if constexpr (std::is_same_v<To, QDateTime>)
245 return from.startOfDay(QTimeZone::UTC);
246 if constexpr (std::is_same_v<To, QTime>) {
248 return coerceValue<QDateTime, QTime>(coerceValue<QDate, QDateTime>(from));
250 if constexpr (std::is_same_v<To, QString>)
251 return convertDateTimeToString(coerceValue<QDate, QDateTime>(from));
252 if constexpr (std::is_same_v<To,
double>)
253 return convertDateTimeToNumber(coerceValue<QDate, QDateTime>(from));
256 if constexpr (std::is_same_v<From, QTime>) {
257 if constexpr (std::is_same_v<To, QDate>) {
259 return from.isValid() ? QDate(1971, 4, 1) : QDate();
262 if constexpr (std::is_same_v<To, QDateTime>)
263 return QDateTime(coerceValue<QTime, QDate>(from), from, QTimeZone::LocalTime);
264 if constexpr (std::is_same_v<To, QString>)
265 return convertDateTimeToString(coerceValue<QTime, QDateTime>(from));
266 if constexpr (std::is_same_v<To,
double>)
267 return convertDateTimeToNumber(coerceValue<QTime, QDateTime>(from));
270 if constexpr (std::is_same_v<To, std::remove_const_t<std::remove_pointer_t<To>>
const *>) {
271 using nonConstTo = std::remove_const_t<std::remove_pointer_t<To>> *;
272 if constexpr (std::is_same_v<From, nonConstTo>)
276 if constexpr (std::is_same_v<To,
double>) {
277 if constexpr (std::is_same_v<From,
int>)
281 if constexpr (std::is_same_v<To,
int>) {
282 if constexpr (std::is_same_v<From,
double>)
283 return QJSNumberCoercion::toInteger(from);
287 const QMetaType sourceType = QMetaType::fromType<From>();
288 const QMetaType targetType = QMetaType::fromType<To>();
290 if constexpr (std::is_same_v<From, QString>) {
291 if (convertString(from, targetType, &to))
293 }
else if (convertMetaType(sourceType, &from, targetType, &to)) {
297 QMetaType::convert(sourceType, &from, targetType, &to);