Skip to content

Commit 0a294b5

Browse files
authored
Merge branch 'master' into stab_peek_mut
2 parents 90da319 + 1597416 commit 0a294b5

Some content is hidden

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

94 files changed

+1618
-1041
lines changed

alloc/benches/vec.rs

+25-68
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,13 @@ use test::{black_box, Bencher};
44

55
#[bench]
66
fn bench_new(b: &mut Bencher) {
7-
b.iter(|| {
8-
let v: Vec<u32> = Vec::new();
9-
assert_eq!(v.len(), 0);
10-
assert_eq!(v.capacity(), 0);
11-
v
12-
})
7+
b.iter(|| Vec::<u32>::new())
138
}
149

1510
fn do_bench_with_capacity(b: &mut Bencher, src_len: usize) {
1611
b.bytes = src_len as u64;
1712

18-
b.iter(|| {
19-
let v: Vec<u32> = Vec::with_capacity(src_len);
20-
assert_eq!(v.len(), 0);
21-
assert_eq!(v.capacity(), src_len);
22-
v
23-
})
13+
b.iter(|| Vec::<u32>::with_capacity(src_len))
2414
}
2515

2616
#[bench]
@@ -46,12 +36,7 @@ fn bench_with_capacity_1000(b: &mut Bencher) {
4636
fn do_bench_from_fn(b: &mut Bencher, src_len: usize) {
4737
b.bytes = src_len as u64;
4838

49-
b.iter(|| {
50-
let dst = (0..src_len).collect::<Vec<_>>();
51-
assert_eq!(dst.len(), src_len);
52-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
53-
dst
54-
})
39+
b.iter(|| (0..src_len).collect::<Vec<_>>())
5540
}
5641

5742
#[bench]
@@ -77,12 +62,7 @@ fn bench_from_fn_1000(b: &mut Bencher) {
7762
fn do_bench_from_elem(b: &mut Bencher, src_len: usize) {
7863
b.bytes = src_len as u64;
7964

80-
b.iter(|| {
81-
let dst: Vec<usize> = repeat(5).take(src_len).collect();
82-
assert_eq!(dst.len(), src_len);
83-
assert!(dst.iter().all(|x| *x == 5));
84-
dst
85-
})
65+
b.iter(|| repeat(5).take(src_len).collect::<Vec<usize>>())
8666
}
8767

8868
#[bench]
@@ -110,12 +90,7 @@ fn do_bench_from_slice(b: &mut Bencher, src_len: usize) {
11090

11191
b.bytes = src_len as u64;
11292

113-
b.iter(|| {
114-
let dst = src.clone()[..].to_vec();
115-
assert_eq!(dst.len(), src_len);
116-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
117-
dst
118-
});
93+
b.iter(|| src.as_slice().to_vec());
11994
}
12095

12196
#[bench]
@@ -144,9 +119,7 @@ fn do_bench_from_iter(b: &mut Bencher, src_len: usize) {
144119
b.bytes = src_len as u64;
145120

146121
b.iter(|| {
147-
let dst: Vec<_> = FromIterator::from_iter(src.clone());
148-
assert_eq!(dst.len(), src_len);
149-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
122+
let dst: Vec<_> = FromIterator::from_iter(src.iter().cloned());
150123
dst
151124
});
152125
}
@@ -180,8 +153,6 @@ fn do_bench_extend(b: &mut Bencher, dst_len: usize, src_len: usize) {
180153
b.iter(|| {
181154
let mut dst = dst.clone();
182155
dst.extend(src.clone());
183-
assert_eq!(dst.len(), dst_len + src_len);
184-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
185156
dst
186157
});
187158
}
@@ -230,8 +201,6 @@ fn do_bench_extend_from_slice(b: &mut Bencher, dst_len: usize, src_len: usize) {
230201
b.iter(|| {
231202
let mut dst = dst.clone();
232203
dst.extend_from_slice(&src);
233-
assert_eq!(dst.len(), dst_len + src_len);
234-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
235204
dst
236205
});
237206
}
@@ -290,12 +259,7 @@ fn do_bench_clone(b: &mut Bencher, src_len: usize) {
290259

291260
b.bytes = src_len as u64;
292261

293-
b.iter(|| {
294-
let dst = src.clone();
295-
assert_eq!(dst.len(), src_len);
296-
assert!(dst.iter().enumerate().all(|(i, x)| i == *x));
297-
dst
298-
});
262+
b.iter(|| src.clone());
299263
}
300264

301265
#[bench]
@@ -329,8 +293,7 @@ fn do_bench_clone_from(b: &mut Bencher, times: usize, dst_len: usize, src_len: u
329293

330294
for _ in 0..times {
331295
dst.clone_from(&src);
332-
assert_eq!(dst.len(), src_len);
333-
assert!(dst.iter().enumerate().all(|(i, x)| dst_len + i == *x));
296+
dst = black_box(dst);
334297
}
335298
dst
336299
});
@@ -463,11 +426,10 @@ macro_rules! bench_in_place {
463426
fn $fname(b: &mut Bencher) {
464427
b.iter(|| {
465428
let src: Vec<$type> = black_box(vec![$init; $count]);
466-
let mut sink = src.into_iter()
429+
src.into_iter()
467430
.enumerate()
468431
.map(|(idx, e)| idx as $type ^ e)
469-
.collect::<Vec<$type>>();
470-
black_box(sink.as_mut_ptr())
432+
.collect::<Vec<$type>>()
471433
});
472434
}
473435
)+
@@ -527,7 +489,6 @@ fn bench_in_place_zip_recycle(b: &mut Bencher) {
527489
.enumerate()
528490
.map(|(i, (d, s))| d.wrapping_add(i as u8) ^ s)
529491
.collect::<Vec<_>>();
530-
assert_eq!(mangled.len(), 1000);
531492
data = black_box(mangled);
532493
});
533494
}
@@ -614,23 +575,6 @@ fn bench_nest_chain_chain_collect(b: &mut Bencher) {
614575
});
615576
}
616577

