fn next()

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)
    }