From b66f61c21795d0acd49cba0ff03883d2a3714694 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Fri, 10 May 2024 23:55:41 -0500 Subject: [PATCH] [ox/std] Add hash function for UUID --- deps/ox/src/ox/std/uuid.hpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/deps/ox/src/ox/std/uuid.hpp b/deps/ox/src/ox/std/uuid.hpp index f4a7a899..80b66f1b 100644 --- a/deps/ox/src/ox/std/uuid.hpp +++ b/deps/ox/src/ox/std/uuid.hpp @@ -8,9 +8,11 @@ #pragma once +#include "bit.hpp" #include "ignore.hpp" #include "istring.hpp" #include "buffer.hpp" +#include "hash.hpp" #include "random.hpp" #include "ranges.hpp" #include "stringview.hpp" @@ -105,7 +107,7 @@ class UUID { static ox::Result generate() noexcept; [[nodiscard]] - constexpr auto value() const noexcept { + constexpr auto const&value() const noexcept { return m_value; } @@ -118,8 +120,8 @@ class UUID { return false; } else { constexpr uint64_t zero = 0; - return ox::memcmp(&zero, m_value.data() + 0, 8) == 0 - && ox::memcmp(&zero, m_value.data() + 8, 8) == 0; + return memcmp(&zero, m_value.data() + 0, 8) == 0 + && memcmp(&zero, m_value.data() + 8, 8) == 0; } } @@ -192,6 +194,24 @@ class UUID { } }; + +template<> +struct hash { + [[nodiscard]] + constexpr size_t operator()(ox::UUID v) const noexcept { + size_t out{}; + if (std::is_constant_evaluated()) { + for (auto i = 0u; i < sizeof(out); ++i) { + out |= static_cast(v.value()[i]) << (i * 8); + } + } else { + memcpy(&out, &v, sizeof(out)); + } + return out; + } +}; + + template constexpr Error model(T *io, ox::CommonPtrWith auto *obj) noexcept { oxReturnError(io->template setTypeInfo());