blob: 653c742ad54fbb1ec129ffdc75059d251df0d618 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#pragma once
#include <mbgl/style/conversion.hpp>
#include <mbgl/util/feature.hpp>
#include <mbgl/util/optional.hpp>
#include <QColor>
#include <QVariant>
namespace mbgl {
namespace style {
namespace conversion {
inline bool isUndefined(const QVariant& value) {
return value.isNull() || !value.isValid();
}
inline bool isArray(const QVariant& value) {
return value.canConvert(QVariant::List);
}
inline std::size_t arrayLength(const QVariant& value) {
return value.toList().size();
}
inline QVariant arrayMember(const QVariant& value, std::size_t i) {
return value.toList()[i];
}
inline bool isObject(const QVariant& value) {
return value.canConvert(QVariant::Map) || value.type() == QVariant::ByteArray;
}
inline optional<QVariant> objectMember(const QVariant& value, const char* key) {
auto map = value.toMap();
auto iter = map.constFind(key);
if (iter != map.constEnd()) {
return iter.value();
} else {
return {};
}
}
using EachMemberFn = std::function<optional<Error>(const std::string&, const QVariant&)>;
optional<Error> eachMember(const QVariant& value, EachMemberFn&& fn) {
auto map = value.toMap();
auto iter = map.constBegin();
while (iter != map.constEnd()) {
optional<Error> result = fn(iter.key().toStdString(), iter.value());
if (result) {
return result;
}
++iter;
}
return {};
}
inline optional<bool> toBool(const QVariant& value) {
if (value.type() == QVariant::Bool) {
return value.toBool();
} else {
return {};
}
}
inline optional<float> toNumber(const QVariant& value) {
if (value.type() == QVariant::Double) {
return value.toFloat();
} else {
return {};
}
}
inline optional<std::string> toString(const QVariant& value) {
if (value.type() == QVariant::String) {
return value.toString().toStdString();
} else if (value.type() == QVariant::Color) {
return value.value<QColor>().name().toStdString();
} else {
return {};
}
}
inline optional<Value> toValue(const QVariant& value) {
if (value.type() == QVariant::Bool) {
return { value.toBool() };
} else if (value.type() == QVariant::String) {
return { value.toString().toStdString() };
} else if (value.type() == QVariant::Color) {
return { value.value<QColor>().name().toStdString() };
} else if (value.type() == QVariant::Int) {
return { value.toInt() };
} else if (value.canConvert(QVariant::Double)) {
return { value.toFloat() };
} else {
return {};
}
}
} // namespace conversion
} // namespace style
} // namespace mbgl
|