@@ -30,6 +30,14 @@ impl AtomicBitset {
30
30
self . words [ index >> WORD_SIZE_SHIFT ] . fetch_or ( mask, ordering) ;
31
31
}
32
32
33
+ #[ inline]
34
+ pub fn reset ( & self , index : usize , ordering : Ordering ) {
35
+ assert ! ( index < self . len) ;
36
+
37
+ let mask = 1 << ( index & WORD_SIZE_MASK ) ;
38
+ self . words [ index >> WORD_SIZE_SHIFT ] . fetch_and ( !mask, ordering) ;
39
+ }
40
+
33
41
#[ inline]
34
42
pub fn get ( & self , index : usize , ordering : Ordering ) -> bool {
35
43
assert ! ( index < self . len) ;
@@ -93,17 +101,15 @@ mod tests {
93
101
fn set_get ( ) {
94
102
let bitset = AtomicBitset :: with_len ( 8 ) ;
95
103
96
- assert ! ( !bitset. get( 0 , Ordering :: Relaxed ) ) ;
97
- bitset. set ( 0 , Ordering :: Relaxed ) ;
98
- assert ! ( bitset. get( 0 , Ordering :: Relaxed ) ) ;
104
+ for index in 0 ..8 {
105
+ assert ! ( !bitset. get( index, Ordering :: Relaxed ) ) ;
99
106
100
- assert ! ( !bitset. get( 3 , Ordering :: Relaxed ) ) ;
101
- bitset. set ( 3 , Ordering :: Relaxed ) ;
102
- assert ! ( bitset. get( 3 , Ordering :: Relaxed ) ) ;
107
+ bitset. set ( index, Ordering :: Relaxed ) ;
108
+ assert ! ( bitset. get( index, Ordering :: Relaxed ) ) ;
103
109
104
- assert ! ( ! bitset. get ( 7 , Ordering :: Relaxed ) ) ;
105
- bitset. set ( 7 , Ordering :: Relaxed ) ;
106
- assert ! ( bitset . get ( 7 , Ordering :: Relaxed ) ) ;
110
+ bitset. reset ( index , Ordering :: Relaxed ) ;
111
+ assert ! ( ! bitset. get ( index , Ordering :: Relaxed ) ) ;
112
+ }
107
113
}
108
114
109
115
#[ test]
0 commit comments