mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-14 07:53:24 +00:00
Fix iterator implementation, add some inlines
This commit is contained in:
parent
14e5816f1b
commit
2b5e592b7a
@ -10,6 +10,7 @@
|
||||
#![feature(macro_metavar_expr)]
|
||||
#![feature(min_specialization)]
|
||||
#![feature(slice_as_chunks)]
|
||||
#![feature(trusted_len)]
|
||||
#![feature(try_blocks)]
|
||||
#![feature(never_type)]
|
||||
#![recursion_limit = "256"]
|
||||
|
@ -38,6 +38,7 @@ use rustc_span::{self, BytePos, ExpnId, Pos, Span, SyntaxContext, DUMMY_SP};
|
||||
|
||||
use proc_macro::bridge::client::ProcMacro;
|
||||
use std::io;
|
||||
use std::iter::TrustedLen;
|
||||
use std::mem;
|
||||
use std::num::NonZeroUsize;
|
||||
use std::path::Path;
|
||||
@ -277,17 +278,25 @@ struct DecodeIterator<'a, 'tcx, T> {
|
||||
impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> Iterator for DecodeIterator<'a, 'tcx, T> {
|
||||
type Item = T;
|
||||
|
||||
#[inline(always)]
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
self.elem_counter.next().map(|_| T::decode(&mut self.dcx))
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
self.elem_counter.size_hint()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> ExactSizeIterator
|
||||
for DecodeIterator<'a, 'tcx, T>
|
||||
{
|
||||
fn len(&self) -> usize {
|
||||
self.elem_counter.len()
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<'a, 'tcx, T: Decodable<DecodeContext<'a, 'tcx>>> TrustedLen
|
||||
for DecodeIterator<'a, 'tcx, T>
|
||||
{
|
||||
}
|
||||
|
||||
impl<'a: 'x, 'tcx: 'x, 'x, T: Decodable<DecodeContext<'a, 'tcx>>> LazyArray<T> {
|
||||
@ -321,6 +330,7 @@ impl<'a, 'tcx> DecodeContext<'a, 'tcx> {
|
||||
self.cdata().map_encoded_cnum_to_current(cnum)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn read_lazy_offset_then<T>(&mut self, f: impl Fn(NonZeroUsize) -> T) -> T {
|
||||
let distance = self.read_usize();
|
||||
let position = match self.lazy_state {
|
||||
|
@ -32,24 +32,28 @@ trait ProcessQueryValue<'tcx, T> {
|
||||
}
|
||||
|
||||
impl<T> ProcessQueryValue<'_, Option<T>> for Option<T> {
|
||||
#[inline(always)]
|
||||
fn process_decoded(self, _tcx: TyCtxt<'_>, _err: impl Fn() -> !) -> Option<T> {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> ProcessQueryValue<'_, T> for Option<T> {
|
||||
#[inline(always)]
|
||||
fn process_decoded(self, _tcx: TyCtxt<'_>, err: impl Fn() -> !) -> T {
|
||||
if let Some(value) = self { value } else { err() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx, T: ArenaAllocatable<'tcx>> ProcessQueryValue<'tcx, &'tcx T> for Option<T> {
|
||||
#[inline(always)]
|
||||
fn process_decoded(self, tcx: TyCtxt<'tcx>, err: impl Fn() -> !) -> &'tcx T {
|
||||
if let Some(value) = self { tcx.arena.alloc(value) } else { err() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T, E> ProcessQueryValue<'_, Result<Option<T>, E>> for Option<T> {
|
||||
#[inline(always)]
|
||||
fn process_decoded(self, _tcx: TyCtxt<'_>, _err: impl Fn() -> !) -> Result<Option<T>, E> {
|
||||
Ok(self)
|
||||
}
|
||||
@ -58,12 +62,14 @@ impl<T, E> ProcessQueryValue<'_, Result<Option<T>, E>> for Option<T> {
|
||||
impl<'a, 'tcx, T: Copy + Decodable<DecodeContext<'a, 'tcx>>> ProcessQueryValue<'tcx, &'tcx [T]>
|
||||
for Option<DecodeIterator<'a, 'tcx, T>>
|
||||
{
|
||||
#[inline(always)]
|
||||
fn process_decoded(self, tcx: TyCtxt<'tcx>, _err: impl Fn() -> !) -> &'tcx [T] {
|
||||
if let Some(iter) = self { tcx.arena.alloc_from_iter(iter) } else { &[] }
|
||||
}
|
||||
}
|
||||
|
||||
impl ProcessQueryValue<'_, Option<DeprecationEntry>> for Option<Deprecation> {
|
||||
#[inline(always)]
|
||||
fn process_decoded(self, _tcx: TyCtxt<'_>, _err: impl Fn() -> !) -> Option<DeprecationEntry> {
|
||||
self.map(DeprecationEntry::external)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user