2019-11-21 11:14:13 +07:00
2019-11-21 11:14:13 +07:00
2019-11-20 20:15:27 +07:00
2019-11-21 11:14:13 +07:00
2019-11-20 20:15:27 +07:00
2019-11-20 20:15:27 +07:00
2019-11-20 20:15:27 +07:00
2019-11-20 20:15:27 +07:00
2019-11-20 20:15:27 +07:00
2019-11-21 03:55:11 +07:00
2019-11-20 20:15:27 +07:00
2019-11-21 11:14:13 +07:00

enum.hpp

travis appveyor codecov language license paypal

Installation

enum.hpp is a header-only library. All you need to do is copy the headers files from headers directory into your project and include them:

#include "enum.hpp/enum.hpp"

Also, you can add the root repository directory to your cmake project:

add_subdirectory(external/enum.hpp)
target_link_libraries(your_project_target enum.hpp)

Examples

Declarations

ENUM_HPP_DECL(debug_level, int,
    (level_info)
    (level_warning)
    (level_error))

// equivalent to:

enum debug_level : int {
    level_info,
    level_warning,
    level_error,
};

struct debug_level_traits {
    static constexpr std::size_t size = 3;

    static constexpr const debug_level values[] = {
        level_info,
        level_warning,
        level_warning
    };

    static constexpr const std::string_view names[] = {
        "level_info",
        "level_warning",
        "level_warning"
    };

    static constexpr std::string_view to_string(
        debug_level e) noexcept;

    static debug_level from_string(
        std::string_view name);

    static constexpr bool from_string_nothrow(
        std::string_view name,
        debug_level& result) noexcept;
};
ENUM_HPP_CLASS_DECL(color, unsigned,
    (red = 1 << 0)
    (green = 1 << 1)
    (blue = 1 << 2)
    (white = red | green | blue))

// equivalent to:

enum class color : unsigned {
    red = 1 << 0,
    green = 1 << 1,
    blue = 1 << 2,
    white = red | green | blue,
};

struct color_traits {
    static constexpr std::size_t size = 4;

    static constexpr const color values[] = {
        color::red,
        color::green,
        color::blue,
        color::white
    };

    static constexpr const std::string_view names[] = {
        "red",
        "green",
        "blue",
        "white"
    };

    static constexpr std::string_view to_string(
        color e) noexcept;

    static color from_string(
        std::string_view name);

    static constexpr bool from_string_nothrow(
        std::string_view name,
        color& result) noexcept;
};

Traits using

ENUM_HPP_CLASS_DECL(color, unsigned, red, green, blue)

// size
color_traits::size; // 3

// to_string
color_traits::to_string(color::red); // returns "red";
color_traits::to_string(color(42)); // returns "";

// from_string
color_traits::from_string("green"); // returns color::green;
color_traits::from_string("error"); // throws enum_hpp::exception

// from_string_nothrow
color result;
bool success = color_traits::from_string_nothrow("blue", result);
// success == true, result == color::blue

// names
for ( auto n : color_traits::names ) {
    std::cout << n << ",";
}
// prints red,green,blue

Alternatives

Better Enums

  • Low variadic macros limit (64)
  • Replaces C++ enum semantics to custom class

wise_enum

Magic Enum

  • Amazing but requires at least GCC 9.0

License (MIT)

Languages
C++ 96.1%
CMake 3.9%