Skip to content

Commit bd88bab

Browse files
committed
Improve AbstractArrayOfSimilarArrays ctors, define conversions
1 parent a613e21 commit bd88bab

File tree

2 files changed

+73
-16
lines changed

2 files changed

+73
-16
lines changed

src/array_of_similar_arrays.jl

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,37 @@ struct ArrayOfSimilarArrays{
5757
} <: AbstractArrayOfSimilarArrays{T,M,N}
5858
data::P
5959

60-
function ArrayOfSimilarArrays{M}(parent::AbstractArray{T,L}) where {T,M,L}
60+
function ArrayOfSimilarArrays{T,M}(parent::AbstractArray{U,L}) where {T,M,L,U}
6161
size_inner, size_outer = split_tuple(size(parent), Val{M}())
6262
N = length(size_outer)
63-
P = typeof(parent)
64-
new{T,M,N,L,P}(parent)
63+
conv_parent = _convert_elype(T, parent)
64+
P = typeof(conv_parent)
65+
new{T,M,N,L,P}(conv_parent)
6566
end
6667
end
6768

6869
export ArrayOfSimilarArrays
6970

71+
function ArrayOfSimilarArrays{T,M,N}(A::AbstractArray{<:AbstractArray{U,M},N}) where {T,M,N,U}
72+
B = ArrayOfSimilarArrays{T,M}(Array{T}(_size_inner(A)..., size(A)...))
73+
copy!(B, A)
74+
end
75+
76+
ArrayOfSimilarArrays{T}(A::AbstractArray{<:AbstractArray{U,M},N}) where {T,M,N,U} =
77+
ArrayOfSimilarArrays{T,M,N}(A)
78+
79+
ArrayOfSimilarArrays(A::AbstractArray{<:AbstractArray{T,M},N}) where {T,M,N} =
80+
ArrayOfSimilarArrays{T,M,N}(A)
81+
82+
83+
@static if VERSION < v"0.7.0-DEV.3138"
84+
Base.convert(R::Type{ArrayOfSimilarArrays{T,M}}, parent::AbstractArray{U,L}) where {T,M,L,U} = R(parent)
85+
86+
Base.convert(R::Type{ArrayOfSimilarArrays{T,M,N}}, A::AbstractArray{<:AbstractArray{U,M},N}) where {T,M,N,U} = R(A)
87+
Base.convert(R::Type{ArrayOfSimilarArrays{T}}, A::AbstractArray{<:AbstractArray{U,M},N}) where {T,M,N,U} = R(A)
88+
Base.convert(R::Type{ArrayOfSimilarArrays}, A::AbstractArray{<:AbstractArray{T,M},N}) where {T,M,N} = R(A)
89+
end
90+
7091

7192
function _size_inner(A::AbstractArray{<:AbstractArray{T,M},N}) where {T,M,N}
7293
s = if !isempty(A)
@@ -86,12 +107,6 @@ function _size_inner(A::ArrayOfSimilarArrays{T,M,N}) where {T,M,N}
86107
end
87108

88109

89-
function ArrayOfSimilarArrays(A::AbstractArray{<:AbstractArray{T,M},N}) where {T,M,N}
90-
B = ArrayOfSimilarArrays{M}(Array{T,M+N}(_size_inner(A)..., size(A)...))
91-
copy!(B, A)
92-
end
93-
94-
95110
import Base.==
96111
(==)(A::ArrayOfSimilarArrays{T,M,N}, B::ArrayOfSimilarArrays{T,M,N}) where {T,M,N} =
97112
(A.data == B.data)
@@ -128,7 +143,7 @@ end
128143
function Base.similar(A::ArrayOfSimilarArrays{T,M,N}, ::Type{<:AbstractArray{U}}, dims::Dims) where {T,M,N,U}
129144
data = A.data
130145
size_inner, size_outer = split_tuple(size(data), Val{M}())
131-
ArrayOfSimilarArrays{M}(similar(data, U, size_inner..., dims...))
146+
ArrayOfSimilarArrays{T,M}(similar(data, U, size_inner..., dims...))
132147
end
133148

134149

