Path: blob/master/src/common/heterogeneous_containers.h
7317 views
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <[email protected]>1// SPDX-License-Identifier: CC-BY-NC-ND-4.023/**4* Provides a map template which doesn't require heap allocations for lookups.5*/67#pragma once89#include "types.h"10#include <map>11#include <set>12#include <string>13#include <unordered_map>14#include <unordered_set>15#include <version>1617namespace detail {18struct transparent_string_hash19{20using is_transparent = void;2122std::size_t operator()(const std::string_view& v) const { return std::hash<std::string_view>{}(v); }23std::size_t operator()(const std::string& s) const { return std::hash<std::string>{}(s); }24std::size_t operator()(const char* s) const { return operator()(std::string_view(s)); }25};2627struct transparent_string_equal28{29using is_transparent = void;3031bool operator()(const std::string& lhs, const std::string_view& rhs) const { return lhs == rhs; }32bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs == rhs; }33bool operator()(const std::string& lhs, const char* rhs) const { return lhs == rhs; }34bool operator()(const std::string_view& lhs, const std::string& rhs) const { return lhs == rhs; }35bool operator()(const char* lhs, const std::string& rhs) const { return lhs == rhs; }36};3738struct transparent_string_less39{40using is_transparent = void;4142bool operator()(const std::string& lhs, const std::string_view& rhs) const { return lhs < rhs; }43bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs < rhs; }44bool operator()(const std::string& lhs, const char* rhs) const { return lhs < rhs; }45bool operator()(const std::string_view& lhs, const std::string& rhs) const { return lhs < rhs; }46bool operator()(const char* lhs, const std::string& rhs) const { return lhs < rhs; }47};48} // namespace detail4950template<typename ValueType>51using StringMap = std::map<std::string, ValueType, detail::transparent_string_less>;52template<typename ValueType>53using StringMultiMap = std::multimap<std::string, ValueType, detail::transparent_string_less>;54using StringSet = std::set<std::string, detail::transparent_string_less>;55using StringMultiSet = std::multiset<std::string, detail::transparent_string_less>;5657template<typename ValueType>58using UnorderedStringMap =59std::unordered_map<std::string, ValueType, detail::transparent_string_hash, detail::transparent_string_equal>;60template<typename ValueType>61using UnorderedStringMultimap =62std::unordered_multimap<std::string, ValueType, detail::transparent_string_hash, detail::transparent_string_equal>;63using UnorderedStringSet =64std::unordered_set<std::string, detail::transparent_string_hash, detail::transparent_string_equal>;65using UnorderedStringMultiSet =66std::unordered_multiset<std::string, detail::transparent_string_hash, detail::transparent_string_equal>;676869