fork download
  1. #include <iostream>
  2. #include <bitset>
  3.  
  4. std::bitset<4> flag_out(int f) {
  5. return std::bitset<4>(f);
  6. }
  7.  
  8. #include <climits>
  9. // For CHAR_BIT.
  10. #include <cstdint>
  11. // For uint8_t.
  12.  
  13. // Underlying flag type. Change as needed. Should remain unsigned.
  14. typedef uint8_t flag_t;
  15.  
  16. // Helper functions, to provide cleaner syntax to the enum.
  17. // Not actually necessary, they'll be evaluated at compile time either way.
  18. constexpr flag_t flag(int f) {
  19. return 1 << f;
  20. }
  21. constexpr flag_t fl_validate(int f) {
  22. return (f ? (1 << f) + fl_validate(f - 1) : 1);
  23. }
  24. constexpr flag_t register_invalids(int f) {
  25. return static_cast<flag_t>(-1) - fl_validate(f - 1);
  26. }
  27.  
  28. // List of available flags.
  29. enum BitFlag : flag_t {
  30. FFalse = flag(0), // 0001
  31. FTrue = flag(1), // 0010
  32. FDefault = flag(2), // 0100
  33. FToggle = flag(3), // 1000
  34.  
  35. // ...
  36.  
  37. // Number of defined flags.
  38. FLAG_COUNT = 4,
  39. // Indicator for invalid flags.
  40. FLAG_INVALID = register_invalids(FLAG_COUNT),
  41. // Maximum number of available flags.
  42. FLAG_MAX = sizeof(flag_t) * CHAR_BIT
  43. };
  44.  
  45. void func(flag_t f) {
  46. if (f & FLAG_INVALID) throw "Invalid flags, yo!";
  47. if (f & FFalse) std::cout << "Flag: FFalse." << std::endl;
  48. if (f & FTrue) std::cout << "Flag: FTrue." << std::endl;
  49. if (f & FDefault) std::cout << "Flag: FDefault." << std::endl;
  50. if (f & FToggle) std::cout << "Flag: FToggle." << std::endl;
  51. std::cout << std::endl;
  52. }
  53.  
  54. int main() {
  55. std::cout << "False: " << flag_out(FFalse) << '\n'
  56. << "True: " << flag_out(FTrue) << '\n'
  57. << "Default: " << flag_out(FDefault) << '\n'
  58. << "Toggle: " << flag_out(FToggle) << '\n'
  59. << "False + True: " << flag_out(FFalse | FTrue) << '\n'
  60. << "False + Default: " << flag_out(FFalse | FDefault) << '\n'
  61. << "False + Toggle: " << flag_out(FFalse | FToggle) << '\n'
  62. << "True + Default: " << flag_out(FTrue | FDefault) << '\n'
  63. << "True + Toggle: " << flag_out(FTrue | FToggle) << '\n'
  64. << "Default + Toggle: " << flag_out(FDefault | FToggle) << '\n'
  65. << "False + True + Default: " << flag_out(FFalse | FTrue | FDefault) << '\n'
  66. << "False + True + Toggle: " << flag_out(FFalse | FTrue | FToggle) << '\n'
  67. << "True + Default + Toggle: " << flag_out(FTrue | FDefault | FToggle) << '\n'
  68. << "All four: " << flag_out(FFalse | FTrue | FDefault | FToggle) << std::endl << std::endl;
  69.  
  70. func(FFalse);
  71. func(FFalse | FTrue);
  72. func(FFalse | FDefault);
  73. func(FFalse | FToggle);
  74. func(FFalse | FTrue | FDefault);
  75. func(FFalse | FTrue | FToggle);
  76. func(FFalse | FDefault | FToggle);
  77. func(FFalse | FTrue | FDefault | FToggle);
  78. func(FTrue);
  79. func(FTrue | FDefault);
  80. func(FTrue | FToggle);
  81. func(FTrue | FDefault | FToggle);
  82. func(FDefault);
  83. func(FDefault | FToggle);
  84. func(FToggle);
  85.  
  86. std::cout << "Invalid flags: " << std::bitset<8>(FLAG_INVALID) << std::endl;
  87.  
  88.  
  89. try {
  90. func(16);
  91. } catch (const char* p) {
  92. std::cout << p << std::endl;
  93. }
  94. }
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
False: 0001
True: 0010
Default: 0100
Toggle: 1000
False + True: 0011
False + Default: 0101
False + Toggle: 1001
True + Default: 0110
True + Toggle: 1010
Default + Toggle: 1100
False + True + Default: 0111
False + True + Toggle: 1011
True + Default + Toggle: 1110
All four: 1111

Flag: FFalse.

Flag: FFalse.
Flag: FTrue.

Flag: FFalse.
Flag: FDefault.

Flag: FFalse.
Flag: FToggle.

Flag: FFalse.
Flag: FTrue.
Flag: FDefault.

Flag: FFalse.
Flag: FTrue.
Flag: FToggle.

Flag: FFalse.
Flag: FDefault.
Flag: FToggle.

Flag: FFalse.
Flag: FTrue.
Flag: FDefault.
Flag: FToggle.

Flag: FTrue.

Flag: FTrue.
Flag: FDefault.

Flag: FTrue.
Flag: FToggle.

Flag: FTrue.
Flag: FDefault.
Flag: FToggle.

Flag: FDefault.

Flag: FDefault.
Flag: FToggle.

Flag: FToggle.

Invalid flags: 11110000
Invalid flags, yo!