@@ -153,22 +153,37 @@ pub fn derive(input: &Input) -> TokenStream {
153
153
/// Similar to [`
154
154
#[ doc = #slice_name_str]
155
155
/// ::get()`](https://doc.rust-lang.org/std/primitive.slice.html#method.get).
156
- pub fn get( & self , i: usize ) -> Option <#ref_name> {
157
- if self . is_empty( ) || i >= self . len( ) {
158
- None
159
- } else {
160
- Some ( #ref_name {
161
- #( #fields_names_1: self . #fields_names_2. get( i) . unwrap( ) , ) *
162
- } )
163
- }
156
+ pub fn get<' b: ' a, I >( & ' b self , index: I ) -> Option <I :: RefOutput >
157
+ where
158
+ I : :: soa_derive:: SoaIndex <#slice_name<' b>>
159
+ {
160
+ let slice: #slice_name<' b> = self . reborrow( ) ;
161
+ index. get( slice)
164
162
}
165
163
166
164
/// Similar to [`
167
165
#[ doc = #slice_name_str]
168
166
/// ::get_unchecked()`](https://doc.rust-lang.org/std/primitive.slice.html#method.get_unchecked).
169
- pub unsafe fn get_unchecked( & self , i: usize ) -> #ref_name {
170
- #ref_name {
171
- #( #fields_names_1: self . #fields_names_2. get_unchecked( i) , ) *
167
+ pub unsafe fn get_unchecked<' b: ' a, I >( & ' b self , index: I ) -> I :: RefOutput
168
+ where
169
+ I : :: soa_derive:: SoaIndex <#slice_name<' b>>
170
+ {
171
+ let slice: #slice_name<' b> = self . reborrow( ) ;
172
+ index. get_unchecked( slice)
173
+ }
174
+
175
+ pub fn index<' b: ' a, I >( & ' b self , index: I ) -> I :: RefOutput
176
+ where
177
+ I : :: soa_derive:: SoaIndex <#slice_name<' b>>
178
+ {
179
+ let slice: #slice_name<' b> = self . reborrow( ) ;
180
+ index. index( slice)
181
+ }
182
+
183
+ /// Reborrows the slices in a more narrower lifetime
184
+ pub fn reborrow<' b: ' a>( & ' b self ) -> #slice_name<' b> {
185
+ #slice_name {
186
+ #( #fields_names_1: & self . #fields_names_2, ) *
172
187
}
173
188
}
174
189
@@ -215,7 +230,6 @@ pub fn derive_mut(input: &Input) -> TokenStream {
215
230
let slice_name = & input. slice_name ( ) ;
216
231
let slice_mut_name = & input. slice_mut_name ( ) ;
217
232
let vec_name = & input. vec_name ( ) ;
218
- let ref_name = & input. ref_name ( ) ;
219
233
let ref_mut_name = & input. ref_mut_name ( ) ;
220
234
let ptr_name = & input. ptr_name ( ) ;
221
235
let ptr_mut_name = & input. ptr_mut_name ( ) ;
@@ -382,44 +396,74 @@ pub fn derive_mut(input: &Input) -> TokenStream {
382
396
/// Similar to [`
383
397
#[ doc = #slice_name_str]
384
398
/// ::get()`](https://doc.rust-lang.org/std/primitive.slice.html#method.get).
385
- pub fn get( & self , i: usize ) -> Option <#ref_name> {
386
- if self . is_empty( ) || i >= self . len( ) {
387
- None
388
- } else {
389
- Some ( #ref_name {
390
- #( #fields_names_1: self . #fields_names_2. get( i) . unwrap( ) , ) *
391
- } )
392
- }
399
+ pub fn get<' b: ' a, I >( & ' b self , index: I ) -> Option <I :: RefOutput >
400
+ where
401
+ I : :: soa_derive:: SoaIndex <#slice_name<' b>>
402
+ {
403
+ let slice: #slice_name<' b> = self . as_slice( ) ;
404
+ index. get( slice)
393
405
}
394
406
395
407
/// Similar to [`
396
408
#[ doc = #slice_name_str]
397
409
/// ::get_unchecked()`](https://doc.rust-lang.org/std/primitive.slice.html#method.get_unchecked).
398
- pub unsafe fn get_unchecked( & self , i: usize ) -> #ref_name {
399
- #ref_name {
400
- #( #fields_names_1: self . #fields_names_2. get_unchecked( i) , ) *
401
- }
410
+ pub unsafe fn get_unchecked<' b: ' a, I >( & ' b self , index: I ) -> I :: RefOutput
411
+ where
412
+ I : :: soa_derive:: SoaIndex <#slice_name<' b>>
413
+ {
414
+ let slice: #slice_name<' b> = self . as_slice( ) ;
415
+ index. get_unchecked( slice)
416
+ }
417
+
418
+ pub fn index<' b: ' a, I >( & ' b self , index: I ) -> I :: RefOutput
419
+ where
420
+ I : :: soa_derive:: SoaIndex <#slice_name<' b>>
421
+ {
422
+ let slice: #slice_name<' b> = self . as_slice( ) ;
423
+ index. index( slice)
402
424
}
403
425
404
426
/// Similar to [`
405
427
#[ doc = #slice_name_str]
406
428
/// ::get_mut()`](https://doc.rust-lang.org/std/primitive.slice.html#method.get_mut).
407
- pub fn get_mut( & mut self , i: usize ) -> Option <#ref_mut_name> {
408
- if self . is_empty( ) || i >= self . len( ) {
409
- None
410
- } else {
411
- Some ( #ref_mut_name {
412
- #( #fields_names_1: self . #fields_names_2. get_mut( i) . unwrap( ) , ) *
413
- } )
414
- }
429
+ pub fn get_mut<' b: ' a, I >( & ' b mut self , index: I ) -> Option <I :: MutOutput >
430
+ where
431
+ I : :: soa_derive:: SoaMutIndex <#slice_mut_name<' b>>
432
+ {
433
+ let slice: #slice_mut_name<' b> = self . reborrow( ) ;
434
+ index. get_mut( slice)
415
435
}
416
436
417
437
/// Similar to [`
418
438
#[ doc = #slice_name_str]
419
439
/// ::get_unchecked_mut()`](https://doc.rust-lang.org/std/primitive.slice.html#method.get_unchecked_mut).
420
- pub unsafe fn get_unchecked_mut( & mut self , i: usize ) -> #ref_mut_name {
421
- #ref_mut_name {
422
- #( #fields_names_1: self . #fields_names_2. get_unchecked_mut( i) , ) *
440
+ pub unsafe fn get_unchecked_mut<' b: ' a, I >( & ' b mut self , index: I ) -> I :: MutOutput
441
+ where
442
+ I : :: soa_derive:: SoaMutIndex <#slice_mut_name<' b>>
443
+ {
444
+ let slice: #slice_mut_name<' b> = self . reborrow( ) ;
445
+ index. get_unchecked_mut( slice)
446
+ }
447
+
448
+ pub fn index_mut<' b: ' a, I >( & ' b mut self , index: I ) -> I :: MutOutput
449
+ where
450
+ I : :: soa_derive:: SoaMutIndex <#slice_mut_name<' b>>
451
+ {
452
+ let slice: #slice_mut_name<' b> = self . reborrow( ) ;
453
+ index. index_mut( slice)
454
+ }
455
+
456
+ /// Returns a non-mutable slice from this mutable slice.
457
+ pub fn as_slice<' b: ' a>( & ' b self ) -> #slice_name<' b> {
458
+ #slice_name {
459
+ #( #fields_names_1: & self . #fields_names_2, ) *
460
+ }
461
+ }
462
+
463
+ /// Reborrows the slices in a more narrower lifetime
464
+ pub fn reborrow<' b: ' a>( & ' b mut self ) -> #slice_mut_name<' b> {
465
+ #slice_mut_name {
466
+ #( #fields_names_1: & mut self . #fields_names_2, ) *
423
467
}
424
468
}
425
469
0 commit comments