17#ifndef FORTRAN_COMMON_ENUM_CLASS_H_
18#define FORTRAN_COMMON_ENUM_CLASS_H_
25constexpr std::size_t CountEnumNames(
const char *p) {
32 }
else if (*p !=
' ') {
39template <std::
size_t ITEMS>
40constexpr std::array<std::string_view, ITEMS> EnumNames(
const char *p) {
41 std::array<std::string_view, ITEMS> result{
""};
43 const char *start{
nullptr};
45 if (*p ==
',' || *p ==
' ') {
48 std::string_view{start,
static_cast<std::size_t
>(p - start)};
56 result[at] = std::string_view{start,
static_cast<std::size_t
>(p - start)};
61#define ENUM_CLASS(NAME, ...) \
62 enum class NAME { __VA_ARGS__ }; \
63 [[maybe_unused]] static constexpr std::size_t NAME##_enumSize{ \
64 ::Fortran::common::CountEnumNames(#__VA_ARGS__)}; \
65 [[maybe_unused]] static inline std::size_t EnumToInt(NAME e) { \
66 return static_cast<std::size_t>(e); \
68 [[maybe_unused]] static inline std::string_view EnumToString(NAME e) { \
69 static const constexpr auto names{ \
70 ::Fortran::common::EnumNames<NAME##_enumSize>(#__VA_ARGS__)}; \
71 return names[static_cast<std::size_t>(e)]; \
73 [[maybe_unused]] inline void ForEach##NAME(std::function<void(NAME)> f) { \
74 for (std::size_t i{0}; i < NAME##_enumSize; ++i) { \
75 f(static_cast<NAME>(i)); \
Definition: bit-population-count.h:20