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
13pub(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}