Implement Extend and FromIterator

This commit is contained in:
root
2015-05-19 18:14:37 +02:00
parent 68a9b32e63
commit 311ab8916c
+43
View File
@@ -1,3 +1,4 @@
use std::iter;
use std::mem; use std::mem;
use std::ptr; use std::ptr;
use std::ops::{ use std::ops::{
@@ -338,6 +339,31 @@ impl<A: Array> Drop for IntoIter<A> {
} }
} }
/// 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<A: Array> Extend<A::Item> for ArrayVec<A> {
fn extend<T: IntoIterator<Item=A::Item>>(&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<A: Array> iter::FromIterator<A::Item> for ArrayVec<A> {
fn from_iter<T: IntoIterator<Item=A::Item>>(iter: T) -> Self {
let mut array = ArrayVec::new();
array.extend(iter);
array
}
}
#[test] #[test]
fn test_simple() { fn test_simple() {
use std::ops::Add; use std::ops::Add;
@@ -399,3 +425,20 @@ fn test_drop() {
assert_eq!(flag.get(), 4); 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]);
}