15 struct GenerateUUIDFunction;
22 enum class Variant :
u8 {
26 enum class Version :
u8 {
39 constexpr explicit UUID(ByteArray bytes) { *
this = util::bit_cast<UUID>(bytes); }
41 constexpr auto null() const ->
bool {
return *
this ==
UUID(); }
45 friend struct detail::GenerateUUIDFunction;
48 return util::bit_cast<ByteArray>(a) == util::bit_cast<ByteArray>(b);
51 return util::bit_cast<ByteArray>(a) <=> util::bit_cast<ByteArray>(b);
54 constexpr auto variant() const ->
Variant {
return Variant(m_clock_seq_hi_and_res >> 5); }
55 constexpr auto version() const -> Version {
return Version(m_time_hi_and_version >> 4); }
57 constexpr void set_to_standard_variant() {
58 m_clock_seq_hi_and_res &= 0b11000000;
59 m_clock_seq_hi_and_res |= 0b10000000;
62 constexpr void set_version(Version type) {
63 m_time_hi_and_version &= 0b00001111;
67 constexpr auto is_little_endian() const ->
bool {
return variant() == Variant::LittleEndian; }
69 template<concepts::Encoding Enc>
76#pragma GCC diagnostic push
77#pragma GCC diagnostic ignored "-Wstringop-overflow"
82 auto output_digit = [&](
u8 digit) {
84 buffer[index++] = char(digit - 10 +
'a');
86 buffer[index++] = char(digit +
'0');
90 auto output_byte = [&](
auto byte) {
91 output_digit(
byte >> 4);
92 output_digit(
byte & 0xF);
95 auto output = [&](
auto value,
auto bytes) {
96 u64 mask = 0xFF << 8 * (bytes - 1);
97 for (; bytes > 0; bytes--) {
98 u8 byte = (value & mask) >> 8 * (bytes - 1);
105 if (uuid.is_little_endian()) {
110 buffer[index++] =
'-';
111 if (uuid.is_little_endian()) {
116 buffer[index++] =
'-';
117 if (uuid.is_little_endian()) {
122 buffer[index++] =
'-';
123 output_byte(uuid.m_clock_seq_hi_and_res);
124 output_byte(uuid.m_clock_seq_low);
125 buffer[index++] =
'-';
133#pragma GCC diagnostic pop
142 auto valid_hex = (
'0'_m -
'9'_m ||
'a'_m -
'f'_m ||
'A'_m -
'F'_m);
150 << []<
typename Context>(
154 auto encoding = context.encoding();
156 auto [a, b, c, d, e] = results;
160 encoding::unicode_code_point_unwrap(encoding, a.end()) });
164 encoding::unicode_code_point_unwrap(encoding, b.end()) });
168 encoding::unicode_code_point_unwrap(encoding, c.end()) });
172 encoding::unicode_code_point_unwrap(encoding, d.end()) });
176 encoding::unicode_code_point_unwrap(encoding, e.end()) });
178 auto result =
UUID {};
179 result.m_time_low = m_time_low;
180 result.m_time_mid = m_time_mid;
181 result.m_time_hi_and_version = time_hi;
182 result.m_clock_seq_hi_and_res = clock_seq >> 8;
183 result.m_clock_seq_low = clock_seq & 0xFF;
184 result.m_node[0] =
Byte((m_node & 0x0000FF0000000000) >> 40);
185 result.m_node[1] =
Byte((m_node & 0x000000FF00000000) >> 32);
186 result.m_node[2] =
Byte((m_node & 0x00000000FF000000) >> 24);
187 result.m_node[3] =
Byte((m_node & 0x0000000000FF0000) >> 16);
188 result.m_node[4] =
Byte((m_node & 0x000000000000FF00) >> 8);
189 result.m_node[5] =
Byte((m_node & 0x00000000000000FF) >> 0);
191 if (result.is_little_endian()) {
204 u32 m_time_low { 0 };
205 u16 m_time_mid { 0 };
206 u16 m_time_hi_and_version { 0 };
207 u8 m_clock_seq_hi_and_res { 0 };
208 u8 m_clock_seq_low { 0 };
213 struct GenerateUUIDFunction {
214 template<concepts::UniformRandomBitGenerator RNG>
215 constexpr auto operator()(RNG&& rng)
const -> UUID {
216 auto distribution = random::UniformIntDistribution(0, 255);
217 auto bytes = UUID::ByteArray {};
218 for (
auto&
byte : bytes) {
219 byte =
Byte(distribution(rng));
222 auto result = UUID(bytes);
223 result.set_version(UUID::Version::Random);
224 result.set_to_standard_variant();
234inline namespace literals {
249#if !defined(DI_NO_GLOBALS) && !defined(DI_NO_GLOBAL_UUID_LITERALS)
Definition string_view_impl.h:19
Definition format_parse_context.h:14
void IsAtom
Definition uuid.h:35
constexpr void clear()
Definition uuid.h:42
constexpr friend auto operator<=>(UUID a, UUID b) -> strong_ordering
Definition uuid.h:50
constexpr friend auto tag_invoke(types::Tag< parser::create_parser_in_place >, InPlaceType< UUID >)
Definition uuid.h:141
constexpr friend auto tag_invoke(types::Tag< format::formatter_in_place >, InPlaceType< UUID >, FormatParseContext< Enc > &parse_context, bool debug)
Definition uuid.h:70
constexpr UUID(ByteArray bytes)
Definition uuid.h:39
constexpr friend auto operator==(UUID a, UUID b) -> bool
Definition uuid.h:47
constexpr auto null() const -> bool
Definition uuid.h:41
Definition operations.h:34
Definition format_context.h:9
string::StringViewImpl< string::TransparentEncoding > TransparentStringView
Definition string_view.h:13
constexpr auto match_one
Definition match_one.h:27
constexpr auto run_parser_unchecked
Definition run_parser_unchecked.h:16
constexpr auto integer
Definition integer.h:212
constexpr auto parse_unchecked
Definition parse_unchecked.h:25
constexpr auto match_exactly
Definition match_exactly.h:56
std::byte byte
Definition byte.h:64
std::byte Byte
Definition byte.h:63
size_t usize
Definition integers.h:33
__UINT64_TYPE__ u64
Definition integers.h:12
__UINT8_TYPE__ u8
Definition integers.h:9
__UINT32_TYPE__ u32
Definition integers.h:11
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
__UINT16_TYPE__ u16
Definition integers.h:10
constexpr auto to_underlying
Definition to_underlying.h:15
constexpr auto generate_uuid
Definition uuid.h:230
Definition any_storable.h:9
constexpr auto host_to_big_endian
Definition big_endian.h:21
constexpr auto little_endian_to_host
Definition little_endian.h:22
constexpr auto size
Definition size.h:62
constexpr auto data
Definition data.h:51
constexpr auto minus
Definition minus.h:15
constexpr auto big_endian_to_host
Definition big_endian.h:22
constexpr auto host_to_little_endian
Definition little_endian.h:21
Definition in_place_type.h:5