@@ -15,7 +15,7 @@ use cmp::{Ord, Eq, Ordering, TotalEq, TotalOrd};
15
15
use container:: { Container , Mutable } ;
16
16
use default:: Default ;
17
17
use fmt;
18
- use iter:: { DoubleEndedIterator , FromIterator , Extendable , Iterator } ;
18
+ use iter:: { DoubleEndedIterator , FromIterator , Extendable , Iterator , range } ;
19
19
use libc:: { free, c_void} ;
20
20
use mem:: { size_of, move_val_init} ;
21
21
use mem;
@@ -1135,6 +1135,56 @@ impl<T> Vec<T> {
1135
1135
pub fn as_mut_ptr ( & mut self ) -> * mut T {
1136
1136
self . as_mut_slice ( ) . as_mut_ptr ( )
1137
1137
}
1138
+
1139
+ /// Retains only the elements specified by the predicate.
1140
+ ///
1141
+ /// In other words, remove all elements `e` such that `f(&e)` returns false.
1142
+ /// This method operates in place and preserves the order the retained elements.
1143
+ ///
1144
+ /// # Example
1145
+ ///
1146
+ /// ```rust
1147
+ /// let mut vec = vec!(1i, 2, 3, 4);
1148
+ /// vec.retain(|x| x%2 == 0);
1149
+ /// assert_eq!(vec, vec!(2, 4));
1150
+ /// ```
1151
+ pub fn retain ( & mut self , f: |& T | -> bool) {
1152
+ let len = self . len ( ) ;
1153
+ let mut del = 0 u;
1154
+ {
1155
+ let v = self . as_mut_slice ( ) ;
1156
+
1157
+ for i in range ( 0 u, len) {
1158
+ if !f ( & v[ i] ) {
1159
+ del += 1 ;
1160
+ } else if del > 0 {
1161
+ v. swap ( i-del, i) ;
1162
+ }
1163
+ }
1164
+ }
1165
+ if del > 0 {
1166
+ self . truncate ( len - del) ;
1167
+ }
1168
+ }
1169
+
1170
+ /// Expands a vector in place, initializing the new elements to the result of a function.
1171
+ ///
1172
+ /// The vector is grown by `n` elements. The i-th new element are initialized to the value
1173
+ /// returned by `f(i)` where `i` is in the range [0, n).
1174
+ ///
1175
+ /// # Example
1176
+ ///
1177
+ /// ```rust
1178
+ /// let mut vec = vec!(0u, 1);
1179
+ /// vec.grow_fn(3, |i| i);
1180
+ /// assert_eq!(vec, vec!(0, 1, 0, 1, 2));
1181
+ /// ```
1182
+ pub fn grow_fn ( & mut self , n : uint , f: |uint| -> T ) {
1183
+ self . reserve_additional ( n) ;
1184
+ for i in range ( 0 u, n) {
1185
+ self . push ( f ( i) ) ;
1186
+ }
1187
+ }
1138
1188
}
1139
1189
1140
1190
impl < T : TotalOrd > Vec < T > {
@@ -1523,4 +1573,17 @@ mod tests {
1523
1573
v. clone_from ( & three) ;
1524
1574
assert_eq ! ( v, three)
1525
1575
}
1576
+
1577
+ fn test_grow_fn ( ) {
1578
+ let mut v = Vec :: from_slice ( [ 0 u, 1 ] ) ;
1579
+ v. grow_fn ( 3 , |i| i) ;
1580
+ assert ! ( v == Vec :: from_slice( [ 0 u, 1 , 0 , 1 , 2 ] ) ) ;
1581
+ }
1582
+
1583
+ #[ test]
1584
+ fn test_retain ( ) {
1585
+ let mut vec = Vec :: from_slice ( [ 1 u, 2 , 3 , 4 ] ) ;
1586
+ vec. retain ( |x| x%2 == 0 ) ;
1587
+ assert ! ( vec == Vec :: from_slice( [ 2 u, 4 ] ) ) ;
1588
+ }
1526
1589
}
0 commit comments