diff options
author | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-05-08 00:15:26 +0200 |
---|---|---|
committer | Steven Le Rouzic <steven.lerouzic@gmail.com> | 2025-05-08 00:15:26 +0200 |
commit | e1ba7dd7a976b2ce076b9361f761dd51cdf4b4ec (patch) | |
tree | 80c76c46ee2678aa39280220d1d6f82bed98ef1c | |
parent | 837f696971677b4ed2263e744a9ce6d6d3865b11 (diff) |
Add enum underlying utilities
-rw-r--r-- | MODULE.bazel.lock | 26 | ||||
-rw-r--r-- | asl/base/meta.hpp | 2 | ||||
-rw-r--r-- | asl/base/meta_tests.cpp | 7 | ||||
-rw-r--r-- | asl/base/utility.hpp | 6 | ||||
-rw-r--r-- | asl/base/utility_tests.cpp | 17 |
5 files changed, 34 insertions, 24 deletions
diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 8dca997..a47fe3f 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -90,10 +90,10 @@ "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.11.0/MODULE.bazel": "c3d280bc5ff1038dcb3bacb95d3f6b83da8dd27bba57820ec89ea4085da767ad", + "https://bcr.bazel.build/modules/rules_java/8.11.0/source.json": "302b52a39259a85aa06ca3addb9787864ca3e03b432a5f964ea68244397e7544", "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", - "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2", - "https://bcr.bazel.build/modules/rules_java/8.6.1/source.json": "f18d9ad3c4c54945bf422ad584fa6c5ca5b3116ff55a5b1bc77e5c1210be5960", "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", @@ -142,28 +142,6 @@ }, "selectedYankedVersions": {}, "moduleExtensions": { - "@@rules_java+//java:rules_java_deps.bzl%compatibility_proxy": { - "general": { - "bzlTransitiveDigest": "84xJEZ1jnXXwo8BXMprvBm++rRt4jsTu9liBxz0ivps=", - "usagesDigest": "jTQDdLDxsS43zuRmg1faAjIEPWdLAbDAowI1pInQSoo=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "compatibility_proxy": { - "repoRuleId": "@@rules_java+//java:rules_java_deps.bzl%_compatibility_proxy_repo_rule", - "attributes": {} - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_java+", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { "general": { "bzlTransitiveDigest": "sFhcgPbDQehmbD1EOXzX4H1q/CD5df8zwG4kp4jbvr8=", diff --git a/asl/base/meta.hpp b/asl/base/meta.hpp index c13439a..3675df3 100644 --- a/asl/base/meta.hpp +++ b/asl/base/meta.hpp @@ -309,6 +309,8 @@ template<is_unsigned_integer T> using as_signed_integer = _integer_traits<T>:: template<typename T> concept is_enum = __is_enum(T); +template<is_enum T> using underlying_t = __underlying_type(T); + template<typename T> struct is_uniquely_represented : false_type {}; template<is_integer T> struct is_uniquely_represented<T> : true_type {}; template<is_enum T> struct is_uniquely_represented<T> : true_type {}; diff --git a/asl/base/meta_tests.cpp b/asl/base/meta_tests.cpp index c221dcf..7bae295 100644 --- a/asl/base/meta_tests.cpp +++ b/asl/base/meta_tests.cpp @@ -372,3 +372,10 @@ static_assert(!asl::same_as<asl::decay_t<int[4][2]>, int*>); static_assert(!asl::same_as<asl::decay_t<int[4][2]>, int**>); static_assert(asl::same_as<asl::decay_t<int[4][2]>, int(*)[2]>); static_assert(asl::same_as<asl::decay_t<int(int)>, int(*)(int)>); + +enum EnumU8 : uint8_t {}; +enum EnumI64 : int64_t {}; + +static_assert(asl::same_as<asl::underlying_t<EnumU8>, uint8_t>); +static_assert(asl::same_as<asl::underlying_t<EnumI64>, int64_t>); + diff --git a/asl/base/utility.hpp b/asl/base/utility.hpp index f371ab4..c4801b1 100644 --- a/asl/base/utility.hpp +++ b/asl/base/utility.hpp @@ -69,6 +69,12 @@ constexpr U bit_cast(T value) requires (sizeof(T) == sizeof(U)) return __builtin_bit_cast(U, value); } +template<is_enum T> +constexpr auto to_underlying(T value) +{ + return static_cast<underlying_t<T>>(value); +} + // NOLINTBEGIN(*-macro-parentheses) #define ASL_DELETE_COPY(T) \ T(const T&) = delete; \ diff --git a/asl/base/utility_tests.cpp b/asl/base/utility_tests.cpp index 7e54bb2..ea3e7c6 100644 --- a/asl/base/utility_tests.cpp +++ b/asl/base/utility_tests.cpp @@ -81,3 +81,20 @@ ASL_TEST(forward_like) ASL_TEST_EXPECT(test_fwd_like<int&&>(9) == 4); } +enum class Enum : int // NOLINT +{ + kOne = 1, + kTwo = 2, +}; + +enum Enum2 : int // NOLINT +{ + kOne = 1, + kTwo = 2, +}; + +static_assert(asl::to_underlying(Enum::kOne) == 1); +static_assert(asl::to_underlying(Enum::kTwo) == 2); +static_assert(asl::to_underlying(kOne) == 1); +static_assert(asl::to_underlying(kTwo) == 2); + |