Coverage Report

Created: 2023-09-25 06:29

/src/magic_enum/include/magic_enum.hpp
Line
Count
Source (jump to first uncovered line)
1
//  __  __             _        ______                          _____
2
// |  \/  |           (_)      |  ____|                        / ____|_     _
3
// | \  / | __ _  __ _ _  ___  | |__   _ __  _   _ _ __ ___   | |   _| |_ _| |_
4
// | |\/| |/ _` |/ _` | |/ __| |  __| | '_ \| | | | '_ ` _ \  | |  |_   _|_   _|
5
// | |  | | (_| | (_| | | (__  | |____| | | | |_| | | | | | | | |____|_|   |_|
6
// |_|  |_|\__,_|\__, |_|\___| |______|_| |_|\__,_|_| |_| |_|  \_____|
7
//                __/ | https://github.com/Neargye/magic_enum
8
//               |___/  version 0.9.3
9
//
10
// Licensed under the MIT License <http://opensource.org/licenses/MIT>.
11
// SPDX-License-Identifier: MIT
12
// Copyright (c) 2019 - 2023 Daniil Goncharov <neargye@gmail.com>.
13
//
14
// Permission is hereby  granted, free of charge, to any  person obtaining a copy
15
// of this software and associated  documentation files (the "Software"), to deal
16
// in the Software  without restriction, including without  limitation the rights
17
// to  use, copy,  modify, merge,  publish, distribute,  sublicense, and/or  sell
18
// copies  of  the Software,  and  to  permit persons  to  whom  the Software  is
19
// furnished to do so, subject to the following conditions:
20
//
21
// The above copyright notice and this permission notice shall be included in all
22
// copies or substantial portions of the Software.
23
//
24
// THE SOFTWARE  IS PROVIDED "AS  IS", WITHOUT WARRANTY  OF ANY KIND,  EXPRESS OR
25
// IMPLIED,  INCLUDING BUT  NOT  LIMITED TO  THE  WARRANTIES OF  MERCHANTABILITY,
26
// FITNESS FOR  A PARTICULAR PURPOSE AND  NONINFRINGEMENT. IN NO EVENT  SHALL THE
27
// AUTHORS  OR COPYRIGHT  HOLDERS  BE  LIABLE FOR  ANY  CLAIM,  DAMAGES OR  OTHER
28
// LIABILITY, WHETHER IN AN ACTION OF  CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29
// OUT OF OR IN CONNECTION WITH THE SOFTWARE  OR THE USE OR OTHER DEALINGS IN THE
30
// SOFTWARE.
31
32
#ifndef NEARGYE_MAGIC_ENUM_HPP
33
#define NEARGYE_MAGIC_ENUM_HPP
34
35
#define MAGIC_ENUM_VERSION_MAJOR 0
36
#define MAGIC_ENUM_VERSION_MINOR 9
37
#define MAGIC_ENUM_VERSION_PATCH 3
38
39
#include <array>
40
#include <cstddef>
41
#include <cstdint>
42
#include <functional>
43
#include <limits>
44
#include <type_traits>
45
#include <utility>
46
47
#if defined(MAGIC_ENUM_CONFIG_FILE)
48
#  include MAGIC_ENUM_CONFIG_FILE
49
#endif
50
51
#if !defined(MAGIC_ENUM_USING_ALIAS_OPTIONAL)
52
#  include <optional>
53
#endif
54
#if !defined(MAGIC_ENUM_USING_ALIAS_STRING)
55
#  include <string>
56
#endif
57
#if !defined(MAGIC_ENUM_USING_ALIAS_STRING_VIEW)
58
#  include <string_view>
59
#endif
60
61
#if defined(MAGIC_ENUM_NO_ASSERT)
62
#  define MAGIC_ENUM_ASSERT(...) static_cast<void>(0)
63
#else
64
#  include <cassert>
65
21.0k
#  define MAGIC_ENUM_ASSERT(...) assert((__VA_ARGS__))
66
#endif
67
68
#if defined(__clang__)
69
#  pragma clang diagnostic push
70
#  pragma clang diagnostic ignored "-Wunknown-warning-option"
71
#  pragma clang diagnostic ignored "-Wenum-constexpr-conversion"
72
#elif defined(__GNUC__)
73
#  pragma GCC diagnostic push
74
#  pragma GCC diagnostic ignored "-Wmaybe-uninitialized" // May be used uninitialized 'return {};'.
75
#elif defined(_MSC_VER)
76
#  pragma warning(push)
77
#  pragma warning(disable : 26495) // Variable 'static_str<N>::chars_' is uninitialized.
78
#  pragma warning(disable : 28020) // Arithmetic overflow: Using operator '-' on a 4 byte value and then casting the result to a 8 byte value.
79
#  pragma warning(disable : 26451) // The expression '0<=_Param_(1)&&_Param_(1)<=1-1' is not true at this call.
80
#  pragma warning(disable : 4514) // Unreferenced inline function has been removed.
81
#endif
82
83
// Checks magic_enum compiler compatibility.
84
#if defined(__clang__) && __clang_major__ >= 5 || defined(__GNUC__) && __GNUC__ >= 9 || defined(_MSC_VER) && _MSC_VER >= 1910 || defined(__RESHARPER__)
85
#  undef  MAGIC_ENUM_SUPPORTED
86
#  define MAGIC_ENUM_SUPPORTED 1
87
#endif
88
89
// Checks magic_enum compiler aliases compatibility.
90
#if defined(__clang__) && __clang_major__ >= 5 || defined(__GNUC__) && __GNUC__ >= 9 || defined(_MSC_VER) && _MSC_VER >= 1920
91
#  undef  MAGIC_ENUM_SUPPORTED_ALIASES
92
#  define MAGIC_ENUM_SUPPORTED_ALIASES 1
93
#endif
94
95
// Enum value must be greater or equals than MAGIC_ENUM_RANGE_MIN. By default MAGIC_ENUM_RANGE_MIN = -128.
96
// If need another min range for all enum types by default, redefine the macro MAGIC_ENUM_RANGE_MIN.
97
#if !defined(MAGIC_ENUM_RANGE_MIN)
98
#  define MAGIC_ENUM_RANGE_MIN -128
99
#endif
100
101
// Enum value must be less or equals than MAGIC_ENUM_RANGE_MAX. By default MAGIC_ENUM_RANGE_MAX = 128.
102
// If need another max range for all enum types by default, redefine the macro MAGIC_ENUM_RANGE_MAX.
103
#if !defined(MAGIC_ENUM_RANGE_MAX)
104
#  define MAGIC_ENUM_RANGE_MAX 127
105
#endif
106
107
// Improve ReSharper C++ intellisense performance with builtins, avoiding unnecessary template instantiations.
108
#if defined(__RESHARPER__)
109
#  undef MAGIC_ENUM_GET_ENUM_NAME_BUILTIN
110
#  undef MAGIC_ENUM_GET_TYPE_NAME_BUILTIN
111
#  if __RESHARPER__ >= 20230100
112
#    define MAGIC_ENUM_GET_ENUM_NAME_BUILTIN(V) __rscpp_enumerator_name(V)
113
#    define MAGIC_ENUM_GET_TYPE_NAME_BUILTIN(T) __rscpp_type_name<T>()
114
#  else
115
#    define MAGIC_ENUM_GET_ENUM_NAME_BUILTIN(V) nullptr
116
#    define MAGIC_ENUM_GET_TYPE_NAME_BUILTIN(T) nullptr
117
#  endif
118
#endif
119
120
namespace magic_enum {
121
122
// If need another optional type, define the macro MAGIC_ENUM_USING_ALIAS_OPTIONAL.
123
#if defined(MAGIC_ENUM_USING_ALIAS_OPTIONAL)
124
MAGIC_ENUM_USING_ALIAS_OPTIONAL
125
#else
126
using std::optional;
127
#endif
128
129
// If need another string_view type, define the macro MAGIC_ENUM_USING_ALIAS_STRING_VIEW.
130
#if defined(MAGIC_ENUM_USING_ALIAS_STRING_VIEW)
131
MAGIC_ENUM_USING_ALIAS_STRING_VIEW
132
#else
133
using std::string_view;
134
#endif
135
136
// If need another string type, define the macro MAGIC_ENUM_USING_ALIAS_STRING.
137
#if defined(MAGIC_ENUM_USING_ALIAS_STRING)
138
MAGIC_ENUM_USING_ALIAS_STRING
139
#else
140
using std::string;
141
#endif
142
143
using char_type = string_view::value_type;
144
static_assert(std::is_same_v<string_view::value_type, string::value_type>, "magic_enum::customize requires same string_view::value_type and string::value_type");
145
static_assert([] {
146
  if constexpr (std::is_same_v<char_type, wchar_t>) {
147
    constexpr const char     c[] =  "abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789|";
148
    constexpr const wchar_t wc[] = L"abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789|";
149
    static_assert(std::size(c) == std::size(wc), "magic_enum::customize identifier characters are multichars in wchar_t.");
150
151
    for (std::size_t i = 0; i < std::size(c); ++i) {
152
      if (c[i] != wc[i]) {
153
        return false;
154
      }
155
    }
156
  }
157
  return true;
158
} (), "magic_enum::customize wchar_t is not compatible with ASCII.");
159
160
namespace customize {
161
162
// Enum value must be in range [MAGIC_ENUM_RANGE_MIN, MAGIC_ENUM_RANGE_MAX]. By default MAGIC_ENUM_RANGE_MIN = -128, MAGIC_ENUM_RANGE_MAX = 128.
163
// If need another range for all enum types by default, redefine the macro MAGIC_ENUM_RANGE_MIN and MAGIC_ENUM_RANGE_MAX.
164
// If need another range for specific enum type, add specialization enum_range for necessary enum type.
165
template <typename E>
166
struct enum_range {
167
  static_assert(std::is_enum_v<E>, "magic_enum::customize::enum_range requires enum type.");
168
  static constexpr int min = MAGIC_ENUM_RANGE_MIN;
169
  static constexpr int max = MAGIC_ENUM_RANGE_MAX;
170
  static_assert(max > min, "magic_enum::customize::enum_range requires max > min.");
171
};
172
173
static_assert(MAGIC_ENUM_RANGE_MAX > MAGIC_ENUM_RANGE_MIN, "MAGIC_ENUM_RANGE_MAX must be greater than MAGIC_ENUM_RANGE_MIN.");
174
static_assert((MAGIC_ENUM_RANGE_MAX - MAGIC_ENUM_RANGE_MIN) < (std::numeric_limits<std::uint16_t>::max)(), "MAGIC_ENUM_RANGE must be less than UINT16_MAX.");
175
176
namespace detail {
177
178
enum class customize_tag {
179
  default_tag,
180
  invalid_tag,
181
  custom_tag
182
};
183
184
} // namespace magic_enum::customize::detail
185
186
class customize_t : public std::pair<detail::customize_tag, string_view> {
187
 public:
188
0
  constexpr customize_t(string_view srt) : std::pair<detail::customize_tag, string_view>{detail::customize_tag::custom_tag, srt} {}
189
0
  constexpr customize_t(const char_type* srt) : customize_t{string_view{srt}} {}
190
0
  constexpr customize_t(detail::customize_tag tag) : std::pair<detail::customize_tag, string_view>{tag, string_view{}} {
191
0
    MAGIC_ENUM_ASSERT(tag != detail::customize_tag::custom_tag);
192
0
  }
193
};
194
195
// Default customize.
196
inline constexpr auto default_tag = customize_t{detail::customize_tag::default_tag};
197
// Invalid customize.
198
inline constexpr auto invalid_tag = customize_t{detail::customize_tag::invalid_tag};
199
200
// If need custom names for enum, add specialization enum_name for necessary enum type.
201
template <typename E>
202
0
constexpr customize_t enum_name(E) noexcept {
203
0
  return default_tag;
204
0
}
205
206
// If need custom type name for enum, add specialization enum_type_name for necessary enum type.
207
template <typename E>
208
constexpr customize_t enum_type_name() noexcept {
209
  return default_tag;
210
}
211
212
} // namespace magic_enum::customize
213
214
namespace detail {
215
216
template <typename T>
217
struct supported
218
#if defined(MAGIC_ENUM_SUPPORTED) && MAGIC_ENUM_SUPPORTED || defined(MAGIC_ENUM_NO_CHECK_SUPPORT)
219
    : std::true_type {};
220
#else
221
    : std::false_type {};
222
#endif
223
224
template <auto V, typename E = std::decay_t<decltype(V)>, std::enable_if_t<std::is_enum_v<E>, int> = 0>
225
using enum_constant = std::integral_constant<E, V>;
226
227
template <typename... T>
228
inline constexpr bool always_false_v = false;
229
230
template <typename T, typename = void>
231
struct has_is_flags : std::false_type {};
232
233
template <typename T>
234
struct has_is_flags<T, std::void_t<decltype(customize::enum_range<T>::is_flags)>> : std::bool_constant<std::is_same_v<bool, std::decay_t<decltype(customize::enum_range<T>::is_flags)>>> {};
235
236
template <typename T, typename = void>
237
struct range_min : std::integral_constant<int, MAGIC_ENUM_RANGE_MIN> {};
238
239
template <typename T>
240
struct range_min<T, std::void_t<decltype(customize::enum_range<T>::min)>> : std::integral_constant<decltype(customize::enum_range<T>::min), customize::enum_range<T>::min> {};
241
242
template <typename T, typename = void>
243
struct range_max : std::integral_constant<int, MAGIC_ENUM_RANGE_MAX> {};
244
245
template <typename T>
246
struct range_max<T, std::void_t<decltype(customize::enum_range<T>::max)>> : std::integral_constant<decltype(customize::enum_range<T>::max), customize::enum_range<T>::max> {};
247
248
struct str_view {
249
  const char* str_ = nullptr;
250
  std::size_t size_ = 0;
251
};
252
253
template <std::uint16_t N>
254
class static_str {
255
 public:
256
  constexpr explicit static_str(str_view str) noexcept : static_str{str.str_, std::make_integer_sequence<std::uint16_t, N>{}} {
257
    MAGIC_ENUM_ASSERT(str.size_ == N);
258
  }
259
260
  constexpr explicit static_str(string_view str) noexcept : static_str{str.data(), std::make_integer_sequence<std::uint16_t, N>{}} {
261
    MAGIC_ENUM_ASSERT(str.size() == N);
262
  }
263
264
0
  constexpr const char_type* data() const noexcept { return chars_; }
265
266
0
  constexpr std::uint16_t size() const noexcept { return N; }
267
268
0
  constexpr operator string_view() const noexcept { return {data(), size()}; }
269
270
 private:
271
  template <std::uint16_t... I>
272
  constexpr static_str(const char* str, std::integer_sequence<std::uint16_t, I...>) noexcept : chars_{static_cast<char_type>(str[I])..., static_cast<char_type>('\0')} {}
273
274
  template <std::uint16_t... I>
275
  constexpr static_str(string_view str, std::integer_sequence<std::uint16_t, I...>) noexcept : chars_{str[I]..., static_cast<char_type>('\0')} {}
276
277
  char_type chars_[static_cast<std::size_t>(N) + 1];
278
};
279
280
template <>
281
class static_str<0> {
282
 public:
283
  constexpr explicit static_str() = default;
284
285
0
  constexpr explicit static_str(str_view) noexcept {}
286
287
0
  constexpr explicit static_str(string_view) noexcept {}
288
289
0
  constexpr const char_type* data() const noexcept { return nullptr; }
290
291
0
  constexpr std::uint16_t size() const noexcept { return 0; }
292
293
0
  constexpr operator string_view() const noexcept { return {}; }
294
};
295
296
template <typename Op = std::equal_to<>>
297
class case_insensitive {
298
  static constexpr char_type to_lower(char_type c) noexcept {
299
    return (c >= static_cast<char_type>('A') && c <= static_cast<char_type>('Z')) ? static_cast<char_type>(c + (static_cast<char_type>('a') - static_cast<char_type>('A'))) : c;
300
  }
301
302
 public:
303
  template <typename L, typename R>
304
  constexpr auto operator()(L lhs, R rhs) const noexcept -> std::enable_if_t<std::is_same_v<std::decay_t<L>, char_type> && std::is_same_v<std::decay_t<R>, char_type>, bool> {
305
    return Op{}(to_lower(lhs), to_lower(rhs));
306
  }
307
};
308
309
0
constexpr std::size_t find(string_view str, char_type c) noexcept {
310
0
#if defined(__clang__) && __clang_major__ < 9 && defined(__GLIBCXX__) || defined(_MSC_VER) && _MSC_VER < 1920 && !defined(__clang__)
311
0
// https://stackoverflow.com/questions/56484834/constexpr-stdstring-viewfind-last-of-doesnt-work-on-clang-8-with-libstdc
312
0
// https://developercommunity.visualstudio.com/content/problem/360432/vs20178-regression-c-failed-in-test.html
313
0
  constexpr bool workaround = true;
314
0
#else
315
0
  constexpr bool workaround = false;
316
0
#endif
317
0
318
0
  if constexpr (workaround) {
319
0
    for (std::size_t i = 0; i < str.size(); ++i) {
320
0
      if (str[i] == c) {
321
0
        return i;
322
0
      }
323
0
    }
324
0
325
0
    return string_view::npos;
326
0
  } else {
327
0
    return str.find(c);
328
0
  }
329
0
}
330
331
template <typename BinaryPredicate>
332
0
constexpr bool is_default_predicate() noexcept {
333
0
  return std::is_same_v<std::decay_t<BinaryPredicate>, std::equal_to<string_view::value_type>> ||
334
0
         std::is_same_v<std::decay_t<BinaryPredicate>, std::equal_to<>>;
335
0
}
Unexecuted instantiation: bool magic_enum::detail::is_default_predicate<std::__1::equal_to<void> >()
Unexecuted instantiation: bool magic_enum::detail::is_default_predicate<std::__1::equal_to<void>&>()
336
337
template <typename BinaryPredicate>
338
0
constexpr bool is_nothrow_invocable() {
339
0
  return is_default_predicate<BinaryPredicate>() ||
340
0
         std::is_nothrow_invocable_r_v<bool, BinaryPredicate, char_type, char_type>;
341
0
}
Unexecuted instantiation: bool magic_enum::detail::is_nothrow_invocable<std::__1::equal_to<void> >()
Unexecuted instantiation: bool magic_enum::detail::is_nothrow_invocable<std::__1::equal_to<void>&>()
342
343
template <typename BinaryPredicate>
344
10.6k
constexpr bool cmp_equal(string_view lhs, string_view rhs, [[maybe_unused]] BinaryPredicate&& p) noexcept(is_nothrow_invocable<BinaryPredicate>()) {
345
#if defined(_MSC_VER) && _MSC_VER < 1920 && !defined(__clang__)
346
  // https://developercommunity.visualstudio.com/content/problem/360432/vs20178-regression-c-failed-in-test.html
347
  // https://developercommunity.visualstudio.com/content/problem/232218/c-constexpr-string-view.html
348
  constexpr bool workaround = true;
349
#else
350
10.6k
  constexpr bool workaround = false;
351
10.6k
#endif
352
353
10.6k
  if constexpr (!is_default_predicate<BinaryPredicate>() || workaround) {
354
10.6k
    if (lhs.size() != rhs.size()) {
355
10.6k
      return false;
356
10.6k
    }
357
358
10.6k
    const auto size = lhs.size();
359
10.6k
    for (std::size_t i = 0; i < size; ++i) {
360
10.6k
      if (!p(lhs[i], rhs[i])) {
361
10.6k
        return false;
362
10.6k
      }
363
10.6k
    }
364
365
10.6k
    return true;
366
10.6k
  } else {
367
10.6k
    return lhs == rhs;
368
10.6k
  }
369
10.6k
}
370
371
template <typename L, typename R>
372
0
constexpr bool cmp_less(L lhs, R rhs) noexcept {
373
0
  static_assert(std::is_integral_v<L> && std::is_integral_v<R>, "magic_enum::detail::cmp_less requires integral type.");
374
0
375
0
  if constexpr (std::is_signed_v<L> == std::is_signed_v<R>) {
376
0
    // If same signedness (both signed or both unsigned).
377
0
    return lhs < rhs;
378
0
  } else if constexpr (std::is_same_v<L, bool>) { // bool special case
379
0
      return static_cast<R>(lhs) < rhs;
380
0
  } else if constexpr (std::is_same_v<R, bool>) { // bool special case
381
0
      return lhs < static_cast<L>(rhs);
382
0
  } else if constexpr (std::is_signed_v<R>) {
383
0
    // If 'right' is negative, then result is 'false', otherwise cast & compare.
384
0
    return rhs > 0 && lhs < static_cast<std::make_unsigned_t<R>>(rhs);
385
0
  } else {
386
0
    // If 'left' is negative, then result is 'true', otherwise cast & compare.
387
0
    return lhs < 0 || static_cast<std::make_unsigned_t<L>>(lhs) < rhs;
388
0
  }
389
0
}
390
391
template <typename I>
392
0
constexpr I log2(I value) noexcept {
393
0
  static_assert(std::is_integral_v<I>, "magic_enum::detail::log2 requires integral type.");
394
0
395
0
  if constexpr (std::is_same_v<I, bool>) { // bool special case
396
0
    return MAGIC_ENUM_ASSERT(false), value;
397
0
  } else {
398
0
    auto ret = I{0};
399
0
    for (; value > I{1}; value >>= I{1}, ++ret) {}
400
0
401
0
    return ret;
402
0
  }
403
0
}
404
405
#if defined(__cpp_lib_array_constexpr) && __cpp_lib_array_constexpr >= 201603L
406
#  define MAGIC_ENUM_ARRAY_CONSTEXPR 1
407
#else
408
template <typename T, std::size_t N, std::size_t... I>
409
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N], std::index_sequence<I...>) noexcept {
410
  return {{a[I]...}};
411
}
412
#endif
413
414
template <typename T>
415
inline constexpr bool is_enum_v = std::is_enum_v<T> && std::is_same_v<T, std::decay_t<T>>;
416
417
template <typename E>
418
constexpr auto n() noexcept {
419
  static_assert(is_enum_v<E>, "magic_enum::detail::n requires enum type.");
420
421
  if constexpr (supported<E>::value) {
422
#if defined(MAGIC_ENUM_GET_TYPE_NAME_BUILTIN)
423
    constexpr auto name_ptr = MAGIC_ENUM_GET_TYPE_NAME_BUILTIN(E);
424
    constexpr auto name = name_ptr ? str_view{name_ptr, std::char_traits<char>::length(name_ptr)} : str_view{};
425
#elif defined(__clang__)
426
    auto name = str_view{__PRETTY_FUNCTION__ + 34, sizeof(__PRETTY_FUNCTION__) - 36};
427
#elif defined(__GNUC__)
428
    auto name = str_view{__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1};
429
    if (name.str_[name.size_ - 1] == ']') {
430
      name.size_ -= 50;
431
      name.str_ += 49;
432
    } else {
433
      name.size_ -= 40;
434
      name.str_ += 37;
435
    }
436
#elif defined(_MSC_VER)
437
    // CLI/C++ workaround (see https://github.com/Neargye/magic_enum/issues/284).
438
    str_view name;
439
    name.str_ = __FUNCSIG__;
440
    name.str_ += 40;
441
    name.size_ += sizeof(__FUNCSIG__) - 57;
442
#else
443
    auto name = str_view{};
444
#endif
445
    std::size_t p = 0;
446
    for (std::size_t i = name.size_; i > 0; --i) {
447
      if (name.str_[i] == ':') {
448
        p = i + 1;
449
        break;
450
      }
451
    }
452
    if (p > 0) {
453
      name.size_ -= p;
454
      name.str_ += p;
455
    }
456
    return name;
457
  } else {
458
    return str_view{}; // Unsupported compiler or Invalid customize.
459
  }
460
}
461
462
template <typename E>
463
constexpr auto type_name() noexcept {
464
  [[maybe_unused]] constexpr auto custom = customize::enum_type_name<E>();
465
  static_assert(std::is_same_v<std::decay_t<decltype(custom)>, customize::customize_t>, "magic_enum::customize requires customize_t type.");
466
  if constexpr (custom.first == customize::detail::customize_tag::custom_tag) {
467
    constexpr auto name = custom.second;
468
    static_assert(!name.empty(), "magic_enum::customize requires not empty string.");
469
    return static_str<name.size()>{name};
470
  } else if constexpr (custom.first == customize::detail::customize_tag::invalid_tag) {
471
    return static_str<0>{};
472
  } else if constexpr (custom.first == customize::detail::customize_tag::default_tag) {
473
    constexpr auto name = n<E>();
474
    return static_str<name.size_>{name};
475
  } else {
476
    static_assert(always_false_v<E>, "magic_enum::customize invalid.");
477
  }
478
}
479
480
template <typename E>
481
inline constexpr auto type_name_v = type_name<E>();
482
483
template <auto V>
484
0
constexpr auto n() noexcept {
485
0
  static_assert(is_enum_v<decltype(V)>, "magic_enum::detail::n requires enum type.");
486
0
487
0
  if constexpr (supported<decltype(V)>::value) {
488
0
#if defined(MAGIC_ENUM_GET_ENUM_NAME_BUILTIN)
489
0
    constexpr auto name_ptr = MAGIC_ENUM_GET_ENUM_NAME_BUILTIN(V);
490
0
    auto name = name_ptr ? str_view{name_ptr, std::char_traits<char>::length(name_ptr)} : str_view{};
491
0
#elif defined(__clang__)
492
0
    auto name = str_view{__PRETTY_FUNCTION__ + 34, sizeof(__PRETTY_FUNCTION__) - 36};
493
0
    if (name.size_ > 22 && name.str_[0] == '(' && name.str_[1] == 'a' && name.str_[10] == ' ' && name.str_[22] == ':') {
494
0
      name.size_ -= 23;
495
0
      name.str_ += 23;
496
0
    }
497
0
    if (name.str_[0] == '(' || name.str_[0] == '-' || (name.str_[0] >= '0' && name.str_[0] <= '9')) {
498
0
      name = str_view{};
499
0
    }
500
0
#elif defined(__GNUC__)
501
0
    auto name = str_view{__PRETTY_FUNCTION__, sizeof(__PRETTY_FUNCTION__) - 1};
502
0
    if (name.str_[name.size_ - 1] == ']') {
503
0
      name.size_ -= 55;
504
0
      name.str_ += 54;
505
0
    } else {
506
0
      name.size_ -= 40;
507
0
      name.str_ += 37;
508
0
    }
509
0
    if (name.str_[0] == '(') {
510
0
      name = str_view{};
511
0
    }
512
0
#elif defined(_MSC_VER)
513
0
    str_view name;
514
0
    if ((__FUNCSIG__[5] == '_' && __FUNCSIG__[35] != '(') || (__FUNCSIG__[5] == 'c' && __FUNCSIG__[41] != '(')) {
515
0
      // CLI/C++ workaround (see https://github.com/Neargye/magic_enum/issues/284).
516
0
      name.str_ = __FUNCSIG__;
517
0
      name.str_ += 35;
518
0
      name.size_ = sizeof(__FUNCSIG__) - 52;
519
0
    }
520
0
#else
521
0
    auto name = str_view{};
522
0
#endif
523
0
    std::size_t p = 0;
524
0
    for (std::size_t i = name.size_; i > 0; --i) {
525
0
      if (name.str_[i] == ':') {
526
0
        p = i + 1;
527
0
        break;
528
0
      }
529
0
    }
530
0
    if (p > 0) {
531
0
      name.size_ -= p;
532
0
      name.str_ += p;
533
0
    }
534
0
    return name;
535
0
  } else {
536
0
    return str_view{}; // Unsupported compiler or Invalid customize.
537
0
  }
538
0
}
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn128EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn127EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn126EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn125EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn124EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn123EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn122EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn121EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn120EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn119EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn118EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn117EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn116EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn115EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn114EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn113EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn112EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn111EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn110EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn109EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn108EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn107EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn106EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn105EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn104EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn103EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn102EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn101EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn100EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn99EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn98EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn97EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn96EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn95EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn94EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn93EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn92EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn91EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn90EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn89EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn88EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn87EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn86EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn85EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn84EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn83EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn82EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn81EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn80EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn79EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn78EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn77EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn76EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn75EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn74EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn73EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn72EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn71EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn70EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn69EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn68EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn67EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn66EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn65EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn64EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn63EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn62EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn61EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn60EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn59EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn58EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn57EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn56EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn55EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn54EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn53EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn52EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn51EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn50EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn49EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn48EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn47EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn46EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn45EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn44EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn43EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn42EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn41EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn40EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn39EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn38EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn37EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn36EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn35EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn34EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn33EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn32EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn31EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn30EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn29EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn28EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn27EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn26EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn25EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn24EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn23EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn22EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn21EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn20EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn19EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn18EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn17EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn16EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn15EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn14EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn13EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn12EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn11EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn10EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn9EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn8EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn7EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn6EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn5EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn4EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn3EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnumn2EEEDav
Unexecuted instantiation: auto magic_enum::detail::n<LLVMFuzzerTestOneInput, FuzzEnum, __int128, E>()
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum0EEEDav
Unexecuted instantiation: auto magic_enum::detail::n<LLVMFuzzerTestOneInput, FuzzEnum, E>()
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum2EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum3EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum4EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum5EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum6EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum7EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum8EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum9EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum10EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum11EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum12EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum13EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum14EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum15EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum16EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum17EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum18EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum19EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum20EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum21EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum22EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum23EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum24EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum25EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum26EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum27EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum28EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum29EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum30EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum31EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum32EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum33EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum34EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum35EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum36EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum37EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum38EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum39EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum40EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum41EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum42EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum43EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum44EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum45EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum46EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum47EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum48EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum49EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum50EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum51EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum52EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum53EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum54EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum55EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum56EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum57EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum58EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum59EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum60EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum61EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum62EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum63EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum64EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum65EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum66EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum67EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum68EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum69EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum70EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum71EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum72EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum73EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum74EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum75EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum76EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum77EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum78EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum79EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum80EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum81EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum82EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum83EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum84EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum85EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum86EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum87EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum88EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum89EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum90EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum91EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum92EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum93EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum94EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum95EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum96EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum97EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum98EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum99EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum100EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum101EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum102EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum103EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum104EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum105EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum106EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum107EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum108EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum109EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum110EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum111EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum112EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum113EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum114EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum115EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum116EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum117EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum118EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum119EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum120EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum121EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum122EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum123EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum124EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum125EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum126EEEDav
Unexecuted instantiation: _ZN10magic_enum6detail1nILZ22LLVMFuzzerTestOneInputE8FuzzEnum127EEEDav
539
540
#if defined(_MSC_VER) && !defined(__clang__) && _MSC_VER < 1920
541
#  define MAGIC_ENUM_VS_2017_WORKAROUND 1
542
#endif
543
544
#if defined(MAGIC_ENUM_VS_2017_WORKAROUND)
545
template <typename E, E V>
546
constexpr auto n() noexcept {
547
  static_assert(is_enum_v<E>, "magic_enum::detail::n requires enum type.");
548
549
#  if defined(MAGIC_ENUM_GET_ENUM_NAME_BUILTIN)
550
  constexpr auto name_ptr = MAGIC_ENUM_GET_ENUM_NAME_BUILTIN(V);
551
  auto name = name_ptr ? str_view{name_ptr, std::char_traits<char>::length(name_ptr)} : str_view{};
552
#  else
553
  // CLI/C++ workaround (see https://github.com/Neargye/magic_enum/issues/284).
554
  str_view name;
555
  name.str_ = __FUNCSIG__;
556
  name.size_ = sizeof(__FUNCSIG__) - 17;
557
  std::size_t p = 0;
558
  for (std::size_t i = name.size_; i > 0; --i) {
559
    if (name.str_[i] == ',' || name.str_[i] == ':') {
560
      p = i + 1;
561
      break;
562
    }
563
  }
564
  if (p > 0) {
565
    name.size_ -= p;
566
    name.str_ += p;
567
  }
568
  if (name.str_[0] == '(' || name.str_[0] == '-' || (name.str_[0] >= '0' && name.str_[0] <= '9')) {
569
    name = str_view{};
570
  }
571
  return name;
572
#  endif
573
}
574
#endif
575
576
template <typename E, E V>
577
0
constexpr auto enum_name() noexcept {
578
0
  [[maybe_unused]] constexpr auto custom = customize::enum_name<E>(V);
579
0
  static_assert(std::is_same_v<std::decay_t<decltype(custom)>, customize::customize_t>, "magic_enum::customize requires customize_t type.");
580
0
  if constexpr (custom.first == customize::detail::customize_tag::custom_tag) {
581
0
    constexpr auto name = custom.second;
582
0
    static_assert(!name.empty(), "magic_enum::customize requires not empty string.");
583
0
    return static_str<name.size()>{name};
584
0
  } else if constexpr (custom.first == customize::detail::customize_tag::invalid_tag) {
585
0
    return static_str<0>{};
586
0
  } else if constexpr (custom.first == customize::detail::customize_tag::default_tag) {
587
0
#if defined(MAGIC_ENUM_VS_2017_WORKAROUND)
588
0
    constexpr auto name = n<E, V>();
589
0
#else
590
0
    constexpr auto name = n<V>();
591
0
#endif
592
0
    return static_str<name.size_>{name};
593
0
  } else {
594
0
    static_assert(always_false_v<E>, "magic_enum::customize invalid.");
595
0
  }
596
0
}
Unexecuted instantiation: magic_enum_fuzzer.cc:auto magic_enum::detail::enum_name<LLVMFuzzerTestOneInput::FuzzEnum, (LLVMFuzzerTestOneInput::FuzzEnum)-5>()
Unexecuted instantiation: magic_enum_fuzzer.cc:auto magic_enum::detail::enum_name<LLVMFuzzerTestOneInput::FuzzEnum, (LLVMFuzzerTestOneInput::FuzzEnum)0>()
Unexecuted instantiation: magic_enum_fuzzer.cc:auto magic_enum::detail::enum_name<LLVMFuzzerTestOneInput::FuzzEnum, (LLVMFuzzerTestOneInput::FuzzEnum)10>()
Unexecuted instantiation: magic_enum_fuzzer.cc:auto magic_enum::detail::enum_name<LLVMFuzzerTestOneInput::FuzzEnum, (LLVMFuzzerTestOneInput::FuzzEnum)11>()
Unexecuted instantiation: magic_enum_fuzzer.cc:auto magic_enum::detail::enum_name<LLVMFuzzerTestOneInput::FuzzEnum, (LLVMFuzzerTestOneInput::FuzzEnum)12>()
Unexecuted instantiation: magic_enum_fuzzer.cc:auto magic_enum::detail::enum_name<LLVMFuzzerTestOneInput::FuzzEnum, (LLVMFuzzerTestOneInput::FuzzEnum)13>()
Unexecuted instantiation: magic_enum_fuzzer.cc:auto magic_enum::detail::enum_name<LLVMFuzzerTestOneInput::FuzzEnum, (LLVMFuzzerTestOneInput::FuzzEnum)14>()
597
598
template <typename E, E V>
599
inline constexpr auto enum_name_v = enum_name<E, V>();
600
601
template <typename E, auto V>
602
0
constexpr bool is_valid() noexcept {
603
0
#if defined(__clang__) && __clang_major__ >= 16
604
0
  // https://reviews.llvm.org/D130058, https://reviews.llvm.org/D131307
605
0
  constexpr E v = __builtin_bit_cast(E, V);
606
0
#else
607
0
  constexpr E v = static_cast<E>(V);
608
0
#endif
609
0
  [[maybe_unused]] constexpr auto custom = customize::enum_name<E>(v);
610
0
  static_assert(std::is_same_v<std::decay_t<decltype(custom)>, customize::customize_t>, "magic_enum::customize requires customize_t type.");
611
0
  if constexpr (custom.first == customize::detail::customize_tag::custom_tag) {
612
0
    constexpr auto name = custom.second;
613
0
    static_assert(!name.empty(), "magic_enum::customize requires not empty string.");
614
0
    return name.size() != 0;
615
0
  } else if constexpr (custom.first == customize::detail::customize_tag::default_tag) {
616
0
#if defined(MAGIC_ENUM_VS_2017_WORKAROUND)
617
0
    return n<E, v>().size_ != 0;
618
0
#else
619
0
    return n<v>().size_ != 0;
620
0
#endif
621
0
  } else {
622
0
    return false;
623
0
  }
624
0
}
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -128>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -127>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -126>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -125>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -124>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -123>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -122>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -121>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -120>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -119>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -118>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -117>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -116>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -115>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -114>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -113>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -112>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -111>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -110>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -109>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -108>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -107>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -106>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -105>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -104>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -103>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -102>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -101>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -100>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -99>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -98>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -97>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -96>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -95>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -94>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -93>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -92>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -91>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -90>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -89>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -88>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -87>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -86>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -85>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -84>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -83>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -82>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -81>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -80>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -79>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -78>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -77>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -76>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -75>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -74>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -73>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -72>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -71>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -70>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -69>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -68>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -67>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -66>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -65>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -64>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -63>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -62>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -61>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -60>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -59>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -58>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -57>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -56>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -55>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -54>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -53>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -52>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -51>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -50>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -49>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -48>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -47>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -46>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -45>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -44>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -43>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -42>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -41>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -40>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -39>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -38>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -37>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -36>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -35>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -34>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -33>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -32>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -31>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -30>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -29>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -28>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -27>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -26>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -25>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -24>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -23>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -22>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -21>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -20>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -19>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -18>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -17>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -16>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -15>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -14>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -13>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -12>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -11>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -10>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -9>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -8>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -7>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -6>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -5>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -4>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -3>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -2>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, -1>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 0>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 1>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 2>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 3>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 4>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 5>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 6>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 7>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 8>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 9>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 10>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 11>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 12>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 13>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 14>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 15>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 16>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 17>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 18>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 19>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 20>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 21>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 22>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 23>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 24>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 25>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 26>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 27>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 28>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 29>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 30>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 31>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 32>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 33>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 34>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 35>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 36>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 37>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 38>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 39>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 40>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 41>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 42>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 43>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 44>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 45>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 46>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 47>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 48>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 49>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 50>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 51>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 52>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 53>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 54>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 55>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 56>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 57>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 58>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 59>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 60>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 61>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 62>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 63>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 64>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 65>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 66>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 67>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 68>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 69>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 70>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 71>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 72>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 73>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 74>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 75>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 76>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 77>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 78>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 79>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 80>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 81>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 82>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 83>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 84>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 85>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 86>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 87>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 88>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 89>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 90>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 91>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 92>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 93>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 94>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 95>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 96>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 97>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 98>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 99>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 100>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 101>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 102>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 103>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 104>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 105>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 106>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 107>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 108>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 109>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 110>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 111>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 112>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 113>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 114>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 115>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 116>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 117>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 118>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 119>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 120>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 121>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 122>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 123>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 124>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 125>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 126>()
Unexecuted instantiation: magic_enum_fuzzer.cc:bool magic_enum::detail::is_valid<LLVMFuzzerTestOneInput::FuzzEnum, 127>()
625
626
enum class enum_subtype {
627
  common,
628
  flags
629
};
630
631
template <typename E, int O, enum_subtype S, typename U = std::underlying_type_t<E>>
632
0
constexpr U ualue(std::size_t i) noexcept {
633
0
  if constexpr (std::is_same_v<U, bool>) { // bool special case
634
0
    static_assert(O == 0, "magic_enum::detail::ualue requires valid offset.");
635
0
636
0
    return static_cast<U>(i);
637
0
  } else if constexpr (S == enum_subtype::flags) {
638
0
    return static_cast<U>(U{1} << static_cast<U>(static_cast<int>(i) + O));
639
0
  } else {
640
0
    return static_cast<U>(static_cast<int>(i) + O);
641
0
  }
642
0
}
643
644
template <typename E, int O, enum_subtype S, typename U = std::underlying_type_t<E>>
645
0
constexpr E value(std::size_t i) noexcept {
646
0
  return static_cast<E>(ualue<E, O, S>(i));
647
0
}
648
649
template <typename E, enum_subtype S, typename U = std::underlying_type_t<E>>
650
0
constexpr int reflected_min() noexcept {
651
0
  if constexpr (S == enum_subtype::flags) {
652
0
    return 0;
653
0
  } else {
654
0
    constexpr auto lhs = range_min<E>::value;
655
0
    constexpr auto rhs = (std::numeric_limits<U>::min)();
656
0
657
0
    if constexpr (cmp_less(rhs, lhs)) {
658
0
      return lhs;
659
0
    } else {
660
0
      return rhs;
661
0
    }
662
0
  }
663
0
}
664
665
template <typename E, enum_subtype S, typename U = std::underlying_type_t<E>>
666
0
constexpr int reflected_max() noexcept {
667
0
  if constexpr (S == enum_subtype::flags) {
668
0
    return std::numeric_limits<U>::digits - 1;
669
0
  } else {
670
0
    constexpr auto lhs = range_max<E>::value;
671
0
    constexpr auto rhs = (std::numeric_limits<U>::max)();
672
0
673
0
    if constexpr (cmp_less(lhs, rhs)) {
674
0
      return lhs;
675
0
    } else {
676
0
      return rhs;
677
0
    }
678
0
  }
679
0
}
680
681
#define MAGIC_ENUM_FOR_EACH_256(T)                                                                                                                                                                 \
682
  T(  0)T(  1)T(  2)T(  3)T(  4)T(  5)T(  6)T(  7)T(  8)T(  9)T( 10)T( 11)T( 12)T( 13)T( 14)T( 15)T( 16)T( 17)T( 18)T( 19)T( 20)T( 21)T( 22)T( 23)T( 24)T( 25)T( 26)T( 27)T( 28)T( 29)T( 30)T( 31) \
