Skip to content

Rollup of 14 pull requests #63319

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 35 commits into from
Aug 6, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
56ebfb1
Implement DoubleEndedIterator for iter::{StepBy, Peekable, Take}
timvermeulen Jun 2, 2019
3b15b16
Explaining the reason why validation is performed in to_str of path.rs
JasonShin Aug 1, 2019
1aa4a57
Update src/libstd/path.rs to shorten the explanation for .to_str vali…
JasonShin Aug 1, 2019
0d15845
fix UB in a test
RalfJung Aug 4, 2019
95f29aa
Revert "Rollup merge of #62696 - chocol4te:fix_#62194, r=estebank"
arielb1 Aug 4, 2019
4e51ef7
Test content, not value
RalfJung Aug 5, 2019
b5e35b1
remove special code path for unknown tokens
matklad Jul 30, 2019
58ac81a
add unknown token
matklad Jul 30, 2019
b3e8c8b
adapt rustdoc to infailable lexer
matklad Jul 30, 2019
ab3fb1e
Drop span argument from mk_list_item
Mark-Simulacrum Aug 4, 2019
24a491f
Drop explicit span argument from mk_name_value_item
Mark-Simulacrum Aug 4, 2019
8849149
Make mk_attr_id private to libsyntax
Mark-Simulacrum Aug 4, 2019
fbf93d4
Remove leftover AwaitOrigin
Mark-Simulacrum Aug 5, 2019
90b95cf
fix slice comparison
RalfJung Aug 5, 2019
288b4e9
Don't store &Span
Mark-Simulacrum Aug 5, 2019
1f01863
improve align_offset docs
RalfJung Aug 5, 2019
30910ee
Make qualify consts in_projection use PlaceRef
spastorino Aug 5, 2019
9058bf2
Make use of possibly uninitialized data a hard error
tmandry Aug 3, 2019
571e22d
Clarify align_to's requirements and obligations
shepmaster Aug 5, 2019
175eb9c
doc: fix broken sentence
tshepang Aug 6, 2019
ee48f82
Update README.md
Centril Aug 6, 2019
fe998db
Rollup merge of #61457 - timvermeulen:double_ended_iters, r=scottmcm
Centril Aug 6, 2019
61e270a
Rollup merge of #63017 - matklad:no-fatal, r=petrochenkov
Centril Aug 6, 2019
e988230
Rollup merge of #63184 - JasonShin:master, r=sfackler
Centril Aug 6, 2019
ab7155d
Rollup merge of #63230 - tmandry:disallow-possibly-uninitialized, r=C…
Centril Aug 6, 2019
046936a
Rollup merge of #63260 - RalfJung:ptr-test, r=matklad
Centril Aug 6, 2019
61da2f4
Rollup merge of #63264 - arielb1:revert-private-coherence-errors, r=e…
Centril Aug 6, 2019
b2603d6
Rollup merge of #63272 - Mark-Simulacrum:clean-attr, r=petrochenkov
Centril Aug 6, 2019
2301ecd
Rollup merge of #63285 - Mark-Simulacrum:rm-await-origin, r=Centril
Centril Aug 6, 2019
505d68e
Rollup merge of #63287 - Mark-Simulacrum:span-no-ref, r=Centril
Centril Aug 6, 2019
000d646
Rollup merge of #63293 - shepmaster:align-to-doc, r=RalfJung
Centril Aug 6, 2019
d7b49a8
Rollup merge of #63295 - RalfJung:align_offset, r=dtolnay
Centril Aug 6, 2019
5a3359d
Rollup merge of #63299 - spastorino:in-projection-use-ref, r=oli-obk
Centril Aug 6, 2019
5710a23
Rollup merge of #63312 - tshepang:doc-fix, r=Centril
Centril Aug 6, 2019
c27405f
Rollup merge of #63315 - rust-lang:fix-63313, r=alexreg
Centril Aug 6, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions src/libcore/iter/adapters/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,39 @@ impl<I> Iterator for StepBy<I> where I: Iterator {
}
}

impl<I> StepBy<I> where I: ExactSizeIterator {
// The zero-based index starting from the end of the iterator of the
// last element. Used in the `DoubleEndedIterator` implementation.
fn next_back_index(&self) -> usize {
let rem = self.iter.len() % (self.step + 1);
if self.first_take {
if rem == 0 { self.step } else { rem - 1 }
} else {
rem
}
}
}

#[stable(feature = "double_ended_step_by_iterator", since = "1.38.0")]
impl<I> DoubleEndedIterator for StepBy<I> where I: DoubleEndedIterator + ExactSizeIterator {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.nth_back(self.next_back_index())
}

#[inline]
fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
// `self.iter.nth_back(usize::MAX)` does the right thing here when `n`
// is out of bounds because the length of `self.iter` does not exceed
// `usize::MAX` (because `I: ExactSizeIterator`) and `nth_back` is
// zero-indexed
let n = n
.saturating_mul(self.step + 1)
.saturating_add(self.next_back_index());
self.iter.nth_back(n)
}
}

// StepBy can only make the iterator shorter, so the len will still fit.
#[stable(feature = "iterator_step_by", since = "1.28.0")]
impl<I> ExactSizeIterator for StepBy<I> where I: ExactSizeIterator {}
Expand Down Expand Up @@ -1158,6 +1191,45 @@ impl<I: Iterator> Iterator for Peekable<I> {
}
}

