37 constexpr uuid() noexcept = default;
45 constexpr
uuid(std::int64_t most, std::int64_t least) noexcept
82 [[nodiscard]]
constexpr std::int32_t
version() const noexcept {
83 return static_cast<std::int32_t
>((most >> 12) & 0x0f);
98 [[nodiscard]]
constexpr std::int32_t
variant() const noexcept {
99 auto least0 =
static_cast<uint64_t
>(least);
100 return static_cast<std::int32_t
>((least0 >> (64 - (least0 >> 62))) & (least >> 63));
109 [[nodiscard]]
constexpr int compare(
const uuid &other)
const noexcept {
110 if (most != other.most) {
111 return most < other.most ? -1 : 1;
113 if (least != other.least) {
114 return least < other.least ? -1 : 1;
121 std::int64_t most = 0;
124 std::int64_t least = 0;
134constexpr bool operator==(
const uuid &lhs,
const uuid &rhs)
noexcept {
135 return lhs.compare(rhs) == 0;
145constexpr bool operator!=(
const uuid &lhs,
const uuid &rhs)
noexcept {
146 return lhs.compare(rhs) != 0;
156constexpr bool operator<(
const uuid &lhs,
const uuid &rhs)
noexcept {
157 return lhs.compare(rhs) < 0;
167constexpr bool operator<=(
const uuid &lhs,
const uuid &rhs)
noexcept {
168 return lhs.compare(rhs) <= 0;
178constexpr bool operator>(
const uuid &lhs,
const uuid &rhs)
noexcept {
179 return lhs.compare(rhs) > 0;
189constexpr bool operator>=(
const uuid &lhs,
const uuid &rhs)
noexcept {
190 return lhs.compare(rhs) >= 0;
200template<
typename C,
typename T>
201::std::basic_ostream<C, T> &operator<<(std::basic_ostream<C, T> &os,
const uuid &
uuid) {
205 auto part1 =
static_cast<std::uint32_t
>(msb >> 32);
206 auto part2 =
static_cast<std::uint16_t
>(msb >> 16);
207 auto part3 =
static_cast<std::uint16_t
>(msb);
208 auto part4 =
static_cast<std::uint16_t
>(lsb >> 48);
209 uint64_t part5 = lsb & 0x0000FFFFFFFFFFFFU;
211 std::ios_base::fmtflags saved_flags = os.flags();
215 << std::setfill<C>(
'0') << std::setw(8) << part1 <<
'-'
216 << std::setfill<C>(
'0') << std::setw(4) << part2 <<
'-'
217 << std::setfill<C>(
'0') << std::setw(4) << part3 <<
'-'
218 << std::setfill<C>(
'0') << std::setw(4) << part4 <<
'-'
219 << std::setfill<C>(
'0') << std::setw(12) << part5;
222 os.flags(saved_flags);
234template<
typename C,
typename T>
235::std::basic_istream<C, T> &operator>>(std::basic_istream<C, T> &is,
uuid &result) {
236 std::uint64_t parts[5];
238 std::ios_base::fmtflags saved_flags = is.flags();
242 for (
int i = 0; i < 4; ++i) {
245 is >> parts[i] >> delim;
247 if (delim !=
static_cast<C
>(
'-')) {
254 is.flags(saved_flags);
257 uuid(std::int64_t((parts[0] << 32) | (parts[1] << 16) | parts[2]), std::int64_t((parts[3] << 48) | parts[4]));
Universally unique identifier (UUID).
Definition uuid.h:32
constexpr std::int64_t get_most_significant_bits() const noexcept
Definition uuid.h:61
constexpr int compare(const uuid &other) const noexcept
Definition uuid.h:109
static uuid random()
Definition uuid.cpp:25
constexpr uuid() noexcept=default
constexpr std::int64_t get_least_significant_bits() const noexcept
Definition uuid.h:68
constexpr std::int32_t variant() const noexcept
Definition uuid.h:98
constexpr std::int32_t version() const noexcept
Definition uuid.h:82