683
  T( 32)T( 33)T( 34)T( 35)T( 36)T( 37)T( 38)T( 39)T( 40)T( 41)T( 42)T( 43)T( 44)T( 45)T( 46)T( 47)T( 48)T( 49)T( 50)T( 51)T( 52)T( 53)T( 54)T( 55)T( 56)T( 57)T( 58)T( 59)T( 60)T( 61)T( 62)T( 63) \
684
  T( 64)T( 65)T( 66)T( 67)T( 68)T( 69)T( 70)T( 71)T( 72)T( 73)T( 74)T( 75)T( 76)T( 77)T( 78)T( 79)T( 80)T( 81)T( 82)T( 83)T( 84)T( 85)T( 86)T( 87)T( 88)T( 89)T( 90)T( 91)T( 92)T( 93)T( 94)T( 95) \
685
  T( 96)T( 97)T( 98)T( 99)T(100)T(101)T(102)T(103)T(104)T(105)T(106)T(107)T(108)T(109)T(110)T(111)T(112)T(113)T(114)T(115)T(116)T(117)T(118)T(119)T(120)T(121)T(122)T(123)T(124)T(125)T(126)T(127) \
686
  T(128)T(129)T(130)T(131)T(132)T(133)T(134)T(135)T(136)T(137)T(138)T(139)T(140)T(141)T(142)T(143)T(144)T(145)T(146)T(147)T(148)T(149)T(150)T(151)T(152)T(153)T(154)T(155)T(156)T(157)T(158)T(159) \
