Skip to content

Commit 8fdcb3a

Browse files
committed
feature: add soa_crate type-level attribute for vendoring
1 parent f200fa0 commit 8fdcb3a

File tree

9 files changed

+85
-64
lines changed

9 files changed

+85
-64
lines changed

soa-derive-internal/src/generic.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ pub fn derive_slice(input: &Input) -> TokenStream {
1111
let ref_name = names::ref_name(&input.name);
1212
let ptr_name = names::ptr_name(&input.name);
1313
let iter_name = names::iter_name(name);
14+
let crate_name = &input.soa_crate;
1415

1516
let generated = quote! {
16-
impl<'a> ::soa_derive::SoASlice<#name> for #slice_name<'a> {
17+
impl<'a> #crate_name::SoASlice<#name> for #slice_name<'a> {
1718
type Ref<'t> = #ref_name<'t> where Self: 't, 'a: 't;
1819
type Slice<'t> = #slice_name<'t> where Self: 't, 'a: 't;
1920
type Iter<'t> = #iter_name<'t> where Self: 't, 'a: 't;
@@ -76,10 +77,11 @@ pub fn derive_slice_mut(input: &Input) -> TokenStream {
7677
let ptr_mut_name = names::ptr_mut_name(&input.name);
7778
let iter_name = names::iter_name(name);
7879
let iter_mut_name = names::iter_mut_name(name);
80+
let crate_name = &input.soa_crate;
7981

8082
let generated = quote! {
8183

82-
impl<'a> ::soa_derive::SoASliceMut<#name> for #slice_mut_name<'a> {
84+
impl<'a> #crate_name::SoASliceMut<#name> for #slice_mut_name<'a> {
8385
type Ref<'t> = #ref_name<'t> where Self: 't;
8486
type Slice<'t> = #slice_name<'t> where Self: 't;
8587
type Iter<'t> = #iter_name<'t> where Self: 't;
@@ -159,7 +161,7 @@ pub fn derive_slice_mut(input: &Input) -> TokenStream {
159161
}
160162

161163
fn apply_index(&mut self, indices: &[usize]) {
162-
self.apply_permutation(&mut ::soa_derive::Permutation::oneline(indices).inverse());
164+
self.apply_permutation(&mut #crate_name::Permutation::oneline(indices).inverse());
163165
}
164166

165167
fn as_ptr(&self) -> Self::Ptr {
@@ -186,10 +188,11 @@ pub fn derive_vec(input: &Input) -> TokenStream {
186188
let ptr_mut_name = names::ptr_mut_name(&input.name);
187189
let iter_name = names::iter_name(name);
188190
let iter_mut_name = names::iter_mut_name(name);
191+
let crate_name = &input.soa_crate;
189192

190193
let generated = quote! {
191194

192-
impl ::soa_derive::SoAVec<#name> for #vec_name {
195+
impl #crate_name::SoAVec<#name> for #vec_name {
193196
type Ref<'t> = #ref_name<'t>;
194197
type Slice<'t> = #slice_name<'t>;
195198
type Iter<'t> = #iter_name<'t>;
@@ -269,7 +272,7 @@ pub fn derive_vec(input: &Input) -> TokenStream {
269272
}
270273

271274
fn apply_index(&mut self, indices: &[usize]) {
272-
use ::soa_derive::SoASliceMut;
275+
use #crate_name::SoASliceMut;
273276
self.as_mut_slice().apply_index(indices);
274277
}
275278

soa-derive-internal/src/index.rs

+29-28
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pub fn derive(input: &Input) -> TokenStream {
1111
let slice_mut_name = names::slice_mut_name(&input.name);
1212
let ref_name = names::ref_name(&input.name);
1313
let ref_mut_name = names::ref_mut_name(&input.name);
14+
let crate_name = &input.soa_crate;
1415

1516
let fields_names = &input.fields.iter()
1617
.map(|field| field.ident.clone().unwrap())
@@ -40,7 +41,7 @@ pub fn derive(input: &Input) -> TokenStream {
4041

4142
quote!{
4243
// usize
43-
impl<'a> ::soa_derive::SoAIndex<&'a #vec_name> for usize {
44+
impl<'a> #crate_name::SoAIndex<&'a #vec_name> for usize {
4445
type RefOutput = #ref_name<'a>;
4546

4647
#[inline]
@@ -63,7 +64,7 @@ pub fn derive(input: &Input) -> TokenStream {
6364
}
6465
}
6566

66-
impl<'a> ::soa_derive::SoAIndexMut<&'a mut #vec_name> for usize {
67+
impl<'a> #crate_name::SoAIndexMut<&'a mut #vec_name> for usize {
6768
type MutOutput = #ref_mut_name<'a>;
6869

6970
#[inline]
@@ -89,7 +90,7 @@ pub fn derive(input: &Input) -> TokenStream {
8990

9091

9192
// Range<usize>
92-
impl<'a> ::soa_derive::SoAIndex<&'a #vec_name> for ::std::ops::Range<usize> {
93+
impl<'a> #crate_name::SoAIndex<&'a #vec_name> for ::std::ops::Range<usize> {
9394
type RefOutput = #slice_name<'a>;
9495

9596
#[inline]
@@ -112,7 +113,7 @@ pub fn derive(input: &Input) -> TokenStream {
112113
}
113114
}
114115

115-
impl<'a> ::soa_derive::SoAIndexMut<&'a mut #vec_name> for ::std::ops::Range<usize> {
116+
impl<'a> #crate_name::SoAIndexMut<&'a mut #vec_name> for ::std::ops::Range<usize> {
116117
type MutOutput = #slice_mut_name<'a>;
117118

118119
#[inline]
@@ -136,7 +137,7 @@ pub fn derive(input: &Input) -> TokenStream {
136137
}
137138

138139
// RangeTo<usize>
139-
impl<'a> ::soa_derive::SoAIndex<&'a #vec_name> for ::std::ops::RangeTo<usize> {
140+
impl<'a> #crate_name::SoAIndex<&'a #vec_name> for ::std::ops::RangeTo<usize> {
140141
type RefOutput = #slice_name<'a>;
141142

142143
#[inline]
@@ -155,7 +156,7 @@ pub fn derive(input: &Input) -> TokenStream {
155156
}
156157
}
157158

158-
impl<'a> ::soa_derive::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeTo<usize> {
159+
impl<'a> #crate_name::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeTo<usize> {
159160
type MutOutput = #slice_mut_name<'a>;
160161

161162
#[inline]
@@ -175,7 +176,7 @@ pub fn derive(input: &Input) -> TokenStream {
175176
}
176177

177178
// RangeFrom<usize>
178-
impl<'a> ::soa_derive::SoAIndex<&'a #vec_name> for ::std::ops::RangeFrom<usize> {
179+
impl<'a> #crate_name::SoAIndex<&'a #vec_name> for ::std::ops::RangeFrom<usize> {
179180
type RefOutput = #slice_name<'a>;
180181

181182
#[inline]
@@ -194,7 +195,7 @@ pub fn derive(input: &Input) -> TokenStream {
194195
}
195196
}
196197

197-
impl<'a> ::soa_derive::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeFrom<usize> {
198+
impl<'a> #crate_name::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeFrom<usize> {
198199
type MutOutput = #slice_mut_name<'a>;
199200

200201
#[inline]
@@ -214,7 +215,7 @@ pub fn derive(input: &Input) -> TokenStream {
214215
}
215216

216217
// RangeFull
217-
impl<'a> ::soa_derive::SoAIndex<&'a #vec_name> for ::std::ops::RangeFull {
218+
impl<'a> #crate_name::SoAIndex<&'a #vec_name> for ::std::ops::RangeFull {
218219
type RefOutput = #slice_name<'a>;
219220

220221
#[inline]
@@ -233,7 +234,7 @@ pub fn derive(input: &Input) -> TokenStream {
233234
}
234235
}
235236

236-
impl<'a> ::soa_derive::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeFull {
237+
impl<'a> #crate_name::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeFull {
237238
type MutOutput = #slice_mut_name<'a>;
238239

239240
#[inline]
@@ -253,7 +254,7 @@ pub fn derive(input: &Input) -> TokenStream {
253254
}
254255

255256
// RangeInclusive<usize>
256-
impl<'a> ::soa_derive::SoAIndex<&'a #vec_name> for ::std::ops::RangeInclusive<usize> {
257+
impl<'a> #crate_name::SoAIndex<&'a #vec_name> for ::std::ops::RangeInclusive<usize> {
257258
type RefOutput = #slice_name<'a>;
258259

259260
#[inline]
@@ -276,7 +277,7 @@ pub fn derive(input: &Input) -> TokenStream {
276277
}
277278
}
278279

279-
impl<'a> ::soa_derive::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeInclusive<usize> {
280+
impl<'a> #crate_name::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeInclusive<usize> {
280281
type MutOutput = #slice_mut_name<'a>;
281282

282283
#[inline]
@@ -300,7 +301,7 @@ pub fn derive(input: &Input) -> TokenStream {
300301
}
301302

302303
// RangeToInclusive<usize>
303-
impl<'a> ::soa_derive::SoAIndex<&'a #vec_name> for ::std::ops::RangeToInclusive<usize> {
304+
impl<'a> #crate_name::SoAIndex<&'a #vec_name> for ::std::ops::RangeToInclusive<usize> {
304305
type RefOutput = #slice_name<'a>;
305306

306307
#[inline]
@@ -319,7 +320,7 @@ pub fn derive(input: &Input) -> TokenStream {
319320
}
320321
}
321322

322-
impl<'a> ::soa_derive::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeToInclusive<usize> {
323+
impl<'a> #crate_name::SoAIndexMut<&'a mut #vec_name> for ::std::ops::RangeToInclusive<usize> {
323324
type MutOutput = #slice_mut_name<'a>;
324325

325326
#[inline]
@@ -339,7 +340,7 @@ pub fn derive(input: &Input) -> TokenStream {
339340
}
340341

341342
// usize
342-
impl<'a> ::soa_derive::SoAIndex<#slice_name<'a>> for usize {
343+
impl<'a> #crate_name::SoAIndex<#slice_name<'a>> for usize {
343344
type RefOutput = #ref_name<'a>;
344345

345346
#[inline]
@@ -366,7 +367,7 @@ pub fn derive(input: &Input) -> TokenStream {
366367
}
367368
}
368369

369-
impl<'a> ::soa_derive::SoAIndexMut<#slice_mut_name<'a>> for usize {
370+
impl<'a> #crate_name::SoAIndexMut<#slice_mut_name<'a>> for usize {
370371
type MutOutput = #ref_mut_name<'a>;
371372

372373
#[inline]
@@ -396,7 +397,7 @@ pub fn derive(input: &Input) -> TokenStream {
396397

397398

398399
// Range<usize>
399-
impl<'a> ::soa_derive::SoAIndex<#slice_name<'a>> for ::std::ops::Range<usize> {
400+
impl<'a> #crate_name::SoAIndex<#slice_name<'a>> for ::std::ops::Range<usize> {
400401
type RefOutput = #slice_name<'a>;
401402

402403
#[inline]
@@ -423,7 +424,7 @@ pub fn derive(input: &Input) -> TokenStream {
423424
}
424425
}
425426

426-
impl<'a> ::soa_derive::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::Range<usize> {
427+
impl<'a> #crate_name::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::Range<usize> {
427428
type MutOutput = #slice_mut_name<'a>;
428429

429430
#[inline]
@@ -453,7 +454,7 @@ pub fn derive(input: &Input) -> TokenStream {
453454

454455

455456
// RangeTo<usize>
456-
impl<'a> ::soa_derive::SoAIndex<#slice_name<'a>> for ::std::ops::RangeTo<usize> {
457+
impl<'a> #crate_name::SoAIndex<#slice_name<'a>> for ::std::ops::RangeTo<usize> {
457458
type RefOutput = #slice_name<'a>;
458459

459460
#[inline]
@@ -472,7 +473,7 @@ pub fn derive(input: &Input) -> TokenStream {
472473
}
473474
}
474475

475-
impl<'a> ::soa_derive::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeTo<usize> {
476+
impl<'a> #crate_name::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeTo<usize> {
476477
type MutOutput = #slice_mut_name<'a>;
477478

478479
#[inline]
@@ -493,7 +494,7 @@ pub fn derive(input: &Input) -> TokenStream {
493494

494495

495496
// RangeFrom<usize>
496-
impl<'a> ::soa_derive::SoAIndex<#slice_name<'a>> for ::std::ops::RangeFrom<usize> {
497+
impl<'a> #crate_name::SoAIndex<#slice_name<'a>> for ::std::ops::RangeFrom<usize> {
497498
type RefOutput = #slice_name<'a>;
498499

499500
#[inline]
@@ -512,7 +513,7 @@ pub fn derive(input: &Input) -> TokenStream {
512513
}
513514
}
514515

515-
impl<'a> ::soa_derive::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeFrom<usize> {
516+
impl<'a> #crate_name::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeFrom<usize> {
516517
type MutOutput = #slice_mut_name<'a>;
517518

518519
#[inline]
@@ -533,7 +534,7 @@ pub fn derive(input: &Input) -> TokenStream {
533534

534535

535536
// RangeFull
536-
impl<'a> ::soa_derive::SoAIndex<#slice_name<'a>> for ::std::ops::RangeFull {
537+
impl<'a> #crate_name::SoAIndex<#slice_name<'a>> for ::std::ops::RangeFull {
537538
type RefOutput = #slice_name<'a>;
538539

539540
#[inline]
@@ -552,7 +553,7 @@ pub fn derive(input: &Input) -> TokenStream {
552553
}
553554
}
554555

555-
impl<'a> ::soa_derive::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeFull {
556+
impl<'a> #crate_name::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeFull {
556557
type MutOutput = #slice_mut_name<'a>;
557558

558559
#[inline]
@@ -573,7 +574,7 @@ pub fn derive(input: &Input) -> TokenStream {
573574

574575

575576
// RangeInclusive<usize>
576-
impl<'a> ::soa_derive::SoAIndex<#slice_name<'a>> for ::std::ops::RangeInclusive<usize> {
577+
impl<'a> #crate_name::SoAIndex<#slice_name<'a>> for ::std::ops::RangeInclusive<usize> {
577578
type RefOutput = #slice_name<'a>;
578579

579580
#[inline]
@@ -596,7 +597,7 @@ pub fn derive(input: &Input) -> TokenStream {
596597
}
597598
}
598599

599-
impl<'a> ::soa_derive::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeInclusive<usize> {
600+
impl<'a> #crate_name::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeInclusive<usize> {
600601
type MutOutput = #slice_mut_name<'a>;
601602

602603
#[inline]
@@ -621,7 +622,7 @@ pub fn derive(input: &Input) -> TokenStream {
621622

622623

623624
// RangeToInclusive<usize>
624-
impl<'a> ::soa_derive::SoAIndex<#slice_name<'a>> for ::std::ops::RangeToInclusive<usize> {
625+
impl<'a> #crate_name::SoAIndex<#slice_name<'a>> for ::std::ops::RangeToInclusive<usize> {
625626
type RefOutput = #slice_name<'a>;
626627

627628
#[inline]
@@ -640,7 +641,7 @@ pub fn derive(input: &Input) -> TokenStream {
640641
}
641642
}
642643

643-
impl<'a> ::soa_derive::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeToInclusive<usize> {
644+
impl<'a> #crate_name::SoAIndexMut<#slice_mut_name<'a>> for ::std::ops::RangeToInclusive<usize> {
644645
type MutOutput = #slice_mut_name<'a>;
645646

646647
#[inline]

soa-derive-internal/src/input.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use proc_macro2::{Span, TokenStream};
22
use quote::quote;
33

44
use syn::punctuated::Punctuated;
5-
use syn::{Attribute, Data, DeriveInput, Field, Path, Visibility, Token};
5+
use syn::{Attribute, Data, DeriveInput, Field, Path, Token, Visibility};
66
use syn::{Meta, MetaList};
77

88
/// Representing the struct we are deriving
@@ -18,10 +18,14 @@ pub struct Input {
1818
/// Additional attributes requested with `#[soa_attr(...)]` or
1919
/// `#[soa_derive()]`
2020
pub attrs: ExtraAttributes,
21-
#[allow(unused)]
21+
2222
/// Whether or not to generate extra trait implementations that make the SoA types usable
2323
/// in a generic context enabled by the `generic_traits` feature.
2424
pub generate_traits: bool,
25+
26+
/// The path to import the `soa_derive` crate from, in case the library is vendored or
27+
/// internalized.
28+
pub soa_crate: syn::Path,
2529
}
2630

2731
pub struct ExtraAttributes {
@@ -114,6 +118,7 @@ impl Input {
114118

115119
let mut extra_attrs = ExtraAttributes::new();
116120
let mut generate_traits: bool = false;
121+
let mut soa_derive_crate: Option<Path> = Some(syn::parse_str("::soa_derive").unwrap());
117122

118123
for attr in input.attrs {
119124
if attr.path().is_ident("soa_derive") {
@@ -172,6 +177,11 @@ impl Input {
172177
if attr.path().is_ident("generate_traits") {
173178
generate_traits = true;
174179
}
180+
181+
if attr.path().is_ident("soa_crate") {
182+
let args = attr.parse_args::<Path>().expect("expected an attribute like a path");
183+
soa_derive_crate = Some(args);
184+
}
175185
}
176186

177187
Input {
@@ -181,6 +191,7 @@ impl Input {
181191
attrs: extra_attrs,
182192
field_is_nested,
183193
generate_traits: generate_traits,
194+
soa_crate: soa_derive_crate.unwrap(),
184195
}
185196
}
186197

0 commit comments

Comments
 (0)