@@ -20,19 +20,43 @@ class val<T> {
20
20
using raw_type = underlying_type_t ;
21
21
using basic_type = raw_type;
22
22
23
- val () : value() {}
24
-
25
23
#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
+ }
30
39
#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
+ }
34
46
#endif
35
47
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
+
36
60
operator val<underlying_type_t >() const {
37
61
return value;
38
62
}
0 commit comments