@@ -159,28 +159,35 @@ class atomic_bitset {
159
159
return *this ;
160
160
}
161
161
162
- template <typename T> auto reset (T idx) -> bitset_t {
162
+ template <typename T>
163
+ auto reset (T idx, std::memory_order order = std::memory_order_seq_cst)
164
+ -> bitset_t {
163
165
auto const pos = static_cast <std::size_t >(to_underlying (idx));
164
- return bitset_t {
165
- atomic::fetch_and (storage, static_cast <elem_t >(~(bit << pos)))};
166
- }
167
-
168
- auto reset (std::memory_order order = std::memory_order_seq_cst)
169
- LIFETIMEBOUND -> atomic_bitset & {
170
- atomic::store (storage, elem_t {}, order);
171
- return *this ;
166
+ return bitset_t {atomic::fetch_and (
167
+ storage, static_cast <elem_t >(~(bit << pos)), order)};
172
168
}
173
169
174
170
auto
175
171
reset (lsb_t lsb, msb_t msb,
176
172
std::memory_order order = std::memory_order_seq_cst) -> bitset_t {
177
- return set (lsb, msb, false , order);
173
+ auto const l = to_underlying (lsb);
174
+ auto const m = to_underlying (msb);
175
+ auto const shifted_value = bit_mask<elem_t >(m, l);
176
+ return bitset_t {atomic::fetch_and (storage, ~shifted_value, order)};
178
177
}
179
178
180
179
auto
181
180
reset (lsb_t lsb, length_t len,
182
181
std::memory_order order = std::memory_order_seq_cst) -> bitset_t {
183
- return set (lsb, len, false , order);
182
+ auto const l = to_underlying (lsb);
183
+ auto const length = to_underlying (len);
184
+ return reset (lsb, static_cast <msb_t >(l + length - 1 ), order);
185
+ }
186
+
187
+ auto reset (std::memory_order order = std::memory_order_seq_cst)
188
+ LIFETIMEBOUND -> atomic_bitset & {
189
+ atomic::store (storage, elem_t {}, order);
190
+ return *this ;
184
191
}
185
192
186
193
template <typename T>
@@ -191,6 +198,21 @@ class atomic_bitset {
191
198
atomic::fetch_xor (storage, static_cast <elem_t >(bit << pos), order)};
192
199
}
193
200
201
+ auto flip (lsb_t lsb, msb_t msb,
202
+ std::memory_order order = std::memory_order_seq_cst) -> bitset_t {
203
+ auto const l = to_underlying (lsb);
204
+ auto const m = to_underlying (msb);
205
+ auto const shifted_value = bit_mask<elem_t >(m, l);
206
+ return bitset_t {atomic::fetch_xor (storage, shifted_value, order)};
207
+ }
208
+
209
+ auto flip (lsb_t lsb, length_t len,
210
+ std::memory_order order = std::memory_order_seq_cst) -> bitset_t {
211
+ auto const l = to_underlying (lsb);
212
+ auto const length = to_underlying (len);
213
+ return flip (lsb, static_cast <msb_t >(l + length - 1 ), order);
214
+ }
215
+
194
216
auto flip (std::memory_order order = std::memory_order_seq_cst) -> bitset_t {
195
217
return bitset_t {atomic::fetch_xor (storage, mask, order)};
196
218
}
0 commit comments