From 7cf452da77206e8fdfcb64062d2fd2c0ea84ccc0 Mon Sep 17 00:00:00 2001 From: artemp Date: Wed, 11 Dec 2013 13:56:11 -0500 Subject: [PATCH] generic ```to_integral``` helper function (convert strongly typed enumeration values to underlying type) --- include/mapnik/symbolizer.hpp | 7 ++++++- src/symbolizer_keys.cpp | 12 ++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/mapnik/symbolizer.hpp b/include/mapnik/symbolizer.hpp index 44ed70f4f..9bc8dba49 100644 --- a/include/mapnik/symbolizer.hpp +++ b/include/mapnik/symbolizer.hpp @@ -370,11 +370,16 @@ boost::optional get_optional(symbolizer_base const& sym, keys key) return boost::optional(); } +template +constexpr auto to_integral(Enum e) -> typename std::underlying_type::type +{ + return static_cast::type>(e); +} + typedef std::tuple > property_meta_type; property_meta_type const& get_meta(mapnik::keys key); mapnik::keys get_key(std::string const& name); - // concrete symbolizer types struct MAPNIK_DECL point_symbolizer : public symbolizer_base {}; struct MAPNIK_DECL line_symbolizer : public symbolizer_base {}; diff --git a/src/symbolizer_keys.cpp b/src/symbolizer_keys.cpp index f553fb622..ec15d3efd 100644 --- a/src/symbolizer_keys.cpp +++ b/src/symbolizer_keys.cpp @@ -101,13 +101,13 @@ mapnik::keys get_key(std::string const& name) { std::string name_copy(name); boost::algorithm::replace_all(name_copy,"_","-"); - for (unsigned i=0;i(keys::MAX_SYMBOLIZER_KEY);++i) + for (unsigned i=0; i< to_integral(keys::MAX_SYMBOLIZER_KEY) ; ++i) { - property_meta_type const& item = key_meta[i]; - if (name_copy == std::get<0>(item)) - { - return static_cast(i); - } + property_meta_type const& item = key_meta[i]; + if (name_copy == std::get<0>(item)) + { + return static_cast(i); + } } throw std::runtime_error("no key found for '" + name + "'"); return static_cast(0);