1
1
use proc_macro2:: TokenStream ;
2
2
use quote:: quote;
3
3
4
- use crate :: input:: Input ;
4
+ use crate :: input:: { Input , TokenStreamIterator } ;
5
5
6
6
pub fn derive ( input : & Input ) -> TokenStream {
7
7
let vec_name = & input. vec_name ( ) ;
8
- let slice_name = & input. slice_name ( ) ;
9
- let slice_mut_name = & input. slice_mut_name ( ) ;
10
- let ref_name = & input. ref_name ( ) ;
11
- let ref_mut_name = & input. ref_mut_name ( ) ;
8
+ let slice_name = Input :: slice_name ( & input. name ) ;
9
+ let slice_mut_name = Input :: slice_mut_name ( & input. name ) ;
10
+ let ref_name = Input :: ref_name ( & input. name ) ;
11
+ let ref_mut_name = Input :: ref_mut_name ( & input. name ) ;
12
12
let fields_names = input. fields . iter ( )
13
13
. map ( |field| field. ident . clone ( ) . unwrap ( ) )
14
14
. collect :: < Vec < _ > > ( ) ;
15
- let fields_names_1 = & fields_names;
16
- let fields_names_2 = & fields_names;
15
+
16
+ let get_unchecked = input. iter_fields ( ) . map (
17
+ |( field_ident, _, is_nested) | {
18
+ if is_nested {
19
+ quote ! {
20
+ #field_ident: self . clone( ) . get_unchecked( slice. #field_ident) ,
21
+ }
22
+ }
23
+ else {
24
+ quote ! {
25
+ #field_ident: slice. #field_ident. get_unchecked( self . clone( ) ) ,
26
+ }
27
+ }
28
+ } ,
29
+ ) . concat ( ) ;
30
+
31
+ let get_unchecked_mut = input. iter_fields ( ) . map (
32
+ |( field_ident, _, is_nested) | {
33
+ if is_nested {
34
+ quote ! {
35
+ #field_ident: self . clone( ) . get_unchecked_mut( slice. #field_ident) ,
36
+ }
37
+ }
38
+ else {
39
+ quote ! {
40
+ #field_ident: slice. #field_ident. get_unchecked_mut( self . clone( ) ) ,
41
+ }
42
+ }
43
+ } ,
44
+ ) . concat ( ) ;
45
+
46
+ let index = input. iter_fields ( ) . map (
47
+ |( field_ident, _, is_nested) | {
48
+ if is_nested {
49
+ quote ! {
50
+ #field_ident: self . clone( ) . index( slice. #field_ident) ,
51
+ }
52
+ }
53
+ else {
54
+ quote ! {
55
+ #field_ident: & slice. #field_ident[ self . clone( ) ] ,
56
+ }
57
+ }
58
+ } ,
59
+ ) . concat ( ) ;
60
+
61
+ let index_mut = input. iter_fields ( ) . map (
62
+ |( field_ident, _, is_nested) | {
63
+ if is_nested {
64
+ quote ! {
65
+ #field_ident: self . clone( ) . index_mut( slice. #field_ident) ,
66
+ }
67
+ }
68
+ else {
69
+ quote ! {
70
+ #field_ident: & mut slice. #field_ident[ self . clone( ) ] ,
71
+ }
72
+ }
73
+ } ,
74
+ ) . concat ( ) ;
75
+
17
76
let first_field_name = & fields_names[ 0 ] ;
18
77
19
78
quote ! {
@@ -32,16 +91,12 @@ pub fn derive(input: &Input) -> TokenStream {
32
91
33
92
#[ inline]
34
93
unsafe fn get_unchecked( self , soa: & ' a #vec_name) -> Self :: RefOutput {
35
- #ref_name {
36
- #( #fields_names_1: soa. #fields_names_2. get_unchecked( self ) , ) *
37
- }
94
+ self . get_unchecked( soa. as_slice( ) )
38
95
}
39
96
40
97
#[ inline]
41
98
fn index( self , soa: & ' a #vec_name) -> Self :: RefOutput {
42
- #ref_name {
43
- #( #fields_names_1: & soa. #fields_names_2[ self ] , ) *
44
- }
99
+ self . index( soa. as_slice( ) )
45
100
}
46
101
}
47
102
@@ -59,16 +114,12 @@ pub fn derive(input: &Input) -> TokenStream {
59
114
60
115
#[ inline]
61
116
unsafe fn get_unchecked_mut( self , soa: & ' a mut #vec_name) -> Self :: MutOutput {
62
- #ref_mut_name {
63
- #( #fields_names_1: soa. #fields_names_2. get_unchecked_mut( self ) , ) *
64
- }
117
+ self . get_unchecked_mut( soa. as_mut_slice( ) )
65
118
}
66
119
67
120
#[ inline]
68
121
fn index_mut( self , soa: & ' a mut #vec_name) -> Self :: MutOutput {
69
- #ref_mut_name {
70
- #( #fields_names_1: & mut soa. #fields_names_2[ self ] , ) *
71
- }
122
+ self . index_mut( soa. as_mut_slice( ) )
72
123
}
73
124
}
74
125
@@ -89,16 +140,12 @@ pub fn derive(input: &Input) -> TokenStream {
89
140
90
141
#[ inline]
91
142
unsafe fn get_unchecked( self , soa: & ' a #vec_name) -> Self :: RefOutput {
92
- #slice_name {
93
- #( #fields_names_1: soa. #fields_names_2. get_unchecked( self . clone( ) ) , ) *
94
- }
143
+ self . get_unchecked( soa. as_slice( ) )
95
144
}
96
145
97
146
#[ inline]
98
147
fn index( self , soa: & ' a #vec_name) -> Self :: RefOutput {
99
- #slice_name {
100
- #( #fields_names_1: & soa. #fields_names_2[ self . clone( ) ] , ) *
101
- }
148
+ self . index( soa. as_slice( ) )
102
149
}
103
150
}
104
151
@@ -116,16 +163,12 @@ pub fn derive(input: &Input) -> TokenStream {
116
163
117
164
#[ inline]
118
165
unsafe fn get_unchecked_mut( self , soa: & ' a mut #vec_name) -> Self :: MutOutput {
119
- #slice_mut_name {
120
- #( #fields_names_1: soa. #fields_names_2. get_unchecked_mut( self . clone( ) ) , ) *
121
- }
166
+ self . get_unchecked_mut( soa. as_mut_slice( ) )
122
167
}
123
168
124
169
#[ inline]
125
170
fn index_mut( self , soa: & ' a mut #vec_name) -> Self :: MutOutput {
126
- #slice_mut_name {
127
- #( #fields_names_1: & mut soa. #fields_names_2[ self . clone( ) ] , ) *
128
- }
171
+ self . index_mut( soa. as_mut_slice( ) )
129
172
}
130
173
}
131
174
@@ -354,14 +397,14 @@ pub fn derive(input: &Input) -> TokenStream {
354
397
#[ inline]
355
398
unsafe fn get_unchecked( self , slice: #slice_name<' a>) -> Self :: RefOutput {
356
399
#ref_name {
357
- #( #fields_names_1 : slice . #fields_names_2 . get_unchecked( self ) , ) *
400
+ #get_unchecked
358
401
}
359
402
}
360
403
361
404
#[ inline]
362
405
fn index( self , slice: #slice_name<' a>) -> Self :: RefOutput {
363
406
#ref_name {
364
- #( #fields_names_1 : & slice . #fields_names_2 [ self ] , ) *
407
+ #index
365
408
}
366
409
}
367
410
}
@@ -381,14 +424,14 @@ pub fn derive(input: &Input) -> TokenStream {
381
424
#[ inline]
382
425
unsafe fn get_unchecked_mut( self , slice: #slice_mut_name<' a>) -> Self :: MutOutput {
383
426
#ref_mut_name {
384
- #( #fields_names_1 : slice . #fields_names_2 . get_unchecked_mut( self ) , ) *
427
+ #get_unchecked_mut
385
428
}
386
429
}
387
430
388
431
#[ inline]
389
432
fn index_mut( self , slice: #slice_mut_name<' a>) -> Self :: MutOutput {
390
433
#ref_mut_name {
391
- #( #fields_names_1 : & mut slice . #fields_names_2 [ self ] , ) *
434
+ #index_mut
392
435
}
393
436
}
394
437
}
@@ -411,14 +454,14 @@ pub fn derive(input: &Input) -> TokenStream {
411
454
#[ inline]
412
455
unsafe fn get_unchecked( self , slice: #slice_name<' a>) -> Self :: RefOutput {
413
456
#slice_name {
414
- #( #fields_names_1 : slice . #fields_names_2 . get_unchecked( self . clone ( ) ) , ) *
457
+ #get_unchecked
415
458
}
416
459
}
417
460
418
461
#[ inline]
419
462
fn index( self , slice: #slice_name<' a>) -> Self :: RefOutput {
420
463
#slice_name {
421
- #( #fields_names_1 : & slice . #fields_names_2 [ self . clone ( ) ] , ) *
464
+ #index
422
465
}
423
466
}
424
467
}
@@ -438,14 +481,14 @@ pub fn derive(input: &Input) -> TokenStream {
438
481
#[ inline]
439
482
unsafe fn get_unchecked_mut( self , slice: #slice_mut_name<' a>) -> Self :: MutOutput {
440
483
#slice_mut_name {
441
- #( #fields_names_1 : slice . #fields_names_2 . get_unchecked_mut( self . clone ( ) ) , ) *
484
+ #get_unchecked_mut
442
485
}
443
486
}
444
487
445
488
#[ inline]
446
489
fn index_mut( self , slice: #slice_mut_name<' a>) -> Self :: MutOutput {
447
490
#slice_mut_name {
448
- #( #fields_names_1 : & mut slice . #fields_names_2 [ self . clone ( ) ] , ) *
491
+ #index_mut
449
492
}
450
493
}
451
494
}
0 commit comments