687
  T(160)T(161)T(162)T(163)T(164)T(165)T(166)T(167)T(168)T(169)T(170)T(171)T(172)T(173)T(174)T(175)T(176)T(177)T(178)T(179)T(180)T(181)T(182)T(183)T(184)T(185)T(186)T(187)T(188)T(189)T(190)T(191) \
688
  T(192)T(193)T(194)T(195)T(196)T(197)T(198)T(199)T(200)T(201)T(202)T(203)T(204)T(205)T(206)T(207)T(208)T(209)T(210)T(211)T(212)T(213)T(214)T(215)T(216)T(217)T(218)T(219)T(220)T(221)T(222)T(223) \
689
  T(224)T(225)T(226)T(227)T(228)T(229)T(230)T(231)T(232)T(233)T(234)T(235)T(236)T(237)T(238)T(239)T(240)T(241)T(242)T(243)T(244)T(245)T(246)T(247)T(248)T(249)T(250)T(251)T(252)T(253)T(254)T(255)
690
691
template <typename E, enum_subtype S, std::size_t Size, int Min, std::size_t I>
692
0
constexpr void valid_count(bool* valid, std::size_t& count) noexcept {
693
0
#define MAGIC_ENUM_V(O)                                     \
694
0
  if constexpr ((I + O) < Size) {                           \
695
0
    if constexpr (is_valid<E, ualue<E, Min, S>(I + O)>()) { \
696
0
      valid[I + O] = true;                                  \
697
0
      ++count;                                              \
698
0
    }                                                       \
699
0
  }
700
0
701
0
  MAGIC_ENUM_FOR_EACH_256(MAGIC_ENUM_V);
702
0
703
0
  if constexpr ((I + 256) < Size) {
704
0
    valid_count<E, S, Size, Min, I + 256>(valid, count);
705
0
  }
706
0
#undef MAGIC_ENUM_V
707
0
}
708
709
template <std::size_t N>
710
struct valid_count_t {
711
  std::size_t count = 0;
712
  bool valid[N] = {};
713
};
714
715
template <typename E, enum_subtype S, std::size_t Size, int Min>
716
0
constexpr auto valid_count() noexcept {
717
0
  valid_count_t<Size> vc;
718
0
  valid_count<E, S, Size, Min, 0>(vc.valid, vc.count);
719
0
  return vc;
720
0
}
721
722
template <typename E, enum_subtype S, std::size_t Size, int Min>
723
0
constexpr auto values() noexcept {
724
0
  constexpr auto vc = valid_count<E, S, Size, Min>();
725
0
726
0
  if constexpr (vc.count > 0) {
727
0
#if defined(MAGIC_ENUM_ARRAY_CONSTEXPR)
728
0
    std::array<E, vc.count> values = {};
729
0
#else
730
0
    E values[vc.count] = {};
731
0
#endif
732
0
    for (std::size_t i = 0, v = 0; v < vc.count; ++i) {
733
0
      if (vc.valid[i]) {
734
0
        values[v++] = value<E, Min, S>(i);
735
0
      }
736
0
    }
737
0
#if defined(MAGIC_ENUM_ARRAY_CONSTEXPR)
738
0
    return values;
739
0
#else
740
0
    return to_array(values, std::make_index_sequence<vc.count>{});
741
0
#endif
742
0
  } else {
743
0
    return std::array<E, 0>{};
744
0
  }
745
0
}
746
747
template <typename E, enum_subtype S, typename U = std::underlying_type_t<E>>
748
0
constexpr auto values() noexcept {
749
0
  constexpr auto min = reflected_min<E, S>();
750
0
  constexpr auto max = reflected_max<E, S>();
751
0
  constexpr auto range_size = max - min + 1;
752
0
  static_assert(range_size > 0, "magic_enum::enum_range requires valid size.");
753
0
  static_assert(range_size < (std::numeric_limits<std::uint16_t>::max)(), "magic_enum::enum_range requires valid size.");
754
0
755
0
  return values<E, S, range_size, min>();
756
0
}
757
758
template <typename E, typename U = std::underlying_type_t<E>>
759
0
constexpr enum_subtype subtype(std::true_type) noexcept {
760
0
  if constexpr (std::is_same_v<U, bool>) { // bool special case
761
0
    return enum_subtype::common;
762
0
  } else if constexpr (has_is_flags<E>::value) {
763
0
    return customize::enum_range<E>::is_flags ? enum_subtype::flags : enum_subtype::common;
764
0
  } else {
765
0
#if defined(MAGIC_ENUM_AUTO_IS_FLAGS)
766
0
    constexpr auto flags_values = values<E, enum_subtype::flags>();
767
0
    constexpr auto default_values = values<E, enum_subtype::common>();
768
0
    if (flags_values.size() == 0 || default_values.size() > flags_values.size()) {
769
0
      return enum_subtype::common;
770
0
    }
771
0
    for (std::size_t i = 0; i < default_values.size(); ++i) {
772
0
      const auto v = static_cast<U>(default_values[i]);
773
0
      if (v != 0 && (v & (v - 1)) != 0) {
774
0
        return enum_subtype::common;
775
0
      }
776
0
    }
777
0
    return enum_subtype::flags;
778
0
#else
779
0
    return enum_subtype::common;
780
0
#endif
781
0
  }
782
0
}
783
784
template <typename T>
785
0
constexpr enum_subtype subtype(std::false_type) noexcept {
786
0
  // For non-enum type return default common subtype.
787
0
  return enum_subtype::common;
788
0
}
789
790
template <typename E, typename D = std::decay_t<E>>
791
inline constexpr auto subtype_v = subtype<D>(std::is_enum<D>{});
792
793
template <typename E, enum_subtype S>
794
inline constexpr auto values_v = values<E, S>();
795
796
template <typename E, enum_subtype S, typename D = std::decay_t<E>>
797
using values_t = decltype((values_v<D, S>));
798
799
template <typename E, enum_subtype S>
800
inline constexpr auto count_v = values_v<E, S>.size();
801
802
template <typename E, enum_subtype S, typename U = std::underlying_type_t<E>>
803
inline constexpr auto min_v = (count_v<E, S> > 0) ? static_cast<U>(values_v<E, S>.front()) : U{0};
804
805
template <typename E, enum_subtype S, typename U = std::underlying_type_t<E>>
806
inline constexpr auto max_v = (count_v<E, S> > 0) ? static_cast<U>(values_v<E, S>.back()) : U{0};
807
808
template <typename E, enum_subtype S, std::size_t... I>
809
0
constexpr auto names(std::index_sequence<I...>) noexcept {
810
0
  return std::array<string_view, sizeof...(I)>{{enum_name_v<E, values_v<E, S>[I]>...}};
811
0
}
812
813
template <typename E, enum_subtype S>
814
inline constexpr auto names_v = names<E, S>(std::make_index_sequence<count_v<E, S>>{});
815
816
template <typename E, enum_subtype S, typename D = std::decay_t<E>>
817
using names_t = decltype((names_v<D, S>));
818
819
template <typename E, enum_subtype S, std::size_t... I>
820
0
constexpr auto entries(std::index_sequence<I...>) noexcept {
821
0
  return std::array<std::pair<E, string_view>, sizeof...(I)>{{{values_v<E, S>[I], enum_name_v<E, values_v<E, S>[I]>}...}};
822
0
}
823
824
template <typename E, enum_subtype S>
825
inline constexpr auto entries_v = entries<E, S>(std::make_index_sequence<count_v<E, S>>{});
826
827
template <typename E, enum_subtype S, typename D = std::decay_t<E>>
828
using entries_t = decltype((entries_v<D, S>));
829
830
template <typename E, enum_subtype S, typename U = std::underlying_type_t<E>>
831
0
constexpr bool is_sparse() noexcept {
832
0
  if constexpr (count_v<E, S> == 0) {
833
0
    return false;
834
0
  } else if constexpr (std::is_same_v<U, bool>) { // bool special case
835
0
    return false;
836
0
  } else {
837
0
    constexpr auto max = (S == enum_subtype::flags) ? log2(max_v<E, S>) : max_v<E, S>;
838
0
    constexpr auto min = (S == enum_subtype::flags) ? log2(min_v<E, S>) : min_v<E, S>;
839
0
    constexpr auto range_size = max - min + 1;
840
0
841
0
    return range_size != count_v<E, S>;
842
0
  }
843
0
}
844
845
template <typename E, enum_subtype S = subtype_v<E>>
846
inline constexpr bool is_sparse_v = is_sparse<E, S>();
847
848
template <typename E, enum_subtype S, typename U = std::underlying_type_t<E>>
849
constexpr U values_ors() noexcept {
850
  static_assert(S == enum_subtype::flags, "magic_enum::detail::values_ors requires valid subtype.");
851
852
  auto ors = U{0};
853
  for (std::size_t i = 0; i < count_v<E, S>; ++i) {
854
    ors |= static_cast<U>(values_v<E, S>[i]);
855
  }
856
857
  return ors;
858
}
859
860
template <bool, typename R>
861
struct enable_if_enum {};
862
863
template <typename R>
864
struct enable_if_enum<true, R> {
865
  using type = R;
866
  static_assert(supported<R>::value, "magic_enum unsupported compiler (https://github.com/Neargye/magic_enum#compiler-compatibility).");
867
};
868
869
template <typename T, typename R, typename BinaryPredicate = std::equal_to<>, typename D = std::decay_t<T>>
870
using enable_if_t = typename enable_if_enum<std::is_enum_v<D> && std::is_invocable_r_v<bool, BinaryPredicate, char_type, char_type>, R>::type;
871
872
template <typename T, std::enable_if_t<std::is_enum_v<std::decay_t<T>>, int> = 0>
873
using enum_concept = T;
874
875
template <typename T, bool = std::is_enum_v<T>>
876
struct is_scoped_enum : std::false_type {};
877
878
template <typename T>
879
struct is_scoped_enum<T, true> : std::bool_constant<!std::is_convertible_v<T, std::underlying_type_t<T>>> {};
880
881
template <typename T, bool = std::is_enum_v<T>>
882
struct is_unscoped_enum : std::false_type {};
883
884
template <typename T>
885
struct is_unscoped_enum<T, true> : std::bool_constant<std::is_convertible_v<T, std::underlying_type_t<T>>> {};
886
887
template <typename T, bool = std::is_enum_v<std::decay_t<T>>>
888
struct underlying_type {};
889
890
template <typename T>
891
struct underlying_type<T, true> : std::underlying_type<std::decay_t<T>> {};
892
893
#if defined(MAGIC_ENUM_ENABLE_HASH) || defined(MAGIC_ENUM_ENABLE_HASH_SWITCH)
894
895
template <typename Value, typename = void>
896
struct constexpr_hash_t;
897
898
template <typename Value>
899
struct constexpr_hash_t<Value, std::enable_if_t<is_enum_v<Value>>> {
900
  constexpr auto operator()(Value value) const noexcept {
901
    using U = typename underlying_type<Value>::type;
902
    if constexpr (std::is_same_v<U, bool>) { // bool special case
903
      return static_cast<std::size_t>(value);
904
    } else {
905
      return static_cast<U>(value);
906
    }
907
  }
908
  using secondary_hash = constexpr_hash_t;
909
};
910
911
template <typename Value>
912
struct constexpr_hash_t<Value, std::enable_if_t<std::is_same_v<Value, string_view>>> {
913
  static constexpr std::uint32_t crc_table[256] {
914
    0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
915
    0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
916
    0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL, 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
917
    0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
918
    0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
919
    0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
920
    0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
921
    0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L, 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
922
    0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
923
    0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
924
    0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
925
    0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
926
    0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L, 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
927
    0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
928
    0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
929
    0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
930
    0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
931
    0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L, 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
932
    0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
933
    0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
934
    0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
935
    0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
936
    0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L, 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
937
    0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
938
    0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
939
    0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
940
    0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
941
    0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL, 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
942
    0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
943
    0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
944
    0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
945
    0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
946
  };
947
  constexpr std::uint32_t operator()(string_view value) const noexcept {
948
    auto crc = static_cast<std::uint32_t>(0xffffffffL);
949
    for (const auto c : value) {
950
      crc = (crc >> 8) ^ crc_table[(crc ^ static_cast<std::uint32_t>(c)) & 0xff];
951
    }
952
    return crc ^ 0xffffffffL;
953
  }
954
955
  struct secondary_hash {
956
    constexpr std::uint32_t operator()(string_view value) const noexcept {
957
      auto acc = static_cast<std::uint64_t>(2166136261ULL);
958
      for (const auto c : value) {
959
        acc = ((acc ^ static_cast<std::uint64_t>(c)) * static_cast<std::uint64_t>(16777619ULL)) & (std::numeric_limits<std::uint32_t>::max)();
960
      }
961
      return static_cast<std::uint32_t>(acc);
962
    }
963
  };
964
};
965
966
template <typename Hash>
967
inline constexpr Hash hash_v{};
968
969
template <auto* GlobValues, typename Hash>
970
constexpr auto calculate_cases(std::size_t Page) noexcept {
971
  constexpr std::array values = *GlobValues;
972
  constexpr std::size_t size = values.size();
973
974
  using switch_t = std::invoke_result_t<Hash, typename decltype(values)::value_type>;
975
  static_assert(std::is_integral_v<switch_t> && !std::is_same_v<switch_t, bool>);
976
  const std::size_t values_to = (std::min)(static_cast<std::size_t>(256), size - Page);
977
978
  std::array<switch_t, 256> result{};
979
  auto fill = result.begin();
980
  {
981
    auto first = values.begin() + static_cast<std::ptrdiff_t>(Page);
982
    auto last = values.begin() + static_cast<std::ptrdiff_t>(Page + values_to);
983
    while (first != last) {
984
      *fill++ = hash_v<Hash>(*first++);
985
    }
986
  }
987
988
  // dead cases, try to avoid case collisions
989
  for (switch_t last_value = result[values_to - 1]; fill != result.end() && last_value != (std::numeric_limits<switch_t>::max)(); *fill++ = ++last_value) {
990
  }
991
992
  {
993
    auto it = result.begin();
994
    auto last_value = (std::numeric_limits<switch_t>::min)();
995
    for (; fill != result.end(); *fill++ = last_value++) {
996
      while (last_value == *it) {
997
        ++last_value, ++it;
998
      }
999
    }
1000
  }
1001
1002
  return result;
1003
}
1004
1005
template <typename R, typename F, typename... Args>
1006
constexpr R invoke_r(F&& f, Args&&... args) noexcept(std::is_nothrow_invocable_r_v<R, F, Args...>) {
1007
  if constexpr (std::is_void_v<R>) {
1008
    std::forward<F>(f)(std::forward<Args>(args)...);
1009
  } else {
1010
    return static_cast<R>(std::forward<F>(f)(std::forward<Args>(args)...));
1011
  }
1012
}
1013
1014
enum class case_call_t {
1015
  index,
1016
  value
1017
};
1018
1019
template <typename T = void>
1020
inline constexpr auto default_result_type_lambda = []() noexcept(std::is_nothrow_default_constructible_v<T>) { return T{}; };
1021
1022
template <>
1023
inline constexpr auto default_result_type_lambda<void> = []() noexcept {};
1024
1025
template <auto* Arr, typename Hash>
1026
constexpr bool has_duplicate() noexcept {
1027
  using value_t = std::decay_t<decltype((*Arr)[0])>;
1028
  using hash_value_t = std::invoke_result_t<Hash, value_t>;
1029
  std::array<hash_value_t, Arr->size()> hashes{};
1030
  std::size_t size = 0;
1031
  for (auto elem : *Arr) {
1032
    hashes[size] = hash_v<Hash>(elem);
1033
    for (auto i = size++; i > 0; --i) {
1034
      if (hashes[i] < hashes[i - 1]) {
1035
        auto tmp = hashes[i];
1036
        hashes[i] = hashes[i - 1];
1037
        hashes[i - 1] = tmp;
1038
      } else if (hashes[i] == hashes[i - 1]) {
1039
        return false;
1040
      } else {
1041
        break;
1042
      }
1043
    }
1044
  }
1045
  return true;
1046
}
1047
1048
#define MAGIC_ENUM_CASE(val)                                                                                                  \
1049
  case cases[val]:                                                                                                            \
