From 42ad77a888110382919d326b1d791cee7a4914bf Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 9 Mar 2017 15:10:24 -0800 Subject: [core] Avoid -Wundefined-var-template warnings with clang 3.9+ --- include/mbgl/util/enum.hpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'include/mbgl/util') diff --git a/include/mbgl/util/enum.hpp b/include/mbgl/util/enum.hpp index 48ffda463e..369ca86bfd 100644 --- a/include/mbgl/util/enum.hpp +++ b/include/mbgl/util/enum.hpp @@ -11,26 +11,26 @@ namespace mbgl { template class Enum { public: - using Value = std::pair; - - static const char * toString(T t) { - auto it = std::find_if(begin, end, [&] (const auto& v) { return t == v.first; }); - assert(it != end); return it->second; - } - - static optional toEnum(const std::string& s) { - auto it = std::find_if(begin, end, [&] (const auto& v) { return s == v.second; }); - return it == end ? optional() : it->first; - } - -private: - static const Value* begin; - static const Value* end; + static const char * toString(T); + static optional toEnum(const std::string&); }; -#define MBGL_DEFINE_ENUM(type, strings...) \ -const constexpr Enum::Value type##_names[] = strings; \ -template <> const Enum::Value* Enum::begin = std::begin(type##_names); \ -template <> const Enum::Value* Enum::end = std::end(type##_names) +#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 -- cgit v1.2.1