116 inline T fromVariant(
const QVariant &value)
120 QT_WARNING_DISABLE_MSVC(4702)
122 if constexpr (std::is_same_v<T, QVariant>)
125 const QMetaType sourceType = value.metaType();
126 const QMetaType targetType = QMetaType::fromType<T>();
127 if (sourceType == targetType)
128 return *
reinterpret_cast<
const T *>(value.constData());
130 if constexpr (std::is_same_v<T,std::remove_const_t<std::remove_pointer_t<T>>
const *>) {
131 using nonConstT = std::remove_const_t<std::remove_pointer_t<T>> *;
132 const QMetaType nonConstTargetType = QMetaType::fromType<nonConstT>();
133 if (value.metaType() == nonConstTargetType)
134 return *
reinterpret_cast<
const nonConstT *>(value.constData());
137 if constexpr (std::is_same_v<T, QJSValue>)
138 return toScriptValue(value);
140 if constexpr (std::is_same_v<T, QJSManagedValue>)
141 return toManagedValue(value);
143 if constexpr (std::is_same_v<T, QJSPrimitiveValue>)
144 return toPrimitiveValue(value);
146 if constexpr (std::is_same_v<T, QString>) {
147 if (sourceType.flags() & QMetaType::PointerToQObject) {
148 return convertQObjectToString(
149 *
reinterpret_cast<QObject *
const *>(value.constData()));
153 if constexpr (std::is_same_v<T,
double>) {
154 if (sourceType == QMetaType::fromType<
int>())
155 return double(*
static_cast<
const int *>(value.constData()));
158 if constexpr (std::is_same_v<T,
int>) {
159 if (sourceType == QMetaType::fromType<
double>()) {
160 return QJSNumberCoercion::toInteger(
161 *
static_cast<
const double *>(value.constData()));
165 if constexpr (std::is_same_v<QObject, std::remove_const_t<std::remove_pointer_t<T>>>) {
166 if (sourceType.flags() & QMetaType::PointerToQObject) {
167 return *
static_cast<QObject *
const *>(value.constData());
174 if (sourceType == QMetaType::fromType<QJSValue>())
175 return fromScriptValue<T>(*
reinterpret_cast<
const QJSValue *>(value.constData()));
177 if (sourceType == QMetaType::fromType<QJSManagedValue>()) {
178 return fromManagedValue<T>(
179 *
reinterpret_cast<
const QJSManagedValue *>(value.constData()));
182 if (sourceType == QMetaType::fromType<QJSPrimitiveValue>()) {
183 return fromPrimitiveValue<T>(
184 *
reinterpret_cast<
const QJSPrimitiveValue *>(value.constData()));
189 if (value.metaType() == QMetaType::fromType<QString>()) {
190 if (convertString(value.toString(), targetType, &t))
192 }
else if (convertVariant(value, targetType, &t)) {
196 QMetaType::convert(value.metaType(), value.constData(), targetType, &t);
204 inline To coerceValue(
const From &from)
206 if constexpr (std::is_base_of_v<To, From>)
209 if constexpr (std::is_same_v<To, QJSValue>)
210 return toScriptValue(from);
212 if constexpr (std::is_same_v<From, QJSValue>)
213 return fromScriptValue<To>(from);
215 if constexpr (std::is_same_v<To, QJSManagedValue>)
216 return toManagedValue(from);
218 if constexpr (std::is_same_v<From, QJSManagedValue>)
219 return fromManagedValue<To>(from);
221 if constexpr (std::is_same_v<To, QJSPrimitiveValue>)
222 return toPrimitiveValue(from);
224 if constexpr (std::is_same_v<From, QJSPrimitiveValue>)
225 return fromPrimitiveValue<To>(from);
227 if constexpr (std::is_same_v<From, QVariant>)
228 return fromVariant<To>(from);
230 if constexpr (std::is_same_v<To, QVariant>)
231 return QVariant::fromValue(from);
233 if constexpr (std::is_same_v<To, QString>) {
234 if constexpr (std::is_base_of_v<QObject, std::remove_const_t<std::remove_pointer_t<From>>>)
235 return convertQObjectToString(from);
238 if constexpr (std::is_same_v<From, QDateTime>) {
239 if constexpr (std::is_same_v<To, QDate>)
240 return convertDateTimeToDate(from.toLocalTime());
241 if constexpr (std::is_same_v<To, QTime>)
242 return from.toLocalTime().time();
243 if constexpr (std::is_same_v<To, QString>)
244 return convertDateTimeToString(from.toLocalTime());
245 if constexpr (std::is_same_v<To,
double>)
246 return convertDateTimeToNumber(from.toLocalTime());
249 if constexpr (std::is_same_v<From, QDate>) {
250 if constexpr (std::is_same_v<To, QDateTime>)
251 return from.startOfDay(QTimeZone::UTC);
252 if constexpr (std::is_same_v<To, QTime>) {
254 return coerceValue<QDateTime, QTime>(coerceValue<QDate, QDateTime>(from));
256 if constexpr (std::is_same_v<To, QString>)
257 return convertDateTimeToString(coerceValue<QDate, QDateTime>(from));
258 if constexpr (std::is_same_v<To,
double>)
259 return convertDateTimeToNumber(coerceValue<QDate, QDateTime>(from));
262 if constexpr (std::is_same_v<From, QTime>) {
263 if constexpr (std::is_same_v<To, QDate>) {
265 return from.isValid() ? QDate(1971, 4, 1) : QDate();
268 if constexpr (std::is_same_v<To, QDateTime>)
269 return QDateTime(coerceValue<QTime, QDate>(from), from, QTimeZone::LocalTime);
270 if constexpr (std::is_same_v<To, QString>)
271 return convertDateTimeToString(coerceValue<QTime, QDateTime>(from));
272 if constexpr (std::is_same_v<To,
double>)
273 return convertDateTimeToNumber(coerceValue<QTime, QDateTime>(from));
276 if constexpr (std::is_same_v<To, std::remove_const_t<std::remove_pointer_t<To>>
const *>) {
277 using nonConstTo = std::remove_const_t<std::remove_pointer_t<To>> *;
278 if constexpr (std::is_same_v<From, nonConstTo>)
282 if constexpr (std::is_same_v<To,
double>) {
283 if constexpr (std::is_same_v<From,
int>)
287 if constexpr (std::is_same_v<To,
int>) {
288 if constexpr (std::is_same_v<From,
double>)
289 return QJSNumberCoercion::toInteger(from);
293 const QMetaType sourceType = QMetaType::fromType<From>();
294 const QMetaType targetType = QMetaType::fromType<To>();
296 if constexpr (std::is_same_v<From, QString>) {
297 if (convertString(from, targetType, &to))
299 }
else if (convertMetaType(sourceType, &from, targetType, &to)) {
303 QMetaType::convert(sourceType, &from, targetType, &to);