13dcb652aSAsahi Lina // SPDX-License-Identifier: Apache-2.0 OR MIT 23dcb652aSAsahi Lina 3ae12ae13SAsahi Lina use crate::alloc::Allocator; 43ed03f4dSMiguel Ojeda use crate::collections::TryReserveError; 5ae12ae13SAsahi Lina use core::iter::TrustedLen; 6ae12ae13SAsahi Lina use core::slice::{self}; 7ae12ae13SAsahi Lina 83ed03f4dSMiguel Ojeda use super::{IntoIter, Vec}; 9ae12ae13SAsahi Lina 10ae12ae13SAsahi Lina // Specialization trait used for Vec::extend 11318c3cc8SMiguel Ojeda #[cfg(not(no_global_oom_handling))] 12ae12ae13SAsahi Lina pub(super) trait SpecExtend<T, I> { spec_extend(&mut self, iter: I)13ae12ae13SAsahi Lina fn spec_extend(&mut self, iter: I); 14ae12ae13SAsahi Lina } 15ae12ae13SAsahi Lina 16318c3cc8SMiguel Ojeda // Specialization trait used for Vec::try_extend 17318c3cc8SMiguel Ojeda pub(super) trait TrySpecExtend<T, I> { try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError>18318c3cc8SMiguel Ojeda fn try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError>; 19318c3cc8SMiguel Ojeda } 20318c3cc8SMiguel Ojeda 21318c3cc8SMiguel Ojeda #[cfg(not(no_global_oom_handling))] 22ae12ae13SAsahi Lina impl<T, I, A: Allocator> SpecExtend<T, I> for Vec<T, A> 23ae12ae13SAsahi Lina where 24ae12ae13SAsahi Lina I: Iterator<Item = T>, 25ae12ae13SAsahi Lina { spec_extend(&mut self, iter: I)26ae12ae13SAsahi Lina default fn spec_extend(&mut self, iter: I) { 27ae12ae13SAsahi Lina self.extend_desugared(iter) 28ae12ae13SAsahi Lina } 29ae12ae13SAsahi Lina } 30ae12ae13SAsahi Lina 31318c3cc8SMiguel Ojeda impl<T, I, A: Allocator> TrySpecExtend<T, I> for Vec<T, A> 32318c3cc8SMiguel Ojeda where 33318c3cc8SMiguel Ojeda I: Iterator<Item = T>, 34318c3cc8SMiguel Ojeda { try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError>35318c3cc8SMiguel Ojeda default fn try_spec_extend(&mut self, iter: I) -> Result<(), TryReserveError> { 36318c3cc8SMiguel Ojeda self.try_extend_desugared(iter) 37318c3cc8SMiguel Ojeda } 38318c3cc8SMiguel Ojeda } 39318c3cc8SMiguel Ojeda 40318c3cc8SMiguel Ojeda #[cfg(not(no_global_oom_handling))] 41ae12ae13SAsahi Lina impl<T, I, A: Allocator> SpecExtend<T, I> for Vec<T, A> 42ae12ae13SAsahi Lina where 43ae12ae13SAsahi Lina I: TrustedLen<Item = T>, 44ae12ae13SAsahi Lina { spec_extend(&mut self, iterator: I)45ae12ae13SAsahi Lina default fn spec_extend(&mut self, iterator: I) { 463ed03f4dSMiguel Ojeda self.extend_trusted(iterator) 47ae12ae13SAsahi Lina } 48ae12ae13SAsahi Lina } 49ae12ae13SAsahi Lina 50318c3cc8SMiguel Ojeda impl<T, I, A: Allocator> TrySpecExtend<T, I> for Vec<T, A> 51318c3cc8SMiguel Ojeda where 52318c3cc8SMiguel Ojeda I: TrustedLen<Item = T>, 53318c3cc8SMiguel Ojeda { try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError>54318c3cc8SMiguel Ojeda default fn try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError> { 553ed03f4dSMiguel Ojeda self.try_extend_trusted(iterator) 56318c3cc8SMiguel Ojeda } 57318c3cc8SMiguel Ojeda } 58318c3cc8SMiguel Ojeda 59318c3cc8SMiguel Ojeda #[cfg(not(no_global_oom_handling))] 60ae12ae13SAsahi Lina impl<T, A: Allocator> SpecExtend<T, IntoIter<T>> for Vec<T, A> { spec_extend(&mut self, mut iterator: IntoIter<T>)61ae12ae13SAsahi Lina fn spec_extend(&mut self, mut iterator: IntoIter<T>) { 62ae12ae13SAsahi Lina unsafe { 63ae12ae13SAsahi Lina self.append_elements(iterator.as_slice() as _); 64ae12ae13SAsahi Lina } 65ae12ae13SAsahi Lina iterator.forget_remaining_elements(); 66ae12ae13SAsahi Lina } 67ae12ae13SAsahi Lina } 68ae12ae13SAsahi Lina 69318c3cc8SMiguel Ojeda impl<T, A: Allocator> TrySpecExtend<T, IntoIter<T>> for Vec<T, A> { try_spec_extend(&mut self, mut iterator: IntoIter<T>) -> Result<(), TryReserveError>70318c3cc8SMiguel Ojeda fn try_spec_extend(&mut self, mut iterator: IntoIter<T>) -> Result<(), TryReserveError> { 71318c3cc8SMiguel Ojeda unsafe { 72318c3cc8SMiguel Ojeda self.try_append_elements(iterator.as_slice() as _)?; 73318c3cc8SMiguel Ojeda } 74318c3cc8SMiguel Ojeda iterator.forget_remaining_elements(); 75318c3cc8SMiguel Ojeda Ok(()) 76318c3cc8SMiguel Ojeda } 77318c3cc8SMiguel Ojeda } 78318c3cc8SMiguel Ojeda 79318c3cc8SMiguel Ojeda #[cfg(not(no_global_oom_handling))] 80*73596f5aSMiguel Ojeda impl<'a, T: 'a, I, A: Allocator> SpecExtend<&'a T, I> for Vec<T, A> 81ae12ae13SAsahi Lina where 82ae12ae13SAsahi Lina I: Iterator<Item = &'a T>, 83ae12ae13SAsahi Lina T: Clone, 84ae12ae13SAsahi Lina { spec_extend(&mut self, iterator: I)85ae12ae13SAsahi Lina default fn spec_extend(&mut self, iterator: I) { 86ae12ae13SAsahi Lina self.spec_extend(iterator.cloned()) 87ae12ae13SAsahi Lina } 88ae12ae13SAsahi Lina } 89ae12ae13SAsahi Lina 90*73596f5aSMiguel Ojeda impl<'a, T: 'a, I, A: Allocator> TrySpecExtend<&'a T, I> for Vec<T, A> 91318c3cc8SMiguel Ojeda where 92318c3cc8SMiguel Ojeda I: Iterator<Item = &'a T>, 93318c3cc8SMiguel Ojeda T: Clone, 94318c3cc8SMiguel Ojeda { try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError>95318c3cc8SMiguel Ojeda default fn try_spec_extend(&mut self, iterator: I) -> Result<(), TryReserveError> { 96318c3cc8SMiguel Ojeda self.try_spec_extend(iterator.cloned()) 97318c3cc8SMiguel Ojeda } 98318c3cc8SMiguel Ojeda } 99318c3cc8SMiguel Ojeda 100318c3cc8SMiguel Ojeda #[cfg(not(no_global_oom_handling))] 101*73596f5aSMiguel Ojeda impl<'a, T: 'a, A: Allocator> SpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T, A> 102ae12ae13SAsahi Lina where 103ae12ae13SAsahi Lina T: Copy, 104ae12ae13SAsahi Lina { spec_extend(&mut self, iterator: slice::Iter<'a, T>)105ae12ae13SAsahi Lina fn spec_extend(&mut self, iterator: slice::Iter<'a, T>) { 106ae12ae13SAsahi Lina let slice = iterator.as_slice(); 107ae12ae13SAsahi Lina unsafe { self.append_elements(slice) }; 108ae12ae13SAsahi Lina } 109ae12ae13SAsahi Lina } 110318c3cc8SMiguel Ojeda 111*73596f5aSMiguel Ojeda impl<'a, T: 'a, A: Allocator> TrySpecExtend<&'a T, slice::Iter<'a, T>> for Vec<T, A> 112318c3cc8SMiguel Ojeda where 113318c3cc8SMiguel Ojeda T: Copy, 114318c3cc8SMiguel Ojeda { try_spec_extend(&mut self, iterator: slice::Iter<'a, T>) -> Result<(), TryReserveError>115318c3cc8SMiguel Ojeda fn try_spec_extend(&mut self, iterator: slice::Iter<'a, T>) -> Result<(), TryReserveError> { 116318c3cc8SMiguel Ojeda let slice = iterator.as_slice(); 117318c3cc8SMiguel Ojeda unsafe { self.try_append_elements(slice) } 118318c3cc8SMiguel Ojeda } 119318c3cc8SMiguel Ojeda } 120