11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22PROMEKI_NAMESPACE_BEGIN
49 PROMEKI_DATATYPE(UUID, DataTypeUUID, 1)
52 using DataFormat = Array<uint8_t, 16>;
64 static UUID generate(
int version = 4);
76 static UUID generateV1();
84 static UUID generateV3(const UUID &ns, const String &name);
90 static UUID generateV4();
98 static UUID generateV5(const UUID &ns, const String &name);
106 static UUID generateV7(int64_t timestampMs = -1);
115 static Result<UUID> fromString(const String &
string);
121 UUID(
const UUID &u) : d(u.d) {}
124 UUID(UUID &&u) noexcept : d(std::move(u.d)) {}
127 UUID(
const DataFormat &val) : d(val) {}
130 UUID(DataFormat &&val) noexcept : d(std::move(val)) {}
133 UUID &operator=(
const UUID &val) {
139 UUID &operator=(UUID &&val)
noexcept {
140 d = std::move(val.d);
145 UUID &operator=(
const DataFormat &val) {
151 UUID &operator=(DataFormat &&val)
noexcept {
157 bool operator==(
const UUID &other)
const {
return d == other.d; }
160 bool operator!=(
const UUID &other)
const {
return d != other.d; }
163 bool operator<(
const UUID &other)
const {
return std::memcmp(d.data(), other.d.data(), 16) < 0; }
166 bool operator>(
const UUID &other)
const {
return std::memcmp(d.data(), other.d.data(), 16) > 0; }
169 bool operator<=(
const UUID &other)
const {
return std::memcmp(d.data(), other.d.data(), 16) <= 0; }
172 bool operator>=(
const UUID &other)
const {
return std::memcmp(d.data(), other.d.data(), 16) >= 0; }
175 operator String()
const {
return toString(); }
181 bool isValid()
const {
return !d.isZero(); }
187 int version()
const {
188 if (!isValid())
return 0;
189 return (d[6] >> 4) & 0x0F;
196 String toString()
const;
202 const DataFormat &data()
const {
return d; }
208 const uint8_t *raw()
const {
return d.data(); }
215 Error writeToStream(DataStream &s)
const;
222 template <u
int32_t V>
static Result<UUID> readFromStream(DataStream &s);
230PROMEKI_FORMAT_VIA_TOSTRING(promeki::UUID);