17#ifndef TOOLBOX_UTIL_STRUCT_HPP
18#define TOOLBOX_UTIL_STRUCT_HPP
28inline namespace util {
31template <
typename TagT,
typename ValueT>
46 enum : std::size_t { Size = 0 };
48 template <
typename TagT,
typename ValueT>
62 enum : std::size_t { Size = 1 + Tail::Size };
73 template <
typename TagU,
typename ValueU>
81 constexpr const auto&
slice(
TagT)
const noexcept {
return *
this; };
82 constexpr auto&
slice(
TagT)
noexcept {
return *
this; };
89constexpr auto Struct = detail::Struct<>{};
92constexpr bool empty(
const detail::Struct<detail::Member<TagsT, ValuesT>...>&
s)
98constexpr std::size_t
size(
const detail::Struct<detail::Member<TagsT, ValuesT>...>&
s)
104constexpr bool has(
const detail::Struct<detail::Member<TagsT, ValuesT>...>&
s,
TagT tag = {})
106 return s.slice(
tag).Size > 0;
110constexpr const auto&
get(
const detail::Struct<detail::Member<TagsT, ValuesT>...>&
s,
TagT tag = {})
112 return s.slice(
tag).head;
116constexpr auto&
get(detail::Struct<detail::Member<TagsT, ValuesT>...>&
s,
TagT tag = {})
118 return s.slice(
tag).head;