Skip to content

Commit 6fdd4f3

Browse files
committed
Use a macro to expand the specialized Fuse
1 parent f8d6fc1 commit 6fdd4f3

File tree

1 file changed

+23
-41
lines changed

1 file changed

+23
-41
lines changed

src/libcore/iter/adapters/fuse.rs

+23-41
Original file line numberDiff line numberDiff line change
@@ -188,34 +188,16 @@ where
188188
}
189189
}
190190

191-
// NOTE: for `I: FusedIterator`, we assume that the iterator is always `Some`
192-
impl<I: FusedIterator> Fuse<I> {
193-
#[inline(always)]
194-
fn as_inner(&self) -> &I {
195-
match self.iter {
196-
Some(ref iter) => iter,
191+
// NOTE: for `I: FusedIterator`, we assume that the iterator is always `Some`.
192+
// Implementing this as a directly-expanded macro helps codegen performance.
193+
macro_rules! unchecked {
194+
($self:ident) => {
195+
match $self {
196+
Fuse { iter: Some(iter) } => iter,
197197
// SAFETY: the specialized iterator never sets `None`
198-
None => unsafe { intrinsics::unreachable() },
198+
Fuse { iter: None } => unsafe { intrinsics::unreachable() },
199199
}
200-
}
201-
202-
#[inline(always)]
203-
fn as_inner_mut(&mut self) -> &mut I {
204-
match self.iter {
205-
Some(ref mut iter) => iter,
206-
// SAFETY: the specialized iterator never sets `None`
207-
None => unsafe { intrinsics::unreachable() },
208-
}
209-
}
210-
211-
#[inline(always)]
212-
fn into_inner(self) -> I {
213-
match self.iter {
214-
Some(iter) => iter,
215-
// SAFETY: the specialized iterator never sets `None`
216-
None => unsafe { intrinsics::unreachable() },
217-
}
218-
}
200+
};
219201
}
220202

221203
#[stable(feature = "fused", since = "1.26.0")]
@@ -225,27 +207,27 @@ where
225207
{
226208
#[inline]
227209
fn next(&mut self) -> Option<<I as Iterator>::Item> {
228-
self.as_inner_mut().next()
210+
unchecked!(self).next()
229211
}
230212

231213
#[inline]
232214
fn nth(&mut self, n: usize) -> Option<I::Item> {
233-
self.as_inner_mut().nth(n)
215+
unchecked!(self).nth(n)
234216
}
235217

236218
#[inline]
237219
fn last(self) -> Option<I::Item> {
238-
self.into_inner().last()
220+
unchecked!(self).last()
239221
}
240222

241223
#[inline]
242224
fn count(self) -> usize {
243-
self.into_inner().count()
225+
unchecked!(self).count()
244226
}
245227

246228
#[inline]
247229
fn size_hint(&self) -> (usize, Option<usize>) {
248-
self.as_inner().size_hint()
230+
unchecked!(self).size_hint()
249231
}
250232

251233
#[inline]
@@ -255,23 +237,23 @@ where
255237
Fold: FnMut(Acc, Self::Item) -> R,
256238
R: Try<Ok = Acc>,
257239
{
258-
self.as_inner_mut().try_fold(init, fold)
240+
unchecked!(self).try_fold(init, fold)
259241
}
260242

261243
#[inline]
262244
fn fold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
263245
where
264246
Fold: FnMut(Acc, Self::Item) -> Acc,
265247
{
266-
self.into_inner().fold(init, fold)
248+
unchecked!(self).fold(init, fold)
267249
}
268250

269251
#[inline]
270252
fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
271253
where
272254
P: FnMut(&Self::Item) -> bool,
273255
{
274-
self.as_inner_mut().find(predicate)
256+
unchecked!(self).find(predicate)
275257
}
276258
}
277259

@@ -282,12 +264,12 @@ where
282264
{
283265
#[inline]
284266
fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
285-
self.as_inner_mut().next_back()
267+
unchecked!(self).next_back()
286268
}
287269

288270
#[inline]
289271
fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
290-
self.as_inner_mut().nth_back(n)
272+
unchecked!(self).nth_back(n)
291273
}
292274

293275
#[inline]
@@ -297,23 +279,23 @@ where
297279
Fold: FnMut(Acc, Self::Item) -> R,
298280
R: Try<Ok = Acc>,
299281
{
300-
self.as_inner_mut().try_rfold(init, fold)
282+
unchecked!(self).try_rfold(init, fold)
301283
}
302284

303285
#[inline]
304286
fn rfold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
305287
where
306288
Fold: FnMut(Acc, Self::Item) -> Acc,
307289
{
308-
self.into_inner().rfold(init, fold)
290+
unchecked!(self).rfold(init, fold)
309291
}
310292

311293
#[inline]
312294
fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
313295
where
314296
P: FnMut(&Self::Item) -> bool,
315297
{
316-
self.as_inner_mut().rfind(predicate)
298+
unchecked!(self).rfind(predicate)
317299
}
318300
}
319301

@@ -323,11 +305,11 @@ where
323305
I: ExactSizeIterator + FusedIterator,
324306
{
325307
fn len(&self) -> usize {
326-
self.as_inner().len()
308+
unchecked!(self).len()
327309
}
328310

329311
fn is_empty(&self) -> bool {
330-
self.as_inner().is_empty()
312+
unchecked!(self).is_empty()
331313
}
332314
}
333315

0 commit comments

Comments
 (0)