162306a36Sopenharmony_ci// SPDX-License-Identifier: Apache-2.0 OR MIT
262306a36Sopenharmony_ci
362306a36Sopenharmony_ciuse crate::alloc::Allocator;
462306a36Sopenharmony_ciuse crate::collections::TryReserveError;
562306a36Sopenharmony_ciuse core::iter::TrustedLen;
662306a36Sopenharmony_ciuse core::slice::{self};
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciuse super::{IntoIter, Vec};
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci// Specialization trait used for Vec::extend
1162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
1262306a36Sopenharmony_cipub(super) trait SpecExtend<T, I> {
1362306a36Sopenharmony_ci    fn spec_extend(&mut self, iter: I);
1462306a36Sopenharmony_ci}
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci// Specialization trait used for Vec::try_extend
1762306a36Sopenharmony_cipub(super) trait TrySpecExtend<T, I> {
1862306a36Sopenharmony_ci    fn try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError>;
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
2262306a36Sopenharmony_ciimpl<T, I, A: Allocator> SpecExtend<T, I> for Vec<T, A>
2362306a36Sopenharmony_ciwhere
2462306a36Sopenharmony_ci    I: Iterator<Item = T>,
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci    default fn spec_extend(&mut self, iter: I) {
2762306a36Sopenharmony_ci        self.extend_desugared(iter)
2862306a36Sopenharmony_ci    }
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciimpl<T, I, A: Allocator> TrySpecExtend<T, I> for Vec<T, A>
3262306a36Sopenharmony_ciwhere
3362306a36Sopenharmony_ci    I: Iterator<Item = T>,
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci    default fn try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError> {
3662306a36Sopenharmony_ci        self.try_extend_desugared(iter)
3762306a36Sopenharmony_ci    }
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
4162306a36Sopenharmony_ciimpl<T, I, A: Allocator> SpecExtend<T, I> for Vec<T, A>
4262306a36Sopenharmony_ciwhere
4362306a36Sopenharmony_ci    I: TrustedLen<Item = T>,
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci    default fn spec_extend(&mut self, iterator: I) {
4662306a36Sopenharmony_ci        self.extend_trusted(iterator)
4762306a36Sopenharmony_ci    }
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciimpl<T, I, A: Allocator> TrySpecExtend<T, I> for Vec<T, A>
5162306a36Sopenharmony_ciwhere
5262306a36Sopenharmony_ci    I: TrustedLen<Item = T>,
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci    default fn try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError> {
5562306a36Sopenharmony_ci        self.try_extend_trusted(iterator)
5662306a36Sopenharmony_ci    }
5762306a36Sopenharmony_ci}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
6062306a36Sopenharmony_ciimpl<T, A: Allocator> SpecExtend<T, IntoIter<T>> for Vec<T, A> {
6162306a36Sopenharmony_ci    fn spec_extend(&mut self, mut iterator: IntoIter<T>) {
6262306a36Sopenharmony_ci        unsafe {
6362306a36Sopenharmony_ci            self.append_elements(iterator.as_slice() as _);
6462306a36Sopenharmony_ci        }
6562306a36Sopenharmony_ci        iterator.forget_remaining_elements();
6662306a36Sopenharmony_ci    }
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciimpl<T, A: Allocator> TrySpecExtend<T, IntoIter<T>> for Vec<T, A> {
7062306a36Sopenharmony_ci    fn try_spec_extend(&mut self, mut iterator: IntoIter<T>) -> Result<(), TryReserveError> {
7162306a36Sopenharmony_ci        unsafe {
7262306a36Sopenharmony_ci            self.try_append_elements(iterator.as_slice() as _)?;
7362306a36Sopenharmony_ci        }
7462306a36Sopenharmony_ci        iterator.forget_remaining_elements();
7562306a36Sopenharmony_ci        Ok(())
7662306a36Sopenharmony_ci    }
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
8062306a36Sopenharmony_ciimpl<'a, T: 'a, I, A: Allocator> SpecExtend<&'a T, I> for Vec<T, A>
8162306a36Sopenharmony_ciwhere
8262306a36Sopenharmony_ci    I: Iterator<Item = &'a T>,
8362306a36Sopenharmony_ci    T: Clone,
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci    default fn spec_extend(&mut self, iterator: I) {
8662306a36Sopenharmony_ci        self.spec_extend(iterator.cloned())
8762306a36Sopenharmony_ci    }
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciimpl<'a, T: 'a, I, A: Allocator> TrySpecExtend<&'a T, I> for Vec<T, A>
9162306a36Sopenharmony_ciwhere
9262306a36Sopenharmony_ci    I: Iterator<Item = &'a T>,
9362306a36Sopenharmony_ci    T: Clone,
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci    default fn try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError> {
9662306a36Sopenharmony_ci        self.try_spec_extend(iterator.cloned())
9762306a36Sopenharmony_ci    }
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci#[cfg(not(no_global_oom_handling))]
10162306a36Sopenharmony_ciimpl<'a, T: 'a, A: Allocator> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T, A>
10262306a36Sopenharmony_ciwhere
10362306a36Sopenharmony_ci    T: Copy,
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci    fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) {
10662306a36Sopenharmony_ci        let slice = iterator.as_slice();
10762306a36Sopenharmony_ci        unsafe { self.append_elements(slice) };
10862306a36Sopenharmony_ci    }
10962306a36Sopenharmony_ci}
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ciimpl<'a, T: 'a, A: Allocator> TrySpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T, A>
11262306a36Sopenharmony_ciwhere
11362306a36Sopenharmony_ci    T: Copy,
11462306a36Sopenharmony_ci{
11562306a36Sopenharmony_ci    fn try_spec_extend(&mut self, iterator: slice::Iter<'a, T>) -> Result<(), TryReserveError> {
11662306a36Sopenharmony_ci        let slice = iterator.as_slice();
11762306a36Sopenharmony_ci        unsafe { self.try_append_elements(slice) }
11862306a36Sopenharmony_ci    }
11962306a36Sopenharmony_ci}
120