3#include <md/object.hpp>
15inline std::size_t hash_combine(
const std::size_t seed,
const std::size_t v)
noexcept {
17 return seed ^ (v + 0x9e3779b97f4a7c15ULL + (seed << 6) + (seed >> 2));
22constexpr std::size_t alt_salt(
const std::size_t idx)
noexcept {
23 constexpr std::size_t base = 0xcbf29ce484222325ULL;
24 return base + (idx * 0x100000001b3ULL);
27std::size_t hash_value(
const Value& v)
noexcept;
29inline std::size_t hash_array(
const Array& a)
noexcept {
30 std::size_t h = alt_salt(7);
31 for (
const auto& el : a) {
32 h = hash_combine(h, hash_value(el));
39inline std::size_t hash_object(
const Object& o)
noexcept {
41 for (
const auto& [k, val] : o) {
42 std::size_t entry = std::hash<std::string_view>{}(std::string_view{k});
43 entry = hash_combine(entry, hash_value(val));
48 return acc ^ alt_salt(8);
51inline std::size_t hash_value(
const Value& v)
noexcept {
53 [&](
const auto& x)
noexcept -> std::size_t {
54 using T = std::decay_t<
decltype(x)>;
55 if constexpr (std::is_same_v<T, std::nullptr_t>) {
57 }
else if constexpr (std::is_same_v<T, bool>) {
58 return hash_combine(alt_salt(1), std::hash<bool>{}(x));
59 }
else if constexpr (std::is_same_v<T, std::int64_t>) {
60 return hash_combine(alt_salt(2), std::hash<std::int64_t>{}(x));
61 }
else if constexpr (std::is_same_v<T, std::uint64_t>) {
62 return hash_combine(alt_salt(3), std::hash<std::uint64_t>{}(x));
63 }
else if constexpr (std::is_same_v<T, float>) {
64 return hash_combine(alt_salt(4), std::hash<float>{}(x));
65 }
else if constexpr (std::is_same_v<T, double>) {
66 return hash_combine(alt_salt(5), std::hash<double>{}(x));
67 }
else if constexpr (std::is_same_v<T, std::string>) {
68 return hash_combine(alt_salt(6),
69 std::hash<std::string_view>{}(std::string_view{x}));
70 }
else if constexpr (std::is_same_v<T, Array>) {
72 }
else if constexpr (std::is_same_v<T, std::unique_ptr<Object>>) {
73 return hash_object(*x);
85struct std::hash<md::Value> {
88 return md::detail::hash_value(v);
95struct std::hash<md::Object> {
98 return md::detail::hash_object(o);
104struct std::hash<md::Array> {
107 return md::detail::hash_array(a);
Ordered-by-insertion-time-ish string-keyed map of Values, with transparent string-view lookup and JSO...
Definition object.hpp:21
Discriminated union holding one of the JSON-like alternatives (null, bool, signed/unsigned integer,...
Definition value.hpp:67
std::size_t operator()(const md::Array &a) const noexcept
Hash an md::Array.
Definition hash.hpp:106
std::size_t operator()(const md::Object &o) const noexcept
Hash an md::Object.
Definition hash.hpp:97
std::size_t operator()(const md::Value &v) const noexcept
Hash an md::Value.
Definition hash.hpp:87