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