Skip to content

Commit 2789b06

Browse files
committed
Auto merge of #48768 - kennytm:rollup, r=kennytm
Rollup of 14 pull requests - Successful merges: #48403, #48432, #48546, #48573, #48590, #48657, #48727, #48732, #48753, #48754, #48761, #48474, #48507, #47463 - Failed merges:
2 parents b977e04 + 8e3493d commit 2789b06

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+684
-384
lines changed

src/etc/sugarise-doc-comments.py

-93
This file was deleted.

src/liballoc/binary_heap.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ impl<'a, T> ExactSizeIterator for Iter<'a, T> {
964964
}
965965
}
966966

967-
#[unstable(feature = "fused", issue = "35602")]
967+
#[stable(feature = "fused", since = "1.26.0")]
968968
impl<'a, T> FusedIterator for Iter<'a, T> {}
969969

970970
/// An owning iterator over the elements of a `BinaryHeap`.
@@ -1019,7 +1019,7 @@ impl<T> ExactSizeIterator for IntoIter<T> {
10191019
}
10201020
}
10211021

1022-
#[unstable(feature = "fused", issue = "35602")]
1022+
#[stable(feature = "fused", since = "1.26.0")]
10231023
impl<T> FusedIterator for IntoIter<T> {}
10241024

10251025
/// A draining iterator over the elements of a `BinaryHeap`.
@@ -1065,7 +1065,7 @@ impl<'a, T: 'a> ExactSizeIterator for Drain<'a, T> {
10651065
}
10661066
}
10671067

1068-
#[unstable(feature = "fused", issue = "35602")]
1068+
#[stable(feature = "fused", since = "1.26.0")]
10691069
impl<'a, T: 'a> FusedIterator for Drain<'a, T> {}
10701070

10711071
#[stable(feature = "binary_heap_extras_15", since = "1.5.0")]

src/liballoc/boxed.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ impl<I: ExactSizeIterator + ?Sized> ExactSizeIterator for Box<I> {
722722
}
723723
}
724724

725-
#[unstable(feature = "fused", issue = "35602")]
725+
#[stable(feature = "fused", since = "1.26.0")]
726726
impl<I: FusedIterator + ?Sized> FusedIterator for Box<I> {}
727727

728728

src/liballoc/btree/map.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1156,7 +1156,7 @@ impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> {
11561156
}
11571157
}
11581158

1159-
#[unstable(feature = "fused", issue = "35602")]
1159+
#[stable(feature = "fused", since = "1.26.0")]
11601160
impl<'a, K, V> FusedIterator for Iter<'a, K, V> {}
11611161

11621162
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1235,7 +1235,7 @@ impl<'a, K: 'a, V: 'a> ExactSizeIterator for IterMut<'a, K, V> {
12351235
}
12361236
}
12371237

1238-
#[unstable(feature = "fused", issue = "35602")]
1238+
#[stable(feature = "fused", since = "1.26.0")]
12391239
impl<'a, K, V> FusedIterator for IterMut<'a, K, V> {}
12401240

12411241
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1365,7 +1365,7 @@ impl<K, V> ExactSizeIterator for IntoIter<K, V> {
13651365
}
13661366
}
13671367

1368-
#[unstable(feature = "fused", issue = "35602")]
1368+
#[stable(feature = "fused", since = "1.26.0")]
13691369
impl<K, V> FusedIterator for IntoIter<K, V> {}
13701370

13711371
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1395,7 +1395,7 @@ impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
13951395
}
13961396
}
13971397

1398-
#[unstable(feature = "fused", issue = "35602")]
1398+
#[stable(feature = "fused", since = "1.26.0")]
13991399
impl<'a, K, V> FusedIterator for Keys<'a, K, V> {}
14001400

14011401
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1432,7 +1432,7 @@ impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
14321432
}
14331433
}
14341434

1435-
#[unstable(feature = "fused", issue = "35602")]
1435+
#[stable(feature = "fused", since = "1.26.0")]
14361436
impl<'a, K, V> FusedIterator for Values<'a, K, V> {}
14371437

14381438
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1482,7 +1482,7 @@ impl<'a, K, V> ExactSizeIterator for ValuesMut<'a, K, V> {
14821482
}
14831483
}
14841484

1485-
#[unstable(feature = "fused", issue = "35602")]
1485+
#[stable(feature = "fused", since = "1.26.0")]
14861486
impl<'a, K, V> FusedIterator for ValuesMut<'a, K, V> {}
14871487

14881488

@@ -1561,7 +1561,7 @@ impl<'a, K, V> Range<'a, K, V> {
15611561
}
15621562
}
15631563

1564-
#[unstable(feature = "fused", issue = "35602")]
1564+
#[stable(feature = "fused", since = "1.26.0")]
15651565
impl<'a, K, V> FusedIterator for Range<'a, K, V> {}
15661566

