enum.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <cassert>
  2. #include <string_view>
  3. #include "simple/support/enum.hpp"
  4. using namespace simple::support;
  5. enum class digits
  6. {
  7. zero,
  8. one,
  9. two,
  10. three,
  11. four,
  12. invalid
  13. };
  14. using digit = mapped_enum
  15. <
  16. digits,
  17. digits::invalid,
  18. 2,
  19. std::string_view
  20. >;
  21. template <> digit::guts::map_type digit::guts::map
  22. {{
  23. {"0", "zero"},
  24. {"1", "one"},
  25. {"2", "two"},
  26. {"3", "three"},
  27. {"4", "four"},
  28. }};
  29. int main()
  30. {
  31. assert( digit("one") == digit("1") );
  32. assert( digit("one") == digits::one );
  33. switch(digit("two"))
  34. {
  35. case digits::zero: assert(false); break;
  36. case digits::one: assert(false); break;
  37. case digits::two: assert(true); break;
  38. case digits::three: assert(false); break;
  39. case digits::four: assert(false); break;
  40. case digits::invalid: assert(false); break;
  41. default: assert(false); break;
  42. }
  43. switch(digit("three"))
  44. {
  45. case digits::zero: assert(false); break;
  46. case digits::one: assert(false); break;
  47. case digits::two: assert(false); break;
  48. case digits::three: assert(true); break;
  49. case digits::four: assert(false); break;
  50. case digits::invalid: assert(false); break;
  51. default: assert(false); break;
  52. }
  53. switch(digit("four... but nah, not really"))
  54. {
  55. case digits::zero: assert(false); break;
  56. case digits::one: assert(false); break;
  57. case digits::two: assert(false); break;
  58. case digits::three: assert(false); break;
  59. case digits::four: assert(false); break;
  60. case digits::invalid: assert(true); break;
  61. default: assert(false); break;
  62. }
  63. assert(to_integer(digit("two")) == 2);
  64. assert(to_integer(digits::two) == 2);
  65. return 0;
  66. }