1 /*
2 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7 #include "trainstationdb.h"
8 #include "trainstationdb_data.cpp"
9
10 #include <QString>
11
12 #include <algorithm>
13 #include <cstring>
14
15 using namespace KItinerary;
16 using namespace KItinerary::KnowledgeDb;
17
18 namespace KItinerary {
19 namespace KnowledgeDb {
20
21 static const auto trainstation_table_size = sizeof(trainstation_table) / sizeof(TrainStation);
22 static_assert(trainstation_table_size < (1 << (sizeof(TrainStationIndex) * 8)), "TrainStationIndex data type too small!");
23
24 }
25 }
26
27 template <typename Id, std::size_t Size>
lookupStation(Id id,const TrainStationIdIndex<Id> (& tab)[Size])28 static TrainStation lookupStation(Id id, const TrainStationIdIndex<Id>(&tab)[Size])
29 {
30 const auto it = std::lower_bound(std::begin(tab), std::end(tab), id);
31 if (it == std::end(tab) || (*it).stationId != id) {
32 return {};
33 }
34
35 return trainstation_table[(*it).stationIndex.value()];
36 }
37
stationForIbnr(IBNR ibnr)38 TrainStation KnowledgeDb::stationForIbnr(IBNR ibnr)
39 {
40 return lookupStation(ibnr, ibnr_table);
41 }
42
stationForUic(UICStation uic)43 TrainStation KnowledgeDb::stationForUic(UICStation uic)
44 {
45 return lookupStation(uic, uic_table);
46 }
47
stationForSncfStationId(SncfStationId sncfId)48 TrainStation KnowledgeDb::stationForSncfStationId(SncfStationId sncfId)
49 {
50 return lookupStation(sncfId, sncfStationId_table);
51 }
52
stationForIndianRailwaysStationCode(const QString & code)53 TrainStation KnowledgeDb::stationForIndianRailwaysStationCode(const QString &code)
54 {
55 const auto codeStr = code.toUtf8();
56 const auto it = std::lower_bound(std::begin(indianRailwaysSationCode_index), std::end(indianRailwaysSationCode_index), codeStr, [](auto lhs, const QByteArray &rhs) {
57 return strcmp(indianRailwaysSationCode_stringtable + lhs.offset, rhs.constData()) < 0;
58 });
59 if (it == std::end(indianRailwaysSationCode_index) || strcmp(indianRailwaysSationCode_stringtable + (*it).offset, codeStr.constData()) != 0) {
60 return {};
61 }
62
63 return trainstation_table[(*it).stationIndex.value()];
64 }
65
stationForVRStationCode(VRStationCode vrStation)66 TrainStation KnowledgeDb::stationForVRStationCode(VRStationCode vrStation)
67 {
68 return lookupStation(vrStation, vrfiConnexionsId_table);
69 }
70
stationForBenerailId(BenerailStationId id)71 TrainStation KnowledgeDb::stationForBenerailId(BenerailStationId id)
72 {
73 return lookupStation(id, benerail_table);
74 }
75