From d0ebfcd51fff98a4fba905820efeaa1f54ecb0c6 Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Sat, 13 May 2017 18:16:06 +0200 Subject: [PATCH 1/3] Factor out push_unchecked() --- src/lib.rs | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1bbf379..97dad1e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -164,10 +164,8 @@ impl ArrayVec { /// ``` pub fn push(&mut self, element: A::Item) -> Option { if self.len() < A::capacity() { - let len = self.len(); unsafe { - ptr::write(self.get_unchecked_mut(len), element); - self.set_len(len + 1); + self.push_unchecked(element); } None } else { @@ -175,6 +173,34 @@ impl ArrayVec { } } + /// Push `element` to the end of the vector without checking the capacity. + /// + /// It is up to the caller to ensure the capacity of the vector is + /// sufficiently large. + /// + /// # Examples + /// + /// ``` + /// use arrayvec::ArrayVec; + /// + /// let mut array = ArrayVec::<[_; 2]>::new(); + /// + /// if array.len() + 2 <= array.capacity() { + /// unsafe { + /// array.push_unchecked(1); + /// array.push_unchecked(2); + /// } + /// } + /// + /// assert_eq!(&array[..], &[1, 2]); + /// ``` + #[inline] + pub unsafe fn push_unchecked(&mut self, element: A::Item) { + let len = self.len(); + ptr::write(self.get_unchecked_mut(len), element); + self.set_len(len + 1); + } + /// Insert `element` in position `index`. /// /// Shift up all elements after `index`. If any is pushed out, it is returned. From 1b6e0a3bfb769c03e02a8da9e0e92bcdc2c2f054 Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Sat, 13 May 2017 18:27:38 +0200 Subject: [PATCH 2/3] Use push_unchecked() for Extend --- src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 97dad1e..84b80f5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -695,7 +695,9 @@ impl Extend for ArrayVec { fn extend>(&mut self, iter: T) { let take = self.capacity() - self.len(); for elt in iter.into_iter().take(take) { - self.push(elt); + unsafe { + self.push_unchecked(elt); + } } } } From 12eee0677c36b5b9caaaa1eb60491837c5a45fa1 Mon Sep 17 00:00:00 2001 From: Niklas Fiekas Date: Wed, 24 May 2017 21:16:27 +0200 Subject: [PATCH 3/3] Debug assert capacity in push_unchecked() --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 84b80f5..cf5f6c7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -197,6 +197,7 @@ impl ArrayVec { #[inline] pub unsafe fn push_unchecked(&mut self, element: A::Item) { let len = self.len(); + debug_assert!(len < A::capacity()); ptr::write(self.get_unchecked_mut(len), element); self.set_len(len + 1); }