Soars

Derive Macro Soars 

Source
#[derive(Soars)]
{
    // Attributes available to this derive:
    #[align]
    #[soa_derive]
    #[soa_array]
}
Expand description

Derive macro for the Soars trait.

Deriving Soars for some struct Foo will create the following additional structs:

StructField typeUse
FooSoaRaw*mut TLow-level, unsafe memory handling for SoA
FooRef&TSoA element reference
FooRefMut&mut TMutable SoA element reference
FooSlices&[T]SoA fields
FooSlicesMut&mut [T]Mutable SoA fields
FooArray[T; N]const-compatible SoA
FooDerefSoA Deref target, provides slice getters

The Soars trait implementation for Foo references these as associated types. AsSoaRef is also implemented for Foo, FooRef, and FooRefMut.

§Arrays

The FooArray type is only generated when the #[soa_array] attribute is added to the struct. Only structs without interior mutability support this attribute for the time being, due to this issue. SOA array types are stack-allocated like normal arrays and are const-initializable.

§Derive for generated types

The soa_derive attribute can be used to derive traits for the generated types. Copy and Clone are added automatically for FooRef and FooSlices. In the following example, we have the following trait implementations:

StructCopy/CloneDebug/PartialEqEqPartialOrd
FooRef
FooRefMut
FooSlices
FooSlicesMut
FooArray
#[derive(Soars)]
#[soa_derive(Debug, PartialEq)]
#[soa_derive(include(Ref, RefMut), Eq)]
#[soa_derive(exclude(Ref, Slices), PartialOrd)]
struct Foo(u8);

§Alignment

Individual fields can be tagged with the align attribute to raise their alignment. The slice for that field will start at a multiple of the requested alignment if it is greater than or equal to the alignment of the field’s type. This can be useful for vector operations.

struct Foo(#[align(8)] u8);