Iros
 
Loading...
Searching...
No Matches
hash_write.h
Go to the documentation of this file.
1#pragma once
2
9#include "di/meta/algorithm.h"
10#include "di/meta/constexpr.h"
11#include "di/meta/language.h"
12#include "di/meta/vocab.h"
13#include "di/types/prelude.h"
14#include "di/util/bit_cast.h"
15#include "di/util/declval.h"
21
22namespace di::container {
23namespace detail {
25 constexpr void operator()(concepts::Hasher auto& hasher, vocab::Span<byte const> data) const {
26 hasher.write(data);
27 }
28
29 template<concepts::IntegralOrEnum T>
30 constexpr void operator()(concepts::Hasher auto& hasher, T value) const {
31 auto bytes = util::bit_cast<vocab::Array<byte, sizeof(T)>>(value);
32 hasher.write(bytes.span());
33 }
34
35 template<concepts::Hasher Hasher, typename T>
37 constexpr void operator()(Hasher& hasher, T const& value) const {
38 function::tag_invoke(*this, hasher, value);
39 }
40 };
41}
42
43constexpr inline auto hash_write = detail::HashWriteFunction {};
44}
45
46namespace di::concepts {
47template<typename T>
48concept Hashable = requires(container::DefaultHasher& hasher, T const& value) {
49 { container::hash_write(hasher, value) } -> SameAs<void>;
50};
51}
52
53namespace di::meta {
54template<typename T>
55struct Hashable : Constexpr<concepts::Hashable<T>> {};
56}
57
58namespace di::container::detail {
59template<typename T>
61
62constexpr void tag_invoke(types::Tag<hash_write>, concepts::Hasher auto& hasher, HashableContainer auto const& value) {
63 for (auto const& element : value) {
64 hash_write(hasher, element);
65 }
66}
67
68namespace detail {
69 template<typename Idx>
70 struct HashableTuple {};
71
72 template<usize... indices>
73 struct HashableTuple<meta::ListV<indices...>> {
74 template<concepts::Tuple T>
75 constexpr auto operator()(InPlaceType<T>) const -> bool {
77 }
78 };
79}
80
81template<concepts::TupleLike T, concepts::Hasher H>
82requires(!HashableContainer<T> &&
83 detail::HashableTuple<meta::MakeIndexSequence<meta::TupleSize<T>>>()(in_place_type<T>))
84constexpr auto tag_invoke(types::Tag<hash_write>, H& hasher, T const& value) {
86 [&](concepts::Hashable auto const& x) {
87 hash_write(hasher, x);
88 },
89 value);
90}
91}
92
93namespace di {
95
97}
Definition span_forward_declaration.h:10
Definition forward_container.h:8
Definition hash_write.h:48
Definition hasher.h:8
Definition core.h:114
Definition tag_invoke.h:33
Definition any_storable.h:9
Definition hash_write.h:68
Definition sequence.h:13
Definition sequence.h:12
constexpr auto data
Definition data.h:51
constexpr auto hash_write
Definition hash_write.h:43
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition merge_interfaces.h:6
decltype(util::get< index >(util::declval< Tup >())) TupleValue
Definition tuple_value.h:10
std::byte byte
Definition byte.h:64
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr void tuple_for_each(F &&function, Tup &&tuple)
Definition tuple_for_each.h:22
Definition zstring_parser.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto in_place_type
Definition in_place_type.h:12
Definition default_hasher.h:7
constexpr void operator()(concepts::Hasher auto &hasher, T value) const
Definition hash_write.h:30
constexpr void operator()(concepts::Hasher auto &hasher, vocab::Span< byte const > data) const
Definition hash_write.h:25
constexpr auto operator()(InPlaceType< T >) const -> bool
Definition hash_write.h:75
A wrapper for a constexpr value.
Definition core.h:77
Definition hash_write.h:55
Definition in_place_type.h:5
Definition span_fixed_size.h:37