From f6eb060f4fc07042da42b573e24839435bf6f4ef Mon Sep 17 00:00:00 2001 From: x7z4w Date: Mon, 24 Nov 2025 17:34:56 +0000 Subject: [PATCH] [generator] Implement hash for `OsmElement::Tag` Signed-off-by: x7z4w --- generator/osm_element.cpp | 2 ++ generator/osm_element.hpp | 10 ++++++++++ generator/road_access_generator.cpp | 3 ++- generator/road_access_generator.hpp | 5 +++-- generator/road_penalty_generator.cpp | 4 +++- 5 files changed, 20 insertions(+), 4 deletions(-) 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},