8#ifndef SEN_CORE_BASE_UUID_H
9#define SEN_CORE_BASE_UUID_H
59 constexpr Uuid() noexcept = default;
63 constexpr
Uuid(uint64_t hi, uint64_t lo) noexcept: hi_(hi), lo_(lo) {}
73 [[nodiscard]]
constexpr bool isNil() const noexcept {
return (hi_ | lo_) == 0; }
82 [[nodiscard]] constexpr uint64_t
getHash() const noexcept {
return hi_ ^ lo_; }
85 [[nodiscard]]
constexpr uint32_t
getHash32() const noexcept;
93 [[nodiscard]] static
bool isValid(
std::string_view s) noexcept;
124 return lhs.hi_ == rhs.hi_ && lhs.lo_ == rhs.lo_;
127[[nodiscard]]
constexpr bool operator!=(
const Uuid& lhs,
const Uuid& rhs)
noexcept {
return !(lhs == rhs); }
131 return (lhs.hi_ < rhs.hi_) || (lhs.hi_ == rhs.hi_ && lhs.lo_ < rhs.lo_);
139 if (
bytes.size() < 2U *
sizeof(uint64_t))
143 std::memcpy(&hi_,
bytes.data(),
sizeof(uint64_t));
144 std::memcpy(&lo_,
bytes.data() +
sizeof(uint64_t),
sizeof(uint64_t));
150 return static_cast<uint32_t
>(h ^ (h >> 32U));
155 auto b =
static_cast<uint8_t
>(lo_ >> 56U);
157 if ((b & 0x80U) == 0U)
162 if ((b & 0xC0U) == 0x80U)
167 if ((b & 0xE0U) == 0xC0U)
177 uint8_t v =
static_cast<uint8_t
>(hi_ >> 12U) & 0xFU;
196inline std::array<uint8_t, Uuid::byteCount>
Uuid::bytes() const noexcept
198 std::array<uint8_t, byteCount> out {};
199 std::memcpy(out.data(), &hi_, 8U);
200 std::memcpy(out.data() + 8U, &lo_, 8U);
206 std::swap(hi_, other.hi_);
207 std::swap(lo_, other.lo_);
229 uint64_t hi = dist_(engine_);
230 uint64_t lo = dist_(engine_);
232 hi &= 0xFFFFFFFFFFFF0FFFULL;
233 hi |= 0x0000000000004000ULL;
235 lo &= 0x3FFFFFFFFFFFFFFFULL;
236 lo |= 0x8000000000000000ULL;
242 std::mt19937_64 engine_;
243 std::uniform_int_distribution<uint64_t> dist_;
Contiguous view of elements of type T. Inspired by http://www.open-std.org/jtc1/sc22/wg21/docs/papers...
Definition span.h:34
Maybe resize(size_type newSize, const T &value) noexcept(nothrowCopyAndDes)
Changes the size of the container to newSize. If need to be appended, elements are copy-constructed f...
Definition static_vector.h:1144
const_pointer data() const noexcept
Direct access to the underlying storage. Complexity: constant.
Definition static_vector.h:131
Stack-based, exception-free and resizable vector with fixed-capacity.
Definition static_vector.h:574
Universal Unique Identifier.
Definition uuid.h:51
#define SEN_ASSERT(expr)
Checks an intermediate result produced by a procedure (not an input or output). NOLINTNEXTLINE.
Definition assert.h:39
std::enable_if_t< HasOperator< T >::lt, bool > operator<(const StaticVector< T, size > &lhs, const StaticVector< T, size > &rhs) noexcept(noexcept(std::declval< const T & >()< std::declval< const T & >()))
Lexicographically compares two StaticVector objects.
Definition static_vector.h:678
size_t operator()(const sen::Uuid &uuid) const noexcept
Definition uuid.h:258
static Uuid fromString(std::string_view s) noexcept
Parses a string and generates a UUID. Returns a Nil UUID in case of error.
std::string toString() const
Builds a string out of this UUID.
friend constexpr bool operator==(const Uuid &lhs, const Uuid &rhs) noexcept
Definition uuid.h:122
void copy(std::array< uint8_t, byteCount > &arr) const
Copy this std::array of bytes into the UUID.
Definition uuid.h:100
friend constexpr bool operator!=(const Uuid &lhs, const Uuid &rhs) noexcept
Definition uuid.h:127
constexpr UuidVariant getVariant() const noexcept
The variant of the UUID according to the spec.
Definition uuid.h:153
UuidRandomGenerator()
Definition uuid.h:223
constexpr bool operator!=(const Span< T > &lhs, const Span< T > &rhs) noexcept
Definition span.h:190
static constexpr std::size_t byteCount
Definition uuid.h:55
std::array< uint8_t, byteCount > bytes() const noexcept
Definition uuid.h:196
static bool isValid(std::string_view s) noexcept
True if the UUID is well-formed. Static: it inspects the string, not this UUID.
constexpr bool operator==(const Span< T > &lhs, const Span< T > &rhs) noexcept
Definition span.h:184
constexpr uint32_t getHash32() const noexcept
Computes a 32-bit hash of the UUID.
Definition uuid.h:147
constexpr Uuid() noexcept=default
constexpr bool isNil() const noexcept
True if all zeroes.
Definition uuid.h:73
constexpr uint64_t getHash() const noexcept
Computes a 64-bit hash of the UUID.
Definition uuid.h:82
UuidVariant
Indicated by a bit pattern in octet 8, marked with N in xxxxxxxx-xxxx-xxxx-Nxxx-xxxxxxxxxxxx.
Definition uuid.h:31
Uuid operator()()
Definition uuid.h:227
void swap(Uuid &other) noexcept
Swap the internal data.
Definition uuid.h:204
UuidVersion
Indicated by a bit pattern in octet 6, marked with M in xxxxxxxx-xxxx-Mxxx-xxxx-xxxxxxxxxxxx.
Definition uuid.h:40
std::ostream & operator<<(std::ostream &s, const Uuid &id)
constexpr UuidVersion getVersion() const noexcept
The version of the UUID according to the spec.
Definition uuid.h:175
UuidRandomGenerator(uint64_t seed)
Definition uuid.h:225
friend constexpr bool operator<(const Uuid &lhs, const Uuid &rhs) noexcept
Definition uuid.h:129
@ ncs
NCS backward compatibility.
Definition uuid.h:32
@ rfc
RFC 4122/DCE 1.1.
Definition uuid.h:33
@ microsoft
Microsoft Corporation backward compatibility.
Definition uuid.h:34
@ reserved
reserved for possible future definition
Definition uuid.h:35
@ nameBasedSha1
The name-based version specified in RFS 4122 with SHA1 hashing.
Definition uuid.h:46
@ none
Only possible for nil or invalid uuids.
Definition uuid.h:41
@ dceSecurity
DCE Security version, with embedded POSIX UIDs.
Definition uuid.h:43
@ timeBased
The time-based version specified in RFC 4122.
Definition uuid.h:42
@ nameBasedMd5
The name-based version specified in RFS 4122 with MD5 hashing.
Definition uuid.h:44
@ randomNumberBased
The randomly or pseudo-randomly generated version specified in RFS 4122.
Definition uuid.h:45