Documentation can be generated by going to doc/ and running "make". This requires Python. Before this change, the user had to install the mistune library, which is used by the generator. The mistune library is now included in the Better Enums distribution. The generated docs are available at doc/html/index.html. Note that some links won't be local (the GitHub repo, the download link, outgoing links to MSDN, tutorial source in the GitHub repo, and so on). All the pages belonging to the actual docs will be local, however. The online version of the docs can be generated by running "make web". The only difference between the online and offline versions is that the former includes Google Analytics tracking code, and may include social communication buttons, comment section, or other useless things in the future. Also included errata since the last release. Resolves #2. |
||
|---|---|---|
| doc | ||
| example | ||
| script | ||
| test | ||
| .gitattributes | ||
| .gitignore | ||
| CONTRIBUTING.md | ||
| CONTRIBUTORS | ||
| enum.h | ||
| LICENSE | ||
| README.md | ||
Better Enums
Reflective compile-time C++ enum library with clean syntax, in a single header file. For example:
#include <enum.h>
ENUM(Channel, uint8_t, Red = 1, Green, Blue)
defines a type Channel. You can then do natural things such as:
Channel channel = Channel::Green;
channel._to_string(); // Results in the string "Green"
Channel::_from_string("Red"); // Results in Channel::Red
Channel::_from_integral(3); // Checked cast, Channel::Blue
Channel::_size; // Number of channels (3)
Channel::_values()[0]; // Get the first channel
for (Channel channel : Channel::_values()) {
process(channel); // Iterate over all channels
}
// Automatic case checking, just as with a built-in enum.
switch (channel) {
case Channel::Red: break;
case Channel::Green: break;
case Channel::Blue: break;
}
...and more. You can try it live here.
In C++11, everything is available at compile time. You can convert your enums,
loop over them, find their max,
statically enforce conventions, and pass along the results as
template arguments or to constexpr functions. All the reflection is available
for your metaprogramming needs.
The interface is the same for C++98 — you just have to use most of it at run time only. This library does provide scoped and sized enums, something not built into C++98.
See the project page for full documentation.
Installation
Simply add enum.h to your project — that's it.
Then, include it and use the ENUM macro. Your compiler will generate the rich
enums that are missing from standard C++.
Additional features
- No dependencies and no external build tools. Uses only standard C++, though, for C++98, variadic macro support is required.
- Supported and tested on clang, gcc, and msvc.
- Fast compilation. You have to declare a few dozen enums to slow down your
compiler as much as just including
iostreamdoes. - Use any initializers and sparse ranges, just like with a built-in enum.
- Guaranteed size and alignment — you choose the representation type.
- Stream operators supported.
- Does not use the heap and can be compiled with exceptions disabled, for use in minimal freestanding environments.
- The underlying type can be an object type.
Limitations
The biggest limitation is that the ENUM macro can't be used inside a class.
This seems difficult to remove. There is a workaround with typedef
(or using):
ENUM(UniquePrefix_Color, uint8_t, Red, Green, Blue)
struct triplet {
typedef UniquePrefix_Color Color;
Color r, g, b;
};
triplet::Color color;
You can, however, use ENUM inside a namespace.
Contact
Don't hesitate to contact me about features or bugs: antonbachin@yahoo.com, Twitter @better_enums, or open an issue on GitHub.
License and history
Better Enums is released under the BSD 2-clause license. See LICENSE.
The library was originally developed by the author in the winter of 2012-2013 at
Hudson River Trading, as a replacement for an older generator called
BETTER_ENUM.