617-
pub fn example_plain_slow(l: &[u32]) -> Vec<u32> {
618-
let mut result = Vec::with_capacity(l.len());
619-
result.extend(l.iter().rev());
620-
result
621-
}
622-
623-
pub fn map_fast(l: &[(u32, u32)]) -> Vec<u32> {
624-
let mut result = Vec::with_capacity(l.len());
625-
for i in 0..l.len() {
626-
unsafe {
627-
*result.get_unchecked_mut(i) = l[i].0;
628-
result.set_len(i);
629-
}
630-
}
631-
result
632-
}
633-
634578
#[bench]
635579
fn bench_range_map_collect(b: &mut Bencher) {
636580
b.iter(|| (0..LEN).map(|_| u32::default()).collect::<Vec<_>>());
@@ -669,7 +613,11 @@ fn bench_rev_1(b: &mut Bencher) {
669613
#[bench]
670614
fn bench_rev_2(b: &mut Bencher) {
671615
let data = black_box([0; LEN]);
672-
b.iter(|| example_plain_slow(&data));
616+
b.iter(|| {
617+
let mut v = Vec::<u32>::with_capacity(data.len());
618+
v.extend(data.iter().rev());
619+
v
620+
});
673621
}
674622

675623
#[bench]
@@ -685,7 +633,16 @@ fn bench_map_regular(b: &mut Bencher) {
685633
#[bench]
686634
fn bench_map_fast(b: &mut Bencher) {
687635
let data = black_box([(0, 0); LEN]);
688-
b.iter(|| map_fast(&data));
636+
b.iter(|| {
637+
let mut result = Vec::with_capacity(data.len());
638+
for i in 0..data.len() {
639+
unsafe {
640+
*result.get_unchecked_mut(i) = data[i].0;
641+
result.set_len(i);
642+
}
643+
}
644+
result
645+
});
689646
}
690647

691648
fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) {

alloc/src/collections/binary_heap.rs

+21
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,27 @@ impl<T> BinaryHeap<T> {
958958
self.data.shrink_to(min_capacity)
959959
}
960960

961+
/// Returns a slice of all values in the underlying vector, in arbitrary
962+
/// order.
963+
///
964+
/// # Examples
965+
///
966+
/// Basic usage:
967+
///
968+
/// ```
969+
/// #![feature(binary_heap_as_slice)]
970+
/// use std::collections::BinaryHeap;
971+
/// use std::io::{self, Write};
972+
///
973+
/// let heap = BinaryHeap::from(vec![1, 2, 3, 4, 5, 6, 7]);
974+
///
975+
/// io::sink().write(heap.as_slice()).unwrap();
976+
/// ```
977+
#[unstable(feature = "binary_heap_as_slice", issue = "83659")]
978+
pub fn as_slice(&self) -> &[T] {
979+
self.data.as_slice()
980+
}
981+
961982
/// Consumes the `BinaryHeap` and returns the underlying vector
962983
/// in arbitrary order.
963984
///

alloc/src/collections/btree/map/tests.rs

-2
Original file line numberDiff line numberDiff line change
@@ -776,7 +776,6 @@ fn test_range_backwards_4() {
776776
}
777777

778778
#[test]
779-
#[should_panic]
780779
fn test_range_finding_ill_order_in_map() {
781780
let mut map = BTreeMap::new();
782781
map.insert(Cyclic3::B, ());
@@ -789,7 +788,6 @@ fn test_range_finding_ill_order_in_map() {
789788
}
790789

791790
#[test]
792-
#[should_panic]
793791
fn test_range_finding_ill_order_in_range_ord() {
794792
// Has proper order the first time asked, then flips around.
795793
struct EvilTwin(i32);

alloc/src/collections/btree/navigate.rs

+11-4
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,18 @@ impl<BorrowType, K, V> LeafRange<BorrowType, K, V> {
2929

3030
impl<BorrowType: marker::BorrowType, K, V> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
3131
/// Finds the distinct leaf edges delimiting a specified range in a tree.
32-
/// Returns either a pair of different handles into the same tree or a pair
33-
/// of empty options.
32+
///
33+
/// If such distinct edges exist, returns them in ascending order, meaning
34+
/// that a non-zero number of calls to `next_unchecked` on the `front` of
35+
/// the result and/or calls to `next_back_unchecked` on the `back` of the
36+
/// result will eventually reach the same edge.
37+
///
38+
/// If there are no such edges, i.e., if the tree contains no key within
39+
/// the range, returns a pair of empty options.
40+
///
3441
/// # Safety
35-
/// Unless `BorrowType` is `Immut`, do not use the duplicate handles to
36-
/// visit the same KV twice.
42+
/// Unless `BorrowType` is `Immut`, do not use the handles to visit the same
43+
/// KV twice.
3744
unsafe fn find_leaf_edges_spanning_range<Q: ?Sized, R>(
3845
self,
3946
range: R,

0 commit comments

Comments
 (0)