mirror of
https://codeberg.org/comaps/comaps
synced 2026-01-02 19:13:44 +00:00
Organic Maps sources as of 02.04.2025 (fad26bbf22ac3da75e01e62aa01e5c8e11861005)
To expand with full Organic Maps and Maps.ME commits history run: git remote add om-historic [om-historic.git repo url] git fetch --tags om-historic git replace squashed-history historic-commits
This commit is contained in:
124
indexer/ftraits.hpp
Normal file
124
indexer/ftraits.hpp
Normal file
@@ -0,0 +1,124 @@
|
||||
#pragma once
|
||||
|
||||
#include "indexer/feature_data.hpp"
|
||||
#include "indexer/ftypes_mapping.hpp"
|
||||
|
||||
#include "coding/csv_reader.hpp"
|
||||
|
||||
#include "platform/platform.hpp"
|
||||
|
||||
#include "base/assert.hpp"
|
||||
#include "base/logging.hpp"
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <initializer_list>
|
||||
#include <optional>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
namespace ftraits
|
||||
{
|
||||
template <typename Base, typename Value>
|
||||
class TraitsBase
|
||||
{
|
||||
public:
|
||||
static std::optional<Value> GetValue(feature::TypesHolder const & types)
|
||||
{
|
||||
auto const & instance = Instance();
|
||||
auto const it = Find(types);
|
||||
if (!instance.m_matcher.IsValid(it))
|
||||
return std::nullopt;
|
||||
|
||||
return it->second;
|
||||
}
|
||||
|
||||
static std::optional<uint32_t> GetType(feature::TypesHolder const & types)
|
||||
{
|
||||
auto const & instance = Instance();
|
||||
auto const it = Find(types);
|
||||
if (!instance.m_matcher.IsValid(it))
|
||||
return std::nullopt;
|
||||
|
||||
return it->first;
|
||||
}
|
||||
|
||||
private:
|
||||
using ConstIterator = typename ftypes::HashMapMatcher<uint32_t, Value>::ConstIterator;
|
||||
|
||||
static ConstIterator Find(feature::TypesHolder const & types)
|
||||
{
|
||||
auto const & instance = Instance();
|
||||
|
||||
auto const excluded = instance.m_excluded.Find(types);
|
||||
if (instance.m_excluded.IsValid(excluded))
|
||||
return instance.m_matcher.End();
|
||||
|
||||
return instance.m_matcher.Find(types);
|
||||
}
|
||||
|
||||
protected:
|
||||
static TraitsBase const & Instance()
|
||||
{
|
||||
static Base instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
ftypes::HashMapMatcher<uint32_t, Value> m_matcher;
|
||||
ftypes::HashSetMatcher<uint32_t> m_excluded;
|
||||
};
|
||||
|
||||
enum class WheelchairAvailability
|
||||
{
|
||||
No,
|
||||
Yes,
|
||||
Limited,
|
||||
};
|
||||
|
||||
inline std::string DebugPrint(WheelchairAvailability wheelchair)
|
||||
{
|
||||
switch (wheelchair)
|
||||
{
|
||||
case WheelchairAvailability::No: return "No";
|
||||
case WheelchairAvailability::Yes: return "Yes";
|
||||
case WheelchairAvailability::Limited: return "Limited";
|
||||
}
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
class Wheelchair : public TraitsBase<Wheelchair, WheelchairAvailability>
|
||||
{
|
||||
friend TraitsBase;
|
||||
|
||||
using TypesInitializer = std::initializer_list<std::initializer_list<char const *>>;
|
||||
|
||||
Wheelchair()
|
||||
{
|
||||
m_matcher.Append<TypesInitializer>({{"wheelchair", "no"}}, WheelchairAvailability::No);
|
||||
m_matcher.Append<TypesInitializer>({{"wheelchair", "yes"}}, WheelchairAvailability::Yes);
|
||||
m_matcher.Append<TypesInitializer>({{"wheelchair", "limited"}}, WheelchairAvailability::Limited);
|
||||
}
|
||||
};
|
||||
|
||||
enum class DrinkingWaterAvailability
|
||||
{
|
||||
No,
|
||||
Yes,
|
||||
};
|
||||
|
||||
class DrinkingWater : public TraitsBase<DrinkingWater, DrinkingWaterAvailability>
|
||||
{
|
||||
friend TraitsBase;
|
||||
|
||||
using TypesInitializer = std::initializer_list<std::initializer_list<char const *>>;
|
||||
|
||||
DrinkingWater()
|
||||
{
|
||||
m_matcher.Append<TypesInitializer>({{"drinking_water", "no"}}, DrinkingWaterAvailability::No);
|
||||
m_matcher.Append<TypesInitializer>({{"drinking_water", "yes"}}, DrinkingWaterAvailability::Yes);
|
||||
m_matcher.Append<TypesInitializer>({{"amenity", "drinking_water"}}, DrinkingWaterAvailability::Yes);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace ftraits
|
||||
Reference in New Issue
Block a user