#pragma once #include "openlr/stats.hpp" #include "indexer/data_source.hpp" #include "base/exception.hpp" #include #include #include #include #include namespace openlr { struct LinearSegment; struct DecodedPath; DECLARE_EXCEPTION(DecoderError, RootException); class Graph; class RoadInfoGetter; class OpenLRDecoder { public: using CountryParentNameGetter = std::function; class SegmentsFilter { public: SegmentsFilter(std::string const & idsPath, bool const multipointsOnly); bool Matches(LinearSegment const & segment) const; private: std::unordered_set m_ids; bool m_idsSet; bool const m_multipointsOnly; }; OpenLRDecoder(DataSource & dataSource, CountryParentNameGetter const & countryParentNameGetter); /** * Maps partner segments to mwm paths. * * `segments` should be sorted by partner id. */ void DecodeV2(std::vector const & segments, uint32_t const numThreads, std::vector & paths); /** * Maps partner segments to mwm paths. */ void DecodeV3(std::vector const & segments, uint32_t numThreads, std::vector & paths); private: template void Decode(std::vector const & segments, uint32_t const numThreads, std::vector & paths); DataSource & m_dataSource; CountryParentNameGetter m_countryParentNameGetter; }; } // namespace openlr