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 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 +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: .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(root, "stops", w); + header.m_gatesOffset = base::checked_cast(w.Pos() - startOffset); + + // @TODO(bykoianko) It's necessary to serialize other transit graph data here. + + w.WritePaddingByEnd(8); + header.m_endOffset = base::checked_cast(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 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 +#include + +namespace +{ +using namespace routing; +using namespace routing::transit; +using namespace std; + +template +void TestSerialization(Obj const & obj) +{ + vector buffer; + MemWriter> writer(buffer); + obj.Serialize(writer); + + MemReader reader(buffer.data(), buffer.size()); + ReaderSource 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 + +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 + +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 + 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 + void Deserialize(TSource & src) + { + m_version = ReadPrimitiveFromSource(src); + m_reserve = ReadPrimitiveFromSource(src); + m_gatesOffset = ReadPrimitiveFromSource(src); + m_edgesOffset = ReadPrimitiveFromSource(src); + m_transfersOffset = ReadPrimitiveFromSource(src); + m_linesOffset = ReadPrimitiveFromSource(src); + m_shapesOffset = ReadPrimitiveFromSource(src); + m_networksOffset = ReadPrimitiveFromSource(src); + m_endOffset = ReadPrimitiveFromSource(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 + +namespace routing +{ +namespace transit +{ +Stop::Stop(StopId id, FeatureId featureId, std::vector 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 +#include +#include + +namespace routing +{ +namespace transit +{ +class Stop final +{ + friend std::string DebugPrint(Stop const & stop); + +public: + Stop() = default; + Stop(StopId id, FeatureId featureId, std::vector const & lineIds, m2::PointD const & point); + bool IsEqualForTesting(Stop const & stop) const; + + template + void Serialize(TSink & sink) const + { + WriteToSink(sink, m_id); + WriteToSink(sink, m_featureId); + WriteToSink(sink, static_cast(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 + void Deserialize(TSource & src) + { + m_id = ReadPrimitiveFromSource(src); + m_featureId = ReadPrimitiveFromSource(src); + uint32_t const lineIdsSize = ReadPrimitiveFromSource(src); + m_lineIds.resize(lineIdsSize); + for (uint32_t i = 0; i < lineIdsSize; ++i) + m_lineIds[i] = ReadPrimitiveFromSource(src); + m2::PointU pointU; + pointU.x = ReadPrimitiveFromSource(src); + pointU.y = ReadPrimitiveFromSource(src); + m_point = PointU2PointD(pointU, POINT_COORD_BITS); + } + +private: + StopId m_id = kStopIdInvalid; + FeatureId m_featureId = kFeatureIdInvalid; + std::vector 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 +#include + +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::max(); +StopId constexpr kStopIdInvalid = std::numeric_limits::max(); +TransfersId constexpr kTransfersIdInvalid = std::numeric_limits::max(); +NetworkId constexpr kNetworkIdInvalid = std::numeric_limits::max(); +FeatureId constexpr kFeatureIdInvalid = std::numeric_limits::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 = ""; }; 40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vehicle_model_for_country_test.cpp; sourceTree = ""; }; + 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 = ""; }; + 5667C1DE1F751F4200C6B31B /* routing_common.pro */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = routing_common.pro; sourceTree = ""; }; + 5667C1DF1F751F4200C6B31B /* transit_header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transit_header.cpp; sourceTree = ""; }; + 5667C1E01F751F4200C6B31B /* transit_stop.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = transit_stop.cpp; sourceTree = ""; }; + 56E41D831F72A64B00E28E2D /* transit_stop.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_stop.hpp; sourceTree = ""; }; + 56E41D851F72B42F00E28E2D /* transit_header.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_header.hpp; sourceTree = ""; }; + 56E41D861F72B42F00E28E2D /* transit_types.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_types.hpp; sourceTree = ""; }; 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 = ""; }; 671E78811E6A3C5D00B2859B /* bicycle_model.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = bicycle_model.hpp; sourceTree = ""; }; @@ -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 */ };