27#include <commons/color.hpp>
28#include <commons/fixed_string.hpp>
29#include <commons/icon.hpp>
60 std::optional<comms::Icon>
icon;
61 std::optional<comms::Color>
color;
74template <comms::FixedString Id,
typename T>
79template <comms::FixedString Id,
typename T>
93concept TagValKind = !std::same_as<decltype(probe_kind(static_cast<T*>(
nullptr))), std::monostate>;
113 using FindFn = std::optional<KindEntryView> (*)(std::string_view code);
120 [[nodiscard]]
constexpr std::string_view
kind_id() const noexcept {
121 return descriptor_.
id;
136 [[nodiscard]] std::vector<KindEntryView>
values()
const {
137 std::vector<KindEntryView> out;
144 template <std::invocable<const KindEntryView&> F>
146 using FRef = std::remove_reference_t<F>;
148 +[](
void* user,
const KindEntryView& e) { std::invoke(*
static_cast<FRef*
>(user), e); };
151 walk_(
static_cast<void*
>(std::addressof(f)), trampoline);
156 [[nodiscard]] std::optional<KindEntryView>
find(
const std::string_view code)
const {
161 return a.descriptor_.id == b.descriptor_.id;
165 template <
typename T>
183 v.descriptor_ = T::descriptor();
192 for (
const auto&
m : T::all_values()) {
198 static std::optional<KindEntryView> find(std::string_view code) {
199 auto exp = T::try_of(code);
217 template <
typename T>
221 const std::string_view
id = T::kind_id();
222 if (std::ranges::any_of(v, [&](
const KindView& kv) {
return kv.
kind_id() ==
id; })) {
229 [[nodiscard]]
static std::span<const KindView>
all() noexcept {
230 return std::span<const KindView>{storage()};
249 [[nodiscard]]
static const KindView*
find(
const std::string_view kind_id)
noexcept {
250 const auto& v = storage();
252 std::ranges::find_if(v, [&](
const KindView& kv) {
return kv.
kind_id() == kind_id; });
253 return it == v.end() ? nullptr : &*it;
257 [[nodiscard]]
static std::vector<KindView>& storage() {
258 static std::vector<KindView> v;
CRTP base for tag-value kinds whose values are fixed at compile time.
Definition closed_ended.hpp:37
Program-wide index of every kind that opted in via TAGVAL_REGISTER_KIND.
Definition kind_registry.hpp:212
static auto all_open() noexcept
Lazy filter view over the registered kinds that selects open-ended kinds only.
Definition kind_registry.hpp:243
static const KindView * find(const std::string_view kind_id) noexcept
Find a kind by id.
Definition kind_registry.hpp:249
static auto all_closed() noexcept
Lazy filter view over the registered kinds that selects closed-ended kinds only.
Definition kind_registry.hpp:237
static std::span< const KindView > all() noexcept
All registered kinds, in registration order.
Definition kind_registry.hpp:229
static void register_kind()
Register a kind.
Definition kind_registry.hpp:219
Type-erased handle to one registered kind.
Definition kind_registry.hpp:109
friend constexpr bool operator==(const KindView &a, const KindView &b) noexcept
Definition kind_registry.hpp:160
constexpr TagValDescriptor descriptor() const noexcept
Definition kind_registry.hpp:117
std::optional< KindEntryView >(*)(std::string_view code) FindFn
Definition kind_registry.hpp:113
constexpr KindCategory category() const noexcept
Definition kind_registry.hpp:123
std::optional< KindEntryView > find(const std::string_view code) const
Look up a value by code.
Definition kind_registry.hpp:156
constexpr bool is_closed_ended() const noexcept
Definition kind_registry.hpp:126
constexpr bool is_open_ended() const noexcept
Definition kind_registry.hpp:129
constexpr KindView() noexcept=default
void(*)(void *user, EmitFn emit) WalkFn
Definition kind_registry.hpp:112
constexpr std::string_view kind_id() const noexcept
Definition kind_registry.hpp:120
void for_each(F &&f) const
Zero-allocation walk over the kind's current values.
Definition kind_registry.hpp:145
std::vector< KindEntryView > values() const
Allocating snapshot of the kind's current values, in declaration order (open-ended: predefined entrie...
Definition kind_registry.hpp:136
void(*)(void *user, const KindEntryView &) EmitFn
Definition kind_registry.hpp:111
CRTP base for tag-value kinds whose values are partly compile-time (Derived::values_t) and partly con...
Definition open_ended.hpp:63
Builds a KindView for a single concrete kind type.
Definition kind_registry.hpp:179
static KindView build()
Definition kind_registry.hpp:181
ClosedEnded base — values come from a compile-time Values<...> list.
Concept: T is a tag-value kind (derives from ClosedEnded or OpenEnded).
Definition kind_registry.hpp:93
Public kind-level metadata struct.
Compile-time Entry NTTP and the runtime-view TagValMetadata struct.
constexpr KindCategory category_of() noexcept
Category of a tag-value kind.
Definition kind_registry.hpp:99
constexpr KindCategory probe_kind(ClosedEnded< Id, T > *) noexcept
Overload set used to detect whether T is a tag-value kind and, if so, which CRTP base it derives from...
Definition kind_registry.hpp:75
constexpr TagValDescriptor compute_descriptor() noexcept
Definition base.hpp:38
KindCategory
Which CRTP base a kind derives from.
Definition kind_registry.hpp:51
OpenEnded base — same in-class declaration shape as ClosedEnded (TAGVAL_ENTRY + using values_t = tagv...
Flattened, copy-friendly view of a single entry.
Definition kind_registry.hpp:57
friend constexpr bool operator==(const KindEntryView &, const KindEntryView &) noexcept=default
std::optional< comms::Color > color
Definition kind_registry.hpp:61
std::optional< comms::Icon > icon
Definition kind_registry.hpp:60
std::string_view code
Definition kind_registry.hpp:58
std::string_view label
Definition kind_registry.hpp:59
Runtime metadata describing a tag-value kind (e.g.
Definition descriptor.hpp:19
std::optional< comms::Icon > icon
Optional UI icon.
Definition descriptor.hpp:23
std::string_view id
Stable identifier (e.g. "device_kind"). Required.
Definition descriptor.hpp:21
std::optional< comms::Color > color
Optional UI accent.
Definition descriptor.hpp:24