1#[cfg(feature = "alloc")]
2use alloc::{string::String, vec::Vec};
3
4pub trait Extend<IN> {
6 type Error;
8
9 fn extend(&mut self, into_iter: impl IntoIterator<Item = IN>) -> Result<(), Self::Error>;
11}
12
13impl<IN, T> Extend<IN> for &mut T
14where
15 T: Extend<IN>,
16{
17 type Error = T::Error;
18
19 #[inline]
20 fn extend(&mut self, into_iter: impl IntoIterator<Item = IN>) -> Result<(), Self::Error> {
21 (*self).extend(into_iter)
22 }
23}
24
25impl<T> Extend<T> for () {
26 type Error = crate::Error;
27
28 #[inline]
29 fn extend(&mut self, _: impl IntoIterator<Item = T>) -> Result<(), Self::Error> {
30 Ok(())
31 }
32}
33
34impl<T> Extend<T> for Option<T> {
40 type Error = crate::Error;
41
42 #[inline]
43 fn extend(&mut self, into_iter: impl IntoIterator<Item = T>) -> Result<(), Self::Error> {
44 _check_capacity!(self);
45 let err = || crate::Error::InsufficientCapacity(1);
46 let mut iter = into_iter.into_iter();
47 let next = iter.next().ok_or_else(err)?;
48 *self = Some(next);
49 if iter.next().is_some() {
50 Err(err())
51 } else {
52 Ok(())
53 }
54 }
55}
56
57#[cfg(feature = "alloc")]
63impl Extend<char> for String {
64 type Error = crate::Error;
65
66 #[inline]
67 fn extend(&mut self, into_iter: impl IntoIterator<Item = char>) -> Result<(), Self::Error> {
68 core::iter::Extend::extend(self, into_iter);
69 Ok(())
70 }
71}
72
73#[cfg(feature = "alloc")]
79impl<T> Extend<T> for Vec<T> {
80 type Error = crate::Error;
81
82 #[inline]
83 fn extend(&mut self, into_iter: impl IntoIterator<Item = T>) -> Result<(), Self::Error> {
84 core::iter::Extend::extend(self, into_iter);
85 Ok(())
86 }
87}
88
89#[cfg(feature = "arrayvec")]
95impl<const N: usize> Extend<char> for arrayvec::ArrayString<N>
96where
97 Self: crate::Push<char>,
98{
99 type Error = <Self as crate::Push<char>>::Error;
100
101 #[inline]
102 fn extend(&mut self, into_iter: impl IntoIterator<Item = char>) -> Result<(), Self::Error> {
103 for elem in into_iter {
104 crate::Push::push(self, elem)?;
105 }
106 Ok(())
107 }
108}
109
110#[cfg(feature = "arrayvec")]
116impl<T, const N: usize> Extend<T> for arrayvec::ArrayVec<T, N>
117where
118 Self: crate::Push<T>,
119{
120 type Error = <Self as crate::Push<T>>::Error;
121
122 #[inline]
123 fn extend(&mut self, into_iter: impl IntoIterator<Item = T>) -> Result<(), Self::Error> {
124 for elem in into_iter {
125 crate::Push::push(self, elem)?;
126 }
127 Ok(())
128 }
129}
130
131#[cfg(feature = "smallvec")]
137impl<A> Extend<A::Item> for smallvec::SmallVec<A>
138where
139 A: smallvec::Array,
140 Self: crate::Push<A::Item>,
141{
142 type Error = <Self as crate::Push<A::Item>>::Error;
143
144 #[inline]
145 fn extend(&mut self, into_iter: impl IntoIterator<Item = A::Item>) -> Result<(), Self::Error> {
146 for elem in into_iter {
147 crate::Push::push(self, elem)?;
148 }
149 Ok(())
150 }
151}
152
153#[cfg(feature = "tinyvec")]
159impl<A> Extend<A::Item> for tinyvec::ArrayVec<A>
160where
161 A: tinyvec::Array,
162 Self: crate::Push<A::Item>,
163{
164 type Error = <Self as crate::Push<A::Item>>::Error;
165
166 #[inline]
167 fn extend(&mut self, into_iter: impl IntoIterator<Item = A::Item>) -> Result<(), Self::Error> {
168 for elem in into_iter {
169 crate::Push::push(self, elem)?;
170 }
171 Ok(())
172 }
173}
174
175#[cfg(all(feature = "alloc", feature = "tinyvec"))]
181impl<A> Extend<A::Item> for tinyvec::TinyVec<A>
182where
183 A: tinyvec::Array,
184 A::Item: Default,
185 Self: crate::Push<A::Item>,
186{
187 type Error = <Self as crate::Push<A::Item>>::Error;
188
189 #[inline]
190 fn extend(&mut self, into_iter: impl IntoIterator<Item = A::Item>) -> Result<(), Self::Error> {
191 for elem in into_iter {
192 crate::Push::push(self, elem)?;
193 }
194 Ok(())
195 }
196}