@@ -27,17 +27,23 @@ StructArray{T}(; kwargs...) where {T} = StructArray{T}(values(kwargs))
27
27
StructArray (; kwargs... ) = StructArray (values (kwargs))
28
28
29
29
StructArray {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)]. .. )
32
39
return quote
33
- sz = convert (Tuple{Vararg{Int}}, d)
34
40
StructArray {T} (NamedTuple {fields(T)} ($ ex))
35
41
end
36
42
end
37
43
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}
39
45
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)]. .. )
41
47
push = Expr (:block , [:($ (syms[i])[j] = f.$ (fieldname (T, i))) for i in 1 : fieldcount (T)]. .. )
42
48
quote
43
49
$ init
0 commit comments