rune_alloc/vec/
spec_extend.rs

1#[cfg(rune_nightly)]
2use core::slice;
3
4use crate::alloc::Allocator;
5#[cfg(rune_nightly)]
6use crate::clone::{TryClone, TryCopy};
7use crate::error::Error;
8
9#[cfg(rune_nightly)]
10use super::IntoIter;
11use super::Vec;
12
13// Specialization trait used for Vec::extend
14pub(super) trait SpecExtend<T, I> {
15    fn spec_extend(&mut self, iter: I) -> Result<(), Error>;
16}
17
18impl<T, I, A: Allocator> SpecExtend<T, I> for Vec<T, A>
19where
20    I: Iterator<Item = T>,
21{
22    default_fn! {
23        fn spec_extend(&mut self, iter: I) -> Result<(), Error> {
24            for value in iter {
25                self.try_push(value)?;
26            }
27
28            Ok(())
29        }
30    }
31}
32
33#[cfg(rune_nightly)]
34impl<T, A: Allocator> SpecExtend<T, IntoIter<T>> for Vec<T, A> {
35    fn spec_extend(&mut self, mut iterator: IntoIter<T>) -> Result<(), Error> {
36        unsafe {
37            self.try_append_elements(iterator.as_slice() as _)?;
38        }
39        iterator.forget_remaining_elements();
40        Ok(())
41    }
42}
43
44#[cfg(rune_nightly)]
45impl<'a, T: 'a, I, A: Allocator> SpecExtend<&'a T, I> for Vec<T, A>
46where
47    I: Iterator<Item = &'a T>,
48    T: TryClone,
49{
50    default fn spec_extend(&mut self, iterator: I) -> Result<(), Error> {
51        for value in iterator {
52            self.try_push(value.try_clone()?)?;
53        }
54
55        Ok(())
56    }
57}
58
59#[cfg(rune_nightly)]
60impl<'a, T: 'a, A: Allocator> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T, A>
61where
62    T: TryCopy,
63{
64    fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) -> Result<(), Error> {
65        let slice = iterator.as_slice();
66
67        unsafe {
68            self.try_append_elements(slice)?;
69        }
70
71        Ok(())
72    }
73}