1
1
use core:: ops:: { Deref , DerefMut } ;
2
2
3
3
use super :: Vec ;
4
+ use crate :: alloc:: { Allocator , Global } ;
4
5
use crate :: fmt;
5
6
6
7
/// Structure wrapping a mutable reference to the last item in a
@@ -11,19 +12,23 @@ use crate::fmt;
11
12
///
12
13
/// [`peek_mut`]: Vec::peek_mut
13
14
#[ unstable( feature = "vec_peek_mut" , issue = "122742" ) ]
14
- pub struct PeekMut < ' a , T > {
15
- vec : & ' a mut Vec < T > ,
15
+ pub struct PeekMut <
16
+ ' a ,
17
+ T ,
18
+ #[ unstable( feature = "allocator_api" , issue = "32838" ) ] A : Allocator = Global ,
19
+ > {
20
+ vec : & ' a mut Vec < T , A > ,
16
21
}
17
22
18
23
#[ unstable( feature = "vec_peek_mut" , issue = "122742" ) ]
19
- impl < T : fmt:: Debug > fmt:: Debug for PeekMut < ' _ , T > {
24
+ impl < T : fmt:: Debug , A : Allocator > fmt:: Debug for PeekMut < ' _ , T , A > {
20
25
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
21
26
f. debug_tuple ( "PeekMut" ) . field ( self . deref ( ) ) . finish ( )
22
27
}
23
28
}
24
29
25
- impl < ' a , T > PeekMut < ' a , T > {
26
- pub ( crate ) fn new ( vec : & ' a mut Vec < T > ) -> Option < Self > {
30
+ impl < ' a , T , A : Allocator > PeekMut < ' a , T , A > {
31
+ pub ( super ) fn new ( vec : & ' a mut Vec < T , A > ) -> Option < Self > {
27
32
if vec. is_empty ( ) { None } else { Some ( Self { vec } ) }
28
33
}
29
34
@@ -36,17 +41,18 @@ impl<'a, T> PeekMut<'a, T> {
36
41
}
37
42
38
43
#[ unstable( feature = "vec_peek_mut" , issue = "122742" ) ]
39
- impl < ' a , T > Deref for PeekMut < ' a , T > {
44
+ impl < ' a , T , A : Allocator > Deref for PeekMut < ' a , T , A > {
40
45
type Target = T ;
41
46
42
47
fn deref ( & self ) -> & Self :: Target {
48
+ let idx = self . vec . len ( ) - 1 ;
43
49
// SAFETY: PeekMut is only constructed if the vec is non-empty
44
- unsafe { self . vec . get_unchecked ( self . vec . len ( ) - 1 ) }
50
+ unsafe { self . vec . get_unchecked ( idx ) }
45
51
}
46
52
}
47
53
48
54
#[ unstable( feature = "vec_peek_mut" , issue = "122742" ) ]
49
- impl < ' a , T > DerefMut for PeekMut < ' a , T > {
55
+ impl < ' a , T , A : Allocator > DerefMut for PeekMut < ' a , T , A > {
50
56
fn deref_mut ( & mut self ) -> & mut Self :: Target {
51
57
let idx = self . vec . len ( ) - 1 ;
52
58
// SAFETY: PeekMut is only constructed if the vec is non-empty
0 commit comments