cl_aux/traits/
extend.rs

1#[cfg(feature = "alloc")]
2use alloc::{string::String, vec::Vec};
3
4/// See [`Extend::extend`] for more information.
5pub trait Extend<IN> {
6  /// Error
7  type Error;
8
9  /// Returns an mutable inner reference of a derived element.
10  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
34/// ```rust
35/// let mut opt = None;
36/// cl_aux::Extend::extend(&mut opt, [3]).unwrap();
37/// assert_eq!(opt, Some(3));
38/// ```
39impl<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/// ```rust
58/// let mut structure = cl_aux::doc_tests::string();
59/// cl_aux::Extend::extend(&mut structure, ['!']);
60/// assert_eq!(structure.as_str(), "Hello!");
61/// ```
62#[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/// ```rust
74/// let mut structure = cl_aux::doc_tests::vec();
75/// cl_aux::Extend::extend(&mut structure, [20]);
76/// assert_eq!(&structure[..], &[1, 2, 3, 20][..]);
77/// ```
78#[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/// ```rust
90/// let mut structure = cl_aux::doc_tests::array_string();
91/// cl_aux::Extend::extend(&mut structure, "!".chars());
92/// assert_eq!(structure.as_str(), "Hello!");
93/// ```
94#[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/// ```rust
111/// let mut structure = cl_aux::doc_tests::array_vec();
112/// cl_aux::Extend::extend(&mut structure, [20]);
113/// assert_eq!(&structure[..], &[1, 2, 3, 20][..]);
114/// ```
115#[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/// ```rust
132/// let mut structure = cl_aux::doc_tests::small_vec();
133/// cl_aux::Extend::extend(&mut structure, [20]);
134/// assert_eq!(&structure[..], &[1, 2, 3, 20][..]);
135/// ```
136#[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/// ```rust
154/// let mut structure = cl_aux::doc_tests::tiny_vec_array_vec();
155/// cl_aux::Extend::extend(&mut structure, [20]);
156/// assert_eq!(&structure[..], &[1, 2, 3, 20][..]);
157/// ```
158#[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/// ```rust
176/// let mut structure = cl_aux::doc_tests::tiny_vec_tiny_vec();
177/// cl_aux::Extend::extend(&mut structure, [20]);
178/// assert_eq!(&structure[..], &[1, 2, 3, 20][..]);
179/// ```
180#[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}