Skip to content

Commit 28512e7

Browse files
committed
Change ctor of ArrayOfSimilarArrays to also require N
1 parent ece937d commit 28512e7

File tree

3 files changed

+25
-10
lines changed

3 files changed

+25
-10
lines changed

src/array_of_similar_arrays.jl

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

60-
function ArrayOfSimilarArrays{T,M}(parent::AbstractArray{U,L}) where {T,M,L,U}
60+
function ArrayOfSimilarArrays{T,M,N}(parent::AbstractArray{U,L}) where {T,M,N,L,U}
6161
size_inner, size_outer = split_tuple(size(parent), Val{M}())
62-
N = length(size_outer)
62+
require_ndims(parent, _add_vals(Val{M}(), Val{N}()))
6363
conv_parent = _convert_elype(T, parent)
6464
P = typeof(conv_parent)
6565
new{T,M,N,L,P}(conv_parent)
@@ -69,7 +69,7 @@ end
6969
export ArrayOfSimilarArrays
7070

7171
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)...))
72+
B = ArrayOfSimilarArrays{T,M,N}(Array{T}(_size_inner(A)..., size(A)...))
7373
copy!(B, A)
7474
end
7575

@@ -81,7 +81,7 @@ ArrayOfSimilarArrays(A::AbstractArray{<:AbstractArray{T,M},N}) where {T,M,N} =
8181

8282

8383
@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)
84+
Base.convert(R::Type{ArrayOfSimilarArrays{T,M,N}}, parent::AbstractArray{U,L}) where {T,M,N,L,U} = R(parent)
8585

8686
Base.convert(R::Type{ArrayOfSimilarArrays{T,M,N}}, A::AbstractArray{<:AbstractArray{U,M},N}) where {T,M,N,U} = R(A)
8787
Base.convert(R::Type{ArrayOfSimilarArrays{T}}, A::AbstractArray{<:AbstractArray{U,M},N}) where {T,M,N,U} = R(A)
@@ -143,7 +143,7 @@ end
143143
function Base.similar(A::ArrayOfSimilarArrays{T,M,N}, ::Type{<:AbstractArray{U}}, dims::Dims) where {T,M,N,U}
144144
data = A.data
145145
size_inner, size_outer = split_tuple(size(data), Val{M}())
146-
ArrayOfSimilarArrays{T,M}(similar(data, U, size_inner..., dims...))
146+
ArrayOfSimilarArrays{T,M,N}(similar(data, U, size_inner..., dims...))
147147
end
148148

149149

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

176176

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

180180

181181

