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