diff --git a/map/transit/transit_reader.cpp b/map/transit/transit_reader.cpp index 3e896138c8..26720bdcdc 100644 --- a/map/transit/transit_reader.cpp +++ b/map/transit/transit_reader.cpp @@ -1,5 +1,7 @@ #include "map/transit/transit_reader.hpp" +#include "routing_common/transit_graph_data.hpp" + #include "indexer/drawing_rules.hpp" #include "indexer/drules_include.hpp" #include "indexer/feature_algo.hpp" @@ -9,73 +11,30 @@ using namespace routing; using namespace std; +// TransitReader ---------------------------------------------------------------------------------- bool TransitReader::Init(MwmSet::MwmId const & mwmId) -{ - m_src = move(GetReader(mwmId)); - if (m_src != nullptr) - ReadHeader(); - return IsValid(); -} - -bool TransitReader::IsValid() const -{ - return m_src != nullptr; -} - -unique_ptr TransitReader::GetReader(MwmSet::MwmId const & mwmId) { MwmSet::MwmHandle handle = m_index.GetMwmHandleById(mwmId); if (!handle.IsAlive()) { LOG(LWARNING, ("Can't get mwm handle for", mwmId)); - return unique_ptr(); + return {}; } MwmValue const & mwmValue = *handle.GetValue(); if (!mwmValue.m_cont.IsExist(TRANSIT_FILE_TAG)) - return unique_ptr(); - FilesContainerR::TReader reader = mwmValue.m_cont.GetReader(TRANSIT_FILE_TAG); - return my::make_unique(reader); + return {}; + + m_reader = make_unique(mwmValue.m_cont.GetReader(TRANSIT_FILE_TAG)); + return IsValid(); } -void TransitReader::ReadHeader() +Reader & TransitReader::GetReader() { - try - { - transit::FixedSizeDeserializer> fixedSizeDeserializer(*m_src.get()); - fixedSizeDeserializer(m_header); - } - catch (Reader::OpenException const & e) - { - LOG(LERROR, ("Error while reading transit header.", e.Msg())); - throw; - } -} - -void TransitReader::ReadStops(vector & stops) -{ - ReadTable(m_header.m_stopsOffset, stops); -} - -void TransitReader::ReadShapes(vector & shapes) -{ - ReadTable(m_header.m_shapesOffset, shapes); -} - -void TransitReader::ReadTransfers(vector & transfers) -{ - ReadTable(m_header.m_transfersOffset, transfers); -} - -void TransitReader::ReadLines(vector & lines) -{ - ReadTable(m_header.m_linesOffset, lines); -} - -void TransitReader::ReadNetworks(vector & networks) -{ - ReadTable(m_header.m_networksOffset, networks); + CHECK(IsValid(), ()); + return *m_reader->GetPtr(); } +// ReadTransitTask -------------------------------------------------------------------------------- bool ReadTransitTask::Init(uint64_t id, MwmSet::MwmId const & mwmId, unique_ptr && transitInfo) { m_id = id; @@ -98,11 +57,10 @@ void ReadTransitTask::Do() if (!m_transitReader.IsValid()) return; - vector stops; - m_transitReader.ReadStops(stops); - FillItemsByIdMap(stops, m_transitInfo->m_stops); - stops.clear(); + transit::GraphData graphData; + graphData.DeserializeForRendering(m_transitReader.GetReader()); + FillItemsByIdMap(graphData.GetStops(), m_transitInfo->m_stops); for (auto const & stop : m_transitInfo->m_stops) { if (stop.second.GetFeatureId() != transit::kInvalidFeatureId) @@ -114,21 +72,9 @@ void ReadTransitTask::Do() if (stop.second.GetTransferId() != transit::kInvalidTransferId) m_transitInfo->m_transfers[stop.second.GetTransferId()] = {}; } - - vector transfers; - m_transitReader.ReadTransfers(transfers); - FillItemsByIdMap(transfers, m_transitInfo->m_transfers); - transfers.clear(); - - vector lines; - m_transitReader.ReadLines(lines); - FillItemsByIdMap(lines, m_transitInfo->m_lines); - lines.clear(); - - vector shapes; - m_transitReader.ReadShapes(shapes); - FillItemsByIdMap(shapes, m_transitInfo->m_shapes); - shapes.clear(); + FillItemsByIdMap(graphData.GetTransfers(), m_transitInfo->m_transfers); + FillItemsByIdMap(graphData.GetLines(), m_transitInfo->m_lines); + FillItemsByIdMap(graphData.GetShapes(), m_transitInfo->m_shapes); vector features; for (auto & id : m_transitInfo->m_features) diff --git a/map/transit/transit_reader.hpp b/map/transit/transit_reader.hpp index d91f0754bf..3f133d0638 100644 --- a/map/transit/transit_reader.hpp +++ b/map/transit/transit_reader.hpp @@ -1,10 +1,12 @@ #pragma once -#include "routing_common/transit_serdes.hpp" +#include "routing_common/transit_types.hpp" #include "indexer/feature_decl.hpp" #include "indexer/index.hpp" +#include "coding/reader.hpp" + #include "base/thread.hpp" #include "base/thread_pool.hpp" @@ -19,49 +21,15 @@ class TransitReader { public: - TransitReader(Index & index) - : m_index(index) - {} + TransitReader(Index & index) : m_index(index) {} bool Init(MwmSet::MwmId const & mwmId); - bool IsValid() const; - - void ReadStops(std::vector & stops); - void ReadShapes(std::vector & shapes); - void ReadTransfers(std::vector & transfers); - void ReadLines(std::vector & lines); - void ReadNetworks(std::vector & networks); + bool IsValid() const { return m_reader != nullptr; } + Reader & GetReader(); private: - using TransitReaderSource = ReaderSource; - std::unique_ptr GetReader(MwmSet::MwmId const & mwmId); - - void ReadHeader(); - - using GetItemsOffsetFn = std::function; - template - void ReadTable(uint32_t offset, std::vector & items) - { - ASSERT(m_src != nullptr, ()); - items.clear(); - try - { - CHECK_GREATER_OR_EQUAL(offset, m_src->Pos(), ("Wrong section format.")); - m_src->Skip(offset - m_src->Pos()); - - routing::transit::Deserializer> deserializer(*m_src.get()); - deserializer(items); - } - catch (Reader::OpenException const & e) - { - LOG(LERROR, ("Error while reading", TRANSIT_FILE_TAG, "section.", e.Msg())); - throw; - } - } - Index & m_index; - std::unique_ptr m_src; - routing::transit::TransitHeader m_header; + std::unique_ptr m_reader; }; struct TransitFeatureInfo diff --git a/routing_common/transit_graph_data.cpp b/routing_common/transit_graph_data.cpp index 75a2c80747..a5faa563d5 100644 --- a/routing_common/transit_graph_data.cpp +++ b/routing_common/transit_graph_data.cpp @@ -287,6 +287,18 @@ void GraphData::DeserializeForRouting(Reader & reader) 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); +} + void GraphData::AppendTo(GraphData const & rhs) { ::Append(rhs.m_stops, m_stops); diff --git a/routing_common/transit_graph_data.hpp b/routing_common/transit_graph_data.hpp index d78468c6c4..a17da5f2a6 100644 --- a/routing_common/transit_graph_data.hpp +++ b/routing_common/transit_graph_data.hpp @@ -129,6 +129,7 @@ public: void Serialize(Writer & writer); void DeserializeAll(Reader & reader); void DeserializeForRouting(Reader & reader); + void DeserializeForRendering(Reader & reader); void AppendTo(GraphData const & rhs); void Clear(); bool IsValid() const;