22#include "pw_assert/assert.h"
23#include "pw_bytes/span.h"
24#include "pw_result/result.h"
25#include "pw_status/status.h"
26#include "pw_string/hex.h"
38 std::string_view{
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}.size();
43 static constexpr Result<Uuid>
FromSpan(span<const uint8_t> span) {
44 Status status = ValidateSpan(span);
54 static Result<Uuid>
FromSpan(ConstByteSpan span) {
56 {
reinterpret_cast<const uint8_t*
>(span.data()), span.size()});
62 static constexpr Result<Uuid>
FromString(std::string_view
string) {
63 Status status = ValidateString(
string);
71 constexpr pw::span<const uint8_t, kSizeBytes>
GetSpan()
const {
75 constexpr bool operator==(
const Uuid& other)
const {
77 if (uuid_[i] != other.uuid_[i]) {
84 constexpr bool operator!=(
const Uuid& other)
const {
85 return !(*
this == other);
92 for (
size_t i = uuid_.size(); i-- != 0;) {
93 out += string::NibbleToHex(uuid_[i] >> 4);
94 out += string::NibbleToHex(uuid_[i] & 0xf);
95 if ((i == 12) || (i == 10) || (i == 8) || (i == 6)) {
103 constexpr explicit Uuid() : uuid_() {}
109 constexpr explicit Uuid(span<const uint8_t> span) : uuid_() {
110 PW_ASSERT(span.size() == uuid_.size());
111 for (
size_t i = 0; i < uuid_.size(); i++) {
119 constexpr explicit Uuid(std::string_view uuid_str) : uuid_() {
120 size_t out_hex_index = 2 * uuid_.size();
123 if (i == 8 || i == 13 || i == 18 || i == 23) {
124 PW_ASSERT(uuid_str[i] ==
'-');
127 PW_ASSERT(uuid_str[i] !=
'\0');
130 uint16_t value = string::HexToNibble(uuid_str[i]);
131 PW_ASSERT(value <= 0xf);
132 if (out_hex_index % 2 == 0) {
133 uuid_[out_hex_index / 2] |=
static_cast<uint8_t
>(value);
135 uuid_[out_hex_index / 2] =
static_cast<uint8_t
>(value << 4);
149 static constexpr Status ValidateString(std::string_view uuid_str) {
151 return Status::FailedPrecondition();
153 for (
size_t i = 0; i < uuid_str.size(); i++) {
154 if (i == 8 || i == 13 || i == 18 || i == 23) {
155 if (uuid_str[i] !=
'-') {
156 return Status::InvalidArgument();
160 if (string::IsHexDigit(uuid_str[i]) == 0) {
161 return Status::InvalidArgument();
175 static constexpr Status ValidateSpan(span<const uint8_t> span) {
177 return Status::FailedPrecondition();
182 std::array<uint8_t, kSizeBytes> uuid_;
pw::InlineBasicString is a fixed-capacity version of std::basic_string. In brief:
Definition: string.h:66
constexpr bool ok() const
Definition: status.h:157
Represents a 128-bit universally unique identifier (UUID).
Definition: uuid.h:32
static constexpr size_t kSizeBytes
Size of the UUID in bytes.
Definition: uuid.h:35
static Result< Uuid > FromSpan(ConstByteSpan span)
Definition: uuid.h:54
constexpr pw::span< const uint8_t, kSizeBytes > GetSpan() const
Return the backing span holding the uuid.
Definition: uuid.h:71
static constexpr Result< Uuid > FromString(std::string_view string)
Definition: uuid.h:62
static constexpr Result< Uuid > FromSpan(span< const uint8_t > span)
Definition: uuid.h:43
constexpr InlineString< kStringSize > ToString() const
Convert the Uuid to a human readable string.
Definition: uuid.h:89
static constexpr size_t kStringSize
Length of the UUID's string representation.
Definition: uuid.h:37
constexpr Status OkStatus()
Definition: status.h:234
pw::InlineBasicString and pw::InlineString are safer alternatives to std::basic_string and std::strin...