16 template<
typename TEnum>
18 requires std::is_enum_v<TEnum>;
23 template<DenselyPackedOptionsEnum TEnum>
26 return static_cast<size_t>(TEnum::NUM_OPTIONS);
32 template<DenselyPackedOptionsEnum TEnum, TEnum... TEnumOptions>
34 static_assert(
sizeof...(TEnumOptions) == num_options<TEnum>());
39 template<DenselyPackedOptionsEnum TEnum>
42 return static_cast<size_t>(std::to_underlying(v));
47 template<DenselyPackedOptionsEnum TEnum>
50 if (pos < num_options<TEnum>()) {
51 return static_cast<TEnum
>(pos);
61 DenselyPackedOptionsEnum TEnum,
62 typename Proj = std::identity
69 using value_type = std::remove_cvref_t<
decltype(Proj{}(std::declval<TEnum>()))>;
84 return std::invoke(*proj_, current_);
89 current_ =
static_cast<TEnum
>(std::to_underlying(current_) + 1);
100 TEnum current_ =
static_cast<TEnum
>(0);
101 const Proj* proj_ =
nullptr;
112 auto front()
const {
return std::invoke(proj_,
static_cast<TEnum
>(0)); }
113 auto back()
const {
return std::invoke(proj_,
static_cast<TEnum
>(std::to_underlying(TEnum::NUM_OPTIONS)-1)); }
122 template<DenselyPackedOptionsEnum TEnum,
typename Proj = std::
identity>
125 return DenselyPackedOptionsIterable<TEnum, Proj>(std::forward<Proj>(proj));
132 template<
typename TEnum>
134 requires std::is_enum_v<TEnum>;
135 requires std::is_unsigned_v<std::underlying_type_t<TEnum>>;
140 template<FlagsEnum TEnum>
143 return static_cast<size_t>(TEnum::NUM_FLAGS);
Definition enum_helpers.h:66
Iterator operator++(int)
Definition enum_helpers.h:93
std::remove_cvref_t< decltype(Proj{}(std::declval< TEnum >()))> value_type
Definition enum_helpers.h:69
Iterator & operator++()
Definition enum_helpers.h:87
std::forward_iterator_tag iterator_category
Definition enum_helpers.h:72
void pointer
Definition enum_helpers.h:70
friend bool operator==(const Iterator &, const Iterator &)=default
value_type operator*() const
Definition enum_helpers.h:82
Iterator(const Proj &proj, TEnum current)
Definition enum_helpers.h:75
value_type reference
Definition enum_helpers.h:71
ptrdiff_t difference_type
Definition enum_helpers.h:68
Definition enum_helpers.h:64
Iterator end() const
Definition enum_helpers.h:115
Iterator begin() const
Definition enum_helpers.h:114
decltype(Proj{}(std::declval< TEnum >())) value_type
Definition enum_helpers.h:104
constexpr DenselyPackedOptionsIterable(Proj proj={})
Definition enum_helpers.h:108
auto back() const
Definition enum_helpers.h:113
auto front() const
Definition enum_helpers.h:112
Definition enum_helpers.h:17
Definition enum_helpers.h:133
Definition custom_decoration_generator.h:5
constexpr DenselyPackedOptionsIterable< TEnum, Proj > make_option_iterable(Proj &&proj={})
Definition enum_helpers.h:123
constexpr std::optional< TEnum > from_index(size_t pos)
Definition enum_helpers.h:48
constexpr size_t to_index(TEnum v)
Definition enum_helpers.h:40
constexpr size_t num_options()
Definition enum_helpers.h:24
constexpr size_t num_flags()
Definition enum_helpers.h:141
Definition enum_helpers.h:33