@@ -27,6 +27,7 @@ pub struct HashSet {
27
27
pub set_order : Vec < Key > ,
28
28
next_clean_size : usize ,
29
29
curr_x : usize ,
30
+ prev_x2 : usize ,
30
31
}
31
32
32
33
pub fn bucket ( k : Key ) -> usize {
@@ -66,6 +67,7 @@ impl HashSet {
66
67
set_order : Vec :: with_capacity ( N + 1 ) ,
67
68
next_clean_size : N / 4 ,
68
69
curr_x : 1 ,
70
+ prev_x2 : N + 1 ,
69
71
}
70
72
}
71
73
@@ -89,7 +91,7 @@ impl HashSet {
89
91
}
90
92
Entry :: Full ( bk, k) => {
91
93
self . set [ i] = Entry :: Full ( bn, n) ;
92
- self . register_remove ( k, b) ;
94
+ self . register_remove ( bk , k, b) ;
93
95
self . register_insert ( bn, n, b) ;
94
96
n = k;
95
97
bn = bk;
@@ -111,6 +113,12 @@ impl HashSet {
111
113
let bn = bucket ( n) ;
112
114
let b = self . insert_loop ( bn, n, b) ;
113
115
if self . bkk && self . size == self . next_clean_size {
116
+ let prev_nx2 = N / self . prev_x2 ;
117
+ for ii in 1 ..prev_nx2 {
118
+ let i = ii * self . prev_x2 ;
119
+ let k = ( i << RSHIFT ) - 1 ;
120
+ self . remove_tombstone ( k) ;
121
+ }
114
122
self . curr_x = N / ( N - self . size ( ) ) ;
115
123
let x4 = 4 * self . curr_x ;
116
124
let x2 = 2 * self . curr_x ;
@@ -121,6 +129,7 @@ impl HashSet {
121
129
self . insert_tombstone ( k) ;
122
130
}
123
131
self . next_clean_size += N / x4;
132
+ self . prev_x2 = x2;
124
133
}
125
134
self . register_insert_len ( b - 1 , bn) ;
126
135
}
@@ -134,7 +143,12 @@ impl HashSet {
134
143
loop {
135
144
let i1 = ( i + 1 ) & ( N - 1 ) ;
136
145
match self . set [ i1] {
137
- Entry :: Full ( bk, _) | Entry :: Tombstone ( bk, _) if bk != i1 => {
146
+ Entry :: Full ( bk, k) if bk != i1 => {
147
+ self . register_remove ( bk, k, i1) ;
148
+ self . set [ i] = self . set [ i1] ;
149
+ self . register_insert ( bk, k, i) ;
150
+ }
151
+ Entry :: Tombstone ( bk, _) if bk != i1 => {
138
152
self . set [ i] = self . set [ i1] ;
139
153
}
140
154
_ => {
@@ -154,7 +168,7 @@ impl HashSet {
154
168
Entry :: Empty => { }
155
169
Entry :: Full ( _, k) if k == n => { }
156
170
Entry :: Full ( bk, k) => {
157
- self . register_remove ( k, b) ;
171
+ self . register_remove ( bk , k, b) ;
158
172
self . set [ i] = Entry :: Tombstone ( bn, n) ;
159
173
self . insert_loop ( bk, k, b + 1 ) ;
160
174
}
@@ -164,8 +178,7 @@ impl HashSet {
164
178
}
165
179
}
166
180
167
- fn register_remove ( & mut self , k : Key , b : usize ) {
168
- let bk = bucket ( k) ;
181
+ fn register_remove ( & mut self , bk : usize , _: Key , b : usize ) {
169
182
let mut d = if bk > b { b + N - bk } else { b - bk } ;
170
183
if d >= N {
171
184
d -= N ;
0 commit comments