[generator] Implement hash for OsmElement::Tag

Signed-off-by: x7z4w <x7z4w@noreply.codeberg.org>
This commit is contained in:
x7z4w
2025-11-24 17:34:56 +00:00
parent ce33990c85
commit f6eb060f4f
5 changed files with 20 additions and 4 deletions

View File

@@ -7,6 +7,8 @@
#include "base/stl_helpers.hpp"
#include "base/string_utils.hpp"
#include "3party/ankerl/unordered_dense.h"
#include <sstream>
std::string DebugPrint(OsmElement::EntityType type)

View File

@@ -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<OsmElement::Tag>
{
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());
}
};

View File

@@ -45,7 +45,8 @@ vector<string> 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<OsmElement::Tag, string> kTagToAccessConditional = {
// TODO: handle Southern Hemisphere
std::pair<OsmElement::Tag, string> const kTagToAccessConditional[] = {
{OsmElement::Tag("winter_road", "yes"), "no @ (Mar - Nov)"},
{OsmElement::Tag("ice_road", "yes"), "no @ (Mar - Nov)"}};

View File

@@ -9,13 +9,14 @@
#include "routing/vehicle_mask.hpp"
#include <array>
#include <map>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#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<OsmElement::Tag, RoadAccess::Type>;
using TagMapping = ankerl::unordered_dense::map<OsmElement::Tag, RoadAccess::Type>;
using ConditionalTagsList = std::vector<std::string>;
explicit RoadAccessTagProcessor(VehicleType vehicleType);

View File

@@ -21,6 +21,8 @@
#include <optional>
#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<OsmElement::Tag, RoadPenalty::Type> const kUnifiedPenaltyMapping = {
ankerl::unordered_dense::map<OsmElement::Tag, RoadPenalty::Type> const kUnifiedPenaltyMapping = {
// Traffic calming measures
{OsmElement::Tag("traffic_calming", "rumble_strip"), RoadPenalty::Type::SmallCalming},