Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/common/heterogeneous_containers.h
7317 views
1
// SPDX-FileCopyrightText: 2019-2024 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
/**
5
* Provides a map template which doesn't require heap allocations for lookups.
6
*/
7
8
#pragma once
9
10
#include "types.h"
11
#include <map>
12
#include <set>
13
#include <string>
14
#include <unordered_map>
15
#include <unordered_set>
16
#include <version>
17
18
namespace detail {
19
struct transparent_string_hash
20
{
21
using is_transparent = void;
22
23
std::size_t operator()(const std::string_view& v) const { return std::hash<std::string_view>{}(v); }
24
std::size_t operator()(const std::string& s) const { return std::hash<std::string>{}(s); }
25
std::size_t operator()(const char* s) const { return operator()(std::string_view(s)); }
26
};
27
28
struct transparent_string_equal
29
{
30
using is_transparent = void;
31
32
bool operator()(const std::string& lhs, const std::string_view& rhs) const { return lhs == rhs; }
33
bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs == rhs; }
34
bool operator()(const std::string& lhs, const char* rhs) const { return lhs == rhs; }
35
bool operator()(const std::string_view& lhs, const std::string& rhs) const { return lhs == rhs; }
36
bool operator()(const char* lhs, const std::string& rhs) const { return lhs == rhs; }
37
};
38
39
struct transparent_string_less
40
{
41
using is_transparent = void;
42
43
bool operator()(const std::string& lhs, const std::string_view& rhs) const { return lhs < rhs; }
44
bool operator()(const std::string& lhs, const std::string& rhs) const { return lhs < rhs; }
45
bool operator()(const std::string& lhs, const char* rhs) const { return lhs < rhs; }
46
bool operator()(const std::string_view& lhs, const std::string& rhs) const { return lhs < rhs; }
47
bool operator()(const char* lhs, const std::string& rhs) const { return lhs < rhs; }
48
};
49
} // namespace detail
50
51
template<typename ValueType>
52
using StringMap = std::map<std::string, ValueType, detail::transparent_string_less>;
53
template<typename ValueType>
54
using StringMultiMap = std::multimap<std::string, ValueType, detail::transparent_string_less>;
55
using StringSet = std::set<std::string, detail::transparent_string_less>;
56
using StringMultiSet = std::multiset<std::string, detail::transparent_string_less>;
57
58
template<typename ValueType>
59
using UnorderedStringMap =
60
std::unordered_map<std::string, ValueType, detail::transparent_string_hash, detail::transparent_string_equal>;
61
template<typename ValueType>
62
using UnorderedStringMultimap =
63
std::unordered_multimap<std::string, ValueType, detail::transparent_string_hash, detail::transparent_string_equal>;
64
using UnorderedStringSet =
65
std::unordered_set<std::string, detail::transparent_string_hash, detail::transparent_string_equal>;
66
using UnorderedStringMultiSet =
67
std::unordered_multiset<std::string, detail::transparent_string_hash, detail::transparent_string_equal>;
68
69