core/iter/sources/
repeat_n.rs1use crate::fmt;
2use crate::iter::{FusedIterator, TrustedLen, UncheckedIterator};
3use crate::num::NonZero;
4use crate::ops::Try;
5
6#[inline]
58#[stable(feature = "iter_repeat_n", since = "1.82.0")]
59pub fn repeat_n<T: Clone>(element: T, count: usize) -> RepeatN<T> {
60 RepeatN { inner: RepeatNInner::new(element, count) }
61}
62
63#[derive(Clone, Copy)]
64struct RepeatNInner<T> {
65 count: NonZero<usize>,
66 element: T,
67}
68
69impl<T> RepeatNInner<T> {
70 fn new(element: T, count: usize) -> Option<Self> {
71 let count = NonZero::<usize>::new(count)?;
72 Some(Self { element, count })
73 }
74}
75
76#[stable(feature = "iter_repeat_n", since = "1.82.0")]
81#[derive(Clone)]
82pub struct RepeatN<A> {
83 inner: Option<RepeatNInner<A>>,
84}
85
86impl<A> RepeatN<A> {
87 #[inline]
89 fn take_element(&mut self) -> Option<A> {
90 self.inner.take().map(|inner| inner.element)
91 }
92}
93
94#[stable(feature = "iter_repeat_n", since = "1.82.0")]
95impl<A: fmt::Debug> fmt::Debug for RepeatN<A> {
96 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
97 let (count, element) = match self.inner.as_ref() {
98 Some(inner) => (inner.count.get(), Some(&inner.element)),
99 None => (0, None),
100 };
101 f.debug_struct("RepeatN").field("count", &count).field("element", &element).finish()
102 }
103}
104
105#[stable(feature = "iter_repeat_n_default", since = "CURRENT_RUSTC_VERSION")]
108impl<A> Default for RepeatN<A> {
109 fn default() -> Self {
110 RepeatN { inner: None }
111 }
112}
113
114#[stable(feature = "iter_repeat_n", since = "1.82.0")]
115impl<A: Clone> Iterator for RepeatN<A> {
116 type Item = A;
117
118 #[inline]
119 fn next(&mut self) -> Option<A> {
120 let inner = self.inner.as_mut()?;
121 let count = inner.count.get();
122
123 if let Some(decremented) = NonZero::<usize>::new(count - 1) {
124 let tmp = inner.element.clone();
126 inner.count = decremented;
127 return Some(tmp);
128 }
129
130 return self.take_element();
131 }
132
133 #[inline]
134 fn size_hint(&self) -> (usize, Option<usize>) {
135 let len = self.len();
136 (len, Some(len))
137 }
138
139 #[inline]
140 fn advance_by(&mut self, skip: usize) -> Result<(), NonZero<usize>> {
141 let Some(inner) = self.inner.as_mut() else {
142 return NonZero::<usize>::new(skip).map(Err).unwrap_or(Ok(()));
143 };
144
145 let len = inner.count.get();
146
147 if let Some(new_len) = len.checked_sub(skip).and_then(NonZero::<usize>::new) {
148 inner.count = new_len;
149 return Ok(());
150 }
151
152 self.inner = None;
153 return NonZero::<usize>::new(skip - len).map(Err).unwrap_or(Ok(()));
154 }
155
156 #[inline]
157 fn last(mut self) -> Option<A> {
158 self.take_element()
159 }
160
161 #[inline]
162 fn count(self) -> usize {
163 self.len()
164 }
165}
166
167#[stable(feature = "iter_repeat_n", since = "1.82.0")]
168impl<A: Clone> ExactSizeIterator for RepeatN<A> {
169 fn len(&self) -> usize {
170 self.inner.as_ref().map(|inner| inner.count.get()).unwrap_or(0)
171 }
172}
173
174#[stable(feature = "iter_repeat_n", since = "1.82.0")]
175impl<A: Clone> DoubleEndedIterator for RepeatN<A> {
176 #[inline]
177 fn next_back(&mut self) -> Option<A> {
178 self.next()
179 }
180
181 #[inline]
182 fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
183 self.advance_by(n)
184 }
185
186 #[inline]
187 fn nth_back(&mut self, n: usize) -> Option<A> {
188 self.nth(n)
189 }
190
191 #[inline]
192 fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
193 where
194 F: FnMut(B, A) -> R,
195 R: Try<Output = B>,
196 {
197 self.try_fold(init, f)
198 }
199
200 #[inline]
201 fn rfold<B, F>(self, init: B, f: F) -> B
202 where
203 F: FnMut(B, A) -> B,
204 {
205 self.fold(init, f)
206 }
207}
208
209#[stable(feature = "iter_repeat_n", since = "1.82.0")]
210impl<A: Clone> FusedIterator for RepeatN<A> {}
211
212#[unstable(feature = "trusted_len", issue = "37572")]
213unsafe impl<A: Clone> TrustedLen for RepeatN<A> {}
214#[stable(feature = "iter_repeat_n", since = "1.82.0")]
215impl<A: Clone> UncheckedIterator for RepeatN<A> {}