From 2e927cd85dede4b09ed2da304847459e9f444880 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 12 Nov 2021 14:46:25 +0000 Subject: [PATCH] constexpr for enum_type --- include/etl/enum_type.h | 18 +++++++++--------- test/test_enum_type.cpp | 27 ++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/include/etl/enum_type.h b/include/etl/enum_type.h index caa43afe..23210a24 100644 --- a/include/etl/enum_type.h +++ b/include/etl/enum_type.h @@ -84,15 +84,15 @@ SOFTWARE. //***************************************************************************** #define ETL_DECLARE_ENUM_TYPE(TypeName, ValueType) \ typedef ValueType value_type; \ - TypeName() : value(static_cast(value_type())) {} \ - TypeName(const TypeName &other) : value(other.value) {} \ - TypeName(enum_type value_) : value(value_) {} \ - TypeName& operator=(const TypeName &other) {value = other.value; return *this;} \ - explicit TypeName(value_type value_) : value(static_cast(value_)) {} \ - operator value_type() const {return static_cast(value);} \ - value_type get_value() const {return static_cast(value);} \ - enum_type get_enum() const {return value;} \ - const char* c_str() const \ + ETL_CONSTEXPR TypeName() : value(static_cast(value_type())) {} \ + ETL_CONSTEXPR TypeName(const TypeName &other) : value(other.value) {} \ + ETL_CONSTEXPR TypeName(enum_type value_) : value(value_) {} \ + ETL_CONSTEXPR14 TypeName& operator=(const TypeName &other) {value = other.value; return *this;} \ + ETL_CONSTEXPR explicit TypeName(value_type value_) : value(static_cast(value_)) {} \ + ETL_CONSTEXPR operator value_type() const {return static_cast(value);} \ + ETL_CONSTEXPR value_type get_value() const {return static_cast(value);} \ + ETL_CONSTEXPR enum_type get_enum() const {return value;} \ + ETL_CONSTEXPR14 const char* c_str() const \ { \ switch (value) \ { diff --git a/test/test_enum_type.cpp b/test/test_enum_type.cpp index 49712a53..7e83e280 100644 --- a/test/test_enum_type.cpp +++ b/test/test_enum_type.cpp @@ -53,7 +53,7 @@ namespace SUITE(test_enum_type) { //************************************************************************* - TEST(Values) + TEST(test_values) { CHECK_EQUAL(0, enum_test::value_type(enum_test::ZERO)); CHECK_EQUAL(1, enum_test::value_type(enum_test::ONE)); @@ -61,6 +61,31 @@ namespace CHECK_EQUAL(4, enum_test::value_type(enum_test::FOUR)); } + //************************************************************************* + TEST(test_constexpr_values) + { + constexpr enum_test zero = enum_test::ZERO; + constexpr enum_test zero2(zero); + constexpr enum_test zero3 = zero; + + constexpr int int_zero = zero; + constexpr int int_zero2 = zero.get_value(); + + constexpr enum_test enum_zero = zero; + constexpr enum_test enum_zero2 = zero.get_enum(); + + constexpr const char* string_zero = zero.c_str(); + + CHECK_EQUAL(0, zero.get_value()); + CHECK_EQUAL(0, zero2.get_value()); + CHECK_EQUAL(0, zero3.get_value()); + CHECK_EQUAL(0, int_zero); + CHECK_EQUAL(0, int_zero2); + CHECK_EQUAL(0, enum_zero.get_value()); + CHECK_EQUAL(0, enum_zero2.get_value()); + CHECK_EQUAL(std::string("ZERO"), std::string(string_zero)); + } + //************************************************************************* TEST(test_c_str) {