Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2017-09-22 13:43:21 +0300
committerTatiana Yan <tatiana.kondakova@gmail.com>2017-10-03 18:17:29 +0300
commite6403fa7c99df834b5b125772d8d2576046c23cb (patch)
tree2fde8d1d57e36601db81b6cb18d1e8ad7d8b1344
parentce64407b536e862a2bcd74052c668b66f0759476 (diff)
Transit section. Architecture.
-rw-r--r--generator/transit_generator.cpp180
-rw-r--r--generator/transit_generator.hpp8
-rw-r--r--routing_common/CMakeLists.txt5
-rw-r--r--routing_common/routing_common.pro5
-rw-r--r--routing_common/routing_common_tests/CMakeLists.txt1
-rw-r--r--routing_common/routing_common_tests/routing_common_tests.pro1
-rw-r--r--routing_common/routing_common_tests/transit_test.cpp60
-rw-r--r--routing_common/transit_header.cpp64
-rw-r--r--routing_common/transit_header.hpp64
-rw-r--r--routing_common/transit_stop.cpp35
-rw-r--r--routing_common/transit_stop.hpp74
-rw-r--r--routing_common/transit_types.hpp23
-rw-r--r--xcode/routing_common/routing_common.xcodeproj/project.pbxproj32
13 files changed, 549 insertions, 3 deletions
diff --git a/generator/transit_generator.cpp b/generator/transit_generator.cpp
index 40571f0201..66777aa967 100644
--- a/generator/transit_generator.cpp
+++ b/generator/transit_generator.cpp
@@ -1,16 +1,192 @@
#include "generator/transit_generator.hpp"
+#include "generator/osm_id.hpp"
+
+#include "routing_common/transit_header.hpp"
+#include "routing_common/transit_stop.hpp"
+
+#include "coding/file_container.hpp"
+#include "coding/file_name_utils.hpp"
+#include "coding/file_writer.hpp"
+
+#include "platform/platform.hpp"
+
#include "base/logging.hpp"
#include "base/macros.hpp"
+#include "3party/jansson/myjansson.hpp"
+
+using namespace platform;
+using namespace std;
+
+namespace
+{
+using namespace routing;
+using namespace routing::transit;
+
+/// \brief Fills Stop instance based on a json field. |node| should point at jansson item at
+/// array:
+/// "stops": [
+/// {
+/// "id": 343259523,
+/// "line_ids": [
+/// 19207936,
+/// 19207937
+/// ],
+/// "osm_id": 4611686018770647427,
+/// "point": {
+/// "x": 27.4970954,
+/// "y": 64.20146835878187
+/// },
+/// "title_anchors": []
+/// },
+/// ...
+/// ]
+void ReadJsonArrayItem(json_struct_t * node, Stop & stop)
+{
+ json_t * idItem = my::GetJSONObligatoryField(node, "id");
+ StopId id;
+ FromJSON(idItem, id);
+
+ json_t * osmIdItem = my::GetJSONObligatoryField(node, "osm_id");
+ json_int_t osmId;
+ FromJSON(osmIdItem, osmId);
+ // @TODO(bykoianko) |osmId| should be converted to feature id here.
+ FeatureId const featureId = 0;
+
+ vector<LineId> lineIds;
+ FromJSONObject(node, "line_ids", lineIds);
+
+ json_t * pointItem = my::GetJSONObligatoryField(node, "point");
+ CHECK(json_is_object(pointItem), ());
+ json_t * xItem = my::GetJSONObligatoryField(pointItem, "x");
+ m2::PointD point;
+ FromJSON(xItem, point.x);
+ json_t * yItem = my::GetJSONObligatoryField(pointItem, "y");
+ FromJSON(yItem, point.y);
+
+ stop = Stop(id, featureId, lineIds, point);
+}
+
+// @TODO(bykoianko) ReadJsonArrayItem(...) methods for the other transit graph structures should be added here.
+
+/// \returns file name without extension by a file path if a file name which have zero, one of several extensions.
+/// For example,
+/// GetFileName("Russia_Nizhny Novgorod Oblast.transit.json") returns "Russia_Nizhny Novgorod Oblast"
+/// GetFileName("Russia_Nizhny Novgorod Oblast.mwm") returns "Russia_Nizhny Novgorod Oblast"
+string GetFileName(string const & filePath)
+{
+ string name = filePath;
+ my::GetNameFromFullPath(name);
+
+ string nameWithExt;
+ do
+ {
+ nameWithExt = name;
+ my::GetNameWithoutExt(name);
+ }
+ while (nameWithExt != name);
+
+ return name;
+}
+
+template <class Item, class Sink>
+void SerializeObject(my::Json const & root, string const & key, Sink & sink)
+{
+ json_t const * const stops = json_object_get(root.get(), key.c_str());
+ CHECK(stops, ());
+ size_t const sz = json_array_size(stops);
+ for (size_t i = 0; i < sz; ++i)
+ {
+ Item item;
+ ReadJsonArrayItem(json_array_get(stops, i), item);
+ item.Serialize(sink);
+ }
+}
+} // namespace
+
namespace routing
{
namespace transit
{
-void BuildTransit(std::string const & mwmPath, std::string const & transitDir)
+string GetCountryId(string & graphCountryId);
+void BuildTransit(string const & mwmPath, string const & transitDir)
{
- LOG(LINFO, ("mwm path:", mwmPath, ", directory with transit:", transitDir));
+ // This method is under construction and should not be used for building production mwm sections.
NOTIMPLEMENTED();
+
+ string const countryId = GetFileName(mwmPath);
+ LOG(LINFO, ("countryId:", countryId));
+
+ Platform::FilesList filesList;
+ Platform::GetFilesByExt(transitDir, ".json", filesList);
+
+ LOG(LINFO,
+ ("mwm path:", mwmPath, ", directory with transit:", transitDir, "filesList:", filesList));
+
+ for (string const & graphFileName : filesList)
+ {
+ string const graphFullPath = my::JoinFoldersToPath(transitDir, graphFileName);
+
+ Platform::EFileType fileType;
+ Platform::EError errCode = Platform::GetFileType(graphFullPath, fileType);
+ CHECK_EQUAL(errCode, Platform::EError::ERR_OK,
+ ("File is not found:", graphFullPath, ", errCode:", errCode));
+ CHECK_EQUAL(fileType, Platform::EFileType::FILE_TYPE_REGULAR,
+ ("File is not found:", graphFullPath, ", fileType:", fileType));
+
+ // @TODO(bykoianko) In the future transit edges which cross mwm border will be split in the generator. Then
+ // routing will support cross mwm transit routing. In current version every json with transit graph
+ // should have a special name: <country id>.transit.json.
+ string const graphCountryId = GetFileName(graphFileName);
+ LOG(LINFO, ("graphCountryId:", graphCountryId));
+
+ if (graphCountryId != countryId)
+ continue;
+
+ LOG(LINFO, ("Creating", TRANSIT_FILE_TAG, "section for:", countryId, "based on", graphFullPath));
+
+ string jsonBuffer;
+ try
+ {
+ GetPlatform().GetReader(graphFullPath)->ReadAsString(jsonBuffer);
+ }
+ catch (RootException const & ex)
+ {
+ LOG(LCRITICAL, ("Can't open", graphFullPath, ex.what()));
+ }
+
+ // @TODO(bykoianko) If it's necessary to parse an integer jansson parser keeps it to time long long value.
+ // It's not good because osm id and stop id are uint64_t. This should be solve before continue writing
+ // transit jansson parsing. According to C++ signed long long is not smaller than long and at least 64 bits.
+ // So as a variant before saving to json osm id and stop id should be converted to signed long long and
+ // then after reading at generator they should be converted back.
+ my::Json root(jsonBuffer.c_str());
+ CHECK(root.get() != nullptr, ("Cannot parse the json file:", graphFullPath));
+
+ FilesContainerW cont(mwmPath, FileWriter::OP_WRITE_EXISTING);
+ FileWriter w = cont.GetWriter(TRANSIT_FILE_TAG);
+
+ TransitHeader header;
+
+ auto const startOffset = w.Pos();
+ header.Serialize(w);
+
+ SerializeObject<Stop>(root, "stops", w);
+ header.m_gatesOffset = base::checked_cast<uint32_t>(w.Pos() - startOffset);
+
+ // @TODO(bykoianko) It's necessary to serialize other transit graph data here.
+
+ w.WritePaddingByEnd(8);
+ header.m_endOffset = base::checked_cast<uint32_t>(w.Pos() - startOffset);
+
+ // Rewriting header info.
+ auto const endOffset = w.Pos();
+ w.Seek(startOffset);
+ header.Serialize(w);
+ w.Seek(endOffset);
+ LOG(LINFO, (TRANSIT_FILE_TAG, "section is ready. The size is", header.m_endOffset));
+ }
}
} // namespace transit
} // namespace routing
diff --git a/generator/transit_generator.hpp b/generator/transit_generator.hpp
index be37921502..a3526f6629 100644
--- a/generator/transit_generator.hpp
+++ b/generator/transit_generator.hpp
@@ -1,9 +1,15 @@
+#pragma once
+
#include <string>
namespace routing
{
namespace transit
{
-void BuildTransit(std::string const & mwmPath, std::string const & srtmDir);
+/// \brief Builds transit section at mwm.
+/// \param mwmPath relative or full path to built mwm. The name of mwm without extension is considered
+/// as country id.
+/// \param transitDir a path to directory with json files with transit graphs.
+void BuildTransit(std::string const & mwmPath, std::string const & transitDir);
} // namespace transit
} // namespace routing
diff --git a/routing_common/CMakeLists.txt b/routing_common/CMakeLists.txt
index 4858cbaf13..d130e3307f 100644
--- a/routing_common/CMakeLists.txt
+++ b/routing_common/CMakeLists.txt
@@ -8,7 +8,12 @@ set(
car_model.hpp
pedestrian_model.cpp
pedestrian_model.hpp
+ transit_header.cpp
+ transit_header.hpp
transit_max_speed.hpp
+ transit_stop.cpp
+ transit_stop.hpp
+ transit_types.hpp
vehicle_model.cpp
vehicle_model.hpp
)
diff --git a/routing_common/routing_common.pro b/routing_common/routing_common.pro
index 51ad9161d2..fa218bea0d 100644
--- a/routing_common/routing_common.pro
+++ b/routing_common/routing_common.pro
@@ -16,6 +16,8 @@ SOURCES += \
bicycle_model.cpp \
car_model.cpp \
pedestrian_model.cpp \
+ transit_header.cpp \
+ transit_stop.cpp \
vehicle_model.cpp \
@@ -23,5 +25,8 @@ HEADERS += \
bicycle_model.hpp \
car_model.hpp \
pedestrian_model.hpp \
+ transit_header.hpp \
transit_max_speed.hpp \
+ transit_stop.hpp \
+ transit_types.hpp \
vehicle_model.hpp \
diff --git a/routing_common/routing_common_tests/CMakeLists.txt b/routing_common/routing_common_tests/CMakeLists.txt
index e3d9029ab8..0ddf624032 100644
--- a/routing_common/routing_common_tests/CMakeLists.txt
+++ b/routing_common/routing_common_tests/CMakeLists.txt
@@ -2,6 +2,7 @@ project(routing_common_tests)
set(
SRC
+ transit_test.cpp
vehicle_model_for_country_test.cpp
vehicle_model_test.cpp
)
diff --git a/routing_common/routing_common_tests/routing_common_tests.pro b/routing_common/routing_common_tests/routing_common_tests.pro
index f4e58be614..f20ae58418 100644
--- a/routing_common/routing_common_tests/routing_common_tests.pro
+++ b/routing_common/routing_common_tests/routing_common_tests.pro
@@ -17,5 +17,6 @@ QT *= core
SOURCES += \
../../testing/testingmain.cpp \
+ transit_test.cpp \
vehicle_model_for_country_test.cpp \
vehicle_model_test.cpp \
diff --git a/routing_common/routing_common_tests/transit_test.cpp b/routing_common/routing_common_tests/transit_test.cpp
new file mode 100644
index 0000000000..29ee62a346
--- /dev/null
+++ b/routing_common/routing_common_tests/transit_test.cpp
@@ -0,0 +1,60 @@
+#include "testing/testing.hpp"
+
+#include "coding/reader.hpp"
+#include "coding/writer.hpp"
+
+#include "routing_common/transit_header.hpp"
+#include "routing_common/transit_stop.hpp"
+#include "routing_common/transit_types.hpp"
+
+#include <cstdint>
+#include <vector>
+
+namespace
+{
+using namespace routing;
+using namespace routing::transit;
+using namespace std;
+
+template <class Obj>
+void TestSerialization(Obj const & obj)
+{
+ vector<uint8_t> buffer;
+ MemWriter<vector<uint8_t>> writer(buffer);
+ obj.Serialize(writer);
+
+ MemReader reader(buffer.data(), buffer.size());
+ ReaderSource<MemReader> src(reader);
+ Obj deserializedHeader;
+ deserializedHeader.Deserialize(src);
+
+ TEST(obj.IsEqualForTesting(deserializedHeader), (obj, "is not equal to", deserializedHeader));
+}
+
+UNIT_TEST(ZeroTransitHeaderSerialization)
+{
+ TransitHeader header;
+ TestSerialization(header);
+}
+
+UNIT_TEST(TransitHeaderSerialization)
+{
+ TransitHeader header(1 /* version */, 1000 /* gatesOffset */, 2000 /* edgesOffset */,
+ 3000 /* transfersOffset */, 4000 /* linesOffset */, 5000 /* shapesOffset */,
+ 6000 /* networksOffset */, 7000 /* endOffset */);
+ TestSerialization(header);
+}
+
+UNIT_TEST(ZeroTransitStopSerialization)
+{
+ Stop stop;
+ TestSerialization(stop);
+}
+
+UNIT_TEST(TransitStopSerialization)
+{
+ Stop stop(1234 /* id */, 5678 /* feature id */, {7, 8, 9, 10} /* line id */, {55.0, 37.0});
+ TestSerialization(stop);
+}
+} // namespace
+
diff --git a/routing_common/transit_header.cpp b/routing_common/transit_header.cpp
new file mode 100644
index 0000000000..9ffc8f3734
--- /dev/null
+++ b/routing_common/transit_header.cpp
@@ -0,0 +1,64 @@
+#include "routing_common/transit_header.hpp"
+
+#include <sstream>
+
+namespace routing
+{
+namespace transit
+{
+using namespace std;
+
+TransitHeader::TransitHeader(uint16_t version, uint32_t gatesOffset, uint32_t edgesOffset,
+ uint32_t transfersOffset, uint32_t linesOffset, uint32_t shapesOffset,
+ uint32_t networksOffset, uint32_t endOffset)
+ : m_version(version)
+ , m_reserve(0)
+ , m_gatesOffset(gatesOffset)
+ , m_edgesOffset(edgesOffset)
+ , m_transfersOffset(transfersOffset)
+ , m_linesOffset(linesOffset)
+ , m_shapesOffset(shapesOffset)
+ , m_networksOffset(networksOffset)
+ , m_endOffset(endOffset)
+{
+}
+
+void TransitHeader::Reset()
+{
+ m_version = 0;
+ m_reserve = 0;
+ m_gatesOffset = 0;
+ m_edgesOffset = 0;
+ m_transfersOffset = 0;
+ m_linesOffset = 0;
+ m_shapesOffset = 0;
+ m_networksOffset = 0;
+ m_endOffset = 0;
+}
+
+bool TransitHeader::IsEqualForTesting(TransitHeader const & header) const
+{
+ return m_version == header.m_version && m_reserve == header.m_reserve &&
+ m_gatesOffset == header.m_gatesOffset && m_edgesOffset == header.m_edgesOffset &&
+ m_transfersOffset == header.m_transfersOffset && m_linesOffset == header.m_linesOffset &&
+ m_shapesOffset == header.m_shapesOffset && m_networksOffset == header.m_networksOffset &&
+ m_endOffset == header.m_endOffset;
+}
+
+string DebugPrint(TransitHeader const & header)
+{
+ stringstream out;
+ out << "TransitHeader [ m_version = " << header.m_version
+ << ", m_reserve = " << header.m_reserve
+ << ", m_gatesOffset = " << header.m_gatesOffset
+ << ", m_edgesOffset = " << header.m_edgesOffset
+ << ", m_transfersOffset = " << header.m_transfersOffset
+ << ", m_linesOffset = " << header.m_linesOffset
+ << ", m_shapesOffset = " << header.m_shapesOffset
+ << ", m_networksOffset = " << header.m_networksOffset
+ << ", m_endOffset = " << header.m_endOffset
+ << " ]" << endl;
+ return out.str();
+}
+} // namespace transit
+} // namespace routing
diff --git a/routing_common/transit_header.hpp b/routing_common/transit_header.hpp
new file mode 100644
index 0000000000..046dc08a9a
--- /dev/null
+++ b/routing_common/transit_header.hpp
@@ -0,0 +1,64 @@
+#pragma once
+
+#include "coding/reader.hpp"
+#include "coding/write_to_sink.hpp"
+
+#include <cstdint>
+
+namespace routing
+{
+namespace transit
+{
+struct TransitHeader final
+{
+ TransitHeader() { Reset(); }
+ TransitHeader(uint16_t version, uint32_t gatesOffset, uint32_t edgesOffset,
+ uint32_t transfersOffset, uint32_t linesOffset, uint32_t shapesOffset,
+ uint32_t networksOffset, uint32_t endOffset);
+ void Reset();
+ bool IsEqualForTesting(TransitHeader const & header) const;
+
+ template <class TSink>
+ void Serialize(TSink & sink) const
+ {
+ WriteToSink(sink, m_version);
+ WriteToSink(sink, m_reserve);
+ WriteToSink(sink, m_gatesOffset);
+ WriteToSink(sink, m_edgesOffset);
+ WriteToSink(sink, m_transfersOffset);
+ WriteToSink(sink, m_linesOffset);
+ WriteToSink(sink, m_shapesOffset);
+ WriteToSink(sink, m_networksOffset);
+ WriteToSink(sink, m_endOffset);
+ }
+
+ template <class TSource>
+ void Deserialize(TSource & src)
+ {
+ m_version = ReadPrimitiveFromSource<uint16_t>(src);
+ m_reserve = ReadPrimitiveFromSource<uint16_t>(src);
+ m_gatesOffset = ReadPrimitiveFromSource<uint32_t>(src);
+ m_edgesOffset = ReadPrimitiveFromSource<uint32_t>(src);
+ m_transfersOffset = ReadPrimitiveFromSource<uint32_t>(src);
+ m_linesOffset = ReadPrimitiveFromSource<uint32_t>(src);
+ m_shapesOffset = ReadPrimitiveFromSource<uint32_t>(src);
+ m_networksOffset = ReadPrimitiveFromSource<uint32_t>(src);
+ m_endOffset = ReadPrimitiveFromSource<uint32_t>(src);
+ }
+
+ uint16_t m_version;
+ uint16_t m_reserve;
+ uint32_t m_gatesOffset;
+ uint32_t m_edgesOffset;
+ uint32_t m_transfersOffset;
+ uint32_t m_linesOffset;
+ uint32_t m_shapesOffset;
+ uint32_t m_networksOffset;
+ uint32_t m_endOffset;
+};
+
+static_assert(sizeof(TransitHeader) == 32, "Wrong header size of transit section.");
+
+string DebugPrint(TransitHeader const & turnItem);
+} // namespace transit
+} // namespace routing
diff --git a/routing_common/transit_stop.cpp b/routing_common/transit_stop.cpp
new file mode 100644
index 0000000000..6ccd948e04
--- /dev/null
+++ b/routing_common/transit_stop.cpp
@@ -0,0 +1,35 @@
+#include "routing_common/transit_stop.hpp"
+
+#include "geometry/point2d.hpp"
+
+#include <sstream>
+
+namespace routing
+{
+namespace transit
+{
+Stop::Stop(StopId id, FeatureId featureId, std::vector<LineId> const & lineIds,
+ m2::PointD const & point)
+ : m_id(id), m_featureId(featureId), m_lineIds(lineIds), m_point(point)
+{
+}
+
+bool Stop::IsEqualForTesting(Stop const & stop) const
+{
+ double constexpr kPointsEqualEpsilon = 1e-6;
+ return m_id == stop.m_id && m_featureId == stop.m_featureId && m_lineIds == stop.m_lineIds &&
+ my::AlmostEqualAbs(m_point, stop.m_point, kPointsEqualEpsilon);
+}
+
+std::string DebugPrint(Stop const & stop)
+{
+ std::stringstream out;
+ out << "Stop [ m_id = " << stop.m_id
+ << ", m_featureId = " << stop.m_featureId
+ << ", m_lineIds = " << ::DebugPrint(stop.m_lineIds)
+ << ", m_point = " << DebugPrint(stop.m_point)
+ << " ]" << endl;
+ return out.str();
+}
+} // namespace transit
+} // namespace routing
diff --git a/routing_common/transit_stop.hpp b/routing_common/transit_stop.hpp
new file mode 100644
index 0000000000..b09f198db9
--- /dev/null
+++ b/routing_common/transit_stop.hpp
@@ -0,0 +1,74 @@
+#pragma once
+
+#include "routing_common/transit_types.hpp"
+
+#include "coding/point_to_integer.hpp"
+#include "coding/reader.hpp"
+#include "coding/write_to_sink.hpp"
+
+#include "geometry/point2d.hpp"
+
+#include <cstdint>
+#include <string>
+#include <vector>
+
+namespace routing
+{
+namespace transit
+{
+class Stop final
+{
+ friend std::string DebugPrint(Stop const & stop);
+
+public:
+ Stop() = default;
+ Stop(StopId id, FeatureId featureId, std::vector<LineId> const & lineIds, m2::PointD const & point);
+ bool IsEqualForTesting(Stop const & stop) const;
+
+ template <class TSink>
+ void Serialize(TSink & sink) const
+ {
+ WriteToSink(sink, m_id);
+ WriteToSink(sink, m_featureId);
+ WriteToSink(sink, static_cast<uint32_t>(m_lineIds.size()));
+ for (LineId lineId : m_lineIds)
+ WriteToSink(sink, lineId);
+
+ m2::PointU const pointU = PointD2PointU(m_point, POINT_COORD_BITS);
+ WriteToSink(sink, pointU.x);
+ WriteToSink(sink, pointU.y);
+ }
+
+ template <class TSource>
+ void Deserialize(TSource & src)
+ {
+ m_id = ReadPrimitiveFromSource<StopId>(src);
+ m_featureId = ReadPrimitiveFromSource<FeatureId>(src);
+ uint32_t const lineIdsSize = ReadPrimitiveFromSource<uint32_t>(src);
+ m_lineIds.resize(lineIdsSize);
+ for (uint32_t i = 0; i < lineIdsSize; ++i)
+ m_lineIds[i] = ReadPrimitiveFromSource<LineId>(src);
+ m2::PointU pointU;
+ pointU.x = ReadPrimitiveFromSource<uint32_t>(src);
+ pointU.y = ReadPrimitiveFromSource<uint32_t>(src);
+ m_point = PointU2PointD(pointU, POINT_COORD_BITS);
+ }
+
+private:
+ StopId m_id = kStopIdInvalid;
+ FeatureId m_featureId = kFeatureIdInvalid;
+ std::vector<LineId> m_lineIds;
+ m2::PointD m_point;
+ // @TODO(bykoianko) It's necessary to add field m_titleAnchors here and implement serialization
+ // and deserialization.
+};
+
+std::string DebugPrint(Stop const & stop);
+
+// @TODO(bykoianko) Method bool DeserializeStops(Stops const & stops) should be implemented here.
+// This method will parse table "stops" at TRANSIT_FILE_TAG mwm section and fills its parameter.
+
+// @TODO(bykoianko) Data structures and methods for other transit data should be implemented in
+// separate units.
+} // namespace transit
+} // namespace routing
diff --git a/routing_common/transit_types.hpp b/routing_common/transit_types.hpp
new file mode 100644
index 0000000000..1f0184846e
--- /dev/null
+++ b/routing_common/transit_types.hpp
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <cstdint>
+#include <limits>
+
+namespace routing
+{
+namespace transit
+{
+using LineId = uint32_t;
+using StopId = uint64_t;
+using TransfersId = uint64_t;
+using NetworkId = uint32_t;
+using FeatureId = uint32_t;
+
+LineId constexpr kLineIdInvalid = std::numeric_limits<LineId>::max();
+StopId constexpr kStopIdInvalid = std::numeric_limits<StopId>::max();
+TransfersId constexpr kTransfersIdInvalid = std::numeric_limits<TransfersId>::max();
+NetworkId constexpr kNetworkIdInvalid = std::numeric_limits<NetworkId>::max();
+FeatureId constexpr kFeatureIdInvalid = std::numeric_limits<FeatureId>::max();
+
+} // namespace transit
+} // namespace routing \ No newline at end of file
diff --git a/xcode/routing_common/routing_common.xcodeproj/project.pbxproj b/xcode/routing_common/routing_common.xcodeproj/project.pbxproj
index 649ca207cf..3293d347bd 100644
--- a/xcode/routing_common/routing_common.xcodeproj/project.pbxproj
+++ b/xcode/routing_common/routing_common.xcodeproj/project.pbxproj
@@ -9,6 +9,13 @@
/* Begin PBXBuildFile section */
40576F7A1F7AA1B4000B593B /* transit_max_speed.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 40576F791F7AA1B4000B593B /* transit_max_speed.hpp */; };
40FF45D01F388EF80046BD40 /* vehicle_model_for_country_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */; };
+ 5647A4511F72BEB600DE1125 /* libicu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5647A4521F72BEB600DE1125 /* libicu.a */; };
+ 5667C1DD1F751F2700C6B31B /* transit_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5647A4531F72BF2B00DE1125 /* transit_test.cpp */; };
+ 5667C1E11F751F4200C6B31B /* transit_header.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5667C1DF1F751F4200C6B31B /* transit_header.cpp */; };
+ 5667C1E21F751F4200C6B31B /* transit_stop.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5667C1E01F751F4200C6B31B /* transit_stop.cpp */; };
+ 56E41D841F72A64B00E28E2D /* transit_stop.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 56E41D831F72A64B00E28E2D /* transit_stop.hpp */; };
+ 56E41D871F72B42F00E28E2D /* transit_header.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 56E41D851F72B42F00E28E2D /* transit_header.hpp */; };
+ 56E41D881F72B42F00E28E2D /* transit_types.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 56E41D861F72B42F00E28E2D /* transit_types.hpp */; };
671E78881E6A3C5D00B2859B /* bicycle_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 671E78801E6A3C5D00B2859B /* bicycle_model.cpp */; };
671E78891E6A3C5D00B2859B /* bicycle_model.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 671E78811E6A3C5D00B2859B /* bicycle_model.hpp */; };
671E788A1E6A3C5D00B2859B /* car_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 671E78821E6A3C5D00B2859B /* car_model.cpp */; };
@@ -38,6 +45,14 @@
/* Begin PBXFileReference section */
40576F791F7AA1B4000B593B /* transit_max_speed.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_max_speed.hpp; sourceTree = "<group>"; };
40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vehicle_model_for_country_test.cpp; sourceTree = "<group>"; };
+ 5647A4521F72BEB600DE1125 /* libicu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libicu.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 5647A4531F72BF2B00DE1125 /* transit_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transit_test.cpp; sourceTree = "<group>"; };
+ 5667C1DE1F751F4200C6B31B /* routing_common.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = routing_common.pro; sourceTree = "<group>"; };
+ 5667C1DF1F751F4200C6B31B /* transit_header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transit_header.cpp; sourceTree = "<group>"; };
+ 5667C1E01F751F4200C6B31B /* transit_stop.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transit_stop.cpp; sourceTree = "<group>"; };
+ 56E41D831F72A64B00E28E2D /* transit_stop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_stop.hpp; sourceTree = "<group>"; };
+ 56E41D851F72B42F00E28E2D /* transit_header.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_header.hpp; sourceTree = "<group>"; };
+ 56E41D861F72B42F00E28E2D /* transit_types.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_types.hpp; sourceTree = "<group>"; };
671E78721E6A3BE200B2859B /* librouting_common.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = librouting_common.a; sourceTree = BUILT_PRODUCTS_DIR; };
671E78801E6A3C5D00B2859B /* bicycle_model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bicycle_model.cpp; sourceTree = "<group>"; };
671E78811E6A3C5D00B2859B /* bicycle_model.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bicycle_model.hpp; sourceTree = "<group>"; };
@@ -80,6 +95,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 5647A4511F72BEB600DE1125 /* libicu.a in Frameworks */,
671E78D11E6A414B00B2859B /* libopening_hours.a in Frameworks */,
671E78CF1E6A414600B2859B /* libjansson.a in Frameworks */,
671E78CD1E6A413F00B2859B /* libz.tbd in Frameworks */,
@@ -124,6 +140,12 @@
671E78741E6A3BE200B2859B /* routing_common */ = {
isa = PBXGroup;
children = (
+ 5667C1DE1F751F4200C6B31B /* routing_common.pro */,
+ 5667C1DF1F751F4200C6B31B /* transit_header.cpp */,
+ 5667C1E01F751F4200C6B31B /* transit_stop.cpp */,
+ 56E41D851F72B42F00E28E2D /* transit_header.hpp */,
+ 56E41D861F72B42F00E28E2D /* transit_types.hpp */,
+ 56E41D831F72A64B00E28E2D /* transit_stop.hpp */,
671E78801E6A3C5D00B2859B /* bicycle_model.cpp */,
671E78811E6A3C5D00B2859B /* bicycle_model.hpp */,
671E78821E6A3C5D00B2859B /* car_model.cpp */,
@@ -141,6 +163,7 @@
671E78971E6A3DA800B2859B /* routing_common_tests */ = {
isa = PBXGroup;
children = (
+ 5647A4531F72BF2B00DE1125 /* transit_test.cpp */,
40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */,
671E78AF1E6A3FEF00B2859B /* testingmain.cpp */,
671E78AD1E6A3FDB00B2859B /* vehicle_model_test.cpp */,
@@ -152,6 +175,7 @@
671E78B41E6A404F00B2859B /* Frameworks */ = {
isa = PBXGroup;
children = (
+ 5647A4521F72BEB600DE1125 /* libicu.a */,
671E78D01E6A414B00B2859B /* libopening_hours.a */,
671E78CE1E6A414600B2859B /* libjansson.a */,
671E78CC1E6A413F00B2859B /* libz.tbd */,
@@ -178,8 +202,11 @@
buildActionMask = 2147483647;
files = (
671E788D1E6A3C5D00B2859B /* pedestrian_model.hpp in Headers */,
+ 56E41D871F72B42F00E28E2D /* transit_header.hpp in Headers */,
+ 56E41D881F72B42F00E28E2D /* transit_types.hpp in Headers */,
671E78891E6A3C5D00B2859B /* bicycle_model.hpp in Headers */,
40576F7A1F7AA1B4000B593B /* transit_max_speed.hpp in Headers */,
+ 56E41D841F72A64B00E28E2D /* transit_stop.hpp in Headers */,
671E788B1E6A3C5D00B2859B /* car_model.hpp in Headers */,
671E788F1E6A3C5D00B2859B /* vehicle_model.hpp in Headers */,
);
@@ -275,10 +302,12 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 5667C1E11F751F4200C6B31B /* transit_header.cpp in Sources */,
671E788A1E6A3C5D00B2859B /* car_model.cpp in Sources */,
671E78881E6A3C5D00B2859B /* bicycle_model.cpp in Sources */,
671E788E1E6A3C5D00B2859B /* vehicle_model.cpp in Sources */,
40FF45D01F388EF80046BD40 /* vehicle_model_for_country_test.cpp in Sources */,
+ 5667C1E21F751F4200C6B31B /* transit_stop.cpp in Sources */,
671E788C1E6A3C5D00B2859B /* pedestrian_model.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -287,6 +316,7 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 5667C1DD1F751F2700C6B31B /* transit_test.cpp in Sources */,
671E78B21E6A3FF900B2859B /* vehicle_model_test.cpp in Sources */,
671E78B11E6A3FF400B2859B /* testingmain.cpp in Sources */,
);
@@ -362,6 +392,7 @@
671E787F1E6A3BE200B2859B /* Release */,
);
defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
};
671E78AA1E6A3DA800B2859B /* Build configuration list for PBXNativeTarget "routing_common_tests" */ = {
isa = XCConfigurationList;
@@ -370,6 +401,7 @@
671E78AC1E6A3DA800B2859B /* Release */,
);
defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};