@@ -187,7 +187,7 @@ const VectorOfSimilarArrays{
187187
export VectorOfSimilarArrays
188188

189189
VectorOfSimilarArrays{T}(parent::AbstractArray{U,L}) where {T,U,L} =
190-
ArrayOfSimilarArrays{T,length(Base.front(size(parent)))}(parent)
190+
ArrayOfSimilarArrays{T,length(Base.front(size(parent))),1}(parent)
191191

192192
VectorOfSimilarArrays{T}(A::AbstractVector{<:AbstractArray{U,M}}) where {T,M,U} =
193193
VectorOfSimilarArrays{T,M}(A)
@@ -237,6 +237,9 @@ const ArrayOfSimilarVectors{
237237

238238
export ArrayOfSimilarVectors
239239

240+
ArrayOfSimilarVectors{T}(parent::AbstractArray{U,L}) where {T,U,L} =
241+
ArrayOfSimilarArrays{T,1,length(Base.front(size(parent)))}(parent)
242+
240243
ArrayOfSimilarVectors{T}(A::AbstractArray{<:AbstractVector{U},N}) where {T,N,U} =
241244
ArrayOfSimilarVectors{T,N}(A)
242245

@@ -245,6 +248,7 @@ ArrayOfSimilarVectors(A::AbstractArray{<:AbstractVector{T},N}) where {T,N} =
245248

246249

247250
@static if VERSION < v"0.7.0-DEV.3138"
251+
Base.convert(R::Type{ArrayOfSimilarVectors{T}}, parent::AbstractArray{U,L}) where {T,U,L} = R(parent)
248252
Base.convert(R::Type{ArrayOfSimilarVectors{T}}, A::AbstractArray{<:AbstractVector{U},N}) where {T,N,U} = R(A)
249253
Base.convert(R::Type{ArrayOfSimilarVectors}, A::AbstractArray{<:AbstractVector{T},N}) where {T,N} = R(A)
250254
end
@@ -258,7 +262,7 @@ const VectorOfSimilarVectors{
258262
export VectorOfSimilarVectors
259263

260264
VectorOfSimilarVectors{T}(parent::AbstractArray{U,2}) where {T,U} =
261-
ArrayOfSimilarArrays{T,1}(parent)
265+
ArrayOfSimilarArrays{T,1,1}(parent)
262266

263267
VectorOfSimilarVectors(parent::AbstractArray{T,2}) where {T} =
264268
VectorOfSimilarVectors{T}(parent)

src/util.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,14 @@ end
3131
_convert_elype(::Type{T}, A::AbstractArray{T}) where {T} = A
3232

3333
_convert_elype(::Type{T}, A::AbstractArray{U}) where {T,U} = broadcast(x -> convert(T, x), A)
34+
35+
36+
Base.@pure _add_vals(Val_M::Val{M}, Val_N::Val{N}) where {M,N} =
37+
Val{length((ntuple(identity, Val_M)..., ntuple(identity, Val_N)...))}()
38+
39+
40+
Base.@pure require_ndims(A::AbstractArray{T,N}, Val_N::Val{N}) where {T,N} =
41+
nothing
42+
43+
Base.@pure require_ndims(A::AbstractArray{T,M}, Val_N::Val{N}) where {T,M,N} =
44+
throw(ArgumentError("Require an array with $N dimensions"))

test/array_of_similar_arrays.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ using Compat.Random
7171

7272

7373
@testset "construct/convert from flat array" begin
74-
test_from_flat(ArrayOfSimilarArrays{Float64,2}, ArrayOfSimilarArrays{Float64,2,3,5,Array{Float64,5}}, Val(5))
74+
test_from_flat(ArrayOfSimilarArrays{Float64,2,3}, ArrayOfSimilarArrays{Float64,2,3,5,Array{Float64,5}}, Val(5))
7575
test_from_flat(ArrayOfSimilarVectors{Float64}, ArrayOfSimilarVectors{Float64,2,3,Array{Float64,3}}, Val(3))
7676
test_from_flat(VectorOfSimilarArrays{Float64}, VectorOfSimilarArrays{Float64,2,3,Array{Float64,3}}, Val(3))
7777
test_from_flat(VectorOfSimilarVectors{Float64}, VectorOfSimilarVectors{Float64,Array{Float64,2}}, Val(2))
7878
test_from_flat(VectorOfSimilarVectors, VectorOfSimilarVectors{Float64,Array{Float64,2}}, Val(2))
7979

80-
test_from_flat(ArrayOfSimilarArrays{Float32,2}, ArrayOfSimilarArrays{Float32,2,3,5,Array{Float32,5}}, Val(5))
80+
test_from_flat(ArrayOfSimilarArrays{Float32,2,3}, ArrayOfSimilarArrays{Float32,2,3,5,Array{Float32,5}}, Val(5))
8181
test_from_flat(ArrayOfSimilarVectors{Float32}, ArrayOfSimilarVectors{Float32,2,3,Array{Float32,3}}, Val(3))
8282
test_from_flat(VectorOfSimilarArrays{Float32}, VectorOfSimilarArrays{Float32,2,3,Array{Float32,3}}, Val(3))
8383
test_from_flat(VectorOfSimilarVectors{Float32}, VectorOfSimilarVectors{Float32,Array{Float32,2}}, Val(2))

0 commit comments

Comments
 (0)