From e072d1fa4f5c6078e121b8c9fc3b5324a915470a Mon Sep 17 00:00:00 2001 From: Cecile Tonglet Date: Wed, 1 Nov 2023 15:52:01 +0100 Subject: [PATCH] Make from_iter() optimized --- src/array.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/array.rs b/src/array.rs index c4fe24b..a184017 100644 --- a/src/array.rs +++ b/src/array.rs @@ -46,8 +46,12 @@ impl Default for IArray { impl FromIterator for IArray { fn from_iter>(it: I) -> Self { - let vec = it.into_iter().collect::>(); - Self::Rc(Rc::from(vec)) + let mut it = it.into_iter(); + if it.size_hint() == (1, Some(1)) { + Self::Single([it.next().unwrap()]) + } else { + Self::Rc(Rc::from(it.collect::>())) + } } } @@ -394,6 +398,14 @@ mod test_array { let _array = [Rc::new(Item)].into_iter().collect::>>(); } + #[test] + fn from_iter_is_optimized() { + let array_1 = [1].into_iter().collect::>(); + assert!(matches!(array_1, IArray::Single(_))); + let array_2 = [1, 2].into_iter().collect::>(); + assert!(matches!(array_2, IArray::Rc(_))); + } + #[test] fn static_array() { const _ARRAY: IArray = IArray::Static(&[1, 2, 3]);