diff --git a/generator/osm_element.cpp b/generator/osm_element.cpp index 27872da3c..d9a66f7e5 100644 --- a/generator/osm_element.cpp +++ b/generator/osm_element.cpp @@ -7,6 +7,8 @@ #include "base/stl_helpers.hpp" #include "base/string_utils.hpp" +#include "3party/ankerl/unordered_dense.h" + #include std::string DebugPrint(OsmElement::EntityType type) diff --git a/generator/osm_element.hpp b/generator/osm_element.hpp index f8d59c6cc..c6f5615b4 100644 --- a/generator/osm_element.hpp +++ b/generator/osm_element.hpp @@ -146,3 +146,13 @@ std::string DebugPrintID(OsmElement const & element); std::string DebugPrint(OsmElement const & element); std::string DebugPrint(OsmElement::EntityType type); std::string DebugPrint(OsmElement::Tag const & tag); + +template <> +struct std::hash +{ + using is_avalanching = void; + auto operator()(OsmElement::Tag const & tag) const noexcept -> std::uint64_t { + std::string const str = tag.m_key + tag.m_value; + return ankerl::unordered_dense::detail::wyhash::hash(str.data(), sizeof(char) * str.size()); + } +}; diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp index 55a91cc6e..ba8eb466d 100644 --- a/generator/road_access_generator.cpp +++ b/generator/road_access_generator.cpp @@ -45,7 +45,8 @@ vector const kBycicleAccessConditionalTags = {"bicycle:conditional"}; // Some tags assume access:conditional in fact, but doesn't have it. // For example if road is tagged as "winter_road = yes", // for routing it is like: "access:conditional = no @ (Feb - Dec)" -std::map kTagToAccessConditional = { +// TODO: handle Southern Hemisphere +std::pair const kTagToAccessConditional[] = { {OsmElement::Tag("winter_road", "yes"), "no @ (Mar - Nov)"}, {OsmElement::Tag("ice_road", "yes"), "no @ (Mar - Nov)"}}; diff --git a/generator/road_access_generator.hpp b/generator/road_access_generator.hpp index f24c0ef09..11d8b740f 100644 --- a/generator/road_access_generator.hpp +++ b/generator/road_access_generator.hpp @@ -9,13 +9,14 @@ #include "routing/vehicle_mask.hpp" #include -#include #include #include #include #include #include +#include "3party/ankerl/unordered_dense.h" + namespace routing { class OsmWay2FeaturePoint; @@ -92,7 +93,7 @@ void Load(Source & src, ConditionalRAVectorT & vec) class RoadAccessTagProcessor { public: - using TagMapping = std::map; + using TagMapping = ankerl::unordered_dense::map; using ConditionalTagsList = std::vector; explicit RoadAccessTagProcessor(VehicleType vehicleType); diff --git a/generator/road_penalty_generator.cpp b/generator/road_penalty_generator.cpp index ff3aafab4..bf3828859 100644 --- a/generator/road_penalty_generator.cpp +++ b/generator/road_penalty_generator.cpp @@ -21,6 +21,8 @@ #include +#include "3party/ankerl/unordered_dense.h" + namespace routing_builder { using namespace feature; @@ -31,7 +33,7 @@ using std::string, std::vector; namespace { // Unified penalty mapping for all OSM tags that create road penalties -std::map const kUnifiedPenaltyMapping = { +ankerl::unordered_dense::map const kUnifiedPenaltyMapping = { // Traffic calming measures {OsmElement::Tag("traffic_calming", "rumble_strip"), RoadPenalty::Type::SmallCalming},