Path: blob/master/src/common/heterogeneous_containers.h
4211 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>;5657#if defined(__cpp_lib_generic_unordered_lookup) && __cpp_lib_generic_unordered_lookup >= 201811L58template<typename ValueType>59using UnorderedStringMap =60std::unordered_map<std::string, ValueType, detail::transparent_string_hash, detail::transparent_string_equal>;61template<typename ValueType>62using UnorderedStringMultimap =63std::unordered_multimap<std::string, ValueType, detail::transparent_string_hash, detail::transparent_string_equal>;64using UnorderedStringSet =65std::unordered_set<std::string, detail::transparent_string_hash, detail::transparent_string_equal>;66using UnorderedStringMultiSet =67std::unordered_multiset<std::string, detail::transparent_string_hash, detail::transparent_string_equal>;6869template<typename ValueType>70using PreferUnorderedStringMap = UnorderedStringMap<ValueType>;71template<typename ValueType>72using PreferUnorderedStringMultimap = UnorderedStringMultimap<ValueType>;73using PreferUnorderedStringSet = UnorderedStringSet;74using PreferUnorderedStringMultiSet = UnorderedStringMultiSet;75#else7677#pragma message "__cpp_lib_generic_unordered_lookup is missing, performance will be slower."7879// GCC 10 doesn't support generic_unordered_lookup...80template<typename ValueType>81using PreferUnorderedStringMap = StringMap<ValueType>;82template<typename ValueType>83using PreferUnorderedStringMultimap = StringMultiMap<ValueType>;84using PreferUnorderedStringSet = StringSet;85using PreferUnorderedStringMultiSet = StringMultiSet;8687#endif888990