Skip to content

Commit 0570f09

Browse files
committed
Add support for custom allocator in VecDeque
1 parent 0443424 commit 0570f09

File tree

5 files changed

+130
-74
lines changed

5 files changed

+130
-74
lines changed

library/alloc/src/collections/vec_deque/drain.rs

+14-12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ use core::iter::FusedIterator;
22
use core::ptr::{self, NonNull};
33
use core::{fmt, mem};
44

5+
use crate::alloc::{Allocator, Global};
6+
57
use super::{count, Iter, VecDeque};
68

79
/// A draining iterator over the elements of a `VecDeque`.
@@ -11,15 +13,15 @@ use super::{count, Iter, VecDeque};
1113
///
1214
/// [`drain`]: VecDeque::drain
1315
#[stable(feature = "drain", since = "1.6.0")]
14-
pub struct Drain<'a, T: 'a> {
16+
pub struct Drain<'a, T: 'a, A: Allocator = Global> {
1517
pub(crate) after_tail: usize,
1618
pub(crate) after_head: usize,
1719
pub(crate) iter: Iter<'a, T>,
18-
pub(crate) deque: NonNull<VecDeque<T>>,
20+
pub(crate) deque: NonNull<VecDeque<T, A>>,
1921
}
2022

2123
#[stable(feature = "collection_debug", since = "1.17.0")]
22-
impl<T: fmt::Debug> fmt::Debug for Drain<'_, T> {
24+
impl<T: fmt::Debug, A: Allocator> fmt::Debug for Drain<'_, T, A> {
2325
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2426
f.debug_tuple("Drain")
2527
.field(&self.after_tail)
@@ -30,16 +32,16 @@ impl<T: fmt::Debug> fmt::Debug for Drain<'_, T> {
3032
}
3133

3234
#[stable(feature = "drain", since = "1.6.0")]
33-
unsafe impl<T: Sync> Sync for Drain<'_, T> {}
35+
unsafe impl<T: Sync, A: Allocator + Sync> Sync for Drain<'_, T, A> {}
3436
#[stable(feature = "drain", since = "1.6.0")]
35-
unsafe impl<T: Send> Send for Drain<'_, T> {}
37+
unsafe impl<T: Send, A: Allocator + Send> Send for Drain<'_, T, A> {}
3638

