Go to the documentation of this file.
33 #ifndef NEARGYE_MAGIC_ENUM_CONTAINERS_HPP
34 #define NEARGYE_MAGIC_ENUM_CONTAINERS_HPP
38 #if !defined(MAGIC_ENUM_NO_EXCEPTION) && (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND))
39 #ifndef MAGIC_ENUM_USE_STD_MODULE
42 # define MAGIC_ENUM_THROW(...) throw (__VA_ARGS__)
44 #ifndef MAGIC_ENUM_USE_STD_MODULE
47 # define MAGIC_ENUM_THROW(...) std::abort()
54 template <
typename T,
typename =
void>
58 inline constexpr
bool is_transparent_v<T, std::void_t<typename T::is_transparent>>{
true};
60 template <
typename Eq = std::equal_to<>,
typename T1,
typename T2>
61 constexpr
bool equal(T1&& t1, T2&& t2, Eq&& eq = {}) {
62 auto first1 = t1.begin();
63 auto last1 = t1.end();
64 auto first2 = t2.begin();
65 auto last2 = t2.end();
67 for (; first1 != last1; ++first1, ++first2) {
68 if (first2 == last2 || !eq(*first1, *first2)) {
72 return first2 == last2;
75 template <
typename Cmp = std::less<>,
typename T1,
typename T2>
77 auto first1 = t1.begin();
78 auto last1 = t1.end();
79 auto first2 = t2.begin();
80 auto last2 = t2.end();
83 for (; (first1 != last1) && (first2 != last2); ++first1, (void)++first2) {
84 if (cmp(*first1, *first2)) {
87 if (cmp(*first2, *first1)) {
91 return (first1 == last1) && (first2 != last2);
104 template <
typename Cmp = std::less<>,
typename ForwardIt,
typename E>
105 constexpr ForwardIt
lower_bound(ForwardIt first, ForwardIt last, E&& e, Cmp&& comp = {}) {
106 auto count = std::distance(first, last);
107 for (
auto it = first; count > 0;) {
108 auto step = count / 2;
109 std::advance(it, step);
120 template <
typename Cmp = std::less<>,
typename B
idirIt,
typename E>
121 constexpr
auto equal_range(BidirIt begin, BidirIt end, E&& e, Cmp&& comp = {}) {
122 const auto first =
lower_bound(begin, end, e, comp);
123 return std::pair{first,
lower_bound(std::make_reverse_iterator(end), std::make_reverse_iterator(first), e, [&comp](
auto&& lhs,
auto&& rhs) {
return comp(rhs, lhs); }).base()};
126 template <
typename E =
void,
typename Cmp = std::less<E>,
typename =
void>
130 std::array<std::size_t, enum_count<E>()> rev_res{};
133 for (std::size_t i = 0; i < enum_count<E>(); ++i) {
137 constexpr
auto orig_values = enum_values<E>();
141 for (std::size_t i = 0; i < enum_count<E>(); ++i) {
142 for (std::size_t j = i + 1; j < enum_count<E>(); ++j) {
143 if (cmp(orig_values[rev_res[j]], orig_values[rev_res[i]])) {
144 auto tmp = rev_res[i];
145 rev_res[i] = rev_res[j];
151 std::array<E, enum_count<E>()> sorted_values{};
153 std::array<std::size_t, enum_count<E>()> res{};
154 for (std::size_t i = 0; i < enum_count<E>(); ++i) {
156 sorted_values[i] = orig_values[rev_res[i]];
159 return std::pair{sorted_values, res};
165 [[nodiscard]]
static constexpr
const E*
begin() noexcept {
return indices.first.data(); }
167 [[nodiscard]]
static constexpr
const E*
end() noexcept {
return indices.first.data() +
indices.first.size(); }
169 [[nodiscard]]
static constexpr
const E*
it(std::size_t i) noexcept {
return indices.first.data() + i; }
171 [[nodiscard]]
static constexpr optional<std::size_t>
at(E val) noexcept {
179 template <
typename E,
typename Cmp>
180 class indexing<E, Cmp,
std::
enable_if_t<std::is_enum_v<std::decay_t<E>> && (std::is_same_v<Cmp, std::less<E>> || std::is_same_v<Cmp, std::less<>>)>> {
181 static constexpr
auto&
values = enum_values<E>();
184 [[nodiscard]]
static constexpr
const E*
begin() noexcept {
return values.data(); }
186 [[nodiscard]]
static constexpr
const E*
end() noexcept {
return values.data() +
values.size(); }
188 [[nodiscard]]
static constexpr
const E*
it(std::size_t i) noexcept {
return values.data() + i; }
190 [[nodiscard]]
static constexpr optional<std::size_t>
at(E val) noexcept {
return enum_index(val); }
193 template <
typename Cmp>
197 template <
typename E>
198 [[nodiscard]]
static constexpr optional<std::size_t>
at(E val) noexcept {
203 template <
typename E =
void,
typename Cmp = std::less<>,
typename =
void>
208 template <
typename Cmp>
212 template <
typename C = Cmp,
typename =
void>
213 struct FullCmp : C {};
215 template <
typename C>
216 struct FullCmp<C,
std::
enable_if_t<!std::is_invocable_v<C, string_view, string_view> && std::is_invocable_v<C, char_type, char_type>>> {
217 [[nodiscard]] constexpr
bool operator()(string_view
s1, string_view
s2)
const noexcept {
return lexicographical_compare<C>(
s1,
s2); }
220 template <
typename E1,
typename E2>
223 (std::is_enum_v<std::decay_t<E1>> || std::is_enum_v<std::decay_t<E2>>) &&
227 (std::is_invocable_r_v<bool, FullCmp<>, std::conditional_t<std::is_enum_v<std::decay_t<E1>>, string_view, E1>, std::conditional_t<std::is_enum_v<std::decay_t<E2>>, string_view, E2>>),
229 operator()(E1 e1, E2 e2)
const noexcept {
230 using D1 = std::decay_t<E1>;
231 using D2 = std::decay_t<E2>;
232 constexpr FullCmp<> cmp{};
234 if constexpr (std::is_enum_v<D1> && std::is_enum_v<D2>) {
236 }
else if constexpr (std::is_enum_v<D1>) {
246 template <
typename Parent,
typename Iterator,
typename Getter,
typename Predicate>
256 using value_type = std::remove_reference_t<std::invoke_result_t<Getter, Parent, Iterator>>;
267 template <typename OtherParent, typename OtherIterator, typename =
std::
enable_if_t<
std::is_convertible_v<OtherParent, Parent> &&
std::is_convertible_v<OtherIterator, Iterator>>*>
315 template <
typename E =
void>
318 template <
typename E =
void>
325 template <
typename E =
void>
328 template <
typename Cmp = std::less<>>
334 template <
typename E,
typename V,
typename Index = default_indexing<E>>
336 static_assert(std::is_enum_v<E>);
337 static_assert(std::is_trivially_constructible_v<Index>);
338 static_assert(enum_count<E>() > 0 && Index::at(enum_values<E>().
front()));
348 using pointer =
typename container_type::pointer;
350 using iterator =
typename container_type::iterator;
356 if (
auto index = index_type::at(pos)) {
359 MAGIC_ENUM_THROW(std::out_of_range(
"magic_enum::containers::array::at Unrecognized position"));
363 if (
auto index = index_type::at(pos)) {
366 MAGIC_ENUM_THROW(std::out_of_range(
"magic_enum::containers::array::at: Unrecognized position"));
370 auto i = index_type::at(pos);
375 auto i = index_type::at(pos);
415 [[nodiscard]] constexpr
bool empty() const noexcept {
return a.empty(); }
427 constexpr
void swap(
array& other) noexcept(std::is_nothrow_swappable_v<V>) {
428 for (std::size_t i = 0; i <
a.size(); ++i) {
429 auto v = std::move(other.a[i]);
430 other.a[i] = std::move(
a[i]);
452 template <
typename E,
typename T, std::size_t N, std::size_t... I>
457 template <
typename E,
typename T, std::size_t N, std::size_t... I>
459 return {{std::move(a[I])...}};
464 template <
typename E,
typename T, std::
size_t N>
465 constexpr std::enable_if_t<(enum_count<E>() == N),
array<E, std::remove_cv_t<T>>>
to_array(T (&a)[N]) {
466 return detail::to_array_impl<E>(a, std::make_index_sequence<N>{});
469 template <
typename E,
typename T, std::
size_t N>
470 constexpr std::enable_if_t<(enum_count<E>() == N),
array<E, std::remove_cv_t<T>>>
to_array(T(&&a)[N]) {
471 return detail::to_array_impl<E>(std::move(a), std::make_index_sequence<N>{});
474 template <
typename E,
typename... Ts>
475 constexpr std::enable_if_t<(enum_count<E>() ==
sizeof...(Ts)),
array<E, std::remove_cv_t<std::common_type_t<Ts...>>>>
make_array(Ts&&... ts) {
476 return {{std::forward<Ts>(ts)...}};
484 template <
typename E,
typename Index = default_indexing<E>>
486 static_assert(std::is_enum_v<E>);
487 static_assert(std::is_trivially_constructible_v<Index>);
488 static_assert(enum_count<E>() > 0 && Index::at(enum_values<E>().front()));
490 using base_type = std::conditional_t<enum_count<E>() <= 8, std::uint_least8_t,
491 std::conditional_t<enum_count<E>() <= 16, std::uint_least16_t,
492 std::conditional_t<enum_count<E>() <= 32, std::uint_least32_t,
493 std::uint_least64_t>>>;
500 template <
typename parent_t = bitset*>
526 *
this =
static_cast<bool>(v);
532 [[nodiscard]] constexpr
bool operator~() const noexcept {
return !
static_cast<bool>(*this); }
540 template <
typename T>
544 for (std::size_t i = 0; i <
size(); ++i, flag <<= 1) {
546 if (i >=
sizeof(T) * 8) {
547 MAGIC_ENUM_THROW(std::overflow_error(
"magic_enum::containers::bitset::to: Cannot represent enum in this type"));
564 unsigned long long bit{1};
565 for (std::size_t i = 0; i < (
sizeof(val) * 8); ++i, bit <<= 1) {
566 if ((val & bit) > 0) {
567 if (i >= enum_count<E>()) {
568 MAGIC_ENUM_THROW(std::out_of_range(
"magic_enum::containers::bitset::constructor: Upper bit set in raw number"));
579 for (
auto c : sv.substr(pos,
n)) {
581 if (i >= enum_count<E>()) {
582 MAGIC_ENUM_THROW(std::out_of_range(
"magic_enum::containers::bitset::constructor: Upper bit set in raw string"));
585 }
else if (c != zero) {
586 MAGIC_ENUM_THROW(std::invalid_argument(
"magic_enum::containers::bitset::constructor: Unrecognized character in raw string"));
593 :
bitset(string_view{str, (std::min)(std::char_traits<char_type>::length(str),
n)}, 0,
n, zero,
one) {}
595 constexpr
bitset(std::initializer_list<E> starters) :
a{{}} {
597 for (
auto& f : starters) {
601 for (
auto& f : starters) {
606 template <
typename V, std::enable_if_t<std::is_same_v<V, E> && magic_enum::detail::subtype_v<V> == magic_enum::detail::enum_subtype::flags,
int> = 0>
607 constexpr
explicit bitset(V starter) :
a{{}} {
609 for (E v : enum_values<E>()) {
616 MAGIC_ENUM_THROW(std::invalid_argument(
"magic_enum::containers::bitset::constructor: Unrecognized enum value in flag"));
620 template <
typename Cmp = std::equal_to<>>
623 if (
auto v = enum_cast<E>(sv.substr(0, to), cmp)) {
626 MAGIC_ENUM_THROW(std::invalid_argument(
"magic_enum::containers::bitset::constructor: Unrecognized enum value in string"));
630 if (
auto v = enum_cast<E>(sv, cmp)) {
633 MAGIC_ENUM_THROW(std::invalid_argument(
"magic_enum::containers::bitset::constructor: Unrecognized enum value in string"));
643 auto i = index_type::at(pos);
648 auto i = index_type::at(pos);
652 constexpr
bool test(E pos)
const {
653 if (
auto i = index_type::at(pos)) {
656 MAGIC_ENUM_THROW(std::out_of_range(
"magic_enum::containers::bitset::test: Unrecognized position"));
659 [[nodiscard]] constexpr
bool all() const noexcept {
676 [[nodiscard]] constexpr
bool any() const noexcept {
685 [[nodiscard]] constexpr
bool none() const noexcept {
return !
any(); }
687 [[nodiscard]] constexpr std::size_t
count() const noexcept {
695 [[nodiscard]] constexpr std::size_t
size() const noexcept {
return enum_count<E>(); }
697 [[nodiscard]] constexpr std::size_t
max_size() const noexcept {
return enum_count<E>(); }
744 if (
auto i = index_type::at(pos)) {
748 MAGIC_ENUM_THROW(std::out_of_range(
"magic_enum::containers::bitset::set: Unrecognized position"));
754 if (
auto i = index_type::at(pos)) {
758 MAGIC_ENUM_THROW(std::out_of_range(
"magic_enum::containers::bitset::reset: Unrecognized position"));
781 template <
typename V = E>
784 for (
const auto& e : enum_values<E>()) {
795 for (
const auto& e : enum_values<E>()) {
801 name.append(
n.data(),
n.size());
809 name.reserve(
size());
810 for (std::size_t i = 0; i <
size(); ++i) {
824 if (i >> s; !s.empty()) {
825 bs =
bitset(string_view{s});
834 template <
typename V,
int = 0>
840 template <
typename E,
typename Cmp = std::less<E>>
844 constexpr
const E&
operator()(
const set*,
const E* p)
const noexcept {
return *p; }
847 constexpr
bool operator()(
const set* h,
const E* e)
const noexcept {
return h->a[*e]; }
867 constexpr
set() noexcept = default;
869 template <typename InputIt>
870 constexpr
set(InputIt first, InputIt last) {
871 while (first != last) {
876 constexpr
set(std::initializer_list<E> ilist) {
877 for (
auto e : ilist) {
881 template <
typename V, std::enable_if_t<std::is_same_v<V, E> && magic_enum::detail::subtype_v<V> == magic_enum::detail::enum_subtype::flags,
int> = 0>
882 constexpr
explicit set(V starter) {
884 for (E v : enum_values<E>()) {
891 constexpr
set(
const set&) noexcept =
default;
892 constexpr
set(
set&&) noexcept = default;
894 constexpr
set& operator=(const
set&) noexcept = default;
895 constexpr
set& operator=(
set&&) noexcept = default;
896 constexpr
set& operator=(
std::initializer_list<E> ilist) {
897 for (
auto e : ilist) {
922 [[nodiscard]] constexpr
bool empty() const noexcept {
return s == 0; }
944 return {
end(),
false};
953 template <
typename InputIt>
954 constexpr
void insert(InputIt first, InputIt last) noexcept {
955 while (first != last) {
960 constexpr
void insert(std::initializer_list<value_type> ilist) noexcept {
961 for (
auto v : ilist) {
966 template <
typename... Args>
967 constexpr std::pair<iterator, bool>
emplace(Args&&... args) noexcept {
968 return insert({std::forward<Args>(args)...});
971 template <
typename... Args>
973 return emplace(std::forward<Args>(args)...).first;
982 while ((first =
erase(first)) != last) {
997 template <
typename K,
typename KC = key_compare>
998 constexpr std::enable_if_t<detail::is_transparent_v<KC>,
size_type>
erase(K&& x) noexcept {
1001 c +=
erase(*first++);
1014 template <
typename K,
typename KC = key_compare>
1015 [[nodiscard]] constexpr std::enable_if_t<detail::is_transparent_v<KC>,
size_type>
count(
const K& x)
const {
1030 template <
typename K,
typename KC = key_compare>
1031 [[nodiscard]] constexpr std::enable_if_t<detail::is_transparent_v<KC>,
const_iterator>
find(
const K& x)
const {
1033 if (
a.
test(*first)) {
1034 return find(*first);
1042 template <
typename K,
typename KC = key_compare>
1043 [[nodiscard]] constexpr std::enable_if_t<detail::is_transparent_v<KC>,
bool>
contains(
const K& x)
const noexcept {
1044 return count(x) > 0;
1049 template <
typename K,
typename KC = key_compare>
1050 [[nodiscard]] constexpr std::enable_if_t<detail::is_transparent_v<KC>, std::pair<const_iterator, const_iterator>>
equal_range(
const K& x)
const noexcept {
1057 return a.
test(key) ? it : std::next(it);
1062 template <
typename K,
typename KC = key_compare>
1075 template <
typename K,
typename KC = key_compare>
1085 [[nodiscard]] constexpr
friend bool operator==(
const set& lhs,
const set& rhs) noexcept {
return lhs.a == rhs.a; }
1087 [[nodiscard]] constexpr
friend bool operator!=(
const set& lhs,
const set& rhs) noexcept {
return lhs.a != rhs.a; }
1090 if (lhs.s < rhs.s) {
1093 if (rhs.s < lhs.s) {
1098 if (
auto c = rhs.contains(*it); c != lhs.contains(*it)) {
1105 [[nodiscard]] constexpr
friend bool operator<=(
const set& lhs,
const set& rhs) noexcept {
return !(rhs < lhs); }
1107 [[nodiscard]] constexpr
friend bool operator>(
const set& lhs,
const set& rhs) noexcept {
return rhs < lhs; }
1109 [[nodiscard]] constexpr
friend bool operator>=(
const set& lhs,
const set& rhs) noexcept {
return !(lhs < rhs); }
1111 template <
typename Pred>
1113 auto old_size =
size();
1114 for (
auto i =
begin(), last =
end(); i != last;) {
1121 return old_size -
size();
1129 template <
typename V,
int = 0>
1132 template <auto I,
typename E,
typename V,
typename Index>
1137 template <auto I,
typename E,
typename V,
typename Index>
1139 return std::move(a.a[I]);
1142 template <auto I,
typename E,
typename V,
typename Index>
1147 template <auto I,
typename E,
typename V,
typename Index>
1149 return std::move(a.a[I]);
1152 template <auto Enum,
typename E,
typename V,
typename Index>
1157 template <auto Enum,
typename E,
typename V,
typename Index>
1159 return std::move(a[
Enum]);
1162 template <auto Enum,
typename E,
typename V,
typename Index>
1167 template <auto Enum,
typename E,
typename V,
typename Index>
1169 return std::move(a[
Enum]);
1174 #endif // NEARGYE_MAGIC_ENUM_CONTAINERS_HPP
constexpr reference_impl(parent_t p, std::pair< std::size_t, base_type > i) noexcept
void swap(set &other) noexcept
constexpr void fill(const V &value)
detail::enum_concept< T > Enum
constexpr bitset & set() noexcept
constexpr iterator rend() noexcept
constexpr const_iterator lower_bound(const key_type &key) const noexcept
constexpr const_reverse_iterator crbegin() const noexcept
static constexpr base_type last_value_max
constexpr set(std::initializer_list< E > ilist)
constexpr bool operator~() const noexcept
typename container_type::const_pointer const_pointer
constexpr iterator emplace_hint(const_iterator, Args &&... args) noexcept
constexpr bitset(std::initializer_list< E > starters)
static constexpr optional< std::size_t > at(E val) noexcept
constexpr const_iterator begin() const noexcept
constexpr std::pair< const_iterator, const_iterator > equal_range(const key_type &key) const noexcept
std::bidirectional_iterator_tag iterator_category
constexpr std::enable_if_t< detail::is_transparent_v< KC >, std::pair< const_iterator, const_iterator > > equal_range(const K &x) const noexcept
set(V starter) -> set< V >
constexpr friend bool operator>(const set &lhs, const set &rhs) noexcept
string_view::value_type char_type
std::ptrdiff_t difference_type
constexpr bitset(V starter)
constexpr FilteredIterator() noexcept=default
constexpr ForwardIt lower_bound(ForwardIt first, ForwardIt last, E &&e, Cmp &&comp={})
constexpr std::enable_if_t< detail::is_transparent_v< KC >, const_iterator > find(const K &x) const
constexpr const_iterator crend() const noexcept
constexpr reference back() noexcept
constexpr friend bool operator==(const array &a1, const array &a2)
string to_string(char_type sep=static_cast< char_type >('|')) const
constexpr const_iterator cbegin() const noexcept
constexpr FilteredIterator & operator--()
constexpr std::enable_if_t< detail::is_transparent_v< KC >, const_iterator > upper_bound(const K &x) const noexcept
constexpr bitset & reset(E pos)
typename enable_if_enum< std::is_enum_v< D > &&std::is_invocable_r_v< bool, BinaryPredicate, char_type, char_type >, R >::type enable_if_t
constexpr friend bool operator<(const set &lhs, const set &rhs) noexcept
constexpr const_reference back() const noexcept
typename container_type::const_reverse_iterator const_reverse_iterator
constexpr std::size_t max_size() const noexcept
constexpr size_type count(const key_type &key) const noexcept
static constexpr const E * begin() noexcept
constexpr array< E, std::remove_cv_t< T > > to_array_impl(T(&a)[N], std::index_sequence< I... >)
constexpr bool empty() const noexcept
constexpr friend bool operator>(const array &a1, const array &a2)
constexpr bool operator()(string_view s1, string_view s2) const noexcept
static constexpr auto indices
constexpr bool all() const noexcept
constexpr auto equal_range(BidirIt begin, BidirIt end, E &&e, Cmp &&comp={})
constexpr friend bitset operator&(const bitset &lhs, const bitset &rhs) noexcept
constexpr const_reverse_iterator rbegin() const noexcept
constexpr bool empty() const noexcept
#define MAGIC_ENUM_THROW(...)
constexpr std::size_t popcount(T x) noexcept
constexpr reference operator[](E pos)
constexpr const_iterator cend() const noexcept
constexpr const E & operator()(const set *, const E *p) const noexcept
constexpr friend bool operator<=(const set &lhs, const set &rhs) noexcept
constexpr const_reverse_iterator rend() const noexcept
constexpr FilteredIterator(Parent p, Iterator begin, Iterator end, Iterator curr, Getter get={}, Predicate pred={})
constexpr E value(std::size_t i) noexcept
constexpr bitset(detail::raw_access_t, const char_type *str, std::size_t n=~std::size_t{0}, char_type zero=static_cast< char_type >('0'), char_type one=static_cast< char_type >('1'))
constexpr bool contains(const key_type &key) const noexcept
string to_string(detail::raw_access_t, char_type zero=static_cast< char_type >('0'), char_type one=static_cast< char_type >('1')) const
constexpr bitset(detail::raw_access_t, string_view sv, string_view::size_type pos=0, string_view::size_type n=string_view::npos, char_type zero=static_cast< char_type >('0'), char_type one=static_cast< char_type >('1'))
friend std::ostream & operator<<(std::ostream &o, const bitset &bs)
static constexpr auto get_indices() noexcept
constexpr pointer operator->() const
Generic::PredicateMatcher< T > Predicate(std::function< bool(T const &)> const &predicate, std::string const &description="")
static constexpr const E * it(std::size_t i) noexcept
constexpr iterator begin() noexcept
constexpr detail::raw_access_t raw_access
constexpr std::size_t size() const noexcept
reference_impl< const bitset * > const_reference
constexpr friend bool operator!=(const array &a1, const array &a2)
constexpr reference_impl & operator=(const reference_impl &v) noexcept
static constexpr std::size_t bits_per_base
typename container_type::reference reference
constexpr friend bool operator<=(const array &a1, const array &a2)
constexpr bool operator[](E pos) const
constexpr bool none() const noexcept
constexpr bitset(detail::raw_access_t, unsigned long long val)
constexpr friend bool operator>=(const array &a1, const array &a2)
constexpr std::enable_if_t< detail::is_transparent_v< KC >, size_type > erase(K &&x) noexcept
constexpr size_type size() const noexcept
constexpr std::enable_if_t< detail::is_transparent_v< KC >, size_type > count(const K &x) const
constexpr bool test(E pos) const
constexpr const_pointer data() const noexcept
constexpr friend bool operator!=(const bitset &lhs, const bitset &rhs) noexcept
constexpr const_iterator cbegin() const noexcept
constexpr bitset & reset() noexcept
constexpr size_type erase(const key_type &key) noexcept
constexpr set() noexcept=default
constexpr bool equal(T1 &&t1, T2 &&t2, Eq &&eq={})
const value_type & const_reference
typename container_type::difference_type difference_type
constexpr iterator insert(const_iterator hint, value_type &&value) noexcept
typename container_type::const_iterator const_iterator
std::true_type is_transparent
typename container_type::iterator iterator
constexpr T to_(detail::raw_access_t) const
constexpr auto enum_contains(E value) noexcept -> detail::enable_if_t< E, bool >
constexpr auto values() noexcept
static constexpr optional< std::size_t > at(E val) noexcept
constexpr size_type max_size() const noexcept
constexpr const_iterator cend() const noexcept
constexpr bitset & operator|=(const bitset &other) noexcept
constexpr bitset operator~() const noexcept
constexpr FilteredIterator operator++(int)
reference_impl<> reference
constexpr auto enum_underlying(E value) noexcept -> detail::enable_if_t< E, underlying_type_t< E >>
size_type erase_if(Pred pred)
constexpr void swap(array &other) noexcept(std::is_nothrow_swappable_v< V >)
static constexpr const E * end() noexcept
constexpr bool operator()(E e1, E e2) const noexcept
std::ptrdiff_t difference_type
constexpr bitset & operator^=(const bitset &other) noexcept
constexpr unsigned long long to_ulong(detail::raw_access_t raw) const
constexpr auto enum_index(E value) noexcept -> detail::enable_if_t< E, optional< std::size_t >>
constexpr const_iterator upper_bound(const key_type &key) const noexcept
constexpr const_reference operator[](E pos) const
constexpr friend bool operator==(const bitset &lhs, const bitset &rhs) noexcept
constexpr friend bitset operator|(const bitset &lhs, const bitset &rhs) noexcept
constexpr std::enable_if_t< detail::is_transparent_v< KC >, bool > contains(const K &x) const noexcept
std::conditional_t< enum_count< E >()<=8, std::uint_least8_t, std::conditional_t< enum_count< E >()<=16, std::uint_least16_t, std::conditional_t< enum_count< E >()<=32, std::uint_least32_t, std::uint_least64_t > >> base_type
constexpr friend bool operator==(const set &lhs, const set &rhs) noexcept
static constexpr std::size_t base_type_count
#define MAGIC_ENUM_ASSERT(...)
constexpr bool operator()(const set *h, const E *e) const noexcept
constexpr bitset(string_view sv, Cmp &&cmp={}, char_type sep=static_cast< char_type >('|'))
constexpr const_iterator rend() const noexcept
constexpr friend bitset operator^(const bitset &lhs, const bitset &rhs) noexcept
constexpr auto n() noexcept
constexpr std::pair< iterator, bool > emplace(Args &&... args) noexcept
constexpr iterator rbegin() noexcept
constexpr const_reverse_iterator crend() const noexcept
constexpr bitset & operator&=(const bitset &other) noexcept
constexpr std::enable_if_t<(enum_count< E >)==sizeof...(Ts)), array< E, std::remove_cv_t< std::common_type_t< Ts... > > > > make_array(Ts &&... ts)
constexpr void clear() noexcept
constexpr reference_impl & flip() noexcept
constexpr friend bool operator!=(const FilteredIterator &lhs, const FilteredIterator &rhs)
constexpr reference operator*() const
constexpr std::size_t count() const noexcept
typename container_type::value_type value_type
constexpr bitset & flip() noexcept
typename container_type::reverse_iterator reverse_iterator
constexpr reference operator[](E pos)
constexpr key_compare key_comp() const
constexpr std::pair< iterator, bool > insert(const value_type &value) noexcept
std::true_type is_transparent
constexpr friend bool operator>=(const set &lhs, const set &rhs) noexcept
static constexpr const E * end() noexcept
constexpr std::pair< iterator, bool > insert(value_type &&value) noexcept
std::array< base_type, base_type_count > container_type
constexpr friend bool operator==(const FilteredIterator &lhs, const FilteredIterator &rhs)
std::reverse_iterator< const_iterator > const_reverse_iterator
bitset(V starter) -> bitset< V >
constexpr value_compare value_comp() const
constexpr auto enum_name() noexcept -> detail::enable_if_t< decltype(V), string_view >
constexpr reference_impl(parent_t p, std::size_t i) noexcept
constexpr const_iterator begin() const noexcept
constexpr iterator insert(const_iterator, const value_type &value) noexcept
constexpr reference front() noexcept
static constexpr const E * begin() noexcept
constexpr std::enable_if_t<(enum_count< E >)==N), array< E, std::remove_cv_t< T > > > to_array(T(&a)[N])
constexpr std::size_t find(string_view str, char_type c) noexcept
constexpr FilteredIterator operator--(int)
constexpr const_iterator end() const noexcept
constexpr const_iterator crbegin() const noexcept
constexpr void insert(InputIt first, InputIt last) noexcept
constexpr iterator end() noexcept
constexpr std::enable_if_t<(std::is_integral_v< decltype(I)> &&I< enum_count< E >)), V & > get(array< E, V, Index > &a) noexcept
constexpr pointer data() noexcept
std::array< V, enum_count< E >()> container_type
static constexpr std::size_t not_interested
constexpr size_type size() const noexcept
constexpr iterator erase(const_iterator first, const_iterator last) noexcept
constexpr friend bool operator!=(const set &lhs, const set &rhs) noexcept
constexpr bitset(detail::raw_access_t=raw_access) noexcept
constexpr const_iterator rbegin() const noexcept
constexpr const_reference front() const noexcept
constexpr void insert(std::initializer_list< value_type > ilist) noexcept
constexpr bool is_transparent_v
typename container_type::const_reference const_reference
constexpr reference_impl & operator=(bool v) noexcept
static constexpr optional< std::size_t > at(E val) noexcept
constexpr const_reference at(E pos) const
constexpr const_iterator find(const key_type &key) const noexcept
constexpr friend bool operator<(const array &a1, const array &a2)
typename container_type::pointer pointer
constexpr reference at(E pos)
static constexpr const E * it(std::size_t i) noexcept
constexpr unsigned long long to_ullong(detail::raw_access_t raw) const
constexpr bool lexicographical_compare(T1 &&t1, T2 &&t2, Cmp &&cmp={}) noexcept
constexpr size_type max_size() const noexcept
constexpr FilteredIterator & operator++()
constexpr std::enable_if_t< detail::is_transparent_v< KC >, const_iterator > lower_bound(const K &x) const noexcept
std::reverse_iterator< iterator > reverse_iterator
constexpr const_iterator end() const noexcept
constexpr bitset & set(E pos, bool value=true)
friend std::istream & operator>>(std::istream &i, bitset &bs)
constexpr bool any() const noexcept
constexpr iterator erase(const_iterator pos) noexcept
typename container_type::size_type size_type
std::remove_reference_t< std::invoke_result_t< Getter, Parent, Iterator > > value_type
const value_type * const_pointer
magic_enum
Author(s):
autogenerated on Fri Feb 21 2025 03:20:19