Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Zero value in is_flags enum. #321

Open
rpatters1 opened this issue Dec 5, 2023 · 1 comment
Open

Zero value in is_flags enum. #321

rpatters1 opened this issue Dec 5, 2023 · 1 comment
Milestone

Comments

@rpatters1
Copy link
Contributor

In reading #314, it appears that it is not possible to fully iterate an is_flags enum that has a zero value. This seems like an unfortunate limitation. I have frequently encountered bit-sensitive enums that include a 0 value for clearing out the bits. My code simply needs to iterate the names and values to create Lua constants, and bit-sensitive values are resource-intensive if they don't set is_flags.

@rpatters1
Copy link
Contributor Author

rpatters1 commented Dec 6, 2023

Just to fill this out with a code example:

template <auto Start, auto End, auto Inc, class F>
constexpr void constexpr_for(F&& f)
{
   if constexpr (Start < End)
   {
      f(std::integral_constant<decltype(Start), Start>());
      constexpr_for<Start + Inc, End, Inc>(f);
   }
}

enum APLHABITS
{
   NONE = 0,
   A = 0x0001,
   B = 0x0002,
   C = 0x0004,
   D = 0x0008,
   E = 0x0010,
   F = 0x0020,
   G = 0x0040,
   H = 0x0080,
   I = 0x0100,
   J = 0x0200,
// K = 0x0300, // ignore this one, it's a typo
   L = 0x0400,
   M = 0x0800,
   N = 0x1000,
   O = 0x2000,
   P = 0x4000,
   Q = 0x8000
};

template <>
struct magic_enum::customize::enum_range<APLHABITS> {
   static constexpr bool is_flags = true;
};

void myfunc()
{
   constexpr std::size_t count = magic_enum::enum_count<APLHABITS>();
   printf("%ld ", count);
   constexpr auto names = magic_enum::enum_names<APLHABITS>();
   constexpr_for<0, count, 1>([&](auto i)
   {
      printf("%s:%d ", names[i].data(), magic_enum::enum_value<APLHABITS, i>());
   });
}

When you run my_func it prints

16 A:1 B:2 C:4 D:8 E:16 F:32 G:64 H:128 I:256 J:512 L:1024 M:2048 N:4096 O:8192 P:16384 Q:32768.

I would like it to print

17 NONE:0 A:1 B:2 C:4 D:8 E:16 F:32 G:64 H:128 I:256 J:512 L:1024 M:2048 N:4096 O:8192 P:16384 Q:32768.

while keeping the is_flags set for performance reasons. Is this possible?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants