Skip to content

Commit 01db9ba

Browse files
committed
Preserve unstored in copy and similar
1 parent d04f9e9 commit 01db9ba

File tree

2 files changed

+35
-25
lines changed

2 files changed

+35
-25
lines changed

src/abstractsparsearray.jl

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,38 @@ function DerivableInterfaces.interface(::Type{<:AbstractSparseArray})
1111
return SparseArrayInterface()
1212
end
1313

14+
function Base.copy(a::AnyAbstractSparseArray)
15+
return copyto!(similar(a), a)
16+
end
17+
18+
function Base.similar(a::AnyAbstractSparseArray)
19+
return SparseArrayDOK(Unstored(unstored(a)))
20+
end
21+
function Base.similar(a::AnyAbstractSparseArray, T::Type)
22+
return SparseArrayDOK(Unstored(unstoredsimilar(unstored(a), T)))
23+
end
24+
function Base.similar(a::AnyAbstractSparseArray, ax::Tuple)
25+
return similar(a, eltype(a), ax)
26+
end
27+
function Base.similar(a::AnyAbstractSparseArray, T::Type, ax::Tuple)
28+
return similar_sparsearray(a, T, ax)
29+
end
30+
# Fix ambiguity error.
31+
function Base.similar(a::AnyAbstractSparseArray, T::Type, ax::Tuple{Int,Vararg{Int}})
32+
return similar_sparsearray(a, T, ax)
33+
end
34+
# Fix ambiguity error.
35+
function Base.similar(
36+
a::AnyAbstractSparseArray,
37+
T::Type,
38+
ax::Tuple{Union{Integer,Base.OneTo},Vararg{Union{Integer,Base.OneTo}}},
39+
)
40+
return similar_sparsearray(a, T, ax)
41+
end
42+
function similar_sparsearray(a::AnyAbstractSparseArray, T::Type, ax::Tuple)
43+
return SparseArrayDOK(Unstored(unstoredsimilar(unstored(a), T, ax)))
44+
end
45+
1446
using DerivableInterfaces: @derive
1547

1648
# TODO: These need to be loaded since `AbstractArrayOps`
@@ -25,9 +57,6 @@ using LinearAlgebra: LinearAlgebra
2557
Base.getindex(::T, ::Int...)
2658
Base.setindex!(::T, ::Any, ::Any...)
2759
Base.setindex!(::T, ::Any, ::Int...)
28-
Base.similar(::T, ::Type, ::Tuple{Vararg{Int}})
29-
Base.similar(::T, ::Type, ::Tuple{Base.OneTo,Vararg{Base.OneTo}})
30-
Base.copy(::T)
3160
Base.copy!(::AbstractArray, ::T)
3261
Base.copyto!(::AbstractArray, ::T)
3362
Base.map(::Any, ::T...)

src/abstractsparsearrayinterface.jl

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,13 @@ unstored(a::AbstractArray) = Zeros{eltype(a)}(axes(a))
2626
function unstoredsimilar(a::AbstractArray, T::Type, ax::Tuple)
2727
return Zeros{T}(ax)
2828
end
29-
function unstoredsimilar(a::AbstractArray, T::Type)
30-
return unstoredsimilar(a, T, axes(a))
31-
end
3229
function unstoredsimilar(a::AbstractArray, ax::Tuple)
3330
return unstoredsimilar(a, eltype(a), ax)
3431
end
35-
function unstoredsimilar(a::AbstractArray)
36-
return unstoredsimilar(a, eltype(a), axes(a))
32+
function unstoredsimilar(a::AbstractArray, T::Type)
33+
return AbstractArray{T}(a)
3734
end
35+
unstoredsimilar(a::AbstractArray) = a
3836

3937
# Generic functionality for converting to a
4038
# dense array, trying to preserve information
@@ -104,23 +102,6 @@ Base.size(a::StoredValues) = size(a.storedindices)
104102
return setindex!(a.array, value, a.storedindices[I])
105103
end
106104

107-
@interface ::AbstractSparseArrayInterface function Base.similar(
108-
a::AbstractArray, T::Type, ax::Tuple
109-
)
110-
return SparseArrayDOK(Unstored(unstoredsimilar(unstored(a), T, ax)))
111-
end
112-
# Fix ambiguity error with DerivableInterfaces.jl.
113-
@interface ::AbstractSparseArrayInterface function Base.similar(
114-
a::AbstractArray, T::Type, ax::Tuple{Int,Vararg{Int}}
115-
)
116-
return SparseArrayDOK(Unstored(unstoredsimilar(unstored(a), T, ax)))
117-
end
118-
# Fix ambiguity error with DerivableInterfaces.jl.
119-
@interface ::AbstractSparseArrayInterface function Base.similar(
120-
a::AbstractArray, T::Type, ax::Tuple{Base.OneTo,Vararg{Base.OneTo}}
121-
)
122-
return SparseArrayDOK(Unstored(unstoredsimilar(unstored(a), T, ax)))
123-
end
124105
using DerivableInterfaces: DerivableInterfaces, zero!
125106

126107
# `zero!` isn't defined in `Base`, but it is defined in `ArrayLayouts`

0 commit comments

Comments
 (0)