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