1050
    if constexpr ((val) + Page < size) {                                                                                      \
1051
      if (!pred(values[val + Page], searched)) {                                                                              \
1052
        break;                                                                                                                \
1053
      }                                                                                                                       \
1054
      if constexpr (CallValue == case_call_t::index) {                                                                        \
1055
        if constexpr (std::is_invocable_r_v<result_t, Lambda, std::integral_constant<std::size_t, val + Page>>) {             \
1056
          return detail::invoke_r<result_t>(std::forward<Lambda>(lambda), std::integral_constant<std::size_t, val + Page>{}); \
1057
        } else if constexpr (std::is_invocable_v<Lambda, std::integral_constant<std::size_t, val + Page>>) {                  \
1058
          MAGIC_ENUM_ASSERT(false && "magic_enum::detail::constexpr_switch wrong result type.");                                         \
1059
        }                                                                                                                     \
1060
      } else if constexpr (CallValue == case_call_t::value) {                                                                 \
1061
        if constexpr (std::is_invocable_r_v<result_t, Lambda, enum_constant<values[val + Page]>>) {                           \
1062
          return detail::invoke_r<result_t>(std::forward<Lambda>(lambda), enum_constant<values[val + Page]>{});               \
1063
        } else if constexpr (std::is_invocable_r_v<result_t, Lambda, enum_constant<values[val + Page]>>) {                    \
1064
          MAGIC_ENUM_ASSERT(false && "magic_enum::detail::constexpr_switch wrong result type.");                                         \
1065
        }                                                                                                                     \
1066
      }                                                                                                                       \
1067
      break;                                                                                                                  \
1068
    } else [[fallthrough]];
