@@ -90,6 +90,17 @@ macro_rules! arrayvec {
90
90
self . xs[ offset..offset + len] . copy_from_slice( & data) ;
91
91
self . len += len as $capacity_ty;
92
92
}
93
+
94
+ /// Removes the last element from the array and returns it.
95
+ /// Returns `None` if the array is empty.
96
+ pub fn pop( & mut self ) -> Option <$ty> {
97
+ if self . len > 0 {
98
+ self . len -= 1 ;
99
+ Some ( self . xs[ self . len as usize ] )
100
+ } else {
101
+ None
102
+ }
103
+ }
93
104
}
94
105
95
106
impl std:: ops:: Deref for $name {
@@ -126,6 +137,38 @@ mod tests {
126
137
}
127
138
arrayvec ! ( ArrayVec , u8 , u32 ) ;
128
139
140
+ #[ test]
141
+ fn push_pop ( ) {
142
+ let mut vec = ArrayVec :: new ( ) ;
143
+ assert ! ( vec. is_empty( ) ) ;
144
+ assert_eq ! ( vec. pop( ) , None ) ;
145
+
146
+ vec. push ( 10 ) ;
147
+ assert_eq ! ( vec. len( ) , 1 ) ;
148
+ assert_eq ! ( vec. as_slice( ) , & [ 10 ] ) ;
149
+
150
+ vec. push ( 20 ) ;
151
+ vec. push ( 30 ) ;
152
+ assert_eq ! ( vec. len( ) , 3 ) ;
153
+ assert_eq ! ( vec. as_slice( ) , & [ 10 , 20 , 30 ] ) ;
154
+
155
+ // Popping elements
156
+ assert_eq ! ( vec. pop( ) , Some ( 30 ) ) ;
157
+ assert_eq ! ( vec. len( ) , 2 ) ;
158
+ assert_eq ! ( vec. as_slice( ) , & [ 10 , 20 ] ) ;
159
+
160
+ assert_eq ! ( vec. pop( ) , Some ( 20 ) ) ;
161
+ assert_eq ! ( vec. len( ) , 1 ) ;
162
+ assert_eq ! ( vec. as_slice( ) , & [ 10 ] ) ;
163
+
164
+ assert_eq ! ( vec. pop( ) , Some ( 10 ) ) ;
165
+ assert_eq ! ( vec. len( ) , 0 ) ;
166
+ assert ! ( vec. is_empty( ) ) ;
167
+
168
+ // Popping from empty vec
169
+ assert_eq ! ( vec. pop( ) , None ) ;
170
+ }
171
+
129
172
#[ test]
130
173
fn remove ( ) {
131
174
let mut vec = ArrayVec :: new ( ) ;
0 commit comments