3739
#[stable(feature = "drain", since = "1.6.0")]
38-
impl<T> Drop for Drain<'_, T> {
40+
impl<T, A: Allocator> Drop for Drain<'_, T, A> {
3941
fn drop(&mut self) {
40-
struct DropGuard<'r, 'a, T>(&'r mut Drain<'a, T>);
42+
struct DropGuard<'r, 'a, T, A: Allocator>(&'r mut Drain<'a, T, A>);
4143

42-
impl<'r, 'a, T> Drop for DropGuard<'r, 'a, T> {
44+
impl<'r, 'a, T, A: Allocator> Drop for DropGuard<'r, 'a, T, A> {
4345
fn drop(&mut self) {
4446
self.0.for_each(drop);
4547

@@ -96,7 +98,7 @@ impl<T> Drop for Drain<'_, T> {
9698
}
9799

98100
#[stable(feature = "drain", since = "1.6.0")]
99-
impl<T> Iterator for Drain<'_, T> {
101+
impl<T, A: Allocator> Iterator for Drain<'_, T, A> {
100102
type Item = T;
101103

102104
#[inline]
@@ -111,15 +113,15 @@ impl<T> Iterator for Drain<'_, T> {
111113
}
112114

113115
#[stable(feature = "drain", since = "1.6.0")]
114-
impl<T> DoubleEndedIterator for Drain<'_, T> {
116+
impl<T, A: Allocator> DoubleEndedIterator for Drain<'_, T, A> {
115117
#[inline]
116118
fn next_back(&mut self) -> Option<T> {
117119
self.iter.next_back().map(|elt| unsafe { ptr::read(elt) })
118120
}
119121
}
120122

121123
#[stable(feature = "drain", since = "1.6.0")]
122-
impl<T> ExactSizeIterator for Drain<'_, T> {}
124+
impl<T, A: Allocator> ExactSizeIterator for Drain<'_, T, A> {}
123125

124126
#[stable(feature = "fused", since = "1.26.0")]
125-
impl<T> FusedIterator for Drain<'_, T> {}
127+
impl<T, A: Allocator> FusedIterator for Drain<'_, T, A> {}

library/alloc/src/collections/vec_deque/into_iter.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use core::fmt;
22
use core::iter::{FusedIterator, TrustedLen};
33

4+
use crate::alloc::{Allocator, Global};
5+
46
use super::VecDeque;
57

68
/// An owning iterator over the elements of a `VecDeque`.
@@ -11,19 +13,19 @@ use super::VecDeque;
1113
/// [`into_iter`]: VecDeque::into_iter
1214
#[derive(Clone)]
1315
#[stable(feature = "rust1", since = "1.0.0")]
14-
pub struct IntoIter<T> {
15-
pub(crate) inner: VecDeque<T>,
16+
pub struct IntoIter<T, A: Allocator = Global> {
17+
pub(crate) inner: VecDeque<T, A>,
1618
}
1719

1820
#[stable(feature = "collection_debug", since = "1.17.0")]
19-
impl<T: fmt::Debug> fmt::Debug for IntoIter<T> {
21+
impl<T: fmt::Debug, A: Allocator> fmt::Debug for IntoIter<T, A> {
2022
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2123
f.debug_tuple("IntoIter").field(&self.inner).finish()
2224
}
2325
}
2426

2527
#[stable(feature = "rust1", since = "1.0.0")]
26-
impl<T> Iterator for IntoIter<T> {
28+
impl<T, A: Allocator> Iterator for IntoIter<T, A> {
2729
type Item = T;
2830

2931
#[inline]
@@ -39,22 +41,22 @@ impl<T> Iterator for IntoIter<T> {
3941
}
4042

4143
#[stable(feature = "rust1", since = "1.0.0")]
42-
impl<T> DoubleEndedIterator for IntoIter<T> {
44+
impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
4345
#[inline]
4446
fn next_back(&mut self) -> Option<T> {
4547
self.inner.pop_back()
4648
}
4749
}
4850

4951
#[stable(feature = "rust1", since = "1.0.0")]
50-
impl<T> ExactSizeIterator for IntoIter<T> {
52+
impl<T, A: Allocator> ExactSizeIterator for IntoIter<T, A> {
5153
fn is_empty(&self) -> bool {
5254
self.inner.is_empty()
5355
}
5456
}
5557

5658
#[stable(feature = "fused", since = "1.26.0")]
57-
impl<T> FusedIterator for IntoIter<T> {}
59+
impl<T, A: Allocator> FusedIterator for IntoIter<T, A> {}
5860

5961
#[unstable(feature = "trusted_len", issue = "37572")]
60-
unsafe impl<T> TrustedLen for IntoIter<T> {}
62+
unsafe impl<T, A: Allocator> TrustedLen for IntoIter<T, A> {}

library/alloc/src/collections/vec_deque/macros.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
macro_rules! __impl_slice_eq1 {
22
([$($vars:tt)*] $lhs:ty, $rhs:ty, $($constraints:tt)*) => {
33
#[stable(feature = "vec_deque_partial_eq_slice", since = "1.17.0")]
4-
impl<A, B, $($vars)*> PartialEq<$rhs> for $lhs
4+
impl<T, U, A: Allocator, $($vars)*> PartialEq<$rhs> for $lhs
55
where
6-
A: PartialEq<B>,
6+
T: PartialEq<U>,
77
$($constraints)*
88
{
99
fn eq(&self, other: &$rhs) -> bool {

0 commit comments

Comments
 (0)