MY_ENUM is a small c++ macro library to add compile-time introspection to c++ enum classes.
For example MY_ENUM(FooBar, int, (foo, bar));
defines an enum class
enum class FooBar : int {
foo,
bar
};
with the following free functions:
// Returns corresponding string of given value
//
// Preconditions: value must be a valid enum value, i.e. FooBar::foo, or
// FooBar::bar.
//
std::string toString(FooBar value);
// Returns corresponding string of given value, or `defaultIfInvalid` if the
// given value does not correspond to an enum element.
//
std::string tryToString(FooBar value, string_view defaultIfInvalid);
// Returns corresponding string view of given value
//
// Preconditions: value must be a valid enum value, i.e. FooBar::foo, or
// FooBar::bar.
//
string_view toStringView(FooBar value);
// Returns pretty string representation of given value
//
// Preconditions: value must be a valid enum value, i.e. FooBar::foo, or
// FooBar::bar.
//
std::string toPretty(FooBar value);
// Sets enum given corresponding string, if string is valid (i.e. "foo" or
// "bar"). Returns false otherwise.
//
bool trySetFromString(FooBar& value, std::string str);
// Sets enum given corresponding string, if string matches case-insensitive
// (i.e. "foo" and "Foo" will both match). Returns false otherwise.
//
bool trySetFromStringCaseInsensitive(FooBar& value, string_view str);
// Returns count of enum type. First argument is needed for ADL only.
//
constexpr size_t getCount(FooBar) {
return 2;
}
// Returns string views of enum type. First argument is needed for ADL only.
std::array<string_view, 2> getStrings(FooBar) {
return {"foo", "bar"};
}
// Returns string view of enum names. First argument is needed for ADL only.
string_view getStringOfNames(FooBar) {
return "foo, bar";
}
// Returns values of enum type. First argument is needed for ADL only.
constexpr std::array<int, 2> getValues(FooBar) {
return {0, 1};
}
// Returns elements of enum type. First argument is needed for ADL only.
constexpr std::array<FooBar, 2> getElements(FooBar) {
return {FooBar::foo, FooBar::bar};
}
// Returns the position of enum value in the enum class. This is the inverse
// of `getValues(FooBar)[i]`.
constexpr size_t getPosition(FooBar value) {
switch(value) {
case FooBar::foo: { return 0; }
case FooBar::bar: { return 1; }
}
}
// Returns string representation of type name. First argument is needed for
// ADL only.
string_view getTypeName(FooBar) {
return "FooBar";
}
MY_ENUM is a c++ macro library.
- CMake configuration and build steps are tested on MacOS and Linux.
- It depends on the BOOST preprocessor library.
- It depends on a string_view implementation: either std::string_view (c++17), or fmt::string_view from the {fmt} library.
- MY_ENUM tests depend on googletest which are pulled in through git sub-modules.
- The MY_ENUM CliExample depends on CLI11.
In the following, we detail how to build MY_ENUM for Ubuntu 18.04.
Install BOOST preprocessor headers:
sudo apt install libboost-system-dev
Install CLI11 if you want to build the CliExample application:
git clone https://github.com/CLIUtils/CLI11.git
cd CLI11
git checkout v1.9.0
mkdir build
cd build
cmake .. -DCLI11_BUILD_TESTS=OFF
make -j2
sudo make install
Now checkout MY_ENUM from the repo and build the MY_ENUM tests and example:
git clone https://github.com/facebook/MY_ENUM
cd MY_ENUM
git submodule update --init --recursive
mkdir build
cd build
cmake ..
make -j2
- file issues here: https://github.com/facebook/MY_ENUM/issues
See the CONTRIBUTING file for how to help out.
MY_ENUM is MIT licensed, as found in the LICENSE file.