115 inline T fromVariant(
const QVariant &value)
117 if constexpr (std::is_same_v<T, QVariant>)
120 const QMetaType sourceType = value.metaType();
121 const QMetaType targetType = QMetaType::fromType<T>();
122 if (sourceType == targetType)
123 return *
reinterpret_cast<
const T *>(value.constData());
125 if constexpr (std::is_same_v<T,std::remove_const_t<std::remove_pointer_t<T>>
const *>) {
126 using nonConstT = std::remove_const_t<std::remove_pointer_t<T>> *;
127 const QMetaType nonConstTargetType = QMetaType::fromType<nonConstT>();
128 if (value.metaType() == nonConstTargetType)
129 return *
reinterpret_cast<
const nonConstT *>(value.constData());
132 if constexpr (std::is_same_v<T, QJSValue>)
133 return toScriptValue(value);
135 if constexpr (std::is_same_v<T, QJSManagedValue>)
136 return toManagedValue(value);
138 if constexpr (std::is_same_v<T, QJSPrimitiveValue>)
139 return toPrimitiveValue(value);
141 if constexpr (std::is_same_v<T, QString>) {
142 if (sourceType.flags() & QMetaType::PointerToQObject) {
143 return convertQObjectToString(
144 *
reinterpret_cast<QObject *
const *>(value.constData()));
148 if constexpr (std::is_same_v<T,
double>) {
149 if (sourceType == QMetaType::fromType<
int>())
150 return double(*
static_cast<
const int *>(value.constData()));
153 if constexpr (std::is_same_v<T,
int>) {
154 if (sourceType == QMetaType::fromType<
double>()) {
155 return QJSNumberCoercion::toInteger(
156 *
static_cast<
const double *>(value.constData()));
160 if constexpr (std::is_same_v<QObject, std::remove_const_t<std::remove_pointer_t<T>>>) {
161 if (sourceType.flags() & QMetaType::PointerToQObject) {
162 return *
static_cast<QObject *
const *>(value.constData());
169 if (sourceType == QMetaType::fromType<QJSValue>())
170 return fromScriptValue<T>(*
reinterpret_cast<
const QJSValue *>(value.constData()));
172 if (sourceType == QMetaType::fromType<QJSManagedValue>()) {
173 return fromManagedValue<T>(
174 *
reinterpret_cast<
const QJSManagedValue *>(value.constData()));
177 if (sourceType == QMetaType::fromType<QJSPrimitiveValue>()) {
178 return fromPrimitiveValue<T>(
179 *
reinterpret_cast<
const QJSPrimitiveValue *>(value.constData()));
184 if (value.metaType() == QMetaType::fromType<QString>()) {
185 if (convertString(value.toString(), targetType, &t))
187 }
else if (convertVariant(value, targetType, &t)) {
191 QMetaType::convert(value.metaType(), value.constData(), targetType, &t);
197 inline To coerceValue(
const From &from)
199 if constexpr (std::is_base_of_v<To, From>)
202 if constexpr (std::is_same_v<To, QJSValue>)
203 return toScriptValue(from);
205 if constexpr (std::is_same_v<From, QJSValue>)
206 return fromScriptValue<To>(from);
208 if constexpr (std::is_same_v<To, QJSManagedValue>)
209 return toManagedValue(from);
211 if constexpr (std::is_same_v<From, QJSManagedValue>)
212 return fromManagedValue<To>(from);
214 if constexpr (std::is_same_v<To, QJSPrimitiveValue>)
215 return toPrimitiveValue(from);
217 if constexpr (std::is_same_v<From, QJSPrimitiveValue>)
218 return fromPrimitiveValue<To>(from);
220 if constexpr (std::is_same_v<From, QVariant>)
221 return fromVariant<To>(from);
223 if constexpr (std::is_same_v<To, QVariant>)
224 return QVariant::fromValue(from);
226 if constexpr (std::is_same_v<To, QString>) {
227 if constexpr (std::is_base_of_v<QObject, std::remove_const_t<std::remove_pointer_t<From>>>)
228 return convertQObjectToString(from);
231 if constexpr (std::is_same_v<From, QDateTime>) {
232 if constexpr (std::is_same_v<To, QDate>)
233 return convertDateTimeToDate(from.toLocalTime());
234 if constexpr (std::is_same_v<To, QTime>)
235 return from.toLocalTime().time();
236 if constexpr (std::is_same_v<To, QString>)
237 return convertDateTimeToString(from.toLocalTime());
238 if constexpr (std::is_same_v<To,
double>)
239 return convertDateTimeToNumber(from.toLocalTime());
242 if constexpr (std::is_same_v<From, QDate>) {
243 if constexpr (std::is_same_v<To, QDateTime>)
244 return from.startOfDay(QTimeZone::UTC);
245 if constexpr (std::is_same_v<To, QTime>) {
247 return coerceValue<QDateTime, QTime>(coerceValue<QDate, QDateTime>(from));
249 if constexpr (std::is_same_v<To, QString>)
250 return convertDateTimeToString(coerceValue<QDate, QDateTime>(from));
251 if constexpr (std::is_same_v<To,
double>)
252 return convertDateTimeToNumber(coerceValue<QDate, QDateTime>(from));
255 if constexpr (std::is_same_v<From, QTime>) {
256 if constexpr (std::is_same_v<To, QDate>) {
258 return from.isValid() ? QDate(1971, 4, 1) : QDate();
261 if constexpr (std::is_same_v<To, QDateTime>)
262 return QDateTime(coerceValue<QTime, QDate>(from), from, QTimeZone::LocalTime);
263 if constexpr (std::is_same_v<To, QString>)
264 return convertDateTimeToString(coerceValue<QTime, QDateTime>(from));
265 if constexpr (std::is_same_v<To,
double>)
266 return convertDateTimeToNumber(coerceValue<QTime, QDateTime>(from));
269 if constexpr (std::is_same_v<To, std::remove_const_t<std::remove_pointer_t<To>>
const *>) {
270 using nonConstTo = std::remove_const_t<std::remove_pointer_t<To>> *;
271 if constexpr (std::is_same_v<From, nonConstTo>)
275 if constexpr (std::is_same_v<To,
double>) {
276 if constexpr (std::is_same_v<From,
int>)
280 if constexpr (std::is_same_v<To,
int>) {
281 if constexpr (std::is_same_v<From,
double>)
282 return QJSNumberCoercion::toInteger(from);
286 const QMetaType sourceType = QMetaType::fromType<From>();
287 const QMetaType targetType = QMetaType::fromType<To>();
289 if constexpr (std::is_same_v<From, QString>) {
290 if (convertString(from, targetType, &to))
292 }
else if (convertMetaType(sourceType, &from, targetType, &to)) {
296 QMetaType::convert(sourceType, &from, targetType, &to);