Skip to content

Instantly share code, notes, and snippets.

@HalCanary
Last active October 9, 2022 15:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HalCanary/23abe183cba0b6169dcf70a7c8b05f80 to your computer and use it in GitHub Desktop.
Save HalCanary/23abe183cba0b6169dcf70a7c8b05f80 to your computer and use it in GitHub Desktop.
enum X Macro
///////////////////////////////////////////////
// header
#include <string_view>
#define RAINBOW(X) \
X(Red) \
X(Orange) \
X(Yellow) \
X(Green) \
X(Blue) \
X(Indigo) \
X(Violet)
enum class Rainbow {
#define M(X) X,
RAINBOW(M)
#undef M
};
// returns "" on error.
std::string_view RainbowToString(Rainbow);
// returns nullptr on error.
const Rainbow* RainbowFromString(std::string_view);
///////////////////////////////////////////////
// implementation
#include <unordered_map>
std::string_view RainbowToString(Rainbow v) {
switch (v) {
#define M(X) case Rainbow::X: return #X;
RAINBOW(M)
#undef M
}
return "";
}
const Rainbow* RainbowFromString(std::string_view v) {
static const std::unordered_map<std::string_view, Rainbow> m{
#define M(X) {#X, Rainbow::X},
RAINBOW(M)
#undef M
};
auto s = m.find(v);
return s != m.end() ? &(s->second) : nullptr;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment