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