#[stable(feature = "double_ended_peek_iterator", since = "1.38.0")]
impl<I> DoubleEndedIterator for Peekable<I> where I: DoubleEndedIterator {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
self.iter.next_back().or_else(|| self.peeked.take().and_then(|x| x))
}

#[inline]
fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where
Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
{
match self.peeked.take() {
Some(None) => return Try::from_ok(init),
Some(Some(v)) => match self.iter.try_rfold(init, &mut f).into_result() {
Ok(acc) => f(acc, v),
Err(e) => {
self.peeked = Some(Some(v));
Try::from_error(e)
}
},
None => self.iter.try_rfold(init, f),
}
}

#[inline]
fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
where Fold: FnMut(Acc, Self::Item) -> Acc,
{
match self.peeked {
Some(None) => return init,
Some(Some(v)) => {
let acc = self.iter.rfold(init, &mut fold);
fold(acc, v)
}
None => self.iter.rfold(init, fold),
}
}
}

#[stable(feature = "rust1", since = "1.0.0")]
impl<I: ExactSizeIterator> ExactSizeIterator for Peekable<I> {}

Expand Down Expand Up @@ -1627,6 +1699,51 @@ impl<I> Iterator for Take<I> where I: Iterator{
}
}

#[stable(feature = "double_ended_take_iterator", since = "1.38.0")]
impl<I> DoubleEndedIterator for Take<I> where I: DoubleEndedIterator + ExactSizeIterator {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
if self.n == 0 {
None
} else {
let n = self.n;
self.n -= 1;
self.iter.nth_back(self.iter.len().saturating_sub(n))
}
}

#[inline]
fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
let len = self.iter.len();
if self.n > n {
let m = len.saturating_sub(self.n) + n;
self.n -= n + 1;
self.iter.nth_back(m)
} else {
if len > 0 {
self.iter.nth_back(len - 1);
}
None
}
}

#[inline]
fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok = Acc>
{
if self.n == 0 {
Try::from_ok(init)
} else {
let len = self.iter.len();
if len > self.n && self.iter.nth_back(len - self.n - 1).is_none() {
Try::from_ok(init)
} else {
self.iter.try_rfold(init, fold)
}
}
}
}

#[stable(feature = "rust1", since = "1.0.0")]
impl<I> ExactSizeIterator for Take<I> where I: ExactSizeIterator {}

Expand Down
12 changes: 8 additions & 4 deletions src/libcore/ptr/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1606,10 +1606,12 @@ impl<T: ?Sized> *const T {
/// `align`.
///
/// If it is not possible to align the pointer, the implementation returns
/// `usize::max_value()`.
/// `usize::max_value()`. It is permissible for the implementation to *always*
/// return `usize::max_value()`. Only your algorithm's performance can depend
/// on getting a usable offset here, not its correctness.
///
/// The offset is expressed in number of `T` elements, and not bytes. The value returned can be
/// used with the `add` method.
/// used with the `wrapping_add` method.
///
/// There are no guarantees whatsoever that offsetting the pointer will not overflow or go
/// beyond the allocation that the pointer points into. It is up to the caller to ensure that
Expand Down Expand Up @@ -2407,10 +2409,12 @@ impl<T: ?Sized> *mut T {
/// `align`.
///
/// If it is not possible to align the pointer, the implementation returns
/// `usize::max_value()`.
/// `usize::max_value()`. It is permissible for the implementation to *always*
/// return `usize::max_value()`. Only your algorithm's performance can depend
/// on getting a usable offset here, not its correctness.
///
/// The offset is expressed in number of `T` elements, and not bytes. The value returned can be
/// used with the `add` method.
/// used with the `wrapping_add` method.
///
/// There are no guarantees whatsoever that offsetting the pointer will not overflow or go
/// beyond the allocation that the pointer points into. It is up to the caller to ensure that
Expand Down
14 changes: 8 additions & 6 deletions src/libcore/slice/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2308,9 +2308,10 @@ impl<T> [T] {
/// maintained.
///
/// This method splits the slice into three distinct slices: prefix, correctly aligned middle
/// slice of a new type, and the suffix slice. The method does a best effort to make the
/// middle slice the greatest length possible for a given type and input slice, but only
/// your algorithm's performance should depend on that, not its correctness.
/// slice of a new type, and the suffix slice. The method may make the middle slice the greatest
/// length possible for a given type and input slice, but only your algorithm's performance
/// should depend on that, not its correctness. It is permissible for all of the input data to
/// be returned as the prefix or suffix slice.
///
/// This method has no purpose when either input element `T` or output element `U` are
/// zero-sized and will return the original slice without splitting anything.
Expand Down Expand Up @@ -2361,9 +2362,10 @@ impl<T> [T] {
/// maintained.
///
/// This method splits the slice into three distinct slices: prefix, correctly aligned middle
/// slice of a new type, and the suffix slice. The method does a best effort to make the
/// middle slice the greatest length possible for a given type and input slice, but only
/// your algorithm's performance should depend on that, not its correctness.
/// slice of a new type, and the suffix slice. The method may make the middle slice the greatest
/// length possible for a given type and input slice, but only your algorithm's performance
/// should depend on that, not its correctness. It is permissible for all of the input data to
/// be returned as the prefix or suffix slice.
///
/// This method has no purpose when either input element `T` or output element `U` are
/// zero-sized and will return the original slice without splitting anything.
Expand Down
Loading