@@ -27,25 +27,35 @@ function DiagonalArray(::UndefInitializer, unstored::Unstored)
2727 return DiagonalArray (Vector {eltype(unstored)} (undef, minimum (size (unstored))), unstored)
2828end
2929
30+ function construct_from_length (vect:: Type{<:AbstractVector} , len:: Integer )
31+ if applicable (vect, len)
32+ return vect (len)
33+ elseif applicable (vect, (Base. OneTo (len),))
34+ return vect ((Base. OneTo (len),))
35+ else
36+ error (lazy " Can't construct $(vect) from length." )
37+ end
38+ end
39+
3040# This helps to support diagonals where the elements are known
3141# from the types, for example diagonals that are `Zeros` and `Ones`.
3242function DiagonalArray {T,N,D,U} (
3343 ax:: Tuple{AbstractUnitRange{<:Integer},Vararg{AbstractUnitRange{<:Integer}}}
3444) where {T,N,D<: AbstractVector{T} ,U<: AbstractArray{T,N} }
35- return DiagonalArray (D ((Base . OneTo ( minimum (length, ax)), )), Unstored (U (ax)))
45+ return DiagonalArray (construct_from_length (D, minimum (length, ax)), Unstored (U (ax)))
3646end
3747function DiagonalArray {T,N,D,U} (
3848 ax1:: AbstractUnitRange{<:Integer} , ax_rest:: Vararg{AbstractUnitRange{<:Integer}}
3949) where {T,N,D<: AbstractVector{T} ,U<: AbstractArray{T,N} }
4050 return DiagonalArray {T,N,D,U} ((ax1, ax_rest... ))
4151end
4252function DiagonalArray {T,N,D,U} (
43- sz:: Tuple{Integer,Vararg{AbstractUnitRange{<: Integer} }}
53+ sz:: Tuple{Integer,Vararg{Integer}}
4454) where {T,N,D<: AbstractVector{T} ,U<: AbstractArray{T,N} }
4555 return DiagonalArray {T,N,D,U} (Base. OneTo .(sz))
4656end
4757function DiagonalArray {T,N,D,U} (
48- sz1:: Integer , sz_rest:: Vararg{ Integer}
58+ sz1:: Integer , sz_rest:: Integer...
4959) where {T,N,D<: AbstractVector{T} ,U<: AbstractArray{T,N} }
5060 return DiagonalArray {T,N,D,U} ((sz1, sz_rest... ))
5161end
@@ -64,12 +74,12 @@ function DiagonalArray{T,N,D}(
6474 return DiagonalArray {T,N,D,Zeros{T,N}} (ax1, ax_rest... )
6575end
6676function DiagonalArray {T,N,D} (
67- sz:: Tuple{Integer,Vararg{AbstractUnitRange{<: Integer} }}
77+ sz:: Tuple{Integer,Vararg{Integer}}
6878) where {T,N,D<: AbstractVector{T} }
6979 return DiagonalArray {T,N,D,Zeros{T,N}} (sz)
7080end
7181function DiagonalArray {T,N,D} (
72- sz1:: Integer , sz_rest:: Vararg{ Integer}
82+ sz1:: Integer , sz_rest:: Integer...
7383) where {T,N,D<: AbstractVector{T} }
7484 return DiagonalArray {T,N,D,Zeros{T,N}} (sz1, sz_rest... )
7585end
0 commit comments