diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..f8b4888 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..995ba26 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,12 @@ +{ + "ExpandedNodes": [ + "", + "\\benches", + "\\fuzz", + "\\fuzz\\fuzz_targets", + "\\fuzz\\in", + "\\scripts" + ], + "SelectedNode": "\\lib.rs", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/rust-smallvec/v15/.suo b/.vs/rust-smallvec/v15/.suo new file mode 100644 index 0000000..beba41e Binary files /dev/null and b/.vs/rust-smallvec/v15/.suo differ diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..db0b1ce Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/lib.rs b/lib.rs index e919678..eba8ba5 100644 --- a/lib.rs +++ b/lib.rs @@ -1504,6 +1504,24 @@ pub struct IntoIter { end: usize, } +impl Clone for IntoIter +where + A::Item: Copy, +{ + fn clone(&self) -> IntoIter { + SmallVec::from_slice(self.as_slice()).into_iter() + } +} + +/*impl Clone for IntoIter +where + A::Item: Clone, +{ + fn clone(&self) -> IntoIter { + SmallVec::from(self.as_slice()).into_iter() + } +}*/ + impl Drop for IntoIter { fn drop(&mut self) { for _ in self {} @@ -2248,6 +2266,37 @@ mod tests { assert_eq!(iter.as_mut_slice(), &[2]); } + #[test] + fn test_into_iter_clone() { + // Test that the cloned iterator yields identical elements and that it owns its own copy + // (i.e. no use after move errors). + let mut iter = SmallVec::<[u8; 2]>::from_iter(0..3).into_iter(); + let mut clone_iter = iter.clone(); + while let Some(x) = iter.next() { + assert_eq!(x, clone_iter.next().unwrap()); + } + assert_eq!(clone_iter.next(), None); + } + + #[test] + fn test_into_iter_clone_partially_consumed_iterator() { + // Test that the cloned iterator only contains the remaining elements of the original iterator. + let mut iter = SmallVec::<[u8; 2]>::from_iter(0..3).into_iter().skip(1); + let mut clone_iter = iter.clone(); + while let Some(x) = iter.next() { + assert_eq!(x, clone_iter.next().unwrap()); + } + assert_eq!(clone_iter.next(), None); + } + + #[test] + fn test_into_iter_clone_empty_smallvec() { + let mut iter = SmallVec::<[u8; 2]>::new().into_iter(); + let mut clone_iter = iter.clone(); + assert_eq!(iter.next(), None); + assert_eq!(clone_iter.next(), None); + } + #[test] fn shrink_to_fit_unspill() { let mut vec = SmallVec::<[u8; 2]>::from_iter(0..3);