22#include "pw_assert/assert.h"
23#include "pw_bytes/span.h"
25#include "pw_result/result.h"
26#include "pw_status/status.h"
27#include "pw_string/hex.h"
42 std::string_view{
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}.size();
45 constexpr explicit Uuid() : uuid_() {}
54 pw::copy(uuid_span.begin(), uuid_span.end(), uuid_.begin());
66 for (
size_t i = 0; i < uuid_.size(); i++) {
67 uuid_[i] =
static_cast<uint8_t
>(uuid_span[i]);
99 template <
size_t kSize,
typename = std::enable_if_t<kSize == kSizeBytes>>
100 static constexpr Uuid FromSpan(
const std::array<uint8_t, kSize>& uuid_array) {
101 return Uuid(uuid_array);
110 template <
size_t kSize,
typename = std::enable_if_t<kSize == kSizeBytes>>
112 const std::array<std::byte, kSize>& uuid_array) {
113 return Uuid(uuid_array);
122 template <
size_t kSize,
typename = std::enable_if_t<kSize == kSizeBytes>>
133 template <
size_t kSize,
typename = std::enable_if_t<kSize == kSizeBytes>>
142 Status status = ValidateString(
string);
152 constexpr bool operator==(
const Uuid& other)
const {
154 if (uuid_[i] != other.uuid_[i]) {
161 constexpr bool operator!=(
const Uuid& other)
const {
162 return !(*
this == other);
169 for (
size_t i = uuid_.size(); i-- != 0;) {
170 out += string::NibbleToHex(uuid_[i] >> 4);
171 out += string::NibbleToHex(uuid_[i] & 0xf);
172 if ((i == 12) || (i == 10) || (i == 8) || (i == 6)) {
183 constexpr explicit Uuid(std::string_view uuid_str) : uuid_() {
184 size_t out_hex_index = 2 * uuid_.size();
187 if (i == 8 || i == 13 || i == 18 || i == 23) {
188 PW_ASSERT(uuid_str[i] ==
'-');
191 PW_ASSERT(uuid_str[i] !=
'\0');
194 uint16_t value = string::HexToNibble(uuid_str[i]);
195 PW_ASSERT(value <= 0xf);
196 if (out_hex_index % 2 == 0) {
197 uuid_[out_hex_index / 2] |=
static_cast<uint8_t
>(value);
199 uuid_[out_hex_index / 2] =
static_cast<uint8_t
>(value << 4);
212 static constexpr Status ValidateString(std::string_view uuid_str) {
216 for (
size_t i = 0; i < uuid_str.size(); i++) {
217 if (i == 8 || i == 13 || i == 18 || i == 23) {
218 if (uuid_str[i] !=
'-') {
223 if (string::IsHexDigit(uuid_str[i]) == 0) {
230 std::array<uint8_t, kSizeBytes> uuid_;
pw::InlineBasicString is a fixed-capacity version of std::basic_string. In brief:
Definition: string.h:68
static constexpr Status InvalidArgument()
Definition: status.h:164
constexpr bool ok() const
Definition: status.h:346
static constexpr Status FailedPrecondition()
Definition: status.h:243
Definition: span_impl.h:235
Represents a 128-bit universally unique identifier (UUID).
Definition: uuid.h:36
constexpr OutputIt copy(InputIt first, InputIt last, OutputIt d_first)
constexpr backport of <algorithm>'s std::copy for C++17.
Definition: algorithm.h:348
constexpr Status OkStatus()
Definition: status.h:450
static constexpr size_t kSizeBytes
Size of the UUID in bytes.
Definition: uuid.h:39
static constexpr Uuid FromSpan(const std::array< std::byte, kSize > &uuid_array)
Creates a Uuid from a std::array of 16 const bytes.
Definition: uuid.h:111
constexpr Uuid(span< const std::byte, kSizeBytes > uuid_span)
Creates a Uuid from a pw::span of 16 const std::byte.
Definition: uuid.h:63
static constexpr Uuid FromSpan(const std::array< uint8_t, kSize > &uuid_array)
Creates a Uuid from a std::array of 16 const uint8_t.
Definition: uuid.h:100
static constexpr Uuid FromSpan(const uint8_t(&uuid_array)[kSize])
Creates a Uuid from a C-style array of 16 const uint8_t.
Definition: uuid.h:123
static constexpr Uuid FromSpan(const std::byte(&uuid_array)[kSize])
Creates a Uuid from a C-style array of 16 const bytes.
Definition: uuid.h:134
static constexpr Result< Uuid > FromString(std::string_view string)
Create a Uuid from a string.
Definition: uuid.h:141
constexpr Uuid(span< const uint8_t, kSizeBytes > uuid_span)
Creates a Uuid from a pw::span of 16 const bytes.
Definition: uuid.h:53
static constexpr Result< Uuid > FromSpan(ConstByteSpan uuid_span)
Create a Uuid from a const std::byte span.
Definition: uuid.h:85
constexpr span< const uint8_t, kSizeBytes > GetSpan() const
Return the backing span holding the uuid.
Definition: uuid.h:150
constexpr InlineString< kStringSize > ToString() const
Convert the Uuid to a human readable string.
Definition: uuid.h:166
static constexpr size_t kStringSize
Length of the UUID's string representation.
Definition: uuid.h:41
static constexpr Result< Uuid > FromSpan(span< const uint8_t > uuid_span)
Create a Uuid from a const uint8_t span.
Definition: uuid.h:74
128-bit universally unique identifier library
Definition: uuid.h:31
pw::InlineBasicString and pw::InlineString are safer alternatives to std::basic_string and std::strin...