From 373121c38d315af374acd0fc7ec2d415fcc4a6c5 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 21 May 2018 11:55:19 +0200 Subject: [PATCH] Allow Color to be constexpr --- Minetestmapper/Color.cpp | 57 +++++++++++++++++----------------------- Minetestmapper/Color.h | 27 +++++++++---------- 2 files changed, 37 insertions(+), 47 deletions(-) diff --git a/Minetestmapper/Color.cpp b/Minetestmapper/Color.cpp index e3e9c08..a360b74 100644 --- a/Minetestmapper/Color.cpp +++ b/Minetestmapper/Color.cpp @@ -5,44 +5,36 @@ #include #include #include -#include #include #include #include +#include -class ColorTable : public std::map -{ -public: - ColorTable() - { - map &table = *this; - table["white"] = Color(0xff, 0xff, 0xff); - table["black"] = Color(0, 0, 0); - table["gray"] = Color(0x7f, 0x7f, 0x7f); - table["grey"] = Color(0x7f, 0x7f, 0x7f); +static const std::unordered_map colorTable{ + {"white", Color(0xff, 0xff, 0xff)}, + {"black", Color(0, 0, 0)}, + {"gray", Color(0x7f, 0x7f, 0x7f)}, + {"grey", Color(0x7f, 0x7f, 0x7f)}, - table["red"] = Color(0xff, 0, 0); - table["green"] = Color(0, 0xff, 0); - table["blue"] = Color(0, 0, 0xff); + {"red", Color(0xff, 0, 0)}, + {"green", Color(0, 0xff, 0)}, + {"blue", Color(0, 0, 0xff)}, - table["yellow"] = Color(0xff, 0xff, 0); - table["magenta"] = Color(0xff, 0, 0xff); - table["fuchsia"] = Color(0xff, 0, 0xff); - table["cyan"] = Color(0, 0xff, 0xff); - table["aqua"] = Color(0, 0xff, 0xff); + {"yellow", Color(0xff, 0xff, 0)}, + {"magenta", Color(0xff, 0, 0xff)}, + {"fuchsia", Color(0xff, 0, 0xff)}, + {"cyan", Color(0, 0xff, 0xff)}, + {"aqua", Color(0, 0xff, 0xff)}, - table["orange"] = Color(0xff, 0x7f, 0); - table["chartreuse"] = Color(0x7f, 0xff, 0); - table["pink"] = Color(0xff, 0, 0x7f); - table["violet"] = Color(0x7f, 0, 0xff); - table["springgreen"] = Color(0, 0xff, 0x7f); - table["azure"] = Color(0, 0x7f, 0xff); + {"orange", Color(0xff, 0x7f, 0)}, + {"chartreuse", Color(0x7f, 0xff, 0)}, + {"pink", Color(0xff, 0, 0x7f)}, + {"violet", Color(0x7f, 0, 0xff)}, + {"springgreen", Color(0, 0xff, 0x7f)}, + {"azure", Color(0, 0x7f, 0xff)}, - table["brown"] = Color(0x7f, 0x3f, 0); - } + {"brown", Color(0x7f, 0x3f, 0)}, }; -ColorTable colorTable; - // alpha: // 0: don't expect/allow alpha @@ -57,11 +49,11 @@ Color::Color(const std::string &color, int alpha) colormod = color.substr(pos); } - if (basecolor[0] != '#') { // Color name std::transform(basecolor.begin(), basecolor.end(), basecolor.begin(), ::tolower); - if (colorTable.count(basecolor) > 0) { - *this = colorTable[basecolor]; + auto colorTableIter = colorTable.find(basecolor); + if (colorTableIter != colorTable.end()) { + *this = colorTableIter->second; } else { throw std::runtime_error(std::string("Symbolic color '") + color + "' not known, or color does not begin with #"); @@ -219,4 +211,3 @@ Color::Color(const std::string &color, int alpha) } } } - diff --git a/Minetestmapper/Color.h b/Minetestmapper/Color.h index b0c8018..78aeff8 100644 --- a/Minetestmapper/Color.h +++ b/Minetestmapper/Color.h @@ -4,15 +4,15 @@ #include struct Color { - Color() = default; - Color(uint32_t c): r((c >> 16) & 0xff), g((c >> 8) & 0xff), b((c >> 0) & 0xff ), a((c >> 24) & 0xff) {}; - Color(uint8_t r, uint8_t g, uint8_t b): r(r), g(g), b(b), a(0xff) {}; - Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a): r(r), g(g), b(b), a(a) {}; - Color(const std::string& color, int alpha = 1); + constexpr Color() = default; + constexpr Color(uint32_t c) : r((c >> 16) & 0xff), g((c >> 8) & 0xff), b((c >> 0) & 0xff), a((c >> 24) & 0xff){}; + constexpr Color(uint8_t r, uint8_t g, uint8_t b) : r(r), g(g), b(b), a(0xff){}; + constexpr Color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) : r(r), g(g), b(b), a(a){}; + Color(const std::string &color, int alpha = 1); Color &operator=(const Color &c) = default; - unsigned to_uint() const { return (unsigned(a) << 24) + (unsigned(r) << 16) + (unsigned(g) << 8) + unsigned(b); } + constexpr unsigned to_uint() const { return (unsigned(a) << 24) + (unsigned(r) << 16) + (unsigned(g) << 8) + unsigned(b); } //libgd treats 127 as transparent, and 0 as opaque ... - int to_libgd() const { return (((0xff - int(a)) >> 1) << 24) + (int(r) << 16) + (int(g) << 8) + int(b); } + constexpr int to_libgd() const { return (((0xff - int(a)) >> 1) << 24) + (int(r) << 16) + (int(g) << 8) + int(b); } uint8_t r{0}; uint8_t g{0}; uint8_t b{0}; @@ -21,12 +21,12 @@ struct Color { struct ColorEntry { enum flags { - FlagNone = 0x00, - FlagIgnore = 0x01, - FlagAir = 0x02, + FlagNone = 0x00, + FlagIgnore = 0x01, + FlagAir = 0x02, }; ColorEntry() = default; - ColorEntry(uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t t, uint8_t f): r(r), g(g), b(b), a(a), t(t), f(f) {}; + ColorEntry(uint8_t r, uint8_t g, uint8_t b, uint8_t a, uint8_t t, uint8_t f) : r(r), g(g), b(b), a(a), t(t), f(f){}; inline Color to_color() const { return Color(r, g, b, a); } uint8_t r{0}; uint8_t g{0}; @@ -36,9 +36,8 @@ struct ColorEntry { uint8_t f{0}; }; -struct HeightMapColor -{ - HeightMapColor(int h0, Color c0, int h1, Color c1) : height{ h0, h1 }, color{ c0, c1 } {} +struct HeightMapColor { + HeightMapColor(int h0, Color c0, int h1, Color c1) : height{h0, h1}, color{c0, c1} {} int height[2]; Color color[2]; };