11use core:: ops:: { Deref , DerefMut } ;
22
33use super :: Vec ;
4+ use crate :: alloc:: { Allocator , Global } ;
45use crate :: fmt;
56
67/// Structure wrapping a mutable reference to the last item in a
@@ -11,19 +12,23 @@ use crate::fmt;
1112///
1213/// [`peek_mut`]: Vec::peek_mut
1314#[ 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 > ,
1621}
1722
1823#[ 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 > {
2025 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
2126 f. debug_tuple ( "PeekMut" ) . field ( self . deref ( ) ) . finish ( )
2227 }
2328}
2429
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 > {
2732 if vec. is_empty ( ) { None } else { Some ( Self { vec } ) }
2833 }
2934
@@ -36,17 +41,18 @@ impl<'a, T> PeekMut<'a, T> {
3641}
3742
3843#[ 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 > {
4045 type Target = T ;
4146
4247 fn deref ( & self ) -> & Self :: Target {
48+ let idx = self . vec . len ( ) - 1 ;
4349 // 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 ) }
4551 }
4652}
4753
4854#[ 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 > {
5056 fn deref_mut ( & mut self ) -> & mut Self :: Target {
5157 let idx = self . vec . len ( ) - 1 ;
5258 // SAFETY: PeekMut is only constructed if the vec is non-empty
0 commit comments