From 26a9db289f34027ba764ffe9e0efe77024625ed0 Mon Sep 17 00:00:00 2001 From: Chris Foster Date: Mon, 24 Apr 2017 22:34:34 +1000 Subject: [PATCH] Define `size` more explicitly, helping the compiler --- src/abstractarray.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index d4a3a09f..8d2b5249 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -1,11 +1,13 @@ length(a::SA) where {SA <: StaticArray} = prod(Size(SA)) length(a::Type{SA}) where {SA <: StaticArray} = prod(Size(SA)) -size(::StaticArray{S}) where {S} = get(Size(S)) -@pure size(::Type{<:StaticArray{S}}) where {S} = get(Size(S)) - -size(::SA, d::Int) where {SA <: StaticArray} = Size(SA)[d] -@pure size(::Type{SA}, d::Int) where {SA <: StaticArray} = Size(SA)[d] +@pure size(::Type{<:StaticArray{S}}) where S = tuple(S.parameters...) +@inline function size(t::Type{<:StaticArray}, d::Int) + S = size(t) + d > length(S) ? 1 : S[d] +end +@inline size(a::StaticArray) = size(typeof(a)) +@inline size(a::StaticArray, d::Int) = size(typeof(a), d) # This seems to confuse Julia a bit in certain circumstances (specifically for trailing 1's) @inline function Base.isassigned(a::StaticArray, i::Int...)