15#include <commons/color.hpp>
16#include <commons/fixed_string.hpp>
17#include <commons/icon.hpp>
34 { T::make_descriptor() } -> std::same_as<TagValDescriptor>;
37template <comms::FixedString Id,
typename Derived>
40 return Derived::make_descriptor();
48template <comms::FixedString Id,
typename Derived>
55 [[nodiscard]] std::string_view
code() const noexcept {
59 [[nodiscard]] std::string_view
label() const noexcept {
63 [[nodiscard]] std::optional<comms::Icon>
icon() const noexcept {
67 [[nodiscard]] std::optional<comms::Color>
color() const noexcept {
71 [[nodiscard]]
bool empty() const noexcept {
72 return meta_ ==
nullptr;
75 [[nodiscard]]
explicit operator bool() const noexcept {
76 return meta_ !=
nullptr;
79 [[nodiscard]]
static constexpr std::string_view
kind_id() noexcept {
89 return a.meta_ ==
b.meta_;
96 const bool ae =
a.meta_ ==
nullptr;
97 if (
const bool be =
b.meta_ ==
nullptr;
ae ||
be) {
98 return static_cast<int>(
be) <=>
static_cast<int>(
ae);
100 return a.meta_->code.compare(
b.meta_->code) <=> 0;
111 d.HandleBase::meta_ =
m;
117 const std::string_view
code)
noexcept {
118 for (
const auto&
m : values) {
119 if (
m.code ==
code) {
127 const std::string_view
code) {
130 std::string
msg =
"tagval: unknown code '";
132 msg +=
"' for kind '";
133 msg.append(
Id.view());
140 [[
nodiscard]]
static std::expected<Derived, ParseError>
142 const std::string_view
code)
noexcept {
Thrown by of() when a code is not present.
Definition error.hpp:19
CRTP handle.
Definition base.hpp:49
static Derived of_impl(const std::span< const TagValMetadata > values, const std::string_view code)
Definition base.hpp:126
std::string_view label() const noexcept
Definition base.hpp:59
std::optional< comms::Color > color() const noexcept
Definition base.hpp:67
static const TagValMetadata * find_in(const std::span< const TagValMetadata > values, const std::string_view code) noexcept
Linear search a metadata range by code.
Definition base.hpp:116
static std::expected< Derived, ParseError > try_of_impl(const std::span< const TagValMetadata > values, const std::string_view code) noexcept
Definition base.hpp:141
constexpr HandleBase() noexcept=default
Default-constructed handle: empty(), bool() == false.
static constexpr TagValDescriptor descriptor() noexcept
Definition base.hpp:83
std::optional< comms::Icon > icon() const noexcept
Definition base.hpp:63
constexpr HandleBase(const TagValMetadata *m) noexcept
Definition base.hpp:104
friend constexpr bool operator==(const HandleBase &a, const HandleBase &b) noexcept
Definition base.hpp:87
static Derived make_handle(const TagValMetadata *m) noexcept
Build a Derived handle from a stable metadata pointer.
Definition base.hpp:109
std::string_view code() const noexcept
Definition base.hpp:55
const TagValMetadata * meta_
Definition base.hpp:106
static constexpr std::string_view kind_id() noexcept
Definition base.hpp:79
friend constexpr std::strong_ordering operator<=>(const HandleBase &a, const HandleBase &b) noexcept
Definition base.hpp:92
bool empty() const noexcept
Definition base.hpp:71
Empty marker base — used by std::hash / std::formatter / operator<< specializations to recognize all ...
Definition base.hpp:30
Public kind-level metadata struct.
Compile-time Entry NTTP and the runtime-view TagValMetadata struct.
tagval exception types and ParseError record used by try_of().
constexpr TagValDescriptor compute_descriptor() noexcept
Definition base.hpp:38
Returned via std::expected from try_of() when a code is not present.
Definition error.hpp:25
std::string code
The attempted code.
Definition error.hpp:26
Runtime metadata describing a tag-value kind (e.g.
Definition descriptor.hpp:19
std::string_view id
Stable identifier (e.g. "device_kind"). Required.
Definition descriptor.hpp:21