23#include "metaenumvariable_p.h"
26#include <QtCore/QStringList>
33 return input.mid(1, input.size() - 2)
34 .replace(QStringLiteral(
"\\\'"), QChar::fromLatin1(
'\''))
35 .replace(QStringLiteral(
"\\\""), QChar::fromLatin1(
'"'))
36 .replace(QStringLiteral(
"\\\\"), QChar::fromLatin1(
'\\'));
42 if (!variant.isValid())
44 switch (variant.userType()) {
45 case QMetaType::Bool: {
46 return variant.toBool();
48 case QMetaType::Int: {
49 return variant.value<
int>() > 0;
51 case QMetaType::UInt: {
52 return variant.value<uint>() > 0;
54 case QMetaType::LongLong: {
55 return variant.value<qlonglong>() > 0;
57 case QMetaType::ULongLong: {
58 return variant.value<qulonglong>() > 0;
60 case QMetaType::Double: {
61 return variant.value<
double>() > 0;
63 case QMetaType::Float: {
64 return variant.value<
float>() > 0;
66 case QMetaType::Char: {
67 return variant.value<
char>() > 0;
69 case QMetaType::QObjectStar: {
70 auto obj = variant.value<QObject *>();
74 if (obj->property(
"__true__").isValid()) {
75 return obj->property(
"__true__").toBool();
79 case QMetaType::QVariantList: {
80 return !variant.value<QVariantList>().isEmpty();
82 case QMetaType::QVariantHash: {
83 return !variant.value<QVariantHash>().isEmpty();
85 case QMetaType::QVariantMap: {
86 return !variant.value<QVariantMap>().isEmpty();
107 temp.setNeedsEscape(
true);
113 if (input.userType() == qMetaTypeId<Cutelee::SafeString>()) {
116 return input.toString();
122 const auto type = input.userType();
123 return ((type == qMetaTypeId<Cutelee::SafeString>())
124 || type == QMetaType::QString);
127static QList<int> getPrimitives()
129 QList<int> primitives;
130 primitives << qMetaTypeId<Cutelee::SafeString>() << QMetaType::QString
131 << QMetaType::Bool << QMetaType::Int << QMetaType::Double
132 << QMetaType::Float << QMetaType::QDate << QMetaType::QTime
133 << QMetaType::QDateTime;
139 static const auto primitives = getPrimitives();
140 return primitives.contains(input.userType());
150 if (lhs.userType() == qMetaTypeId<Cutelee::SafeString>()) {
151 if (rhs.userType() == qMetaTypeId<Cutelee::SafeString>()) {
154 }
else if (rhs.userType() == QMetaType::QString) {
157 }
else if (rhs.userType() == qMetaTypeId<Cutelee::SafeString>()
158 && lhs.userType() == QMetaType::QString) {
160 }
else if (rhs.userType() == qMetaTypeId<MetaEnumVariable>()) {
161 if (lhs.userType() == qMetaTypeId<MetaEnumVariable>()) {
162 equal = (rhs.value<MetaEnumVariable>() == lhs.value<MetaEnumVariable>());
163 }
else if (lhs.userType() == qMetaTypeId<int>()) {
164 equal = (rhs.value<MetaEnumVariable>() == lhs.value<
int>());
166 }
else if (lhs.userType() == qMetaTypeId<MetaEnumVariable>()) {
167 if (rhs.userType() == qMetaTypeId<int>()) {
168 equal = (lhs.value<MetaEnumVariable>() == rhs.value<
int>());
178 return QVariant::compare(lhs, rhs) == QPartialOrdering::Greater;
183 return equals(lhs, rhs) || gt(lhs, rhs);
188 return QVariant::compare(lhs, rhs) == QPartialOrdering::Less;
193 return equals(lhs, rhs) || lt(lhs, rhs);
198 std::pair<qreal,QString> ret;
200 int _unitSystem = unitSystem;
202 if ((_unitSystem != 2) && (_unitSystem != 10)) {
203 qWarning(
"%s",
"Unrecognized file size unit system. Falling back to decimal unit system.");
209 ret.second = QStringLiteral(
"bytes");
211 }
else if ((size == 1.0) || (size == -1.0)) {
213 ret.second = QStringLiteral(
"byte");
217 qreal _size = size * multiplier;
219 const bool positiveValue = (_size > 0);
221 if (!positiveValue) {
225 static const QStringList binaryUnits({
226 QStringLiteral(
"bytes"),
227 QStringLiteral(
"KiB"),
228 QStringLiteral(
"MiB"),
229 QStringLiteral(
"GiB"),
230 QStringLiteral(
"TiB"),
231 QStringLiteral(
"PiB"),
232 QStringLiteral(
"EiB"),
233 QStringLiteral(
"ZiB"),
234 QStringLiteral(
"YiB")
237 static const QStringList decimalUnits({
238 QStringLiteral(
"bytes"),
239 QStringLiteral(
"KB"),
240 QStringLiteral(
"MB"),
241 QStringLiteral(
"GB"),
242 QStringLiteral(
"TB"),
243 QStringLiteral(
"PB"),
244 QStringLiteral(
"EB"),
245 QStringLiteral(
"ZB"),
250 const qreal baseVal = (_unitSystem == 10) ? 1000.0f : 1024.0f;
251#if FLT_EVAL_METHOD == 2
254 volatile qreal current = 1.0F;
256 qreal current = 1.0f;
258 int units = decimalUnits.size();
259 while (count < units) {
261 if (_size < current) {
267 if (count >= units) {
271 qreal devider = current/baseVal;
272 _size = _size/devider;
274 if (!positiveValue) {
279 ret.second = (_unitSystem == 10) ? decimalUnits.at(count) : binaryUnits.at(count);
286 QString output(QLatin1Char(
'['));
287 auto it = list.constBegin();
288 const auto end = list.constEnd();
290 const auto item = *it;
291 if (isSafeString(item)) {
292 output += QStringLiteral(
"u\'")
293 +
static_cast<QString>(getSafeString(item).
get())
296 if ((item.userType() == qMetaTypeId<int>())
297 || (item.userType() == qMetaTypeId<uint>())
298 || (item.userType() == qMetaTypeId<double>())
299 || (item.userType() == qMetaTypeId<float>())
300 || (item.userType() == qMetaTypeId<long long>())
301 || (item.userType() == qMetaTypeId<unsigned long long>())) {
302 output += item.toString();
304 if (item.userType() == qMetaTypeId<QVariantList>()) {
306 +=
static_cast<QString>(toString(item.value<QVariantList>()).get());
309 output += QStringLiteral(
", ");
313 return output.append(QLatin1Char(
']'));
A QString wrapper class for containing whether a string is safe or needs to be escaped.
const NestedString & get() const
@ IsSafe
The string is safe and requires no further escaping.
bool equals(const QVariant &lhs, const QVariant &rhs)
QString unescapeStringLiteral(const QString &input)
std::pair< qreal, QString > calcFileSize(qreal size, int unitSystem=10, qreal multiplier=1.0)
bool supportedOutputType(const QVariant &input)
bool isSafeString(const QVariant &input)
Cutelee::SafeString getSafeString(const QVariant &input)
Cutelee::SafeString markSafe(const Cutelee::SafeString &input)
Cutelee::SafeString markForEscaping(const Cutelee::SafeString &input)
bool variantIsTrue(const QVariant &variant)
Utility functions used throughout Cutelee.