in src/storage/seg/src/hashtable/mod.rs [151:187]
fn next(&mut self) -> Option<<Self as Iterator>::Item> {
if self.state.finished {
return None;
}
let n_item_slot = self.state.n_item_slot();
// SAFETY: this assert ensures memory safety for the pointer operations
// that follow as in-line unsafe blocks. We first check to make sure the
// bucket_id is within range for the slice of buckets. As long as this
// holds true, the pointer operations are safe.
assert!(
self.state.bucket_id < self.state.buckets_len,
"bucket id not in range"
);
let item_info =
unsafe { &mut (*self.ptr.add(self.state.bucket_id)).data[self.state.item_slot] };
if self.state.item_slot < n_item_slot - 1 {
self.state.item_slot += 1;
} else {
// finished iterating in this bucket, see if it's chained
if self.state.chain_idx < self.state.chain_len {
self.state.chain_idx += 1;
self.state.item_slot = 0;
let next_bucket_id = unsafe {
(*self.ptr.add(self.state.bucket_id)).data[N_BUCKET_SLOT - 1] as usize
};
self.state.bucket_id = next_bucket_id;
} else {
self.state.finished = true;
}
}
Some(item_info)
}