Skip to content

Commit 5818aa2

Browse files
committed
Added test case/example for usage with enum class
Signed-off-by: Nils Schubert <nilslpschubert@gmail.com>
1 parent cef3add commit 5818aa2

File tree

2 files changed

+71
-9
lines changed

2 files changed

+71
-9
lines changed

nautilus/include/nautilus/val_enum.hpp

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,43 @@ class val<T> {
2020
using raw_type = underlying_type_t;
2121
using basic_type = raw_type;
2222

23-
val() : value() {}
24-
2523
#ifdef ENABLE_TRACING
26-
val(val<underlying_type_t> t) : state(t.state), value((T) details::getRawValue(t)) {}
27-
val(val<T>& t) : state(tracing::traceCopy(t.state)), value(t.value) {}
28-
val(val<T>&& t) : state(t.state), value(t.value) {}
29-
val(T val) : state(tracing::traceConstant((underlying_type_t) val)), value(val) {}
24+
template<T>
25+
requires std::is_enum_v<T> && (!std::is_convertible_v<T, std::underlying_type_t<T>>)
26+
val(T val) : state(tracing::traceConstant(static_cast<std::underlying_type_t<T>>(val))), value(static_cast<std::underlying_type_t<T>>(val)) {}
27+
28+
template<T>
29+
requires std::is_enum_v<T> && (!std::is_convertible_v<T, std::underlying_type_t<T>>)
30+
val(val<T>& val) : state(tracing::traceConstant(static_cast<std::underlying_type_t<T>>(val))), value(static_cast<std::underlying_type_t<T>>(val)) {}
31+
val(val<underlying_type_t> t) : state(t.state), value((T) details::getRawValue(t)) {
32+
}
33+
val(val<T>& t) : state(tracing::traceCopy(t.state)), value(t.value) {
34+
}
35+
val(val<T>&& t) : state(t.state), value(t.value) {
36+
}
37+
val(T val) : state(tracing::traceConstant((underlying_type_t) val)), value(val) {
38+
}
3039
#else
31-
val(val<underlying_type_t> t) : value((T) details::getRawValue(t)) {}
32-
val(val<T>& t) : value(t.value) {}
33-
val(T val) : value(val) {}
40+
val(val<underlying_type_t> t) : value((T) details::getRawValue(t)) {
41+
}
42+
val(val<T>& t) : value(t.value) {
43+
}
44+
val(T val) : value(val) {
45+
}
3446
#endif
3547

48+
template<typename RHS>
49+
requires std::is_enum_v<RHS> && (!std::is_convertible_v<RHS, std::underlying_type_t<RHS>>)
50+
bool operator==(const RHS& other) const {
51+
return val(value) == val(static_cast<std::underlying_type_t<RHS>>(other));
52+
}
53+
54+
template<typename RHS>
55+
requires std::is_enum_v<RHS> && (!std::is_convertible_v<RHS, std::underlying_type_t<RHS>>)
56+
bool operator!=(const RHS& other) const {
57+
return val(value) != val(static_cast<std::underlying_type_t<RHS>>(other));
58+
}
59+
3660
operator val<underlying_type_t>() const {
3761
return value;
3862
}

nautilus/test/execution-tests/EnumFunction.hpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
#pragma once
22

33
#include <nautilus/Engine.hpp>
4+
#include <nautilus/val.hpp>
45

56
namespace nautilus {
67

78
enum Color { BLUE, GREEN };
9+
enum class LogLevel : uint8_t { LOG_NONE = 1, LOG_FATAL_ERROR = 2, LOG_ERROR = 3, LOG_WARNING = 4, LOG_INFO = 5, LOG_DEBUG = 6, LOG_TRACE = 7 };
10+
811

912
val<bool> handleEnum(val<Color> enumVal) {
1013
return enumVal == Color::BLUE;
1114
}
1215

16+
val<bool> handleEnumLogLevel(val<LogLevel> enumVal) {
17+
return enumVal == LogLevel::LOG_DEBUG || enumVal == LogLevel::LOG_INFO;
18+
}
19+
1320
val<int32_t> isEnum(val<Color> enumVal) {
1421
if (enumVal == Color::BLUE) {
1522
return 1;
@@ -33,7 +40,38 @@ int32_t enumFunction(Color value) {
3340
}
3441
}
3542

43+
auto enumClassFunction(LogLevel level) {
44+
switch (level) {
45+
46+
case LogLevel::LOG_NONE:
47+
return 42;
48+
break;
49+
case LogLevel::LOG_FATAL_ERROR:
50+
return 42;
51+
break;
52+
case LogLevel::LOG_ERROR:
53+
return 42;
54+
break;
55+
case LogLevel::LOG_WARNING:
56+
return 42;
57+
break;
58+
case LogLevel::LOG_INFO:
59+
return 42;
60+
break;
61+
case LogLevel::LOG_DEBUG:
62+
return 42;
63+
break;
64+
case LogLevel::LOG_TRACE:
65+
return 42;
66+
break;
67+
}
68+
}
69+
3670
val<int32_t> callEnumFunction(val<Color> enumVal) {
3771
return invoke(enumFunction, enumVal);
3872
}
73+
74+
val<int32_t> callEnumClassFunction(val<LogLevel> enumClassVal) {
75+
return invoke(enumClassFunction, enumClassVal);
76+
}
3977
} // namespace nautilus

0 commit comments

Comments
 (0)