15671567
#[stable(feature = "btree_range", since = "1.17.0")]
@@ -1630,7 +1630,7 @@ impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V> {
16301630
}
16311631
}
16321632

1633-
#[unstable(feature = "fused", issue = "35602")]
1633+
#[stable(feature = "fused", since = "1.26.0")]
16341634
impl<'a, K, V> FusedIterator for RangeMut<'a, K, V> {}
16351635

16361636
impl<'a, K, V> RangeMut<'a, K, V> {

src/liballoc/btree/set.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -946,7 +946,7 @@ impl<'a, T> ExactSizeIterator for Iter<'a, T> {
946946
fn len(&self) -> usize { self.iter.len() }
947947
}
948948

949-
#[unstable(feature = "fused", issue = "35602")]
949+
#[stable(feature = "fused", since = "1.26.0")]
950950
impl<'a, T> FusedIterator for Iter<'a, T> {}
951951

952952
#[stable(feature = "rust1", since = "1.0.0")]
@@ -971,7 +971,7 @@ impl<T> ExactSizeIterator for IntoIter<T> {
971971
fn len(&self) -> usize { self.iter.len() }
972972
}
973973

974-
#[unstable(feature = "fused", issue = "35602")]
974+
#[stable(feature = "fused", since = "1.26.0")]
975975
impl<T> FusedIterator for IntoIter<T> {}
976976

977977
#[stable(feature = "btree_range", since = "1.17.0")]
@@ -997,7 +997,7 @@ impl<'a, T> DoubleEndedIterator for Range<'a, T> {
997997
}
998998
}
999999

1000-
#[unstable(feature = "fused", issue = "35602")]
1000+
#[stable(feature = "fused", since = "1.26.0")]
10011001
impl<'a, T> FusedIterator for Range<'a, T> {}
10021002

10031003
/// Compare `x` and `y`, but return `short` if x is None and `long` if y is None
@@ -1044,7 +1044,7 @@ impl<'a, T: Ord> Iterator for Difference<'a, T> {
10441044
}
10451045
}
10461046

1047-
#[unstable(feature = "fused", issue = "35602")]
1047+
#[stable(feature = "fused", since = "1.26.0")]
10481048
impl<'a, T: Ord> FusedIterator for Difference<'a, T> {}
10491049

10501050
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1078,7 +1078,7 @@ impl<'a, T: Ord> Iterator for SymmetricDifference<'a, T> {
10781078
}
10791079
}
10801080

1081-
#[unstable(feature = "fused", issue = "35602")]
1081+
#[stable(feature = "fused", since = "1.26.0")]
10821082
impl<'a, T: Ord> FusedIterator for SymmetricDifference<'a, T> {}
10831083

10841084
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1116,7 +1116,7 @@ impl<'a, T: Ord> Iterator for Intersection<'a, T> {
11161116
}
11171117
}
11181118

1119-
#[unstable(feature = "fused", issue = "35602")]
1119+
#[stable(feature = "fused", since = "1.26.0")]
11201120
impl<'a, T: Ord> FusedIterator for Intersection<'a, T> {}
11211121

11221122
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1150,5 +1150,5 @@ impl<'a, T: Ord> Iterator for Union<'a, T> {
11501150
}
11511151
}
11521152

1153-
#[unstable(feature = "fused", issue = "35602")]
1153+
#[stable(feature = "fused", since = "1.26.0")]
11541154
impl<'a, T: Ord> FusedIterator for Union<'a, T> {}

src/liballoc/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@
9696
#![feature(fmt_internals)]
9797
#![feature(from_ref)]
9898
#![feature(fundamental)]
99-
#![feature(fused)]
10099
#![feature(generic_param_attrs)]
101100
#![feature(i128_type)]
102101
#![feature(inclusive_range)]
@@ -124,8 +123,9 @@
124123
#![feature(allocator_internals)]
125124
#![feature(on_unimplemented)]
126125
#![feature(exact_chunks)]
126+
#![feature(pointer_methods)]
127127

128-
#![cfg_attr(not(test), feature(fused, fn_traits, placement_new_protocol, swap_with_slice, i128))]
128+
#![cfg_attr(not(test), feature(fn_traits, placement_new_protocol, swap_with_slice, i128))]
129129
#![cfg_attr(test, feature(test, box_heap))]
130130

131131
// Allow testing this library

src/liballoc/linked_list.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
897897
#[stable(feature = "rust1", since = "1.0.0")]
898898
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
899899

900-
#[unstable(feature = "fused", issue = "35602")]
900+
#[stable(feature = "fused", since = "1.26.0")]
901901
impl<'a, T> FusedIterator for Iter<'a, T> {}
902902

903903
#[stable(feature = "rust1", since = "1.0.0")]
@@ -946,7 +946,7 @@ impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
946946
#[stable(feature = "rust1", since = "1.0.0")]
947947
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
948948

