#pragma once #include #include #include #include namespace mbgl { template class Enum { public: static const char * toString(T); static optional toEnum(const std::string&); }; #define MBGL_DEFINE_ENUM(T, values...) \ \ static const constexpr std::pair T##_names[] = values; \ \ template <> \ const char * Enum::toString(T t) { \ auto it = std::find_if(std::begin(T##_names), std::end(T##_names), \ [&] (const auto& v) { return t == v.first; }); \ assert(it != std::end(T##_names)); return it->second; \ } \ \ template <> \ optional Enum::toEnum(const std::string& s) { \ auto it = std::find_if(std::begin(T##_names), std::end(T##_names), \ [&] (const auto& v) { return s == v.second; }); \ return it == std::end(T##_names) ? optional() : it->first; \ } } // namespace mbgl