From c75ff7881fdb6e55d8bc9a9047526a4ba18106df Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Fri, 3 Mar 2023 23:24:38 -0600 Subject: [PATCH] [ox/std] Add UUID::isNull() --- deps/ox/src/ox/std/uuid.cpp | 3 +++ deps/ox/src/ox/std/uuid.hpp | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/deps/ox/src/ox/std/uuid.cpp b/deps/ox/src/ox/std/uuid.cpp index 89f5be52..a406309a 100644 --- a/deps/ox/src/ox/std/uuid.cpp +++ b/deps/ox/src/ox/std/uuid.cpp @@ -34,4 +34,7 @@ Result UUID::generate() noexcept { return out; } +static_assert(UUID{}.isNull()); +static_assert(!UUID::fromString("34AF4809-043D-4348-B720-2B454E5678C7").value.isNull()); + } diff --git a/deps/ox/src/ox/std/uuid.hpp b/deps/ox/src/ox/std/uuid.hpp index 0e227e63..833521aa 100644 --- a/deps/ox/src/ox/std/uuid.hpp +++ b/deps/ox/src/ox/std/uuid.hpp @@ -107,6 +107,22 @@ class UUID { return m_value; } + [[nodiscard]] + constexpr auto isNull() const noexcept { + if (std::is_constant_evaluated()) { + for (auto v : m_value) { + if (v) { + return false; + } + } + return true; + } 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; + } + } + static constexpr ox::Result fromString(ox::CRStringView s) noexcept { if (s.len() < 36) { return OxError(1, "Insufficient data contain complete UUID"); @@ -135,7 +151,7 @@ class UUID { UUIDStr out; auto valueI = 0u; constexpr auto printChars = []( - ox::BString<36> *out, + UUIDStr *out, const Array &value, std::size_t cnt, unsigned valueI) {