949-
#[unstable(feature = "fused", issue = "35602")]
949+
#[stable(feature = "fused", since = "1.26.0")]
950950
impl<'a, T> FusedIterator for IterMut<'a, T> {}
951951

952952
impl<'a, T> IterMut<'a, T> {
@@ -1117,7 +1117,7 @@ impl<T> DoubleEndedIterator for IntoIter<T> {
11171117
#[stable(feature = "rust1", since = "1.0.0")]
11181118
impl<T> ExactSizeIterator for IntoIter<T> {}
11191119

1120-
#[unstable(feature = "fused", issue = "35602")]
1120+
#[stable(feature = "fused", since = "1.26.0")]
11211121
impl<T> FusedIterator for IntoIter<T> {}
11221122

11231123
#[stable(feature = "rust1", since = "1.0.0")]

src/liballoc/str.rs

+55-4
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use core::str as core_str;
4343
use core::str::pattern::Pattern;
4444
use core::str::pattern::{Searcher, ReverseSearcher, DoubleEndedSearcher};
4545
use core::mem;
46+
use core::ptr;
4647
use core::iter::FusedIterator;
4748
use std_unicode::str::{UnicodeStr, Utf16Encoder};
4849

@@ -171,7 +172,7 @@ impl<'a> Iterator for EncodeUtf16<'a> {
171172
}
172173
}
173174

174-
#[unstable(feature = "fused", issue = "35602")]
175+
#[stable(feature = "fused", since = "1.26.0")]
175176
impl<'a> FusedIterator for EncodeUtf16<'a> {}
176177

177178
#[stable(feature = "rust1", since = "1.0.0")]
@@ -2066,9 +2067,59 @@ impl str {
20662067
/// ```
20672068
#[stable(feature = "repeat_str", since = "1.16.0")]
20682069
pub fn repeat(&self, n: usize) -> String {
2069-
let mut s = String::with_capacity(self.len() * n);
2070-
s.extend((0..n).map(|_| self));
2071-
s
2070+
if n == 0 {
2071+
return String::new();
2072+
}
2073+
2074+
// If `n` is larger than zero, it can be split as
2075+
// `n = 2^expn + rem (2^expn > rem, expn >= 0, rem >= 0)`.
2076+
// `2^expn` is the number represented by the leftmost '1' bit of `n`,
2077+
// and `rem` is the remaining part of `n`.
2078+
2079+
// Using `Vec` to access `set_len()`.
2080+
let mut buf = Vec::with_capacity(self.len() * n);
2081+
2082+
// `2^expn` repetition is done by doubling `buf` `expn`-times.
2083+
buf.extend(self.as_bytes());
2084+
{
2085+
let mut m = n >> 1;
2086+
// If `m > 0`, there are remaining bits up to the leftmost '1'.
2087+
while m > 0 {
2088+
// `buf.extend(buf)`:
2089+
unsafe {
2090+
ptr::copy_nonoverlapping(
2091+
buf.as_ptr(),
2092+
(buf.as_mut_ptr() as *mut u8).add(buf.len()),
2093+
buf.len(),
2094+
);
2095+
// `buf` has capacity of `self.len() * n`.
2096+
let buf_len = buf.len();
2097+
buf.set_len(buf_len * 2);
2098+
}
2099+
2100+
m >>= 1;
2101+
}
2102+
}
2103+
2104+
// `rem` (`= n - 2^expn`) repetition is done by copying
2105+
// first `rem` repetitions from `buf` itself.
2106+
let rem_len = self.len() * n - buf.len(); // `self.len() * rem`
2107+
if rem_len > 0 {
2108+
// `buf.extend(buf[0 .. rem_len])`:
2109+
unsafe {
2110+
// This is non-overlapping since `2^expn > rem`.
2111+
ptr::copy_nonoverlapping(
2112+
buf.as_ptr(),
2113+
(buf.as_mut_ptr() as *mut u8).add(buf.len()),
2114+
rem_len,
2115+
);
2116+
// `buf.len() + rem_len` equals to `buf.capacity()` (`= self.len() * n`).
2117+
let buf_cap = buf.capacity();
2118+
buf.set_len(buf_cap);
2119+
}
2120+
}
2121+
2122+
unsafe { String::from_utf8_unchecked(buf) }
20722123
}
20732124

20742125
/// Checks if all characters in this string are within the ASCII range.

src/liballoc/string.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2254,5 +2254,5 @@ impl<'a> DoubleEndedIterator for Drain<'a> {
22542254
}
22552255
}
22562256

2257-
#[unstable(feature = "fused", issue = "35602")]
2257+
#[stable(feature = "fused", since = "1.26.0")]
22582258
impl<'a> FusedIterator for Drain<'a> {}

0 commit comments

Comments
 (0)