5#ifndef INCLUDE_GUARD_ARENE_BASE_STDLIB_INCLUDE_STDLIB_DETAIL_HASH_HPP_
6#define INCLUDE_GUARD_ARENE_BASE_STDLIB_INCLUDE_STDLIB_DETAIL_HASH_HPP_
9#include "arene/base/constraints.hpp"
10#include "arene/base/span.hpp"
11#include "arene/base/utility.hpp"
12#include "stdlib/include/stdlib_detail/conditional.hpp"
13#include "stdlib/include/stdlib_detail/cstddef.hpp"
14#include "stdlib/include/stdlib_detail/cstdint.hpp"
15#include "stdlib/include/stdlib_detail/enable_if.hpp"
16#include "stdlib/include/stdlib_detail/integral_constant.hpp"
17#include "stdlib/include/stdlib_detail/is_enum.hpp"
18#include "stdlib/include/stdlib_detail/is_fundamental.hpp"
19#include "stdlib/include/stdlib_detail/is_pointer.hpp"
100 using argument_type = T;
106 using scalar_type = conditional_t<
sizeof(size_t) ==
sizeof(uint32_t), uint32_t, uint64_t>;
108 scalar_type hash{fnv_offset_basis_v<scalar_type>};
110 for (
auto const elem : arene::base::as_bytes(arene::base::span<T
const, 1U>(&value, 1U))) {
111 hash ^=
static_cast<scalar_type>(arene::base::to_underlying(elem));
112 hash *= fnv_prime_v<scalar_type>;
120template <
class T,
typename = arene::base::constraints<>>
FNV-1a hash algorithm.
Definition hash.hpp:95
auto operator()(T const &value) const noexcept -> size_t
Calculate the hash of a value.
Definition hash.hpp:105
constexpr Scalar fnv_prime_v
The FNV prime to use depending on bit variant.
constexpr Scalar fnv_offset_basis_v
The FNV offset basis to use depending on bit variant.
constexpr auto operator()(::arene::base::result< void, E > const &value) const noexcept(noexcept(hash< E >{}(std::declval< E const & >()))) -> std::size_t
Calculate the hash of a result.
Definition result.hpp:1827
hash function primary template
Definition hash.hpp:138