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

0001 /*
0002     SPDX-FileCopyrightText: 2020 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KOSMINDOORMAP_LOCALIZATION_P_H
0008 #define KOSMINDOORMAP_LOCALIZATION_P_H
0009 
0010 #include "localization.h"
0011 
0012 #include <KLocalizedString>
0013 #include <KLazyLocalizedString>
0014 
0015 #include <QCoreApplication>
0016 #include <QLocale>
0017 
0018 #include <cstring>
0019 #include <iterator>
0020 
0021 namespace KOSMIndoorMap {
0022 
0023 struct ValueMapEntry
0024 {
0025     const char *keyName;
0026     const KLazyLocalizedString label;
0027 };
0028 
0029 template <typename MapEntry, std::size_t N>
0030 inline constexpr bool isSortedLookupTable(const MapEntry(&map)[N])
0031 {
0032 #if __cplusplus > 201703L && defined(__GNUC__) && !defined(__clang__)
0033     return std::is_sorted(std::begin(map), std::end(map), [](const auto &lhs, const auto &rhs) {
0034         return std::strcmp(lhs.keyName, rhs.keyName) < 0;
0035     });
0036 #else
0037     Q_UNUSED(map);
0038     return true;
0039 #endif
0040 }
0041 
0042 template <typename MapEntry, std::size_t N>
0043 inline QString translateValue(const char *keyName, const MapEntry(&map)[N], Localization::TranslationOption opt = Localization::ReturnUnknownKey)
0044 {
0045     const auto it = std::lower_bound(std::begin(map), std::end(map), keyName, [](const auto &lhs, auto rhs) {
0046         return std::strcmp(lhs.keyName, rhs) < 0;
0047     });
0048     if (it == std::end(map) || std::strcmp((*it).keyName, keyName) != 0) {
0049         return opt == Localization::ReturnUnknownKey ? QString::fromUtf8(keyName) : QString();
0050     }
0051 
0052     return (*it).label.toString();
0053 }
0054 
0055 template <typename MapEntry, std::size_t N>
0056 inline bool hasTranslatedValue(const char *value, const MapEntry(&map)[N])
0057 {
0058     const auto it = std::lower_bound(std::begin(map), std::end(map), value, [](const auto &lhs, auto rhs) {
0059         return std::strcmp(lhs.keyName, rhs) < 0;
0060     });
0061     return it != std::end(map) && std::strcmp((*it).keyName, value) == 0;
0062 }
0063 
0064 template <typename MapEntry, std::size_t N>
0065 inline QString translateValues(const QByteArray &values, const MapEntry(&map)[N], Localization::TranslationOption opt = Localization::ReturnUnknownKey)
0066 {
0067     const auto l = values.split(';');
0068     QStringList out;
0069     out.reserve(l.size());
0070     for (const auto &value : l) {
0071         const auto s = translateValue(value.constData(), map, opt);
0072         if (!s.isEmpty() && !out.contains(s)) {
0073             out.push_back(s);
0074         }
0075     }
0076     return QLocale().createSeparatedList(out);
0077 }
0078 
0079 }
0080 
0081 #endif