diff --git a/src/vector_of_array.jl b/src/vector_of_array.jl index eef23eac..f1947de4 100644 --- a/src/vector_of_array.jl +++ b/src/vector_of_array.jl @@ -704,6 +704,12 @@ function Base.similar(vec::VectorOfArray{ return VectorOfArray(similar.(Base.parent(vec))) end +function Base.similar(vec::VectorOfArray{ + T, N, AT}) where {T, N, AT <: AbstractArray{<:StaticArraysCore.StaticVecOrMat{T}}} + # this avoids behavior such as similar(SVector) returning an MVector + return VectorOfArray(similar(Base.parent(vec))) +end + @inline function Base.similar(VA::VectorOfArray, ::Type{T} = eltype(VA)) where {T} VectorOfArray(similar.(VA.u, T)) end diff --git a/test/copy_static_array_test.jl b/test/copy_static_array_test.jl index d3346593..de0132ce 100644 --- a/test/copy_static_array_test.jl +++ b/test/copy_static_array_test.jl @@ -120,4 +120,14 @@ x = StructArray{SVector{2, Float64}}((randn(2), randn(2))) vx = VectorOfArray(x) vx2 = copy(vx) .+ 1 ans = vx .+ vx2 -@test ans.u isa StructArray \ No newline at end of file +@test ans.u isa StructArray + +# check that Base.similar(VectorOfArray{<:StaticArray}) returns the +# same type as the original VectorOfArray +x_staticvector = [SVector(0.0, 0.0) for _ in 1:2] +x_structarray = StructArray{SVector{2, Float64}}((randn(2), randn(2))) +x_mutablefv = [MutableFV(1.0, 2.0)] +x_immutablefv = [ImmutableFV(1.0, 2.0)] +for vec in [x_staticvector, x_structarray, x_mutablefv, x_immutablefv] + @test typeof(similar(VectorOfArray(vec))) === typeof(VectorOfArray(vec)) +end \ No newline at end of file