// SPDX-License-Identifier: Apache-2.0 OR MIT use crate::alloc::Allocator; use crate::collections::TryReserveError; use core::iter::TrustedLen; use core::slice::{self}; use super::{IntoIter, Vec}; // Specialization trait used for Vec::extend #[cfg(not(no_global_oom_handling))] pub(super) trait SpecExtend { fn spec_extend(&mut self, iter: I); } // Specialization trait used for Vec::try_extend pub(super) trait TrySpecExtend { fn try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError>; } #[cfg(not(no_global_oom_handling))] impl SpecExtend for Vec where I: Iterator, { default fn spec_extend(&mut self, iter: I) { self.extend_desugared(iter) } } impl TrySpecExtend for Vec where I: Iterator, { default fn try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError> { self.try_extend_desugared(iter) } } #[cfg(not(no_global_oom_handling))] impl SpecExtend for Vec where I: TrustedLen, { default fn spec_extend(&mut self, iterator: I) { self.extend_trusted(iterator) } } impl TrySpecExtend for Vec where I: TrustedLen, { default fn try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError> { self.try_extend_trusted(iterator) } } #[cfg(not(no_global_oom_handling))] impl SpecExtend> for Vec { fn spec_extend(&mut self, mut iterator: IntoIter) { unsafe { self.append_elements(iterator.as_slice() as _); } iterator.forget_remaining_elements(); } } impl TrySpecExtend> for Vec { fn try_spec_extend(&mut self, mut iterator: IntoIter) -> Result<(), TryReserveError> { unsafe { self.try_append_elements(iterator.as_slice() as _)?; } iterator.forget_remaining_elements(); Ok(()) } } #[cfg(not(no_global_oom_handling))] impl<'a, T: 'a, I, A: Allocator> SpecExtend<&'a T, I> for Vec where I: Iterator, T: Clone, { default fn spec_extend(&mut self, iterator: I) { self.spec_extend(iterator.cloned()) } } impl<'a, T: 'a, I, A: Allocator> TrySpecExtend<&'a T, I> for Vec where I: Iterator, T: Clone, { default fn try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError> { self.try_spec_extend(iterator.cloned()) } } #[cfg(not(no_global_oom_handling))] impl<'a, T: 'a, A: Allocator> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec where T: Copy, { fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) { let slice = iterator.as_slice(); unsafe { self.append_elements(slice) }; } } impl<'a, T: 'a, A: Allocator> TrySpecExtend<&'a T, slice::Iter<'a, T>> for Vec where T: Copy, { fn try_spec_extend(&mut self, iterator: slice::Iter<'a, T>) -> Result<(), TryReserveError> { let slice = iterator.as_slice(); unsafe { self.try_append_elements(slice) } } }