use crate::ChunkedVec;
impl<T> FromIterator<T> for ChunkedVec<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let iter = iter.into_iter();
let (lower, upper) = iter.size_hint();
let mut chunked_vec = ChunkedVec::with_capacity(upper.unwrap_or(lower));
for item in iter {
chunked_vec.push(item);
}
chunked_vec
}
}
impl<T> From<Vec<T>> for ChunkedVec<T> {
fn from(vec: Vec<T>) -> Self {
Self::from_iter(vec)
}
}
impl<T, const M: usize> From<[T; M]> for ChunkedVec<T> {
fn from(array: [T; M]) -> Self {
Self::from_iter(array)
}
}
impl<T: Clone, const M: usize> From<&[T; M]> for ChunkedVec<T> {
fn from(array: &[T; M]) -> Self {
Self::from_iter(array.iter().cloned())
}
}
impl<T: Clone> From<&[T]> for ChunkedVec<T> {
fn from(slice: &[T]) -> Self {
Self::from_iter(slice.iter().cloned())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_from_iterator() {
let vec = vec![1, 2, 3, 4, 5];
let chunked_vec: ChunkedVec<_> = vec.into_iter().collect();
assert_eq!(chunked_vec.len(), 5);
}
#[test]
fn test_from_vec() {
let vec = vec![1, 2, 3, 4, 5];
let chunked_vec: ChunkedVec<_> = vec.into();
assert_eq!(chunked_vec.len(), 5);
let chunked_vec = ChunkedVec::from(vec![2, 3, 1]);
assert_eq!(chunked_vec[0], 2);
assert_eq!(chunked_vec[1], 3);
assert_eq!(chunked_vec[2], 1);
}
#[test]
fn test_from_array() {
let chunked_vec = ChunkedVec::from([2, 3, 1]);
assert_eq!(chunked_vec[0], 2);
assert_eq!(chunked_vec[1], 3);
assert_eq!(chunked_vec[2], 1);
}
#[test]
fn test_from_array_ref() {
let array = [2, 3, 1];
let chunked_vec = ChunkedVec::from(&array);
assert_eq!(chunked_vec[0], 2);
assert_eq!(chunked_vec[1], 3);
assert_eq!(chunked_vec[2], 1);
assert_eq!(array, [2, 3, 1]);
}
#[test]
fn test_from_slice() {
let slice: &[i32] = &[2, 3, 1];
let chunked_vec = ChunkedVec::from(slice);
assert_eq!(chunked_vec[0], 2);
assert_eq!(chunked_vec[1], 3);
assert_eq!(chunked_vec[2], 1);
}
}