summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2025-05-08 00:15:26 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2025-05-08 00:15:26 +0200
commite1ba7dd7a976b2ce076b9361f761dd51cdf4b4ec (patch)
tree80c76c46ee2678aa39280220d1d6f82bed98ef1c
parent837f696971677b4ed2263e744a9ce6d6d3865b11 (diff)
Add enum underlying utilities
-rw-r--r--MODULE.bazel.lock26
-rw-r--r--asl/base/meta.hpp2
-rw-r--r--asl/base/meta_tests.cpp7
-rw-r--r--asl/base/utility.hpp6
-rw-r--r--asl/base/utility_tests.cpp17
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);
+