@@ -251,6 +251,56 @@ where
251
251
Rotate :: < OFFSET > :: swizzle ( self )
252
252
}
253
253
254
+ /// Shifts the vector elements to the left by `OFFSET`, padding by the
255
+ /// default value (e.g., zero) to the right.
256
+ #[ inline]
257
+ #[ must_use = "method returns a new vector and does not mutate the original inputs" ]
258
+ fn shift_elements_left < const OFFSET : usize > ( self ) -> Self
259
+ where
260
+ T : Default ,
261
+ {
262
+ struct Shift < const OFFSET : usize > ;
263
+
264
+ impl < const OFFSET : usize , const N : usize > Swizzle < N > for Shift < OFFSET > {
265
+ const INDEX : [ usize ; N ] = const {
266
+ let mut index = [ N ; N ] ;
267
+ let mut i = 0 ;
268
+ while i + OFFSET < N {
269
+ index[ i] = i + OFFSET ;
270
+ i += 1 ;
271
+ }
272
+ index
273
+ } ;
274
+ }
275
+
276
+ Shift :: < OFFSET > :: concat_swizzle ( self , Self :: default ( ) )
277
+ }
278
+
279
+ /// Shifts the vector elements to the right by `OFFSET`, padding by the
280
+ /// default value (e.g., zero) from the left.
281
+ #[ inline]
282
+ #[ must_use = "method returns a new vector and does not mutate the original inputs" ]
283
+ fn shift_elements_right < const OFFSET : usize > ( self ) -> Self
284
+ where
285
+ T : Default ,
286
+ {
287
+ struct Shift < const OFFSET : usize > ;
288
+
289
+ impl < const OFFSET : usize , const N : usize > Swizzle < N > for Shift < OFFSET > {
290
+ const INDEX : [ usize ; N ] = const {
291
+ let mut index = [ N ; N ] ;
292
+ let mut i = OFFSET ;
293
+ while i < N {
294
+ index[ i] = i - OFFSET ;
295
+ i += 1 ;
296
+ }
297
+ index
298
+ } ;
299
+ }
300
+
301
+ Shift :: < OFFSET > :: concat_swizzle ( self , Self :: default ( ) )
302
+ }
303
+
254
304
/// Interleave two vectors.
255
305
///
256
306
/// The resulting vectors contain elements taken alternatively from `self` and `other`, first
@@ -451,6 +501,30 @@ where
451
501
unsafe { Self :: from_int_unchecked ( self . to_int ( ) . rotate_elements_right :: < OFFSET > ( ) ) }
452
502
}
453
503
504
+ /// Shifts the mask elements to the left by `OFFSET`, padding by the
505
+ /// default value (e.g., zero) to the right.
506
+ #[ inline]
507
+ #[ must_use = "method returns a new vector and does not mutate the original inputs" ]
508
+ pub fn shift_elements_left < const OFFSET : usize > ( self ) -> Self
509
+ where
510
+ T : Default ,
511
+ {
512
+ // Safety: swizzles are safe for masks
513
+ unsafe { Self :: from_int_unchecked ( self . to_int ( ) . shift_elements_left :: < OFFSET > ( ) ) }
514
+ }
515
+
516
+ /// Shifts the mask elements to the right by `OFFSET`, padding by the
517
+ /// default value (e.g., `false`) from the left.
518
+ #[ inline]
519
+ #[ must_use = "method returns a new vector and does not mutate the original inputs" ]
520
+ pub fn shift_elements_right < const OFFSET : usize > ( self ) -> Self
521
+ where
522
+ T : Default ,
523
+ {
524
+ // Safety: swizzles are safe for masks
525
+ unsafe { Self :: from_int_unchecked ( self . to_int ( ) . shift_elements_right :: < OFFSET > ( ) ) }
526
+ }
527
+
454
528
/// Interleave two masks.
455
529
///
456
530
/// The resulting masks contain elements taken alternatively from `self` and `other`, first
0 commit comments