Skip to content

Commit 3cd7dc5

Browse files
committed
Add known_length(::Type{<:SubArray})
1 parent dd50a94 commit 3cd7dc5

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/ArrayInterface.jl

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,19 @@ Otherwise, return `nothing`.
3535
known_length(x) = known_length(typeof(x))
3636
known_length(::Type{<:NTuple{N,<:Any}}) where {N} = N
3737
known_length(::Type{<:NamedTuple{L}}) where {L} = length(L)
38-
known_length(::Type{T}) where {T<:Base.Slice} = known_length(parent_type(T))
39-
known_length(::Type{T}) where {T} = nothing
38+
known_length(::Type{<:Number}) = 1
39+
function known_length(::Type{T}) where {T}
40+
if parent_type(T) <: T
41+
return nothing
42+
else
43+
return known_length(parent_type(T))
44+
end
45+
end
46+
@inline function known_length(::Type{<:SubArray{T,N,P,I}}) where {T,N,P,I}
47+
return _known_length(ntuple(i -> known_length(I.parameters[i]), Val(N)))
48+
end
49+
_known_length(x::Tuple{Vararg{<:Union{Int,Nothing}}}) = nothing
50+
_known_length(x::Tuple{Vararg{Int}}) = prod(x)
4051

4152
"""
4253
can_change_size(::Type{T}) -> Bool

test/runtests.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ end
205205
@test ArrayInterface.known_length((1,)) == 1
206206
@test ArrayInterface.known_length((a=1,b=2)) == 2
207207
@test ArrayInterface.known_length([]) == nothing
208+
209+
x = view(SArray{Tuple{3,3,3}}(ones(3,3,3)), :, SOneTo(2), 2)
210+
@test @inferred(ArrayInterface.known_length(x)) == 6
211+
@test @inferred(ArrayInterface.known_length(x')) == 6
208212
end
209213

210214
@testset "indices" begin

0 commit comments

Comments
 (0)