@@ -61,7 +61,9 @@ impl<T> RangeMap<T> {
61
61
/// Provides read-only iteration over everything in the given range. This does
62
62
/// *not* split items if they overlap with the edges. Do not use this to mutate
63
63
/// through interior mutability.
64
- pub fn iter < ' a > ( & ' a self , offset : Size , len : Size ) -> impl Iterator < Item = & ' a T > + ' a {
64
+ ///
65
+ /// The iterator also provides the offset of the given element.
66
+ pub fn iter < ' a > ( & ' a self , offset : Size , len : Size ) -> impl Iterator < Item = ( Size , & ' a T ) > + ' a {
65
67
let offset = offset. bytes ( ) ;
66
68
let len = len. bytes ( ) ;
67
69
// Compute a slice starting with the elements we care about.
@@ -75,7 +77,7 @@ impl<T> RangeMap<T> {
75
77
} ;
76
78
// The first offset that is not included any more.
77
79
let end = offset + len;
78
- slice. iter ( ) . take_while ( move |elem| elem. range . start < end) . map ( |elem| & elem. data )
80
+ slice. iter ( ) . take_while ( move |elem| elem. range . start < end) . map ( |elem| ( Size :: from_bytes ( elem . range . start ) , & elem. data ) )
79
81
}
80
82
81
83
pub fn iter_mut_all < ' a > ( & ' a mut self ) -> impl Iterator < Item = & ' a mut T > + ' a {
@@ -112,11 +114,13 @@ impl<T> RangeMap<T> {
112
114
/// this will split entries in the map that are only partially hit by the given range,
113
115
/// to make sure that when they are mutated, the effect is constrained to the given range.
114
116
/// Moreover, this will opportunistically merge neighbouring equal blocks.
117
+ ///
118
+ /// The iterator also provides the offset of the given element.
115
119
pub fn iter_mut < ' a > (
116
120
& ' a mut self ,
117
121
offset : Size ,
118
122
len : Size ,
119
- ) -> impl Iterator < Item = & ' a mut T > + ' a
123
+ ) -> impl Iterator < Item = ( Size , & ' a mut T ) > + ' a
120
124
where
121
125
T : Clone + PartialEq ,
122
126
{
@@ -197,7 +201,7 @@ impl<T> RangeMap<T> {
197
201
// Now we yield the slice. `end` is inclusive.
198
202
& mut self . v [ first_idx..=end_idx]
199
203
} ;
200
- slice. iter_mut ( ) . map ( |elem| & mut elem. data )
204
+ slice. iter_mut ( ) . map ( |elem| ( Size :: from_bytes ( elem . range . start ) , & mut elem. data ) )
201
205
}
202
206
}
203
207
@@ -209,26 +213,26 @@ mod tests {
209
213
fn to_vec < T : Copy > ( map : & RangeMap < T > , offset : u64 , len : u64 ) -> Vec < T > {
210
214
( offset..offset + len)
211
215
. into_iter ( )
212
- . map ( |i| map. iter ( Size :: from_bytes ( i) , Size :: from_bytes ( 1 ) ) . next ( ) . map ( |& t | t) . unwrap ( ) )
216
+ . map ( |i| map. iter ( Size :: from_bytes ( i) , Size :: from_bytes ( 1 ) ) . next ( ) . map ( |( _ , & t ) | t) . unwrap ( ) )
213
217
. collect ( )
214
218
}
215
219
216
220
#[ test]
217
221
fn basic_insert ( ) {
218
222
let mut map = RangeMap :: < i32 > :: new ( Size :: from_bytes ( 20 ) , -1 ) ;
219
223
// Insert.
220
- for x in map. iter_mut ( Size :: from_bytes ( 10 ) , Size :: from_bytes ( 1 ) ) {
224
+ for ( _ , x ) in map. iter_mut ( Size :: from_bytes ( 10 ) , Size :: from_bytes ( 1 ) ) {
221
225
* x = 42 ;
222
226
}
223
227
// Check.
224
228
assert_eq ! ( to_vec( & map, 10 , 1 ) , vec![ 42 ] ) ;
225
229
assert_eq ! ( map. v. len( ) , 3 ) ;
226
230
227
231
// Insert with size 0.
228
- for x in map. iter_mut ( Size :: from_bytes ( 10 ) , Size :: from_bytes ( 0 ) ) {
232
+ for ( _ , x ) in map. iter_mut ( Size :: from_bytes ( 10 ) , Size :: from_bytes ( 0 ) ) {
229
233
* x = 19 ;
230
234
}
231
- for x in map. iter_mut ( Size :: from_bytes ( 11 ) , Size :: from_bytes ( 0 ) ) {
235
+ for ( _ , x ) in map. iter_mut ( Size :: from_bytes ( 11 ) , Size :: from_bytes ( 0 ) ) {
232
236
* x = 19 ;
233
237
}
234
238
assert_eq ! ( to_vec( & map, 10 , 2 ) , vec![ 42 , -1 ] ) ;
@@ -238,16 +242,16 @@ mod tests {
238
242
#[ test]
239
243
fn gaps ( ) {
240
244
let mut map = RangeMap :: < i32 > :: new ( Size :: from_bytes ( 20 ) , -1 ) ;
241
- for x in map. iter_mut ( Size :: from_bytes ( 11 ) , Size :: from_bytes ( 1 ) ) {
245
+ for ( _ , x ) in map. iter_mut ( Size :: from_bytes ( 11 ) , Size :: from_bytes ( 1 ) ) {
242
246
* x = 42 ;
243
247
}
244
- for x in map. iter_mut ( Size :: from_bytes ( 15 ) , Size :: from_bytes ( 1 ) ) {
248
+ for ( _ , x ) in map. iter_mut ( Size :: from_bytes ( 15 ) , Size :: from_bytes ( 1 ) ) {
245
249
* x = 43 ;
246
250
}
247
251
assert_eq ! ( map. v. len( ) , 5 ) ;
248
252
assert_eq ! ( to_vec( & map, 10 , 10 ) , vec![ -1 , 42 , -1 , -1 , -1 , 43 , -1 , -1 , -1 , -1 ] ) ;
249
253
250
- for x in map. iter_mut ( Size :: from_bytes ( 10 ) , Size :: from_bytes ( 10 ) ) {
254
+ for ( _ , x ) in map. iter_mut ( Size :: from_bytes ( 10 ) , Size :: from_bytes ( 10 ) ) {
251
255
if * x < 42 {
252
256
* x = 23 ;
253
257
}
@@ -256,14 +260,14 @@ mod tests {
256
260
assert_eq ! ( to_vec( & map, 10 , 10 ) , vec![ 23 , 42 , 23 , 23 , 23 , 43 , 23 , 23 , 23 , 23 ] ) ;
257
261
assert_eq ! ( to_vec( & map, 13 , 5 ) , vec![ 23 , 23 , 43 , 23 , 23 ] ) ;
258
262
259
- for x in map. iter_mut ( Size :: from_bytes ( 15 ) , Size :: from_bytes ( 5 ) ) {
263
+ for ( _ , x ) in map. iter_mut ( Size :: from_bytes ( 15 ) , Size :: from_bytes ( 5 ) ) {
260
264
* x = 19 ;
261
265
}
262
266
assert_eq ! ( map. v. len( ) , 6 ) ;
263
267
assert_eq ! ( to_vec( & map, 10 , 10 ) , vec![ 23 , 42 , 23 , 23 , 23 , 19 , 19 , 19 , 19 , 19 ] ) ;
264
268
// Should be seeing two blocks with 19.
265
269
assert_eq ! (
266
- map. iter( Size :: from_bytes( 15 ) , Size :: from_bytes( 2 ) ) . map( |& t | t) . collect:: <Vec <_>>( ) ,
270
+ map. iter( Size :: from_bytes( 15 ) , Size :: from_bytes( 2 ) ) . map( |( _ , & t ) | t) . collect:: <Vec <_>>( ) ,
267
271
vec![ 19 , 19 ]
268
272
) ;
269
273
0 commit comments