VBVX 0.1.0
Header-only C++23 library for safe, zero-copy parsing of packet buffers.
Loading...
Searching...
No Matches
flags_view.hxx
Go to the documentation of this file.
1#pragma once
2
3#include <concepts>
4#include <type_traits>
5
6namespace vbvx {
7
25template <typename _Tp> struct enable_bitmask_operators : std::false_type {};
26
27template <typename _Tp>
30
31template <typename E>
33constexpr E operator|(E lhs, E rhs) {
34 using T = std::underlying_type_t<E>;
35 return static_cast<E>(static_cast<T>(lhs) | static_cast<T>(rhs));
36}
37
38template <typename E>
40constexpr E operator&(E lhs, E rhs) {
41 using T = std::underlying_type_t<E>;
42 return static_cast<E>(static_cast<T>(lhs) & static_cast<T>(rhs));
43}
44
45template <typename E>
47constexpr E operator^(E lhs, E rhs) {
48 using T = std::underlying_type_t<E>;
49 return static_cast<E>(static_cast<T>(lhs) ^ static_cast<T>(rhs));
50}
51
52template <typename E>
54constexpr E operator~(E val) {
55 using T = std::underlying_type_t<E>;
56 return static_cast<E>(~static_cast<T>(val));
57}
58
59template <typename E>
61constexpr E& operator|=(E& lhs, E rhs) {
62 lhs = lhs | rhs;
63 return lhs;
64}
65
66template <typename E>
68constexpr E& operator&=(E& lhs, E rhs) {
69 lhs = lhs & rhs;
70 return lhs;
71}
72
73template <typename E>
75constexpr E& operator^=(E& lhs, E rhs) {
76 lhs = lhs ^ rhs;
77 return lhs;
78}
79
80template <typename E, std::integral U>
82constexpr E operator<<(E lhs, U shift) {
83 using T = std::underlying_type_t<E>;
84 return static_cast<E>(static_cast<T>(lhs) << shift);
85}
86
87template <typename E, std::integral U>
89constexpr E operator>>(E lhs, U shift) {
90 using T = std::underlying_type_t<E>;
91 return static_cast<E>(static_cast<T>(lhs) >> shift);
92}
93
94template <typename BitmaskEnum>
95 requires std::is_enum_v<BitmaskEnum>
96class ConstFlagsView;
97
103template <typename BitmaskEnum>
104 requires std::is_enum_v<BitmaskEnum>
106public:
107 constexpr explicit FlagsView(BitmaskEnum& flags) : flags_ref_(flags) {}
108
109 constexpr auto set(BitmaskEnum mask) -> FlagsView& {
110 flags_ref_ |= mask;
111 return *this;
112 }
113
114 constexpr auto clear(BitmaskEnum mask) -> FlagsView& {
115 flags_ref_ &= ~mask;
116 return *this;
117 }
118
119 constexpr auto toggle(BitmaskEnum mask) -> FlagsView& {
120 flags_ref_ ^= mask;
121 return *this;
122 }
123
124 constexpr auto reset() -> FlagsView& {
125 flags_ref_ = static_cast<BitmaskEnum>(0);
126 return *this;
127 }
128
129 constexpr bool has(BitmaskEnum mask) const {
130 return (flags_ref_ & mask) != static_cast<BitmaskEnum>(0);
131 }
132
133 constexpr bool has_all(BitmaskEnum mask) const {
134 return (flags_ref_ & mask) == mask;
135 }
136
137 constexpr auto value() const -> BitmaskEnum { return flags_ref_; }
138 constexpr operator BitmaskEnum() const { return flags_ref_; }
139
140 constexpr operator ConstFlagsView<BitmaskEnum>() const {
141 return ConstFlagsView<BitmaskEnum>(flags_ref_);
142 }
143
144private:
145 BitmaskEnum& flags_ref_;
146};
147
153template <typename BitmaskEnum>
154 requires std::is_enum_v<BitmaskEnum>
156public:
157 constexpr explicit ConstFlagsView(const BitmaskEnum& flags)
158 : flags_ref_(flags) {}
159
160 constexpr bool has(BitmaskEnum mask) const {
161 return (flags_ref_ & mask) != static_cast<BitmaskEnum>(0);
162 }
163
164 constexpr bool has_all(BitmaskEnum mask) const {
165 return (flags_ref_ & mask) == mask;
166 }
167
168 constexpr auto value() const -> BitmaskEnum { return flags_ref_; }
169 constexpr operator BitmaskEnum() const { return flags_ref_; }
170
171private:
172 const BitmaskEnum& flags_ref_;
173};
174
175} // namespace vbvx
A zero-copy const view for a bitmask enum.
Definition flags_view.hxx:155
constexpr auto value() const -> BitmaskEnum
Definition flags_view.hxx:168
constexpr ConstFlagsView(const BitmaskEnum &flags)
Definition flags_view.hxx:157
constexpr bool has(BitmaskEnum mask) const
Definition flags_view.hxx:160
constexpr bool has_all(BitmaskEnum mask) const
Definition flags_view.hxx:164
constexpr auto toggle(BitmaskEnum mask) -> FlagsView &
Definition flags_view.hxx:119
constexpr FlagsView(BitmaskEnum &flags)
Definition flags_view.hxx:107
constexpr auto reset() -> FlagsView &
Definition flags_view.hxx:124
constexpr bool has_all(BitmaskEnum mask) const
Definition flags_view.hxx:133
constexpr auto clear(BitmaskEnum mask) -> FlagsView &
Definition flags_view.hxx:114
constexpr auto set(BitmaskEnum mask) -> FlagsView &
Definition flags_view.hxx:109
constexpr auto value() const -> BitmaskEnum
Definition flags_view.hxx:137
constexpr bool has(BitmaskEnum mask) const
Definition flags_view.hxx:129
Definition arp.hxx:11
constexpr E & operator&=(E &lhs, E rhs)
Definition flags_view.hxx:68
constexpr E operator|(E lhs, E rhs)
Definition flags_view.hxx:33
constexpr E operator~(E val)
Definition flags_view.hxx:54
constexpr E & operator|=(E &lhs, E rhs)
Definition flags_view.hxx:61
constexpr E operator<<(E lhs, U shift)
Definition flags_view.hxx:82
constexpr E operator>>(E lhs, U shift)
Definition flags_view.hxx:89
constexpr E operator^(E lhs, E rhs)
Definition flags_view.hxx:47
constexpr bool enable_bitmask_operators_v
Definition flags_view.hxx:28
constexpr E operator&(E lhs, E rhs)
Definition flags_view.hxx:40
constexpr E & operator^=(E &lhs, E rhs)
Definition flags_view.hxx:75
Enable bitwise operators for an enum class.
Definition flags_view.hxx:25