File indexing completed on 2024-05-12 04:42:45

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KPUBLICTRANSPORT_VARIANT_H
0008 #define KPUBLICTRANSPORT_VARIANT_H
0009 
0010 #include <QVariant>
0011 
0012 #include <vector>
0013 
0014 struct QMetaObject;
0015 
0016 namespace KPublicTransport {
0017 
0018 /** Deserialization from variant maps, for QML bindings. */
0019 namespace Variant
0020 {
0021     void fromVariantMap(const QMetaObject *mo, const QVariantMap &v, void *obj);
0022 
0023     /** Deserialize variant map into an actual object based on meta-type information. */
0024     template <typename T>
0025     inline T fromVariant(const QVariant &v)
0026     {
0027         if (qMetaTypeId<T>() == v.userType()) {
0028             return v.value<T>();
0029         }
0030         if (v.canConvert<QVariantMap>()) {
0031             T obj;
0032             fromVariantMap(&T::staticMetaObject, v.toMap(), &obj);
0033             return obj;
0034         }
0035         return {};
0036     }
0037 
0038     /** Deserialize a list of variants. */
0039     template <typename T>
0040     inline std::vector<T> fromVariantList(const QVariantList &l)
0041     {
0042         std::vector<T> out;
0043         out.reserve(l.size());
0044         std::transform(l.begin(), l.end(), std::back_inserter(out), &Variant::fromVariant<T>);
0045         return out;
0046     }
0047 }
0048 
0049 }
0050 
0051 #endif // KPUBLICTRANSPORT_VARIANT_H