From c4774cc30c04c1763504f634761cde87972dcbf3 Mon Sep 17 00:00:00 2001 From: Maxim Pimenov Date: Wed, 26 Apr 2017 13:45:47 +0300 Subject: [PATCH] Review fixes. --- generator/generator_tests/road_access_test.cpp | 2 +- generator/road_access_generator.cpp | 10 +++++++--- generator/road_access_generator.hpp | 3 --- routing/road_access.cpp | 8 ++++---- routing/road_access.hpp | 15 ++++++++++++++- routing/road_access_serialization.hpp | 6 +++++- 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/generator/generator_tests/road_access_test.cpp b/generator/generator_tests/road_access_test.cpp index e05dd2ea46..2b76fc4c46 100644 --- a/generator/generator_tests/road_access_test.cpp +++ b/generator/generator_tests/road_access_test.cpp @@ -33,7 +33,7 @@ using namespace generator; using namespace platform::tests_support; using namespace platform; using namespace routing; -using std::string; +using namespace std; namespace { diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp index 0615cd4b77..dfdcb9fc3f 100644 --- a/generator/road_access_generator.cpp +++ b/generator/road_access_generator.cpp @@ -10,6 +10,7 @@ #include "indexer/classificator.hpp" #include "indexer/feature.hpp" #include "indexer/feature_data.hpp" +#include "indexer/features_vector.hpp" #include "coding/file_container.hpp" #include "coding/file_writer.hpp" @@ -43,15 +44,17 @@ TagMapping const kCarTagMapping = { }; TagMapping const kPedestrianTagMapping = { + {OsmElement::Tag("access", "no"), RoadAccess::Type::No}, {OsmElement::Tag("foot", "no"), RoadAccess::Type::No}, }; TagMapping const kBicycleTagMapping = { + {OsmElement::Tag("access", "no"), RoadAccess::Type::No}, {OsmElement::Tag("bicycle", "no"), RoadAccess::Type::No}, }; bool ParseRoadAccess(string const & roadAccessPath, map const & osmIdToFeatureId, - RoadAccess & roadAccess, FeaturesVector const & featuresVector) + FeaturesVector const & featuresVector, RoadAccess & roadAccess) { ifstream stream(roadAccessPath); if (!stream) @@ -202,7 +205,6 @@ bool RoadAccessWriter::IsOpened() const { return m_stream && m_stream.is_open(); // RoadAccessCollector ---------------------------------------------------------- RoadAccessCollector::RoadAccessCollector(string const & dataFilePath, string const & roadAccessPath, string const & osmIdsToFeatureIdsPath) - : m_featuresVector(dataFilePath) { map osmIdToFeatureId; if (!ParseOsmIdToFeatureIdMapping(osmIdsToFeatureIdsPath, osmIdToFeatureId)) @@ -213,8 +215,10 @@ RoadAccessCollector::RoadAccessCollector(string const & dataFilePath, string con return; } + FeaturesVectorTest featuresVector(dataFilePath); + RoadAccess roadAccess; - if (!ParseRoadAccess(roadAccessPath, osmIdToFeatureId, roadAccess, m_featuresVector.GetVector())) + if (!ParseRoadAccess(roadAccessPath, osmIdToFeatureId, featuresVector.GetVector(), roadAccess)) { LOG(LWARNING, ("An error happened while parsing road access from file:", roadAccessPath)); m_valid = false; diff --git a/generator/road_access_generator.hpp b/generator/road_access_generator.hpp index 4096442eae..0c54a33541 100644 --- a/generator/road_access_generator.hpp +++ b/generator/road_access_generator.hpp @@ -5,8 +5,6 @@ #include "routing/road_access.hpp" -#include "indexer/features_vector.hpp" - #include #include #include @@ -62,7 +60,6 @@ public: bool IsValid() const { return m_valid; } private: - FeaturesVectorTest m_featuresVector; RoadAccess m_roadAccess; bool m_valid = true; }; diff --git a/routing/road_access.cpp b/routing/road_access.cpp index 2f7f64ffef..5c0796c2ed 100644 --- a/routing/road_access.cpp +++ b/routing/road_access.cpp @@ -79,13 +79,13 @@ string ToString(RoadAccess::Type type) { if (type <= RoadAccess::Type::Count) return kNames[static_cast(type)]; - ASSERT(false, ()); + ASSERT(false, ("Bad road access type")); return {}; } -void FromString(std::string const & s, RoadAccess::Type & result) +void FromString(string const & s, RoadAccess::Type & result) { - for (size_t i = 0; i < static_cast(RoadAccess::Type::Count); ++i) + for (size_t i = 0; i <= static_cast(RoadAccess::Type::Count); ++i) { if (s == kNames[i]) { @@ -93,7 +93,7 @@ void FromString(std::string const & s, RoadAccess::Type & result) return; } } - ASSERT(false, ()); + ASSERT(false, ("Could not read RoadAccess from the string", s)); } string DebugPrint(RoadAccess::Type type) { return ToString(type); } diff --git a/routing/road_access.hpp b/routing/road_access.hpp index 393d0af221..7d86d0904c 100644 --- a/routing/road_access.hpp +++ b/routing/road_access.hpp @@ -18,12 +18,25 @@ namespace routing class RoadAccess final { public: + // The road access types are selected by analyzing the most + // popular tags used when mapping roads in OSM. enum class Type : uint8_t { + // Moving through the road is prohibited. No, + + // Moving through the road requires a special permission. Private, + + // No transit through the road is allowed; however, it can + // be used if it is close enough to the destination point + // of the route. Destination, - Yes, // No restrictions, as in access=yes. + + // No restrictions, as in "access=yes". + Yes, + + // The number of different road types. Count }; diff --git a/routing/road_access_serialization.hpp b/routing/road_access_serialization.hpp index 4d2ac9ebe1..271ea8016a 100644 --- a/routing/road_access_serialization.hpp +++ b/routing/road_access_serialization.hpp @@ -61,8 +61,11 @@ private: for (auto const & kv : m) segmentsByRoadAccessType[static_cast(kv.second)].push_back(kv.first); - for (auto const & segs : segmentsByRoadAccessType) + for (auto & segs : segmentsByRoadAccessType) + { + std::sort(segs.begin(), segs.end()); SerializeSegments(sink, segs); + } } template @@ -104,6 +107,7 @@ private: uint32_t prevFid = 0; for (auto const & fid : featureIds) { + CHECK_GREATER_OR_EQUAL(fid, prevFid, ()); uint64_t const fidDiff = static_cast(fid - prevFid); bool ok = coding::GammaCoder::Encode(bitWriter, fidDiff + 1); ASSERT(ok, ());