userver: userver/utils/cached_hash.hpp Source File
Loading...
Searching...
No Matches
cached_hash.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/utils/cached_hash.hpp
4/// @brief @copybrief utils::CachedHash
5
6#include <functional>
7#include <type_traits>
8
9USERVER_NAMESPACE_BEGIN
10
11namespace utils {
12
13/// @ingroup userver_universal
14///
15/// @brief Holds the key and its hash for faster comparisons and hashing
16template <class Key>
17struct CachedHash final {
18 std::size_t hash;
19 Key key;
20};
21
22/// @brief Compares utils::CachedHash by hash first and then by keys
23template <class T>
24constexpr bool operator==(const CachedHash<T>& x, const CachedHash<T>& y) {
25 return x.hash == y.hash && x.key == y.key;
26}
27
28/// @brief Compares utils::CachedHash only by keys
29template <class Equal>
31public:
32 explicit constexpr CachedHashKeyEqual(const Equal& eq)
33 : equality_(eq)
34 {}
35
36 template <class T>
37 constexpr bool operator()(const CachedHash<T>& x, const CachedHash<T>& y) const {
38 return equality_(x.key, y.key);
39 }
40
41private:
42 Equal equality_;
43};
44
45/// @brief Compares utils::CachedHash only by keys (EBO-optimized for non-final Equal)
46template <class Equal>
47requires(!std::is_final_v<Equal>)
48class CachedHashKeyEqual<Equal> : private Equal {
49public:
50 explicit constexpr CachedHashKeyEqual(const Equal& eq)
51 : Equal(eq)
52 {}
53
54 template <class T>
55 constexpr bool operator()(const CachedHash<T>& x, const CachedHash<T>& y) const {
56 return Equal::operator()(x.key, y.key);
57 }
58};
59
60} // namespace utils
61
62USERVER_NAMESPACE_END
63
64template <class T>
65struct std::hash<USERVER_NAMESPACE::utils::CachedHash<T>> {
66 constexpr std::size_t operator()(const USERVER_NAMESPACE::utils::CachedHash<T>& value) const noexcept {
67 return value.hash;
68 }
69};