Skip to content

Commit 1ed91fc

Browse files
committed
Add support for Compiler::StaticType bitmasking
1 parent afacb3e commit 1ed91fc

File tree

3 files changed

+63
-6
lines changed

3 files changed

+63
-6
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ install(TARGETS scratchcpp DESTINATION lib)
2626
target_sources(scratchcpp
2727
PUBLIC
2828
include/scratchcpp/global.h
29+
include/scratchcpp/enum_bitmask.h
2930
include/scratchcpp/project.h
3031
include/scratchcpp/scratchconfiguration.h
3132
include/scratchcpp/iengine.h

include/scratchcpp/compiler.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <vector>
77

88
#include "global.h"
9+
#include "enum_bitmask.h"
910
#include "spimpl.h"
1011

1112
namespace libscratchcpp
@@ -31,12 +32,12 @@ class LIBSCRATCHCPP_EXPORT Compiler
3132
public:
3233
enum class StaticType
3334
{
34-
Void,
35-
Number,
36-
Bool,
37-
String,
38-
Pointer,
39-
Unknown
35+
Void = 0,
36+
Number = 1 << 0,
37+
Bool = 1 << 1,
38+
String = 1 << 2,
39+
Pointer = 1 << 3,
40+
Unknown = Number | Bool | String
4041
};
4142

4243
enum class CodeType
@@ -161,4 +162,6 @@ class LIBSCRATCHCPP_EXPORT Compiler
161162
spimpl::unique_impl_ptr<CompilerPrivate> impl;
162163
};
163164

165+
constexpr bool enable_enum_bitmask(Compiler::StaticType);
166+
164167
} // namespace libscratchcpp

include/scratchcpp/enum_bitmask.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
#pragma once
4+
5+
#include <type_traits>
6+
7+
namespace libscratchcpp
8+
{
9+
10+
// https://andreasfertig.com/blog/2024/01/cpp20-concepts-applied
11+
// OR operator |
12+
template<typename T>
13+
constexpr std::enable_if_t<std::conjunction_v<std::is_enum<T>, std::is_same<bool, decltype(enable_enum_bitmask(std::declval<T>()))>>, T> operator|(const T lhs, const T rhs)
14+
{
15+
using underlying = std::underlying_type_t<T>;
16+
return static_cast<T>(static_cast<underlying>(lhs) | static_cast<underlying>(rhs));
17+
}
18+
19+
// OR assignment operator |=
20+
template<typename T>
21+
constexpr std::enable_if_t<std::conjunction_v<std::is_enum<T>, std::is_same<bool, decltype(enable_enum_bitmask(std::declval<T>()))>>, T &> operator|=(T &lhs, const T rhs)
22+
{
23+
using underlying = std::underlying_type_t<T>;
24+
lhs = static_cast<T>(static_cast<underlying>(lhs) | static_cast<underlying>(rhs));
25+
return lhs;
26+
}
27+
28+
// AND operator &
29+
template<typename T>
30+
constexpr std::enable_if_t<std::conjunction_v<std::is_enum<T>, std::is_same<bool, decltype(enable_enum_bitmask(std::declval<T>()))>>, T> operator&(const T lhs, const T rhs)
31+
{
32+
using underlying = std::underlying_type_t<T>;
33+
return static_cast<T>(static_cast<underlying>(lhs) & static_cast<underlying>(rhs));
34+
}
35+
36+
// AND assignment operator &=
37+
template<typename T>
38+
constexpr std::enable_if_t<std::conjunction_v<std::is_enum<T>, std::is_same<bool, decltype(enable_enum_bitmask(std::declval<T>()))>>, T &> operator&=(T &lhs, const T rhs)
39+
{
40+
using underlying = std::underlying_type_t<T>;
41+
lhs = static_cast<T>(static_cast<underlying>(lhs) & static_cast<underlying>(rhs));
42+
return lhs;
43+
}
44+
45+
// NOT operator ~
46+
template<typename T>
47+
constexpr std::enable_if_t<std::conjunction_v<std::is_enum<T>, std::is_same<bool, decltype(enable_enum_bitmask(std::declval<T>()))>>, T> operator~(const T value)
48+
{
49+
using underlying = std::underlying_type_t<T>;
50+
return static_cast<T>(~static_cast<underlying>(value));
51+
}
52+
53+
} // namespace libscratchcpp

0 commit comments

Comments
 (0)