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 by hash first and then by keys
29template <class T>
30constexpr bool operator!=(const CachedHash<T>& x, const CachedHash<T>& y) {
31 return !(x.key == y.key);
32}
33
34/// @brief Compares utils::CachedHash only by keys
35template <class Equal, class = std::enable_if_t<!std::is_final_v<Equal>>>
36class CachedHashKeyEqual : private Equal {
37public:
38 explicit constexpr CachedHashKeyEqual(const Equal& eq)
39 : Equal(eq)
40 {}
41
42 template <class T>
43 constexpr bool operator()(const CachedHash<T>& x, const CachedHash<T>& y) const {
44 return Equal::operator()(x.key, y.key);
45 }
46};
47
48template <class Equal>
49class CachedHashKeyEqual<Equal, std::false_type> {
50public:
51 explicit constexpr CachedHashKeyEqual(const Equal& eq)
52 : equality_(eq)
53 {}
54
55 template <class T>
56 constexpr bool operator()(const CachedHash<T>& x, const CachedHash<T>& y) const {
57 return equality_(x.key, y.key);
58 }
59
60private:
61 Equal equality_;
62};
63
64} // namespace utils
65
66USERVER_NAMESPACE_END
67
68template <class T>
69struct std::hash<USERVER_NAMESPACE::utils::CachedHash<T>> {
70 constexpr std::size_t operator()(const USERVER_NAMESPACE::utils::CachedHash<T>& value) const noexcept {
71 return value.hash;
72 }
73};