From 311ab8916c8a9d98ea30bb4c15ea9bae1c1b1c04 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 19 May 2015 18:14:37 +0200 Subject: [PATCH] Implement Extend and FromIterator --- src/lib.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index e7f7a60..0cf0cbd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +use std::iter; use std::mem; use std::ptr; use std::ops::{ @@ -338,6 +339,31 @@ impl Drop for IntoIter { } } +/// Extend the **ArrayVec** with an iterator. +/// +/// Does not extract more items than there is space for. No error +/// occurs if there are more iterator elements. +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); + } + } +} + +/// Create an **ArrayVec** from an iterator. +/// +/// Does not extract more items than there is space for. No error +/// occurs if there are more iterator elements. +impl iter::FromIterator for ArrayVec { + fn from_iter>(iter: T) -> Self { + let mut array = ArrayVec::new(); + array.extend(iter); + array + } +} + #[test] fn test_simple() { use std::ops::Add; @@ -399,3 +425,20 @@ fn test_drop() { assert_eq!(flag.get(), 4); } + +#[test] +fn test_extend() { + let mut range = 0..10; + + let mut array: ArrayVec<[_; 5]> = range.by_ref().collect(); + assert_eq!(&array[..], &[0, 1, 2, 3, 4]); + assert_eq!(range.next(), Some(5)); + + array.extend(range.by_ref()); + assert_eq!(range.next(), Some(6)); + + let mut array: ArrayVec<[_; 10]> = (0..3).collect(); + assert_eq!(&array[..], &[0, 1, 2]); + array.extend(3..5); + assert_eq!(&array[..], &[0, 1, 2, 3, 4]); +}