Skip to content

Commit 5bb494c

Browse files
curryyzhengLuthaf
authored andcommitted
feat: soa_attr support for SliceMut/PtrMut/RefMut
1 parent 88a2e23 commit 5bb494c

File tree

4 files changed

+26
-10
lines changed

4 files changed

+26
-10
lines changed

soa-derive-internal/src/input.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ pub struct Input {
1919

2020
pub vec_attrs: Vec<Meta>,
2121
pub slice_attrs: Vec<Meta>,
22+
pub slice_mut_attrs: Vec<Meta>,
2223
pub ref_attrs: Vec<Meta>,
24+
pub ref_mut_attrs: Vec<Meta>,
2325
pub ptr_attrs: Vec<Meta>,
26+
pub ptr_mut_attrs: Vec<Meta>,
2427
}
2528

2629
impl Input {
@@ -33,8 +36,11 @@ impl Input {
3336
let mut derives: Vec<Ident> = vec![];
3437
let mut vec_attrs = Vec::new();
3538
let mut slice_attrs = Vec::new();
39+
let mut slice_mut_attrs = Vec::new();
3640
let mut ref_attrs = Vec::new();
41+
let mut ref_mut_attrs = Vec::new();
3742
let mut ptr_attrs = Vec::new();
43+
let mut ptr_mut_attrs = Vec::new();
3844
for attr in input.attrs {
3945
if let Ok(meta) = attr.parse_meta() {
4046
if meta.path().is_ident("soa_derive") {
@@ -63,23 +69,27 @@ impl Input {
6369
panic!("expected a attribute, got {}", quote!(attr))
6470
}
6571
};
66-
match soa_type {
72+
let attrs_mut = match soa_type {
6773
NestedMeta::Meta(Meta::Path(path)) => match path.get_ident() {
6874
Some(ident) => match ident.to_string().as_str() {
69-
"Vec" => vec_attrs.push(attr),
70-
"Slice" => slice_attrs.push(attr),
71-
"Ref" => ref_attrs.push(attr),
72-
"Ptr" => ptr_attrs.push(attr),
75+
"Vec" => &mut vec_attrs,
76+
"Slice" => &mut slice_attrs,
77+
"SliceMut" => &mut slice_mut_attrs,
78+
"Ref" => &mut ref_attrs,
79+
"RefMut" => &mut ref_mut_attrs,
80+
"Ptr" => &mut ptr_attrs,
81+
"PtrMut" => &mut ptr_mut_attrs,
7382
_ => panic!("expected a soa type, got {}", ident),
7483
},
7584
None => {
76-
panic!("expected a soa type, got {}", quote!(#path))
85+
panic!("expected a soa type, got {}", quote!(#path));
7786
}
7887
},
7988
_ => {
80-
panic!("expected a soa type, got {}", quote!(#soa_type))
89+
panic!("expected a soa type, got {}", quote!(#soa_type));
8190
}
82-
}
91+
};
92+
attrs_mut.push(attr);
8393
}
8494
_ => panic!("expected #[soa_attr(...)], got #[{}]", quote!(#meta)),
8595
}
@@ -94,8 +104,11 @@ impl Input {
94104
visibility: input.vis,
95105
vec_attrs,
96106
slice_attrs,
107+
slice_mut_attrs,
97108
ref_attrs,
109+
ref_mut_attrs,
98110
ptr_attrs,
111+
ptr_mut_attrs,
99112
}
100113
}
101114

soa-derive-internal/src/ptr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub fn derive(input: &Input) -> TokenStream {
88
let visibility = &input.visibility;
99
let other_derive = &input.derive_with_exceptions();
1010
let attrs = &input.ptr_attrs;
11+
let mut_attrs = &input.ptr_mut_attrs;
1112
let vec_name = &input.vec_name();
1213
let ptr_name = &input.ptr_name();
1314
let ptr_mut_name = &input.ptr_mut_name();
@@ -56,6 +57,7 @@ pub fn derive(input: &Input) -> TokenStream {
5657
#[doc = #doc_url]
5758
/// with struct of array layout.
5859
#other_derive
60+
#(#[#mut_attrs])*
5961
#[derive(Copy, Clone)]
6062
#visibility struct #ptr_mut_name {
6163
#(

soa-derive-internal/src/refs.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub fn derive(input: &Input) -> TokenStream {
88
let visibility = &input.visibility;
99
let other_derive = &input.derive_with_exceptions();
1010
let attrs = &input.ref_attrs;
11+
let mut_attrs = &input.ref_mut_attrs;
1112
let vec_name = &input.vec_name();
1213
let ref_name = &input.ref_name();
1314
let ref_mut_name = &input.ref_mut_name();
@@ -52,7 +53,7 @@ pub fn derive(input: &Input) -> TokenStream {
5253
#[doc = #doc_url]
5354
/// with struct of array layout.
5455
#other_derive
55-
#(#[#attrs])*
56+
#(#[#mut_attrs])*
5657
#visibility struct #ref_mut_name<'a> {
5758
#(
5859
#[doc = #fields_mut_doc]

soa-derive-internal/src/slice.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ pub fn derive_mut(input: &Input) -> TokenStream {
241241
let slice_name = &input.slice_name();
242242
let slice_mut_name = &input.slice_mut_name();
243243
let vec_name = &input.vec_name();
244-
let attrs = &input.slice_attrs;
244+
let attrs = &input.slice_mut_attrs;
245245
let ref_mut_name = &input.ref_mut_name();
246246
let ptr_name = &input.ptr_name();
247247
let ptr_mut_name = &input.ptr_mut_name();

0 commit comments

Comments
 (0)