summaryrefslogtreecommitdiffstats
path: root/library/alloc/src/vec/in_place_drop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/alloc/src/vec/in_place_drop.rs')
-rw-r--r--library/alloc/src/vec/in_place_drop.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/library/alloc/src/vec/in_place_drop.rs b/library/alloc/src/vec/in_place_drop.rs
new file mode 100644
index 000000000..1b1ef9130
--- /dev/null
+++ b/library/alloc/src/vec/in_place_drop.rs
@@ -0,0 +1,24 @@
+use core::ptr::{self};
+use core::slice::{self};
+
+// A helper struct for in-place iteration that drops the destination slice of iteration,
+// i.e. the head. The source slice (the tail) is dropped by IntoIter.
+pub(super) struct InPlaceDrop<T> {
+ pub(super) inner: *mut T,
+ pub(super) dst: *mut T,
+}
+
+impl<T> InPlaceDrop<T> {
+ fn len(&self) -> usize {
+ unsafe { self.dst.sub_ptr(self.inner) }
+ }
+}
+
+impl<T> Drop for InPlaceDrop<T> {
+ #[inline]
+ fn drop(&mut self) {
+ unsafe {
+ ptr::drop_in_place(slice::from_raw_parts_mut(self.inner, self.len()));
+ }
+ }
+}