#pragma once #ifdef VC_ENABLE_REFLECTION #define VC_ENUM_METADATA(NAME) static inline util::EnumMetadata NAME##Meta { #define VC_ENUM_END }; #include #include #include namespace util { template class EnumMetadata { public: EnumMetadata( std::initializer_list> items ) : items(items) { for (const auto& [name, item] : items) { names[item] = name; } } std::string_view getName(EnumT item) const { const auto& found = names.find(item); if (found == names.end()) { return ""; } return found->second; } std::string getNameString(EnumT item) const { return std::string(getName(item)); } bool getItem(std::string_view name, EnumT& dst) const { const auto& found = items.find(name); if (found == items.end()) { return false; } dst = found->second; return true; } size_t size() const { return items.size(); } private: std::map items; std::map names; }; } #else #include #define VC_ENUM_METADATA(NAME) \ struct NAME##__PAIR {const char* n; NAME i;}; \ [[maybe_unused]] static inline std::initializer_list NAME##_PAIRS { #define VC_ENUM_END }; #endif // VC_ENABLE_REFLECTION