22static_assert(
sizeof(
bUUID) == 16,
"expect UUIDs to be 128 bit exactly");
26 static std::mt19937_64 rng = []() {
30 static_assert(std::mt19937_64::min() == 0
LL);
31 static_assert(std::mt19937_64::max() == 0xffffffffffffffffLL);
40 clock_gettime(CLOCK_REALTIME, &ts);
42 timespec_get(&ts, TIME_UTC);
59 uuid_as_int64[0] = rng();
60 uuid_as_int64[1] = rng();
75 const bUUID nil = {0, 0, 0, 0, 0, {0}};
86 return std::memcmp(&uuid1, &uuid2,
sizeof(uuid1)) == 0;
94 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
114 const int fields_parsed_num = std::sscanf(
116 "%8x-%4hx-%4hx-%2hhx%2hhx-%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx",
128 return fields_parsed_num == 11;
133 std::string buffer(36,
'\0');
141bUUID::bUUID(
const std::initializer_list<uint32_t> field_values)
143 BLI_assert_msg(field_values.size() == 11,
"bUUID requires 5 regular fields + 6 `node` values");
145 const auto *field_iter = field_values.begin();
147 this->time_low = *field_iter++;
148 this->time_mid =
uint16_t(*field_iter++);
149 this->time_hi_and_version =
uint16_t(*field_iter++);
150 this->clock_seq_hi_and_reserved =
uint8_t(*field_iter++);
151 this->clock_seq_low =
uint8_t(*field_iter++);
153 std::copy(field_iter, field_values.end(), this->node);
156bUUID::bUUID(
const StringRefNull string_formatted_uuid)
160 std::stringstream ss;
161 ss <<
"invalid UUID string " << string_formatted_uuid;
162 throw std::runtime_error(ss.str());
166bUUID::bUUID(const ::bUUID &struct_uuid)
168 *(
static_cast<::
bUUID *
>(
this)) = struct_uuid;
171std::string bUUID::str()
const
173 std::string string(36,
'\0');
182 return uuid_as_int64[0] ^ uuid_as_int64[1];
192 return !(uuid1 == uuid2);
197 auto simple_fields1 = std::tie(uuid1.
time_low,
202 auto simple_fields2 = std::tie(uuid2.
time_low,
207 if (simple_fields1 == simple_fields2) {
208 return std::memcmp(uuid1.
node, uuid2.
node,
sizeof(uuid1.
node)) < 0;
210 return simple_fields1 < simple_fields2;
#define BLI_assert_msg(a, msg)
size_t BLI_snprintf(char *__restrict dst, size_t dst_maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
#define UNUSED_VARS_NDEBUG(...)
bool BLI_uuid_parse_string(bUUID *uuid, const char *buffer) ATTR_NONNULL()
bool BLI_uuid_equal(bUUID uuid1, bUUID uuid2)
void BLI_uuid_format(char *buffer, bUUID uuid) ATTR_NONNULL()
struct bUUID bUUID
Universally Unique Identifier according to RFC4122.
static unsigned long seed
constexpr bool operator!=(StringRef a, StringRef b)
constexpr bool operator==(StringRef a, StringRef b)
constexpr bool operator<(StringRef a, StringRef b)
unsigned __int64 uint64_t
Universally Unique Identifier according to RFC4122.
uint8_t clock_seq_hi_and_reserved
uint16_t time_hi_and_version
void BLI_uuid_format(char *buffer, const bUUID uuid)
std::ostream & operator<<(std::ostream &stream, bUUID uuid)
bool BLI_uuid_equal(const bUUID uuid1, const bUUID uuid2)
bool BLI_uuid_parse_string(bUUID *uuid, const char *buffer)
bool BLI_uuid_is_nil(bUUID uuid)
bUUID BLI_uuid_generate_random()