impl<K, V> IndexMapCore<K, V> { #[track_caller] pub(crate) fn extract<R>(&mutself, range: R) -> ExtractCore<'_, K, V> where
R: RangeBounds<usize>,
{ let range = simplify_range(range, self.entries.len());
// SAFETY: We must have consistent lengths to start, so that's a hard assertion. // Then the worst `set_len` can do is leak items if `ExtractCore` doesn't drop.
assert_eq!(self.entries.len(), self.indices.len()); unsafe { self.entries.set_len(range.start);
}
ExtractCore {
map: self,
new_len: range.start,
current: range.start,
end: range.end,
}
}
}
// SAFETY: We assume `new_len` and `current` were correctly maintained by the iterator. // So `entries[new_len..current]` were extracted, but the rest before and after are valid. unsafe { if new_len == self.current { // Nothing was extracted, so any remaining items can be left in place.
new_len = old_len;
} elseifself.current < old_len { // Need to shift the remaining items down. let tail_len = old_len - self.current; let base = self.map.entries.as_mut_ptr(); let src = base.add(self.current); let dest = base.add(new_len);
src.copy_to(dest, tail_len);
new_len += tail_len;
} self.map.entries.set_len(new_len);
}
if new_len != old_len { // We don't keep track of *which* items were extracted, so reindex everything. self.map.rebuild_hash_table();
}
}
}
let base = self.map.entries.as_mut_ptr(); whileself.current < self.end { // SAFETY: We're maintaining both indices within bounds of the original entries, so // 0..new_len and current..indices.len() are always valid items for our Drop to keep. unsafe { let item = base.add(self.current); if pred(&mut *item) { // Extract it! self.current += 1; return Some(item.read());
} else { // Keep it, shifting it down if needed. ifself.new_len != self.current {
debug_assert!(self.new_len < self.current); let dest = base.add(self.new_len);
item.copy_to_nonoverlapping(dest, 1);
} self.current += 1; self.new_len += 1;
}
}
}
None
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.