@@ -74,7 +74,6 @@ impl<T: Copy> Expand for &mut BufferMut<T> {
7474 return ;
7575 }
7676
77- // Expand to the new buffer size which equals the length of the mask.
7877 self . reserve ( mask_len - buf_len) ;
7978
8079 // SAFETY: We just reserved enough space above.
@@ -216,6 +215,7 @@ mod tests {
216215
217216 use super :: * ;
218217
218+ // Tests for Buffer<T>
219219 #[ test]
220220 fn test_expand_scattered ( ) {
221221 let buf = buffer ! [ 100u32 , 200 , 300 ] ;
@@ -278,7 +278,7 @@ mod tests {
278278 buf. expand ( & mask) ;
279279 }
280280
281- // Tests for &Buffer<T> impl
281+ // Tests for &Buffer<T>
282282 #[ test]
283283 fn test_expand_ref_scattered ( ) {
284284 let buf = buffer ! [ 100u32 , 200 , 300 ] ;
@@ -300,7 +300,7 @@ mod tests {
300300 assert_eq ! ( result, buffer![ 10u32 , 20 , 30 ] ) ;
301301 }
302302
303- // Tests for &mut BufferMut<T> impl
303+ // Tests for &mut BufferMut<T>
304304 #[ test]
305305 fn test_expand_mut_scattered ( ) {
306306 let mut buf = buffer_mut ! [ 100u32 , 200 , 300 ] ;
@@ -374,4 +374,40 @@ mod tests {
374374 let mask = Mask :: from_iter ( [ true , true , true , false ] ) ;
375375 ( & mut buf) . expand ( & mask) ;
376376 }
377+
378+ #[ test]
379+ fn test_expand_into_new_buffer ( ) {
380+ let src = [ 10u32 , 20 , 30 , 40 , 50 ] ;
381+ // Alternating pattern with gaps: [T, F, T, F, T, F, T, F, T, F]
382+ let mask = Mask :: from_iter ( [
383+ true , false , true , false , true , false , true , false , true , false ,
384+ ] ) ;
385+
386+ let result = expand_into_new_buffer ( & src, & mask) ;
387+ assert_eq ! ( result. len( ) , 10 ) ;
388+ assert_eq ! ( result. as_slice( ) [ 0 ] , 10 ) ;
389+ assert_eq ! ( result. as_slice( ) [ 2 ] , 20 ) ;
390+ assert_eq ! ( result. as_slice( ) [ 4 ] , 30 ) ;
391+ assert_eq ! ( result. as_slice( ) [ 6 ] , 40 ) ;
392+ assert_eq ! ( result. as_slice( ) [ 8 ] , 50 ) ;
393+ }
394+
395+ #[ test]
396+ fn test_scatter_into_slice_from ( ) {
397+ let src = [ 1u32 , 2 , 3 , 4 , 5 ] ;
398+ let mut dest = vec ! [ 0u32 ; 8 ] ;
399+ let mask = Mask :: from_iter ( [ true , true , false , true , true , false , true , false ] ) ;
400+
401+ let mask_values = match & mask {
402+ Mask :: Values ( mv) => mv,
403+ _ => panic ! ( "Expected Mask::Values" ) ,
404+ } ;
405+
406+ scatter_into_slice_from ( & src, & mut dest, mask_values) ;
407+ assert_eq ! ( dest[ 0 ] , 1 ) ;
408+ assert_eq ! ( dest[ 1 ] , 2 ) ;
409+ assert_eq ! ( dest[ 3 ] , 3 ) ;
410+ assert_eq ! ( dest[ 4 ] , 4 ) ;
411+ assert_eq ! ( dest[ 6 ] , 5 ) ;
412+ }
377413}
0 commit comments