diff --git a/generator/data_generator.cpp b/generator/data_generator.cpp index 9fb2d09195..39702af888 100644 --- a/generator/data_generator.cpp +++ b/generator/data_generator.cpp @@ -92,13 +92,13 @@ bool GenerateImpl(string const & dir, string const & osmFileName = string()) bool GenerateToFile(string const & dir, string const & nodeStorage, string const & osmFileName) { if (nodeStorage == "raw") - return GenerateImpl>(dir, osmFileName); + return GenerateImpl>(dir, osmFileName); else if (nodeStorage == "map") return GenerateImpl>(dir, osmFileName); else if (nodeStorage == "sqlite") return GenerateImpl>(dir, osmFileName); else if (nodeStorage == "mem") - return GenerateImpl>(dir, osmFileName); + return GenerateImpl>(dir, osmFileName); else CHECK(nodeStorage.empty(), ("Incorrect node_storage type:", nodeStorage)); return false; diff --git a/generator/feature_generator.cpp b/generator/feature_generator.cpp index a24ff104ac..c4c616d129 100644 --- a/generator/feature_generator.cpp +++ b/generator/feature_generator.cpp @@ -429,13 +429,13 @@ bool GenerateImpl(GenerateInfo & info, string const & osmFileName = string()) bool GenerateFeatures(GenerateInfo & info, string const & nodeStorage, string const & osmFileName) { if (nodeStorage == "raw") - return GenerateImpl>(info, osmFileName); + return GenerateImpl>(info, osmFileName); else if (nodeStorage == "map") return GenerateImpl>(info, osmFileName); else if (nodeStorage == "sqlite") return GenerateImpl>(info, osmFileName); else if (nodeStorage == "mem") - return GenerateImpl>(info, osmFileName); + return GenerateImpl>(info, osmFileName); else CHECK(nodeStorage.empty(), ("Incorrect node_storage type:", nodeStorage)); return false; diff --git a/generator/point_storage.hpp b/generator/point_storage.hpp index d7e18da733..a3929d08d3 100644 --- a/generator/point_storage.hpp +++ b/generator/point_storage.hpp @@ -311,6 +311,78 @@ public: }; +template < BasePointStorage::EStorageMode ModeT > +class RawMemShortPointStorage : public BasePointStorage +{ + typename std::conditional::type m_file; + + double const m_precision = 10000000; + + vector m_data; + +public: + RawMemShortPointStorage(string const & name) + : BasePointStorage(name, 1000) + , m_file(name) + , m_data((size_t)0xFFFFFFFF) + { + InitStorage(EnableIf()); + } + + ~RawMemShortPointStorage() + { + DoneStorage(EnableIf()); + } + + void InitStorage(EnableIf) {} + + void InitStorage(EnableIf) + { + m_file.Read(0, m_data.data(), m_data.size()); + } + + void DoneStorage(EnableIf) + { + m_file.Write(m_data.data(), m_data.size()); + } + + void DoneStorage(EnableIf) {} + + template + typename std::enable_if::type AddPoint(uint64_t id, double lat, double lng) + { + int64_t const lat64 = lat * m_precision; + int64_t const lng64 = lng * m_precision; + + ShortLatLon & ll = m_data[id]; + ll.lat = static_cast(lat64); + ll.lon = static_cast(lng64); + CHECK_EQUAL(static_cast(ll.lat), lat64, ("Latitude is out of 32bit boundary!")); + CHECK_EQUAL(static_cast(ll.lon), lng64, ("Longtitude is out of 32bit boundary!")); + + m_progress.Inc(); + } + + template + typename std::enable_if::type GetPoint(uint64_t id, double & lat, double & lng) const + { + ShortLatLon const & ll = m_data[id]; + // assume that valid coordinate is not (0, 0) + if (ll.lat != 0.0 || ll.lon != 0.0) + { + lat = static_cast(ll.lat) / m_precision; + lng = static_cast(ll.lon) / m_precision; + return true; + } + else + { + LOG(LERROR, ("Node with id = ", id, " not found!")); + return false; + } + } +}; + + template < BasePointStorage::EStorageMode ModeT > class MapFilePointStorage : public BasePointStorage {