summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-06-10 21:17:23 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-06-13 17:22:05 -0700
commit282e626ac112b1ca7a9bf9f9d4c0239db8fbd97a (patch)
treef83ef7974687a84341dd616b364b2aa5a9c012a8 /include
parent36bef2157595e1455aa55c64c6c526f096dd1c8e (diff)
downloadqtlocation-mapboxgl-282e626ac112b1ca7a9bf9f9d4c0239db8fbd97a.tar.gz
[core] Make enum ↔ string conversion more generic-friendly
Rewrite enum.hpp in such a way that parseConstant can be defined generically for all enumerated types. While there, properly validated enumerated property values.
Diffstat (limited to 'include')
-rw-r--r--include/mbgl/platform/event.hpp31
-rw-r--r--include/mbgl/style/types.hpp10
-rw-r--r--include/mbgl/util/enum.hpp60
3 files changed, 23 insertions, 78 deletions
diff --git a/include/mbgl/platform/event.hpp b/include/mbgl/platform/event.hpp
index f082114946..ee1ce6fa4e 100644
--- a/include/mbgl/platform/event.hpp
+++ b/include/mbgl/platform/event.hpp
@@ -1,7 +1,5 @@
#pragma once
-#include <mbgl/util/enum.hpp>
-
#include <cstdint>
namespace mbgl {
@@ -13,14 +11,6 @@ enum class EventSeverity : uint8_t {
Error,
};
-MBGL_DEFINE_ENUM_CLASS(EventSeverityClass, EventSeverity, {
- { EventSeverity::Debug, "DEBUG" },
- { EventSeverity::Info, "INFO" },
- { EventSeverity::Warning, "WARNING" },
- { EventSeverity::Error, "ERROR" },
- { EventSeverity(-1), "UNKNOWN" },
-})
-
enum class Event : uint8_t {
General,
Setup,
@@ -40,27 +30,6 @@ enum class Event : uint8_t {
Glyph,
};
-MBGL_DEFINE_ENUM_CLASS(EventClass, Event, {
- { Event::General, "General" },
- { Event::Setup, "Setup" },
- { Event::Shader, "Shader" },
- { Event::ParseStyle, "ParseStyle" },
- { Event::ParseTile, "ParseTile" },
- { Event::Render, "Render" },
- { Event::Style, "Style" },
- { Event::Database, "Database" },
- { Event::HttpRequest, "HttpRequest" },
- { Event::Sprite, "Sprite" },
- { Event::Image, "Image" },
- { Event::OpenGL, "OpenGL" },
- { Event::JNI, "JNI" },
- { Event::Android, "Android" },
- { Event::Crash, "Crash" },
- { Event::Glyph, "Glyph" },
- { Event(-1), "Unknown" },
-})
-
-
struct EventPermutation {
const EventSeverity severity;
const Event event;
diff --git a/include/mbgl/style/types.hpp b/include/mbgl/style/types.hpp
index ece56026df..46c0cb3c39 100644
--- a/include/mbgl/style/types.hpp
+++ b/include/mbgl/style/types.hpp
@@ -1,6 +1,6 @@
#pragma once
-#include <mbgl/util/enum.hpp>
+#include <cstdint>
namespace mbgl {
@@ -13,14 +13,6 @@ enum class SourceType : uint8_t {
Annotations
};
-MBGL_DEFINE_ENUM_CLASS(SourceTypeClass, SourceType, {
- { SourceType::Vector, "vector" },
- { SourceType::Raster, "raster" },
- { SourceType::GeoJSON, "geojson" },
- { SourceType::Video, "video" },
- { SourceType::Annotations, "annotations" },
-})
-
namespace style {
enum class VisibilityType : bool {
diff --git a/include/mbgl/util/enum.hpp b/include/mbgl/util/enum.hpp
index 3fbf313aed..48ffda463e 100644
--- a/include/mbgl/util/enum.hpp
+++ b/include/mbgl/util/enum.hpp
@@ -1,52 +1,36 @@
#pragma once
-#include <iosfwd>
+#include <mbgl/util/optional.hpp>
+
+#include <algorithm>
+#include <cassert>
#include <string>
namespace mbgl {
-template <typename Type>
-struct EnumValue {
- const Type value;
- const char *name;
-};
-
-template <typename EnumName, const EnumValue<EnumName> *names, const size_t length>
-struct Enum {
- using Type = EnumName;
- Type value;
- static const constexpr size_t l = length;
-private:
- static constexpr inline bool compare(const char *a, const char *b) {
- return *a == *b && (*a == '\0' || compare(a + 1, b + 1));
- }
- static constexpr inline const char *lookup_type(Type e, EnumValue<Type> const * const list, size_t r) {
- return r == 0 ? "" : list->value == e ? list->name : lookup_type(e, list + 1, r - 1);
- }
- static constexpr inline Type lookup_name(const char *n, EnumValue<Type> const * const list, size_t r) {
- return r == 0 ? Type(-1) : compare(list->name, n) ? list->value : lookup_name(n, list + 1, r - 1);
- }
+template <typename T>
+class Enum {
public:
- inline constexpr Enum(const char *n) : value(lookup_name(n, names, length)) {}
- inline constexpr Enum(const std::string &n) : value(lookup_name(n.c_str(), names, length)) {}
- inline constexpr Enum(Type t) : value(t) {}
-
- inline void operator=(const char *n) { value = lookup_name(n, names, length); }
- inline void operator=(const std::string &n) { *this = n.c_str(); }
- inline void operator=(Type t) { value = t; }
+ using Value = std::pair<const T, const char *>;
- inline constexpr bool valid() const { return value != Type(-1); }
+ 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;
+ }
- inline constexpr const char *c_str() const { return lookup_type(value, names, length); }
- inline std::string str() const { return c_str(); }
+ static optional<T> toEnum(const std::string& s) {
+ auto it = std::find_if(begin, end, [&] (const auto& v) { return s == v.second; });
+ return it == end ? optional<T>() : it->first;
+ }
- inline constexpr operator Type() const { return value; }
+private:
+ static const Value* begin;
+ static const Value* end;
};
-#define MBGL_DEFINE_ENUM_CLASS(name, type, strings...) \
- const constexpr ::mbgl::EnumValue<type> type##_names[] = strings; \
- using name = ::mbgl::Enum<type, type##_names, sizeof(type##_names) / sizeof(::mbgl::EnumValue<type>)>; \
- inline std::ostream& operator<<(std::ostream& os, type t) { return os << name(t).str(); }
+#define MBGL_DEFINE_ENUM(type, strings...) \
+const constexpr Enum<type>::Value type##_names[] = strings; \
+template <> const Enum<type>::Value* Enum<type>::begin = std::begin(type##_names); \
+template <> const Enum<type>::Value* Enum<type>::end = std::end(type##_names)
} // namespace mbgl
-