xref: /openbmc/linux/rust/alloc/vec/spec_extend.rs (revision 73596f5a)
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