Skip to content

Commit 92cd7d0

Browse files
mangelatsLuthaf
authored andcommitted
f => actually add methods to the generated slices
1 parent 9751703 commit 92cd7d0

File tree

1 file changed

+79
-35
lines changed

1 file changed

+79
-35
lines changed

soa-derive-internal/src/slice.rs

Lines changed: 79 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -153,22 +153,37 @@ pub fn derive(input: &Input) -> TokenStream {
153153
/// Similar to [`
154154
#[doc = #slice_name_str]
155155
/// ::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)
164162
}
165163

166164
/// Similar to [`
167165
#[doc = #slice_name_str]
168166
/// ::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,)*
172187
}
173188
}
174189

@@ -215,7 +230,6 @@ pub fn derive_mut(input: &Input) -> TokenStream {
215230
let slice_name = &input.slice_name();
216231
let slice_mut_name = &input.slice_mut_name();
217232
let vec_name = &input.vec_name();
218-
let ref_name = &input.ref_name();
219233
let ref_mut_name = &input.ref_mut_name();
220234
let ptr_name = &input.ptr_name();
221235
let ptr_mut_name = &input.ptr_mut_name();
@@ -382,44 +396,74 @@ pub fn derive_mut(input: &Input) -> TokenStream {
382396
/// Similar to [`
383397
#[doc = #slice_name_str]
384398
/// ::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)
393405
}
394406

395407
/// Similar to [`
396408
#[doc = #slice_name_str]
397409
/// ::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)
402424
}
403425

404426
/// Similar to [`
405427
#[doc = #slice_name_str]
406428
/// ::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)
415435
}
416436

417437
/// Similar to [`
418438
#[doc = #slice_name_str]
419439
/// ::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,)*
423467
}
424468
}
425469

0 commit comments

Comments
 (0)