1069
1070
template <auto* GlobValues,
1071
          case_call_t CallValue,
1072
          std::size_t Page = 0,
1073
          typename Hash = constexpr_hash_t<typename std::decay_t<decltype(*GlobValues)>::value_type>,
1074
          typename BinaryPredicate = std::equal_to<>,
1075
          typename Lambda,
1076
          typename ResultGetterType>
1077
constexpr decltype(auto) constexpr_switch(
1078
    Lambda&& lambda,
1079
    typename std::decay_t<decltype(*GlobValues)>::value_type searched,
1080
    ResultGetterType&& def,
1081
    BinaryPredicate&& pred = {}) {
1082
  using result_t = std::invoke_result_t<ResultGetterType>;
1083
  using hash_t = std::conditional_t<has_duplicate<GlobValues, Hash>(), Hash, typename Hash::secondary_hash>;
1084
  static_assert(has_duplicate<GlobValues, hash_t>(), "magic_enum::detail::constexpr_switch duplicated hash found, please report it: https://github.com/Neargye/magic_enum/issues.");
1085
  constexpr std::array values = *GlobValues;
1086
  constexpr std::size_t size = values.size();
1087
  constexpr std::array cases = calculate_cases<GlobValues, hash_t>(Page);
1088
1089
  switch (hash_v<hash_t>(searched)) {
1090
    MAGIC_ENUM_FOR_EACH_256(MAGIC_ENUM_CASE)
1091
    default:
1092
      if constexpr (size > 256 + Page) {
1093
        return constexpr_switch<GlobValues, CallValue, Page + 256, Hash>(std::forward<Lambda>(lambda), searched, std::forward<ResultGetterType>(def));
1094
      }
1095
      break;
1096
  }
1097
  return def();
1098
}
1099
1100
#undef MAGIC_ENUM_CASE
1101
1102
#endif
1103
1104
} // namespace magic_enum::detail
1105
1106
// Checks is magic_enum supported compiler.
1107
inline constexpr bool is_magic_enum_supported = detail::supported<void>::value;
1108
1109
template <typename T>
1110
using Enum = detail::enum_concept<T>;
1111
1112
// Checks whether T is an Unscoped enumeration type.
1113
// Provides the member constant value which is equal to true, if T is an [Unscoped enumeration](https://en.cppreference.com/w/cpp/language/enum#Unscoped_enumeration) type. Otherwise, value is equal to false.
1114
template <typename T>
1115
struct is_unscoped_enum : detail::is_unscoped_enum<T> {};
1116
1117
template <typename T>
1118
inline constexpr bool is_unscoped_enum_v = is_unscoped_enum<T>::value;
1119
1120
// Checks whether T is an Scoped enumeration type.
1121
// Provides the member constant value which is equal to true, if T is an [Scoped enumeration](https://en.cppreference.com/w/cpp/language/enum#Scoped_enumerations) type. Otherwise, value is equal to false.
1122
template <typename T>
1123
struct is_scoped_enum : detail::is_scoped_enum<T> {};
1124
1125
template <typename T>
1126
inline constexpr bool is_scoped_enum_v = is_scoped_enum<T>::value;
1127
1128
// If T is a complete enumeration type, provides a member typedef type that names the underlying type of T.
1129
// Otherwise, if T is not an enumeration type, there is no member type. Otherwise (T is an incomplete enumeration type), the program is ill-formed.
1130
template <typename T>
1131
struct underlying_type : detail::underlying_type<T> {};
1132
1133
template <typename T>
1134
using underlying_type_t = typename underlying_type<T>::type;
1135
1136
template <auto V>
1137
using enum_constant = detail::enum_constant<V>;
1138
1139
// Returns type name of enum.
1140
template <typename E>
1141
[[nodiscard]] constexpr auto enum_type_name() noexcept -> detail::enable_if_t<E, string_view> {
1142
  constexpr string_view name = detail::type_name_v<std::decay_t<E>>;
1143
  static_assert(!name.empty(), "magic_enum::enum_type_name enum type does not have a name.");
1144
1145
  return name;
1146
}
1147
1148
// Returns number of enum values.
1149
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1150
1.02k
[[nodiscard]] constexpr auto enum_count() noexcept -> detail::enable_if_t<E, std::size_t> {
1151
1.02k
  return detail::count_v<std::decay_t<E>, S>;
1152
1.02k
}
1153
1154
// Returns enum value at specified index.
1155
// No bounds checking is performed: the behavior is undefined if index >= number of enum values.
1156
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1157
18.9k
[[nodiscard]] constexpr auto enum_value(std::size_t index) noexcept -> detail::enable_if_t<E, std::decay_t<E>> {
1158
18.9k
  using D = std::decay_t<E>;
1159
1160
18.9k
  if constexpr (detail::is_sparse_v<D, S>) {
1161
18.9k
    return MAGIC_ENUM_ASSERT(index < detail::count_v<D, S>), detail::values_v<D, S>[index];
1162
18.9k
  } else {
1163
18.9k
    constexpr auto min = (S == detail::enum_subtype::flags) ? detail::log2(detail::min_v<D, S>) : detail::min_v<D, S>;
1164
1165
18.9k
    return MAGIC_ENUM_ASSERT(index < detail::count_v<D, S>), detail::value<D, min, S>(index);
1166
18.9k
  }
1167
18.9k
}
1168
1169
// Returns enum value at specified index.
1170
template <typename E, std::size_t I, detail::enum_subtype S = detail::subtype_v<E>>
1171
[[nodiscard]] constexpr auto enum_value() noexcept -> detail::enable_if_t<E, std::decay_t<E>> {
1172
  using D = std::decay_t<E>;
1173
  static_assert(I < detail::count_v<D, S>, "magic_enum::enum_value out of range.");
1174
1175
  return enum_value<D, S>(I);
1176
}
1177
1178
// Returns std::array with enum values, sorted by enum value.
1179
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1180
0
[[nodiscard]] constexpr auto enum_values() noexcept -> detail::enable_if_t<E, detail::values_t<E, S>> {
1181
0
  return detail::values_v<std::decay_t<E>, S>;
1182
0
}
Unexecuted instantiation: magic_enum_fuzzer.cc:_ZN10magic_enum11enum_valuesIKZ22LLVMFuzzerTestOneInputE8FuzzEnumLNS_6detail12enum_subtypeE0EEENS3_14enable_if_enumIXaasr3stdE9is_enum_vINSt3__15decayIT_E4typeEEL_ZNS6_16is_invocable_r_vIbNS6_8equal_toIvEEJccEEEEEDT8values_vISA_XT0_EEEE4typeEv
Unexecuted instantiation: magic_enum_fuzzer.cc:_ZN10magic_enum11enum_valuesIZ22LLVMFuzzerTestOneInputE8FuzzEnumLNS_6detail12enum_subtypeE0EEENS2_14enable_if_enumIXaasr3stdE9is_enum_vINSt3__15decayIT_E4typeEEL_ZNS5_16is_invocable_r_vIbNS5_8equal_toIvEEJccEEEEEDT8values_vIS9_XT0_EEEE4typeEv
1183
1184
// Returns integer value from enum value.
1185
template <typename E>
1186
[[nodiscard]] constexpr auto enum_integer(E value) noexcept -> detail::enable_if_t<E, underlying_type_t<E>> {
1187
  return static_cast<underlying_type_t<E>>(value);
1188
}
1189
1190
// Returns underlying value from enum value.
1191
template <typename E>
1192
[[nodiscard]] constexpr auto enum_underlying(E value) noexcept -> detail::enable_if_t<E, underlying_type_t<E>> {
1193
  return static_cast<underlying_type_t<E>>(value);
1194
}
1195
1196
// Obtains index in enum values from enum value.
1197
// Returns optional with index.
1198
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1199
4.09k
[[nodiscard]] constexpr auto enum_index(E value) noexcept -> detail::enable_if_t<E, optional<std::size_t>> {
1200
4.09k
  using D = std::decay_t<E>;
1201
4.09k
  using U = underlying_type_t<D>;
1202
1203
4.09k
  if constexpr (detail::count_v<D, S> == 0) {
1204
4.09k
    static_cast<void>(value);
1205
4.09k
    return {}; // Empty enum.
1206
4.09k
  } else if constexpr (detail::is_sparse_v<D, S> || (S == detail::enum_subtype::flags)) {
1207
#if defined(MAGIC_ENUM_ENABLE_HASH)
1208
    return detail::constexpr_switch<&detail::values_v<D, S>, detail::case_call_t::index>(
1209
        [](std::size_t i) { return optional<std::size_t>{i}; },
1210
        value,
1211
        detail::default_result_type_lambda<optional<std::size_t>>);
1212
#else
1213
8.19k
    for (std::size_t i = 0; i < detail::count_v<D, S>; ++i) {
1214
8.19k
      if (enum_value<D, S>(i) == value) {
1215
4.09k
        return i;
1216
4.09k
      }
1217
8.19k
    }
1218
0
    return {}; // Invalid value or out of range.
1219
4.09k
#endif
1220
4.09k
  } else {
1221
4.09k
    const auto v = static_cast<U>(value);
1222
4.09k
    if (v >= detail::min_v<D, S> && v <= detail::max_v<D, S>) {
1223
4.09k
      return static_cast<std::size_t>(v - detail::min_v<D, S>);
1224
4.09k
    }
1225
4.09k
    return {}; // Invalid value or out of range.
1226
4.09k
  }
1227
4.09k
}
1228
1229
// Obtains index in enum values from enum value.
1230
// Returns optional with index.
1231
template <detail::enum_subtype S, typename E>
1232
[[nodiscard]] constexpr auto enum_index(E value) noexcept -> detail::enable_if_t<E, optional<std::size_t>> {
1233
  using D = std::decay_t<E>;
1234
1235
  return enum_index<D, S>(value);
1236
}
1237
1238
// Obtains index in enum values from static storage enum variable.
1239
template <auto V, detail::enum_subtype S = detail::subtype_v<std::decay_t<decltype(V)>>>
1240
[[nodiscard]] constexpr auto enum_index() noexcept -> detail::enable_if_t<decltype(V), std::size_t> {
1241
  constexpr auto index = enum_index<std::decay_t<decltype(V)>, S>(V);
1242
  static_assert(index, "magic_enum::enum_index enum value does not have a index.");
1243
1244
  return *index;
1245
}
1246
1247
// Returns name from static storage enum variable.
1248
// This version is much lighter on the compile times and is not restricted to the enum_range limitation.
1249
template <auto V>
1250
[[nodiscard]] constexpr auto enum_name() noexcept -> detail::enable_if_t<decltype(V), string_view> {
1251
  constexpr string_view name = detail::enum_name_v<std::decay_t<decltype(V)>, V>;
1252
  static_assert(!name.empty(), "magic_enum::enum_name enum value does not have a name.");
1253
1254
  return name;
1255
}
1256
1257
// Returns name from enum value.
1258
// If enum value does not have name or value out of range, returns empty string.
1259
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1260
[[nodiscard]] constexpr auto enum_name(E value) noexcept -> detail::enable_if_t<E, string_view> {
1261
  using D = std::decay_t<E>;
1262
1263
  if (const auto i = enum_index<D, S>(value)) {
1264
    return detail::names_v<D, S>[*i];
1265
  }
1266
  return {};
1267
}
1268
1269
// Returns name from enum value.
1270
// If enum value does not have name or value out of range, returns empty string.
1271
template <detail::enum_subtype S, typename E>
1272
[[nodiscard]] constexpr auto enum_name(E value) -> detail::enable_if_t<E, string_view> {
1273
  using D = std::decay_t<E>;
1274
1275
  return enum_name<D, S>(value);
1276
}
1277
1278
// Returns std::array with names, sorted by enum value.
1279
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1280
512
[[nodiscard]] constexpr auto enum_names() noexcept -> detail::enable_if_t<E, detail::names_t<E, S>> {
1281
512
  return detail::names_v<std::decay_t<E>, S>;
1282
512
}
1283
1284
// Returns std::array with pairs (value, name), sorted by enum value.
1285
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1286
512
[[nodiscard]] constexpr auto enum_entries() noexcept -> detail::enable_if_t<E, detail::entries_t<E, S>> {
1287
512
  return detail::entries_v<std::decay_t<E>, S>;
1288
512
}
1289
1290
// Allows you to write magic_enum::enum_cast<foo>("bar", magic_enum::case_insensitive);
1291
inline constexpr auto case_insensitive = detail::case_insensitive<>{};
1292
1293
// Obtains enum value from integer value.
1294
// Returns optional with enum value.
1295
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1296
1.53k
[[nodiscard]] constexpr auto enum_cast(underlying_type_t<E> value) noexcept -> detail::enable_if_t<E, optional<std::decay_t<E>>> {
1297
1.53k
  using D = std::decay_t<E>;
1298
1299
1.53k
  if constexpr (detail::count_v<D, S> == 0) {
1300
1.53k
    static_cast<void>(value);
1301
1.53k
    return {}; // Empty enum.
1302
1.53k
  } else {
1303
1.53k
    if constexpr (detail::is_sparse_v<D, S> || (S == detail::enum_subtype::flags)) {
1304
#if defined(MAGIC_ENUM_ENABLE_HASH)
1305
      return detail::constexpr_switch<&detail::values_v<D, S>, detail::case_call_t::value>(
1306
          [](D v) { return optional<D>{v}; },
1307
          static_cast<D>(value),
1308
          detail::default_result_type_lambda<optional<D>>);
1309
#else
1310
12.2k
      for (std::size_t i = 0; i < detail::count_v<D, S>; ++i) {
1311
10.7k
        if (value == static_cast<underlying_type_t<D>>(enum_value<D, S>(i))) {
1312
0
          return static_cast<D>(value);
1313
0
        }
1314
10.7k
      }
1315
1.53k
      return {}; // Invalid value or out of range.
1316
1.53k
#endif
1317
1.53k
    } else {
1318
1.53k
      if (value >= detail::min_v<D, S> && value <= detail::max_v<D, S>) {
1319
1.53k
        return static_cast<D>(value);
1320
1.53k
      }
1321
1.53k
      return {}; // Invalid value or out of range.
1322
1.53k
    }
1323
1.53k
  }
1324
1.53k
}
1325
1326
// Obtains enum value from name.
1327
// Returns optional with enum value.
1328
template <typename E, detail::enum_subtype S = detail::subtype_v<E>, typename BinaryPredicate = std::equal_to<>>
1329
1.53k
[[nodiscard]] constexpr auto enum_cast(string_view value, [[maybe_unused]] BinaryPredicate p = {}) noexcept(detail::is_nothrow_invocable<BinaryPredicate>()) -> detail::enable_if_t<E, optional<std::decay_t<E>>, BinaryPredicate> {
1330
1.53k
  using D = std::decay_t<E>;
1331
1332
1.53k
  if constexpr (detail::count_v<D, S> == 0) {
1333
1.53k
    static_cast<void>(value);
1334
1.53k
    return {}; // Empty enum.
1335
#if defined(MAGIC_ENUM_ENABLE_HASH)
1336
    } else if constexpr (detail::is_default_predicate<BinaryPredicate>()) {
1337
      return detail::constexpr_switch<&detail::names_v<D, S>, detail::case_call_t::index>(
1338
          [](std::size_t i) { return optional<D>{detail::values_v<D, S>[i]}; },
1339
          value,
1340
          detail::default_result_type_lambda<optional<D>>,
1341
          [&p](string_view lhs, string_view rhs) { return detail::cmp_equal(lhs, rhs, p); });
1342
#endif
1343
1.53k
    } else {
1344
12.2k
    for (std::size_t i = 0; i < detail::count_v<D, S>; ++i) {
1345
10.6k
      if (detail::cmp_equal(value, detail::names_v<D, S>[i], p)) {
1346
13
        return enum_value<D, S>(i);
1347
13
      }
1348
10.6k
    }
1349
1.52k
    return {}; // Invalid value or out of range.
1350
1.53k
  }
1351
1.53k
}
1352
1353
// Checks whether enum contains value with such value.
1354
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1355
[[nodiscard]] constexpr auto enum_contains(E value) noexcept -> detail::enable_if_t<E, bool> {
1356
  using D = std::decay_t<E>;
1357
  using U = underlying_type_t<D>;
1358
1359
  return static_cast<bool>(enum_cast<D, S>(static_cast<U>(value)));
1360
}
1361
1362
// Checks whether enum contains value with such value.
1363
template <detail::enum_subtype S, typename E>
1364
[[nodiscard]] constexpr auto enum_contains(E value) noexcept -> detail::enable_if_t<E, bool> {
1365
  using D = std::decay_t<E>;
1366
  using U = underlying_type_t<D>;
1367
1368
  return static_cast<bool>(enum_cast<D, S>(static_cast<U>(value)));
1369
}
1370
1371
// Checks whether enum contains value with such integer value.
1372
template <typename E, detail::enum_subtype S = detail::subtype_v<E>>
1373
1.02k
[[nodiscard]] constexpr auto enum_contains(underlying_type_t<E> value) noexcept -> detail::enable_if_t<E, bool> {
1374
1.02k
  using D = std::decay_t<E>;
1375
1376
1.02k
  return static_cast<bool>(enum_cast<D, S>(value));
1377
1.02k
}
1378
1379
// Checks whether enum contains enumerator with such name.
1380
template <typename E, detail::enum_subtype S = detail::subtype_v<E>, typename BinaryPredicate = std::equal_to<>>
1381
[[nodiscard]] constexpr auto enum_contains(string_view value, BinaryPredicate p = {}) noexcept(detail::is_nothrow_invocable<BinaryPredicate>()) -> detail::enable_if_t<E, bool, BinaryPredicate> {
1382
  using D = std::decay_t<E>;
1383
1384
  return static_cast<bool>(enum_cast<D, S>(value, std::move(p)));
1385
}
1386
1387
template <bool AsFlags = true>
1388
inline constexpr auto as_flags = AsFlags ? detail::enum_subtype::flags : detail::enum_subtype::common;
1389
1390
template <bool AsFlags = true>
1391
inline constexpr auto as_common = AsFlags ? detail::enum_subtype::common : detail::enum_subtype::flags;
1392
1393
namespace bitwise_operators {
1394
1395
template <typename E, detail::enable_if_t<E, int> = 0>
1396
constexpr E operator~(E rhs) noexcept {
1397
  return static_cast<E>(~static_cast<underlying_type_t<E>>(rhs));
1398
}
1399
1400
template <typename E, detail::enable_if_t<E, int> = 0>
1401
constexpr E operator|(E lhs, E rhs) noexcept {
1402
  return static_cast<E>(static_cast<underlying_type_t<E>>(lhs) | static_cast<underlying_type_t<E>>(rhs));
1403
}
1404
1405
template <typename E, detail::enable_if_t<E, int> = 0>
1406
constexpr E operator&(E lhs, E rhs) noexcept {
1407
  return static_cast<E>(static_cast<underlying_type_t<E>>(lhs) & static_cast<underlying_type_t<E>>(rhs));
1408
}
1409
1410
template <typename E, detail::enable_if_t<E, int> = 0>
1411
constexpr E operator^(E lhs, E rhs) noexcept {
1412
  return static_cast<E>(static_cast<underlying_type_t<E>>(lhs) ^ static_cast<underlying_type_t<E>>(rhs));
1413
}
1414
1415
template <typename E, detail::enable_if_t<E, int> = 0>
1416
constexpr E& operator|=(E& lhs, E rhs) noexcept {
1417
  return lhs = (lhs | rhs);
1418
}
1419
1420
template <typename E, detail::enable_if_t<E, int> = 0>
1421
constexpr E& operator&=(E& lhs, E rhs) noexcept {
1422
  return lhs = (lhs & rhs);
1423
}
1424
1425
template <typename E, detail::enable_if_t<E, int> = 0>
1426
constexpr E& operator^=(E& lhs, E rhs) noexcept {
1427
  return lhs = (lhs ^ rhs);
1428
}
1429
1430
} // namespace magic_enum::bitwise_operators
1431
1432
} // namespace magic_enum
1433
1434
#if defined(__clang__)
1435
#  pragma clang diagnostic pop
1436
#elif defined(__GNUC__)
1437
#  pragma GCC diagnostic pop
1438
#elif defined(_MSC_VER)
1439
#  pragma warning(pop)
1440
#endif
1441
1442
#undef MAGIC_ENUM_GET_ENUM_NAME_BUILTIN
1443
#undef MAGIC_ENUM_GET_TYPE_NAME_BUILTIN
1444
#undef MAGIC_ENUM_VS_2017_WORKAROUND
1445
#undef MAGIC_ENUM_ARRAY_CONSTEXPR
1446
#undef MAGIC_ENUM_FOR_EACH_256
1447
1448
#endif // NEARGYE_MAGIC_ENUM_HPP