From 0b0a84dc8003b289d855fec5c37cd203e66383e6 Mon Sep 17 00:00:00 2001 From: Kai Schmidt Date: Tue, 12 Mar 2024 12:13:35 -0700 Subject: [PATCH] Make `EcoVec::extend_from_trusted` public Add the bound `I::IntoIter: ExactSizeIterator` to try to prevent unsafe usage. The `count` parameter is removed in favor of `ExactSizeIterator::len`. --- src/vec.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/vec.rs b/src/vec.rs index a1c5848..411fff4 100644 --- a/src/vec.rs +++ b/src/vec.rs @@ -686,11 +686,16 @@ impl EcoVec { impl EcoVec { /// Clones and pushes all elements in a trusted-len iterator to the vector. /// - /// The iterator must produce exactly `count` items. - unsafe fn extend_from_trusted(&mut self, count: usize, iter: I) + /// # Safety + /// `ExactSizeIterator::len` must return the exact length of the iterator. + pub unsafe fn extend_from_trusted(&mut self, iter: I) where I: IntoIterator, + I::IntoIter: ExactSizeIterator, { + let iter = iter.into_iter(); + let count = iter.len(); + if count == 0 { return; } @@ -965,7 +970,7 @@ impl From<[T; N]> for EcoVec { let mut vec = Self::new(); unsafe { // Safety: Array's IntoIter implements `TrustedLen`. - vec.extend_from_trusted(array.len(), array); + vec.extend_from_trusted(array); } vec } @@ -977,7 +982,7 @@ impl From> for EcoVec { let mut vec = Self::new(); unsafe { // Safety: Vec's IntoIter implements `TrustedLen`. - vec.extend_from_trusted(other.len(), other); + vec.extend_from_trusted(other); } vec }