Generics
Types in Julia can have parameters, which may or may not affect the layout of the type.
There are two reasons why a type parameter might not affect the layout:
- it's a value parameter, not referenced by any of the fields.
- it affects the layout of a field that isn't inlined.
Any type parameter that doesn't affect the layout can be elided, otherwise it can be treated the same way in Rust and Julia:
struct Generic{T}
t::T
end
struct SetGeneric
t::Generic{UInt32}
end
struct Elided{T}
t::UInt32
end
#[repr(C)]
struct Generic<T> {
t: T,
}
#[repr(C)]
struct SetGeneric {
t: Generic<u32>,
}
#[repr(C)]
struct Elided {
t: u32,
}
All three types can implement ValidLayout
and ValidField
because they're immutable types in Julia. In the case of Generic
it's required that T: ValidField
. If T
is some mutable or otherwise non-inlined type, we can express the layout type as Generic<Option<ValueRef>>
.
Generic
and SetGeneric
don't elide any type parameters so they can implement ConstructType
, but Elided
is unaware of the type paramater T
.