Celestia

Форк
0
101 строка · 2.9 Кб
1
#include "name.h"
2

3
#include <utility>
4

5
#ifdef DEBUG
6
#include <celutil/logger.h>
7
#endif
8
#include <celutil/gettext.h>
9
#include <celutil/greek.h>
10
#include <celutil/utf8.h>
11

12
void
13
NameDatabase::add(const AstroCatalog::IndexNumber catalogNumber, std::string_view name)
14
{
15
    if (name.empty())
16
        return;
17

18
#ifdef DEBUG
19
    if (AstroCatalog::IndexNumber tmp = getCatalogNumberByName(name, false); tmp != AstroCatalog::InvalidIndex)
20
        celestia::util::GetLogger()->debug("Duplicated name '{}' on object with catalog numbers: {} and {}\n", name, tmp, catalogNumber);
21
#endif
22

23
    std::string fname = ReplaceGreekLetterAbbr(name);
24
    nameIndex[fname] = catalogNumber;
25

26
#ifdef ENABLE_NLS
27
    std::string_view lname = D_(fname.c_str());
28
    if (lname != fname)
29
        localizedNameIndex[std::string(lname)] = catalogNumber;
30
#endif
31

32
    numberIndex.emplace(catalogNumber, std::move(fname));
33
}
34

35
void NameDatabase::erase(const AstroCatalog::IndexNumber catalogNumber)
36
{
37
    numberIndex.erase(catalogNumber);
38
}
39

40
AstroCatalog::IndexNumber
41
NameDatabase::getCatalogNumberByName(std::string_view name, [[maybe_unused]] bool i18n) const
42
{
43
    if (auto iter = nameIndex.find(name); iter != nameIndex.end())
44
        return iter->second;
45

46
#if ENABLE_NLS
47
    if (i18n)
48
    {
49
        if (auto iter = localizedNameIndex.find(name); iter != localizedNameIndex.end())
50
            return iter->second;
51
    }
52
#endif
53

54
    if (auto replacedGreek = ReplaceGreekLetterAbbr(name); replacedGreek != name)
55
        return getCatalogNumberByName(replacedGreek, i18n);
56

57
    return AstroCatalog::InvalidIndex;
58
}
59

60
// Return the first name matching the catalog number or end()
61
// if there are no matching names.  The first name *should* be the
62
// proper name of the OBJ, if one exists. This requires the
63
// OBJ name database file to have the proper names listed before
64
// other designations.  Also, the STL implementation must
65
// preserve this order when inserting the names into the multimap
66
// (not certain whether or not this behavior is in the STL spec.
67
// but it works on the implementations I've tried so far.)
68
NameDatabase::NumberIndex::const_iterator
69
NameDatabase::getFirstNameIter(const AstroCatalog::IndexNumber catalogNumber) const
70
{
71
    auto iter = numberIndex.lower_bound(catalogNumber);
72
    if (iter == numberIndex.end() || iter->first != catalogNumber)
73
        return getFinalNameIter();
74

75
    return iter;
76
}
77

78
NameDatabase::NumberIndex::const_iterator
79
NameDatabase::getFinalNameIter() const
80
{
81
    return numberIndex.end();
82
}
83

84
void
85
NameDatabase::getCompletion(std::vector<std::string>& completion, std::string_view name) const
86
{
87
    std::string name2 = ReplaceGreekLetter(name);
88
    for (const auto &[n, _] : nameIndex)
89
    {
90
        if (UTF8StartsWith(n, name2, true))
91
            completion.push_back(n);
92
    }
93

94
#ifdef ENABLE_NLS
95
    for (const auto &[n, _] : localizedNameIndex)
96
    {
97
        if (UTF8StartsWith(n, name2, true))
98
            completion.push_back(n);
99
    }
100
#endif
101
}
102

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.