tagval 0.2.0
Modern C++23 header-only library of tagged values (open/closed enumerations with metadata)
Loading...
Searching...
No Matches
values.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <tagval/entry.hpp>
7
8#include <array>
9#include <concepts>
10#include <cstddef>
11#include <string_view>
12#include <tuple>
13
14namespace tagval::detail {
15
16template <typename... Es>
17[[nodiscard]] consteval bool all_codes_unique() noexcept {
18 if constexpr (sizeof...(Es) <= 1) {
19 return true;
20 } else {
21 const std::array<std::string_view, sizeof...(Es)> codes{std::string_view{Es::code}...};
22 for (std::size_t i = 0; i < codes.size(); ++i) {
23 for (std::size_t j = i + 1; j < codes.size(); ++j) {
24 if (codes[i] == codes[j]) {
25 return false;
26 }
27 }
28 }
29 return true;
30 }
31}
32
33} // namespace tagval::detail
34
35namespace tagval {
36
40template <typename... Entries>
41struct Values {
42 static_assert(sizeof...(Entries) > 0, "Values<> must list at least one entry");
43
44 using entries_t = std::tuple<Entries...>;
45 using owner_t = std::tuple_element_t<0, entries_t>::owner_t;
46
47 static_assert((std::same_as<typename Entries::owner_t, owner_t> && ...),
48 "All entries in tagval::Values must share the same owner");
49
50 static_assert(detail::all_codes_unique<Entries...>(),
51 "tagval::Values: duplicate code in entry list");
52
53 template <typename E>
54 static constexpr bool contains = (std::same_as<E, Entries> || ...);
55
56 static constexpr std::size_t size = sizeof...(Entries);
57};
58
59namespace detail {
60
61template <typename... Es>
62[[nodiscard]] constexpr auto values_metadata_array_impl(std::tuple<Es...>* /*tag*/) {
63 return std::array<TagValMetadata, sizeof...(Es)>{metadata_of<Es>()...};
64}
65
66template <typename... Es>
67[[nodiscard]] constexpr auto values_metadata_pointers_impl(std::tuple<Es...>* /*tag*/) {
68 return std::array<const TagValMetadata*, sizeof...(Es)>{&metadata_v<Es>...};
69}
70
71} // namespace detail
72
75template <typename V>
76[[nodiscard]] constexpr auto values_metadata_array() {
77 return detail::values_metadata_array_impl(static_cast<V::entries_t*>(nullptr));
78}
79
83template <typename V>
84[[nodiscard]] constexpr auto values_metadata_pointers() {
85 return detail::values_metadata_pointers_impl(static_cast<V::entries_t*>(nullptr));
86}
87
88} // namespace tagval
Compile-time Entry NTTP and the runtime-view TagValMetadata struct.
Definition base.hpp:26
constexpr TagValDescriptor compute_descriptor() noexcept
Definition base.hpp:38
consteval bool all_codes_unique() noexcept
Definition values.hpp:17
constexpr auto values_metadata_array_impl(std::tuple< Es... > *)
Definition values.hpp:62
constexpr auto values_metadata_pointers_impl(std::tuple< Es... > *)
Definition values.hpp:67
Definition base.hpp:26
constexpr auto values_metadata_pointers()
Materialize an array of pointers to the pinned metadata_v<E> constants for a Values<....
Definition values.hpp:84
constexpr auto values_metadata_array()
Materialize the metadata array for a Values<...> list.
Definition values.hpp:76
Runtime view of an entry's metadata.
Definition entry.hpp:46
Compile-time tuple of Entry types belonging to a single Owner.
Definition values.hpp:41
std::tuple< Entries... > entries_t
Definition values.hpp:44
std::tuple_element_t< 0, entries_t >::owner_t owner_t
Definition values.hpp:45
static constexpr bool contains
Definition values.hpp:54
static constexpr std::size_t size
Definition values.hpp:56