Skip to content

Commit ec27b66

Browse files
authored
add constructor from existing aos array (JuliaArrays#10)
1 parent 946da64 commit ec27b66

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/structarray.jl

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,22 @@ StructArray{T}(args...) where {T} = StructArray{T}(NamedTuple{fields(T)}(args))
3131
end
3232
end
3333

34+
@generated function StructArray(v::AbstractArray{T, N}) where {T, N}
35+
syms = [gensym() for i in 1:fieldcount(T)]
36+
init = Expr(:block, [:($(syms[i]) = similar(v, $(fieldtype(T, i)))) for i in 1:fieldcount(T)]...)
37+
push = Expr(:block, [:($(syms[i])[j] = f.$(fieldname(T, i))) for i in 1:fieldcount(T)]...)
38+
quote
39+
$init
40+
for (j, f) in enumerate(v)
41+
@inbounds $push
42+
end
43+
return StructArray{T}($(syms...))
44+
end
45+
end
46+
StructArray(s::StructArray) = copy(s)
47+
48+
Base.convert(::Type{StructArray}, v::AbstractArray) = StructArray(v)
49+
3450
columns(s::StructArray) = getfield(s, :columns)
3551
Base.getproperty(s::StructArray, key::Symbol) = getfield(columns(s), key)
3652
Base.getproperty(s::StructArray, key::Int) = getfield(columns(s), key)

test/runtests.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ using Test
1111
@test (@inferred view(t, 2, 1:2)) == StructArray((a = view(a, 2, 1:2), b = view(b, 2, 1:2)))
1212
end
1313

14+
@testset "constructor from existing array" begin
15+
v = rand(ComplexF64, 5, 3)
16+
t = @inferred StructArray(v)
17+
@test size(t) == (5, 3)
18+
@test t[2,2] == v[2,2]
19+
t2 = convert(StructArray, v)::StructArray
20+
@test t2 == t
21+
t3 = StructArray(t)::StructArray
22+
@test t3 == t
23+
end
24+
1425
@testset "complex" begin
1526
a, b = [1 2; 3 4], [4 5; 6 7]
1627
t = StructArray{ComplexF64}(a, b)

0 commit comments

Comments
 (0)