#pragma once #include "geocoder/hierarchy.hpp" #include "base/exception.hpp" #include "base/geo_object_id.hpp" #include #include #include #include #include #include #include namespace geocoder { class HierarchyReader { public: using Entry = Hierarchy::Entry; using ParsingStats = Hierarchy::ParsingStats; DECLARE_EXCEPTION(OpenException, RootException); explicit HierarchyReader(std::string const & pathToJsonHierarchy); explicit HierarchyReader(std::istream & jsonHierarchy); // Read hierarchy file/stream concurrently in |readersCount| threads. Hierarchy Read(unsigned int readersCount = 1); private: void ReadEntryMap(std::multimap & entries, ParsingStats & stats); void DeserializeEntryMap(std::vector const & linesBuffer, std::size_t const bufferSize, std::multimap & entries, ParsingStats & stats); std::vector MergeEntries(std::vector> & entryParts); void CheckDuplicateOsmIds(std::vector const & entries, ParsingStats & stats); std::ifstream m_fileStream; std::istream & m_in; std::mutex m_mutex; std::atomic m_totalNumLoaded{0}; }; } // namespace geocoder