@@ -160,7 +175,7 @@ Base.prepend!(dest::ArrayOfSimilarArrays{T,M,N}, src::AbstractArray{<:AbstractAr
160175

161176

162177
UnsafeArrays.unsafe_uview(A::ArrayOfSimilarArrays{T,M,N}) where {T,M,N} =
163-
ArrayOfSimilarArrays{M}(uview(A.data))
178+
ArrayOfSimilarArrays{T,M}(uview(A.data))
164179

165180

166181

@@ -171,8 +186,21 @@ const VectorOfSimilarArrays{
171186

172187
export VectorOfSimilarArrays
173188

174-
VectorOfSimilarArrays(parent::AbstractArray{T,L}) where {T,L} =
175-
ArrayOfSimilarArrays{L-1}(parent)
189+
VectorOfSimilarArrays{T}(parent::AbstractArray{U,L}) where {T,U,L} =
190+
ArrayOfSimilarArrays{T,length(Base.front(size(parent)))}(parent)
191+
192+
VectorOfSimilarArrays{T}(A::AbstractVector{<:AbstractArray{U,M}}) where {T,M,U} =
193+
VectorOfSimilarArrays{T,M}(A)
194+
195+
VectorOfSimilarArrays(A::AbstractVector{<:AbstractArray{T,M}}) where {T,M} =
196+
VectorOfSimilarArrays{T,M}(A)
197+
198+
199+
@static if VERSION < v"0.7.0-DEV.3138"
200+
Base.convert(R::Type{VectorOfSimilarArrays{T}}, parent::AbstractArray{U,L}) where {T,U,L} = R(parent)
201+
Base.convert(R::Type{VectorOfSimilarArrays{T}}, A::AbstractVector{<:AbstractArray{U,M}}) where {T,M,U} = R(A)
202+
Base.convert(R::Type{VectorOfSimilarArrays}, A::AbstractVector{<:AbstractArray{T,M}}) where {T,M} = R(A)
203+
end
176204

177205

178206
@inline Base.IndexStyle(V::VectorOfSimilarArrays) = IndexLinear()
@@ -209,10 +237,18 @@ const ArrayOfSimilarVectors{
209237

210238
export ArrayOfSimilarVectors
211239

212-
ArrayOfSimilarVectors(parent::AbstractArray{T,L}) where {T,L} =
213-
ArrayOfSimilarArrays{1}(parent)
240+
ArrayOfSimilarVectors{T}(A::AbstractArray{<:AbstractVector{U},N}) where {T,N,U} =
241+
ArrayOfSimilarVectors{T,N}(A)
242+
243+
ArrayOfSimilarVectors(A::AbstractArray{<:AbstractVector{T},N}) where {T,N} =
244+
ArrayOfSimilarVectors{T,N}(A)
214245

215246

247+
@static if VERSION < v"0.7.0-DEV.3138"
248+
Base.convert(R::Type{ArrayOfSimilarVectors{T}}, A::AbstractArray{<:AbstractVector{U},N}) where {T,N,U} = R(A)
249+
Base.convert(R::Type{ArrayOfSimilarVectors}, A::AbstractArray{<:AbstractVector{T},N}) where {T,N} = R(A)
250+
end
251+
216252

217253
const VectorOfSimilarVectors{
218254
T,
@@ -221,5 +257,21 @@ const VectorOfSimilarVectors{
221257

222258
export VectorOfSimilarVectors
223259

260+
VectorOfSimilarVectors{T}(parent::AbstractArray{U,2}) where {T,U} =
261+
ArrayOfSimilarArrays{T,1}(parent)
262+
224263
VectorOfSimilarVectors(parent::AbstractArray{T,2}) where {T} =
225-
ArrayOfSimilarArrays{1}(parent)
264+
VectorOfSimilarVectors{T}(parent)
265+
266+
VectorOfSimilarVectors{T}(A::AbstractVector{<:AbstractVector{U}}) where {T,U} =
267+
ArrayOfSimilarArrays{T,1}(A)
268+
269+
VectorOfSimilarVectors(A::AbstractVector{<:AbstractVector{T}}) where {T} =
270+
VectorOfSimilarVectors{T}(A)
271+
272+
@static if VERSION < v"0.7.0-DEV.3138"
273+
Base.convert(R::Type{VectorOfSimilarVectors{T}}, parent::AbstractArray{U,2}) where {T,U} = R(parent)
274+
Base.convert(R::Type{VectorOfSimilarVectors}, parent::AbstractArray{T,2}) where {T} = R(parent)
275+
Base.convert(R::Type{VectorOfSimilarVectors{T}}, A::AbstractVector{<:AbstractVector{U}}) where {T,U} = R(A)
276+
Base.convert(R::Type{VectorOfSimilarVectors}, A::AbstractVector{<:AbstractVector{T}}) where {T} = R(A)
277+
end

src/util.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,8 @@ end
2626
end
2727

2828
@inline split_tuple(x, ::Val{N}) where {N} = _split_tuple_impl((), x, Val{N}())
29+
30+
31+
_convert_elype(::Type{T}, A::AbstractArray{T}) where {T} = A
32+
33+
_convert_elype(::Type{T}, A::AbstractArray{U}) where {T,U} = broadcast(x -> convert(T, x), A)

0 commit comments

Comments
 (0)