Skip to content

Commit 5673bf3

Browse files
committed
Improve specializations of empty
Add support for empty!
1 parent d5d9ecc commit 5673bf3

File tree

4 files changed

+33
-8
lines changed

4 files changed

+33
-8
lines changed

src/array_of_similar_arrays.jl

+12-5
Original file line numberDiff line numberDiff line change
@@ -344,16 +344,23 @@ end
344344
# Will need equivalent of resize! that resizes in front of data instead of in back:
345345
# popfirst!(V::ArrayOfSimilarArrays) = ...
346346

347-
function Base.empty(A::VectorOfSimilarArrays{T,M}, ::Type{<:AbstractArray{U}}) where {T,M,U}
348-
data = A.data
349-
size_inner, size_outer = split_tuple(size(data), Val{1}())
347+
348+
function _empty_data_size(A::VectorOfSimilarArrays{T,M}) where {T,M}
349+
size_inner, size_outer = split_tuple(size(A.data), Val{M}())
350350
empty_size_outer = map(x -> zero(x), size_outer)
351+
(size_inner..., empty_size_outer...)
352+
end
351353

354+
function Base.empty(A::VectorOfSimilarArrays{T,M}, ::Type{<:AbstractArray{U}}) where {T,M,U}
355+
new_data_size = _empty_data_size(A)
352356
# ToDo: Don't use similar if data is an ElasticArray?
353-
VectorOfSimilarArrays{T,M}(similar(data, U, size_inner..., empty_size_outer...))
357+
VectorOfSimilarArrays{T,M}(similar(A.data, U, new_data_size...))
354358
end
355359

356-
Base.empty(A::VectorOfSimilarArrays{T,M}) where {T,M} = empty(A, Array{T})
360+
function Base.empty!(A::VectorOfSimilarArrays{T,M}) where {T,M}
361+
resize!(A.data, _empty_data_size(A))
362+
A
363+
end
357364

358365

359366

src/vector_of_arrays.jl

+9-2
Original file line numberDiff line numberDiff line change
@@ -379,13 +379,20 @@ function Base.push!(A::VectorOfArrays{T,N}, x::AbstractArray{U,N}) where {T,N,U}
379379
end
380380

381381

382-
function Base.empty(A::VectorOfArrays{T,N}) where {T,N}
383-
empty_data = empty(A.data)
382+
function Base.empty(A::VectorOfArrays{T,N}, ::Type{<:DenseArray{U,N}}) where {T,N,U}
383+
empty_data = empty(A.data, U)
384384
empty_elem_ptr = push!(empty(A.elem_ptr), firstindex(empty_data))
385385
empty_kernel_size = empty(A.kernel_size)
386386
VectorOfArrays(empty_data, empty_elem_ptr, empty_kernel_size, no_consistency_checks)
387387
end
388388

389+
function Base.empty!(A::VectorOfArrays)
390+
empty!(A.data)
391+
resize!(A.elem_ptr, 1)
392+
empty!(A.kernel_size)
393+
A
394+
end
395+
389396

390397
function Adapt.adapt_structure(to, A::VectorOfArrays)
391398
VectorOfArrays(

test/array_of_similar_arrays.jl

+7
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,13 @@ using StatsBase: cov2cor
248248
B = ArrayOfSimilarArrays(A)
249249
@test typeof(@inferred empty(B)) == typeof(B)
250250
@test empty(A) == empty(B)
251+
252+
C = VectorOfSimilarArrays{Float64,2}(ElasticArray(B.data))
253+
@test @inferred(empty(C)) == empty(A)
254+
@test @inferred(empty!(deepcopy(C))) == empty(A)
255+
@test @inferred(empty(C)) == @inferred(empty!(deepcopy(C)))
256+
@test append!(empty(C), C) == A
257+
@test append!(empty!(deepcopy(C)), C) == A
251258
end
252259

253260
@testset "stats" begin

test/vector_of_arrays.jl

+5-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,11 @@ using ArraysOfArrays: full_consistency_checks, append_elemptr!, element_ptr
217217
B = VectorOfArrays(A);
218218

219219
@test typeof(@inferred empty(B)) == typeof(B)
220-
@test empty(A) == empty(B)
220+
@test @inferred(empty(B)) == empty(A)
221+
@test @inferred(empty!(deepcopy(B))) == empty(A)
222+
@test @inferred(empty(B)) == @inferred(empty!(deepcopy(B)))
223+
@test append!(empty(B), B) == A
224+
@test append!(empty!(deepcopy(B)), B) == A
221225
end
222226

223227

0 commit comments

Comments
 (0)