@@ -27,17 +27,23 @@ StructArray{T}(; kwargs...) where {T} = StructArray{T}(values(kwargs))
2727StructArray (; kwargs... ) = StructArray (values (kwargs))
2828
2929StructArray {T} (args... ) where {T} = StructArray {T} (NamedTuple {fields(T)} (args))
30- @generated function StructArray {T} (:: Base.UndefInitializer , d:: Integer... ) where {T}
31- ex = Expr (:tuple , [:(Array {$(fieldtype(T, i))} (undef, sz)) for i in 1 : fieldcount (T)]. .. )
30+
31+ _undef_array (:: Type{T} , sz; unwrap = t -> false ) where {T} = unwrap (T) ? StructArray {T} (undef, sz; unwrap = unwrap) : Array {T} (undef, sz)
32+ function _similar (v:: S , :: Type{Z} ; unwrap = t -> false ) where {S <: AbstractArray{T, N} , Z} where {T, N}
33+ unwrap (Z) ? StructArray {Z} (map (t -> _similar (v, fieldtype (Z, t); unwrap = unwrap), fields (Z))) : similar (v, Z)
34+ end
35+
36+ StructArray {T} (u:: Base.UndefInitializer , d:: Integer... ; unwrap = t -> false ) where {T} = StructArray {T} (u, convert (Dims, d); unwrap = unwrap)
37+ @generated function StructArray {T} (:: Base.UndefInitializer , sz:: Dims ; unwrap = t -> false ) where {T}
38+ ex = Expr (:tuple , [:(_undef_array ($ (fieldtype (T, i)), sz; unwrap = unwrap)) for i in 1 : fieldcount (T)]. .. )
3239 return quote
33- sz = convert (Tuple{Vararg{Int}}, d)
3440 StructArray {T} (NamedTuple {fields(T)} ($ ex))
3541 end
3642end
3743
38- @generated function StructArray (v:: AbstractArray{T, N} ) where {T, N}
44+ @generated function StructArray (v:: AbstractArray{T, N} ; unwrap = t -> false ) where {T, N}
3945 syms = [gensym () for i in 1 : fieldcount (T)]
40- init = Expr (:block , [:($ (syms[i]) = similar (v, $ (fieldtype (T, i)))) for i in 1 : fieldcount (T)]. .. )
46+ init = Expr (:block , [:($ (syms[i]) = _similar (v, $ (fieldtype (T, i)); unwrap = unwrap )) for i in 1 : fieldcount (T)]. .. )
4147 push = Expr (:block , [:($ (syms[i])[j] = f.$ (fieldname (T, i))) for i in 1 : fieldcount (T)]. .. )
4248 quote
4349 $ init
0 commit comments