diff --git a/generator/transit_generator.cpp b/generator/transit_generator.cpp index a8ae865399..1dbb29e904 100644 --- a/generator/transit_generator.cpp +++ b/generator/transit_generator.cpp @@ -4,7 +4,6 @@ #include "generator/borders_loader.hpp" #include "generator/utils.hpp" -#include "routing/routing_exceptions.hpp" #include "routing/index_router.hpp" #include "routing/routing_exceptions.hpp" #include "routing/vehicle_mask.hpp" @@ -65,8 +64,10 @@ string GetMwmPath(string const & mwmDir, TCountryId const & countryId) return my::JoinPath(mwmDir, countryId + DATA_FILE_EXTENSION); } -/// \brief Calculates best pedestrian segment for every gate in |m_gates|. -/// \note All gates in |m_gates| must have a valid |m_point| field before the call. +/// \brief Calculates best pedestrian segment for every gate in |graphData.m_gates|. +/// The result of the calculation is set to |Gate::m_bestPedestrianSegment| of every gate +/// from |graphData.m_gates|. +/// \note All gates in |graphData.m_gates| must have a valid |m_point| field before the call. void CalculateBestPedestrianSegments(string const & mwmPath, TCountryId const & countryId, GraphData & graphData) { diff --git a/map/transit/transit_reader.cpp b/map/transit/transit_reader.cpp index 26720bdcdc..aa351a29fc 100644 --- a/map/transit/transit_reader.cpp +++ b/map/transit/transit_reader.cpp @@ -8,6 +8,8 @@ #include "drape_frontend/stylist.hpp" +#include "base/stl_add.hpp" + using namespace routing; using namespace std; @@ -18,13 +20,13 @@ bool TransitReader::Init(MwmSet::MwmId const & mwmId) if (!handle.IsAlive()) { LOG(LWARNING, ("Can't get mwm handle for", mwmId)); - return {}; + return false; } MwmValue const & mwmValue = *handle.GetValue(); if (!mwmValue.m_cont.IsExist(TRANSIT_FILE_TAG)) - return {}; + return false; - m_reader = make_unique(mwmValue.m_cont.GetReader(TRANSIT_FILE_TAG)); + m_reader = my::make_unique(mwmValue.m_cont.GetReader(TRANSIT_FILE_TAG)); return IsValid(); } @@ -42,7 +44,7 @@ bool ReadTransitTask::Init(uint64_t id, MwmSet::MwmId const & mwmId, unique_ptr< if (transitInfo == nullptr) { m_loadSubset = false; - m_transitInfo = make_unique(); + m_transitInfo = my::make_unique(); } else { @@ -131,7 +133,7 @@ void TransitReadManager::Start() return; using namespace placeholders; - uint8_t constexpr kThreadsCount = 2; + uint8_t constexpr kThreadsCount = 1; m_threadsPool = my::make_unique( kThreadsCount, bind(&TransitReadManager::OnTaskCompleted, this, _1)); } diff --git a/map/transit/transit_reader.hpp b/map/transit/transit_reader.hpp index 3f133d0638..0db8fb0ed2 100644 --- a/map/transit/transit_reader.hpp +++ b/map/transit/transit_reader.hpp @@ -25,6 +25,7 @@ public: bool Init(MwmSet::MwmId const & mwmId); bool IsValid() const { return m_reader != nullptr; } + /// \note This method should be used only if IsValid() returns true. Reader & GetReader(); private: diff --git a/routing_common/transit_graph_data.cpp b/routing_common/transit_graph_data.cpp index e20c0e1bb7..6487c50a55 100644 --- a/routing_common/transit_graph_data.cpp +++ b/routing_common/transit_graph_data.cpp @@ -134,6 +134,16 @@ void UpdateItems(set const & ids, vector & items) SortVisitor{}(itemsToFill, nullptr /* name */); items.swap(itemsToFill); } + +template +void ReadItems(uint32_t start, uint32_t end, NonOwningReaderSource & src, vector & itmes) +{ + Deserializer deserializer(src); + CHECK_EQUAL(src.Pos(), start, ("Wrong", TRANSIT_FILE_TAG, "section format.")); + deserializer(itmes); + CHECK_EQUAL(src.Pos(), end, ("Wrong", TRANSIT_FILE_TAG, "section format.")); + CHECK(IsValidSortedUnique(itmes), ()); +} } // namespace namespace routing @@ -263,50 +273,46 @@ void GraphData::Serialize(Writer & writer) void GraphData::DeserializeAll(Reader & reader) { - NonOwningReaderSource src(reader); - - ReadHeader(src); - ReadStops(src); - ReadGates(src); - ReadEdges(src); - ReadTransfers(src); - ReadLines(src); - ReadShapes(src); - ReadNetworks(src); + DeserializeWith(reader, [this](NonOwningReaderSource & src) { + ReadStops(src); + ReadGates(src); + ReadEdges(src); + ReadTransfers(src); + ReadLines(src); + ReadShapes(src); + ReadNetworks(src); + }); } void GraphData::DeserializeForRouting(Reader & reader) { - NonOwningReaderSource src(reader); - - ReadHeader(src); - ReadStops(src); - ReadGates(src); - ReadEdges(src); - src.Skip(m_header.m_linesOffset - src.Pos()); - ReadLines(src); + DeserializeWith(reader, [this](NonOwningReaderSource & src) { + ReadStops(src); + ReadGates(src); + ReadEdges(src); + src.Skip(m_header.m_linesOffset - src.Pos()); + ReadLines(src); + }); } void GraphData::DeserializeForRendering(Reader & reader) { - NonOwningReaderSource src(reader); - - ReadHeader(src); - ReadStops(src); - src.Skip(m_header.m_transfersOffset - src.Pos()); - ReadTransfers(src); - ReadLines(src); - ReadShapes(src); + DeserializeWith(reader, [this](NonOwningReaderSource & src) { + ReadStops(src); + src.Skip(m_header.m_transfersOffset - src.Pos()); + ReadTransfers(src); + ReadLines(src); + ReadShapes(src); + }); } void GraphData::DeserializeForCrossMwm(Reader & reader) { - NonOwningReaderSource src(reader); - - ReadHeader(src); - ReadStops(src); - src.Skip(m_header.m_edgesOffset - src.Pos()); - ReadEdges(src); + DeserializeWith(reader, [this](NonOwningReaderSource & src) { + ReadStops(src); + src.Skip(m_header.m_edgesOffset - src.Pos()); + ReadEdges(src); + }); } void GraphData::AppendTo(GraphData const & rhs) @@ -522,65 +528,37 @@ void GraphData::ReadHeader(NonOwningReaderSource & src) void GraphData::ReadStops(NonOwningReaderSource & src) { - Deserializer deserializer(src); - CHECK_EQUAL(src.Pos(), m_header.m_stopsOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - deserializer(m_stops); - CHECK_EQUAL(src.Pos(), m_header.m_gatesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - CHECK(IsValidSortedUnique(m_stops), ()); + ReadItems(m_header.m_stopsOffset, m_header.m_gatesOffset, src, m_stops); } void GraphData::ReadGates(NonOwningReaderSource & src) { - Deserializer deserializer(src); - CHECK_EQUAL(src.Pos(), m_header.m_gatesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - deserializer(m_gates); - CHECK_EQUAL(src.Pos(), m_header.m_edgesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - CHECK(IsValidSortedUnique(m_gates), ()); + ReadItems(m_header.m_gatesOffset, m_header.m_edgesOffset, src, m_gates); } void GraphData::ReadEdges(NonOwningReaderSource & src) { - Deserializer deserializer(src); - CHECK_EQUAL(src.Pos(), m_header.m_edgesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - deserializer(m_edges); - CHECK_EQUAL(src.Pos(), m_header.m_transfersOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - CHECK(IsValidSortedUnique(m_edges), ()); + ReadItems(m_header.m_edgesOffset, m_header.m_transfersOffset, src, m_edges); } void GraphData::ReadTransfers(NonOwningReaderSource & src) { - Deserializer deserializer(src); - CHECK_EQUAL(src.Pos(), m_header.m_transfersOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - deserializer(m_transfers); - CHECK_EQUAL(src.Pos(), m_header.m_linesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - CHECK(IsValidSortedUnique(m_transfers), ()); + ReadItems(m_header.m_transfersOffset, m_header.m_linesOffset, src, m_transfers); } void GraphData::ReadLines(NonOwningReaderSource & src) { - Deserializer deserializer(src); - CHECK_EQUAL(src.Pos(), m_header.m_linesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - deserializer(m_lines); - CHECK_EQUAL(src.Pos(), m_header.m_shapesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - CHECK(IsValidSortedUnique(m_lines), ()); + ReadItems(m_header.m_linesOffset, m_header.m_shapesOffset, src, m_lines); } void GraphData::ReadShapes(NonOwningReaderSource & src) { - Deserializer deserializer(src); - CHECK_EQUAL(src.Pos(), m_header.m_shapesOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - deserializer(m_shapes); - CHECK_EQUAL(src.Pos(), m_header.m_networksOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - CHECK(IsValidSortedUnique(m_shapes), ()); + ReadItems(m_header.m_shapesOffset, m_header.m_networksOffset, src, m_shapes); } void GraphData::ReadNetworks(NonOwningReaderSource & src) { - Deserializer deserializer(src); - CHECK_EQUAL(src.Pos(), m_header.m_networksOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - deserializer(m_networks); - CHECK_EQUAL(src.Pos(), m_header.m_endOffset, ("Wrong", TRANSIT_FILE_TAG, "section format.")); - CHECK(IsValidSortedUnique(m_networks), ()); + ReadItems(m_header.m_networksOffset, m_header.m_endOffset, src, m_networks); } } // namespace transit } // namespace routing diff --git a/routing_common/transit_graph_data.hpp b/routing_common/transit_graph_data.hpp index 8a1768c38a..897cf37e29 100644 --- a/routing_common/transit_graph_data.hpp +++ b/routing_common/transit_graph_data.hpp @@ -126,6 +126,7 @@ class GraphData { public: void DeserializeFromJson(my::Json const & root, OsmIdToFeatureIdsMap const & mapping); + /// \note This method changes only |m_header| and fills it with correct offsets. void Serialize(Writer & writer); void DeserializeAll(Reader & reader); void DeserializeForRouting(Reader & reader); @@ -197,6 +198,14 @@ private: void ReadShapes(NonOwningReaderSource & src); void ReadNetworks(NonOwningReaderSource & src); + template + void DeserializeWith(Reader & reader, Fn && fn) + { + NonOwningReaderSource src(reader); + ReadHeader(src); + fn(src); + } + TransitHeader m_header; std::vector m_stops; std::vector m_gates;