File indexing completed on 2024-11-10 04:40:47

0001 /*
0002     SPDX-FileCopyrightText: 2017 Daniel Vrátil <dvratil@kde.og>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "typehelper.h"
0008 #include "nodetree.h"
0009 
0010 #include <QMetaType>
0011 #include <QString>
0012 
0013 bool TypeHelper::isNumericType(const QString &name)
0014 {
0015     const int metaTypeId = QMetaType::fromName(qPrintable(name)).id();
0016     if (metaTypeId == -1) {
0017         return false;
0018     }
0019 
0020     switch (metaTypeId) {
0021     case QMetaType::Int:
0022     case QMetaType::UInt:
0023     case QMetaType::Double:
0024     case QMetaType::Long:
0025     case QMetaType::LongLong:
0026     case QMetaType::Short:
0027     case QMetaType::ULong:
0028     case QMetaType::ULongLong:
0029     case QMetaType::UShort:
0030     case QMetaType::Float:
0031         return true;
0032     default:
0033         return false;
0034     }
0035 }
0036 
0037 bool TypeHelper::isBoolType(const QString &name)
0038 {
0039     const int metaTypeId = QMetaType::fromName(qPrintable(name)).id();
0040     if (metaTypeId == -1) {
0041         return false;
0042     }
0043 
0044     switch (metaTypeId) {
0045     case QMetaType::Bool:
0046         return true;
0047     default:
0048         return false;
0049     }
0050 }
0051 
0052 bool TypeHelper::isBuiltInType(const QString &type)
0053 {
0054     // TODO: should be smarter than this....
0055     return !type.startsWith(QLatin1StringView("Akonadi::Protocol")) || type == QLatin1StringView("Akonadi::Protocol::Attributes") // typedef to QMap
0056         || (type.startsWith(QLatin1StringView("Akonadi::Protocol")) // enums
0057             && type.count(QStringLiteral("::")) > 2);
0058 }
0059 
0060 bool TypeHelper::isContainer(const QString &type)
0061 {
0062     const int tplB = type.indexOf(QLatin1Char('<'));
0063     const int tplE = type.lastIndexOf(QLatin1Char('>'));
0064     return tplB > -1 && tplE > -1 && tplB < tplE;
0065 }
0066 
0067 QString TypeHelper::containerType(const QString &type)
0068 {
0069     const int tplB = type.indexOf(QLatin1Char('<'));
0070     const int tplE = type.indexOf(QLatin1Char('>'));
0071     return type.mid(tplB + 1, tplE - tplB - 1);
0072 }
0073 
0074 QString TypeHelper::containerName(const QString &type)
0075 {
0076     const int tplB = type.indexOf(QLatin1Char('<'));
0077     return type.left(tplB);
0078 }
0079 
0080 bool TypeHelper::isPointerType(const QString &type)
0081 {
0082     return type.endsWith(QLatin1StringView("Ptr"));
0083 }