Skip to content

Commit 2a51e57

Browse files
committed
avoid exposing that binary heap's IntoIter is backed by vec::IntoIter, use a private trait instead
1 parent c731648 commit 2a51e57

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

library/alloc/src/collections/binary_heap.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ use core::ops::{Deref, DerefMut};
151151
use core::ptr;
152152

153153
use crate::slice;
154-
use crate::vec::{self, Vec};
154+
use crate::vec::{self, Vec, AsIntoIter};
155155

156156
use super::SpecExtend;
157157

@@ -1175,17 +1175,23 @@ impl<T> FusedIterator for IntoIter<T> {}
11751175

11761176
#[unstable(issue = "0", feature = "inplace_iteration")]
11771177
unsafe impl<T> SourceIter for IntoIter<T> {
1178-
type Source = impl Iterator<Item = T>;
1178+
type Source = IntoIter<T>;
11791179

11801180
#[inline]
11811181
fn as_inner(&mut self) -> &mut Self::Source {
1182-
&mut self.iter
1182+
self
11831183
}
11841184
}
11851185

11861186
#[unstable(issue = "0", feature = "inplace_iteration")]
11871187
unsafe impl<I> InPlaceIterable for IntoIter<I> {}
11881188

1189+
impl<I> AsIntoIter<I> for IntoIter<I> {
1190+
fn as_into_iter(&mut self) -> &mut vec::IntoIter<I> {
1191+
&mut self.iter
1192+
}
1193+
}
1194+
11891195
#[unstable(feature = "binary_heap_into_iter_sorted", issue = "59278")]
11901196
#[derive(Clone, Debug)]
11911197
pub struct IntoIterSorted<T> {

library/alloc/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
#![feature(map_first_last)]
108108
#![feature(map_into_keys_values)]
109109
#![feature(negative_impls)]
110-
#![cfg_attr(bootstrap, feature(never_type))]
110+
#![feature(never_type)]
111111
#![feature(new_uninit)]
112112
#![feature(nll)]
113113
#![feature(nonnull_slice_from_raw_parts)]

library/alloc/src/vec.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2221,7 +2221,7 @@ impl<T> SpecFrom<T, IntoIter<T>> for Vec<T> {
22212221
// T can be split into IN and OUT which only need to have the same size and alignment
22222222
impl<T, I> SpecFrom<T, I> for Vec<T>
22232223
where
2224-
I: Iterator<Item = T> + InPlaceIterable + SourceIter<Source = IntoIter<T>>,
2224+
I: Iterator<Item = T> + InPlaceIterable + SourceIter<Source: AsIntoIter<T>>,
22252225
{
22262226
default fn from_iter(mut iterator: I) -> Self {
22272227
// This specialization only makes sense if we're juggling real allocations.
@@ -2230,8 +2230,8 @@ where
22302230
return SpecFromNested::from_iter(iterator);
22312231
}
22322232

2233-
let src_buf = iterator.as_inner().buf.as_ptr();
2234-
let src_end = iterator.as_inner().end;
2233+
let src_buf = iterator.as_inner().as_into_iter().buf.as_ptr();
2234+
let src_end = iterator.as_inner().as_into_iter().end;
22352235
let dst = src_buf;
22362236

22372237
let dst = if mem::needs_drop::<T>() {
@@ -2273,14 +2273,14 @@ where
22732273
.unwrap()
22742274
};
22752275

2276-
let src = iterator.as_inner();
2276+
let src = iterator.as_inner().as_into_iter();
22772277
// check if SourceIter and InPlaceIterable contracts were upheld.
22782278
// caveat: if they weren't we may not even make it to this point
22792279
debug_assert_eq!(src_buf, src.buf.as_ptr());
22802280
debug_assert!(dst as *const _ <= src.ptr, "InPlaceIterable contract violation");
22812281

22822282
if mem::needs_drop::<T>() {
2283-
// drop tail if iterator was only partially exhaused
2283+
// drop tail if iterator was only partially exhausted
22842284
unsafe {
22852285
ptr::drop_in_place(src.as_mut_slice());
22862286
}
@@ -2998,6 +2998,17 @@ unsafe impl<T> SourceIter for IntoIter<T> {
29982998
}
29992999
}
30003000

3001+
// internal helper trait for in-place iteration specialization.
3002+
pub(crate) trait AsIntoIter<T> {
3003+
fn as_into_iter(&mut self) -> &mut IntoIter<T>;
3004+
}
3005+
3006+
impl<T> AsIntoIter<T> for IntoIter<T> {
3007+
fn as_into_iter(&mut self) -> &mut IntoIter<T> {
3008+
self
3009+
}
3010+
}
3011+
30013012
/// A draining iterator for `Vec<T>`.
30023013
///
30033014
/// This `struct` is created by [`Vec::drain`].

0 commit comments

Comments
 (0)