From a62318ed5f094054103ee8d69151c82c6d7aff5f Mon Sep 17 00:00:00 2001 From: jishnub Date: Fri, 7 May 2021 14:05:21 +0400 Subject: [PATCH 1/7] views of SArray use indexing --- src/SArray.jl | 3 +++ test/SArray.jl | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/SArray.jl b/src/SArray.jl index 5e175079..8ea5df0a 100644 --- a/src/SArray.jl +++ b/src/SArray.jl @@ -283,3 +283,6 @@ end function promote_rule(::Type{<:SArray{S,T,N,L}}, ::Type{<:SArray{S,U,N,L}}) where {S,T,U,N,L} SArray{S,promote_type(T,U),N,L} end + +# SArrays may avoid the SubArray wrapper and consequently an additional level of indirection +Base.view(S::SArray, I...) = getindex(S, I...) diff --git a/test/SArray.jl b/test/SArray.jl index f2d19fc9..a5ea42cd 100644 --- a/test/SArray.jl +++ b/test/SArray.jl @@ -139,6 +139,9 @@ @test_throws Exception m[1] = 1 @test Base.dataids(m) === () + + @test (@view m[:, :]) == m + @test all(map(isequal, (@view m[1, 1]), m[1, 1])) end @testset "promotion" begin From fb21bba3bc0aba38b23431531f299d50409b970d Mon Sep 17 00:00:00 2001 From: jishnub Date: Fri, 7 May 2021 14:57:20 +0400 Subject: [PATCH 2/7] move fn defn to abstractarray.jl --- src/SArray.jl | 3 --- src/abstractarray.jl | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SArray.jl b/src/SArray.jl index 8ea5df0a..5e175079 100644 --- a/src/SArray.jl +++ b/src/SArray.jl @@ -283,6 +283,3 @@ end function promote_rule(::Type{<:SArray{S,T,N,L}}, ::Type{<:SArray{S,U,N,L}}) where {S,T,U,N,L} SArray{S,promote_type(T,U),N,L} end - -# SArrays may avoid the SubArray wrapper and consequently an additional level of indirection -Base.view(S::SArray, I...) = getindex(S, I...) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index 40221f8e..749c759a 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -295,3 +295,6 @@ if VERSION >= v"1.6.0-DEV.1334" return similar_type(typeof(a), Size(newlen))(Base.rest(Tuple(a), i + 1)) end end + +# SArrays may avoid the SubArray wrapper and consequently an additional level of indirection +Base.view(S::SArray, I...) = getindex(S, I...) From c7d3c3c17b51945785d99473e82c43d0922fbb7e Mon Sep 17 00:00:00 2001 From: jishnub Date: Fri, 7 May 2021 15:36:03 +0400 Subject: [PATCH 3/7] wrap elements in Scalar --- src/abstractarray.jl | 6 +++++- test/SArray.jl | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index 749c759a..3924e050 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -297,4 +297,8 @@ if VERSION >= v"1.6.0-DEV.1334" end # SArrays may avoid the SubArray wrapper and consequently an additional level of indirection -Base.view(S::SArray, I...) = getindex(S, I...) +# The output may use the broadcasting machinery defined for StaticArrays (see issue #892) +# wrap elements in Scalar to be consistent with 0D views +_maybewrapscalar(S::SArray{<:Any,T}, r::T) where {T} = Scalar{T}(r) +_maybewrapscalar(S, r) = r +Base.view(S::SArray, I...) = _maybewrapscalar(S, getindex(S, I...)) diff --git a/test/SArray.jl b/test/SArray.jl index a5ea42cd..bb2aacc4 100644 --- a/test/SArray.jl +++ b/test/SArray.jl @@ -140,8 +140,9 @@ @test Base.dataids(m) === () - @test (@view m[:, :]) == m - @test all(map(isequal, (@view m[1, 1]), m[1, 1])) + @test (@view m[:, :]) === m + @test (@view m[:, 1]) === @SArray [11, 12] + @test (@view m[1, 1])[] === m[1, 1] end @testset "promotion" begin From 665dd51dbdd602a8b212faa116e943c94ca54d51 Mon Sep 17 00:00:00 2001 From: jishnub Date: Fri, 7 May 2021 15:43:23 +0400 Subject: [PATCH 4/7] restrict index types --- src/abstractarray.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index 3924e050..c754b168 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -301,4 +301,4 @@ end # wrap elements in Scalar to be consistent with 0D views _maybewrapscalar(S::SArray{<:Any,T}, r::T) where {T} = Scalar{T}(r) _maybewrapscalar(S, r) = r -Base.view(S::SArray, I...) = _maybewrapscalar(S, getindex(S, I...)) +Base.view(S::SArray, I::Union{Colon, Integer, SOneTo}...) = _maybewrapscalar(S, getindex(S, I...)) From 6f9536bba225a3650664bafebd33d8257c1f18df Mon Sep 17 00:00:00 2001 From: jishnub Date: Fri, 7 May 2021 15:52:41 +0400 Subject: [PATCH 5/7] allow indexing with SArrays --- src/abstractarray.jl | 2 +- test/SArray.jl | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index c754b168..2a3de17d 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -301,4 +301,4 @@ end # wrap elements in Scalar to be consistent with 0D views _maybewrapscalar(S::SArray{<:Any,T}, r::T) where {T} = Scalar{T}(r) _maybewrapscalar(S, r) = r -Base.view(S::SArray, I::Union{Colon, Integer, SOneTo}...) = _maybewrapscalar(S, getindex(S, I...)) +Base.view(S::SArray, I::Union{Colon, Integer, SOneTo, StaticArray{<:Tuple, Int}}...) = _maybewrapscalar(S, getindex(S, I...)) diff --git a/test/SArray.jl b/test/SArray.jl index bb2aacc4..21726470 100644 --- a/test/SArray.jl +++ b/test/SArray.jl @@ -142,6 +142,9 @@ @test (@view m[:, :]) === m @test (@view m[:, 1]) === @SArray [11, 12] + @test (@view m[SVector{2,Int}(1,2), 1]) === @SArray [11, 12] + @test (@view m[SMatrix{2,2,Int}(1,2,3,4)]) === m + @test (@view m[SOneTo(2), 1]) === @SArray [11, 12] @test (@view m[1, 1])[] === m[1, 1] end From 83c9b27665e679cf7c4d1e97ed431c12e61b5546 Mon Sep 17 00:00:00 2001 From: jishnub Date: Wed, 12 May 2021 14:12:55 +0400 Subject: [PATCH 6/7] views for CartesianIndex, inferred in tests --- src/abstractarray.jl | 5 ++++- test/SArray.jl | 15 +++++++++------ test/SVector.jl | 8 ++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/abstractarray.jl b/src/abstractarray.jl index 2a3de17d..ee890a6e 100644 --- a/src/abstractarray.jl +++ b/src/abstractarray.jl @@ -301,4 +301,7 @@ end # wrap elements in Scalar to be consistent with 0D views _maybewrapscalar(S::SArray{<:Any,T}, r::T) where {T} = Scalar{T}(r) _maybewrapscalar(S, r) = r -Base.view(S::SArray, I::Union{Colon, Integer, SOneTo, StaticArray{<:Tuple, Int}}...) = _maybewrapscalar(S, getindex(S, I...)) +function Base.view(S::SArray, I::Union{Colon, Integer, SOneTo, StaticArray{<:Tuple, Int}, CartesianIndex}...) + V = getindex(S, I...) + _maybewrapscalar(S, V) +end diff --git a/test/SArray.jl b/test/SArray.jl index 21726470..641a5786 100644 --- a/test/SArray.jl +++ b/test/SArray.jl @@ -140,12 +140,15 @@ @test Base.dataids(m) === () - @test (@view m[:, :]) === m - @test (@view m[:, 1]) === @SArray [11, 12] - @test (@view m[SVector{2,Int}(1,2), 1]) === @SArray [11, 12] - @test (@view m[SMatrix{2,2,Int}(1,2,3,4)]) === m - @test (@view m[SOneTo(2), 1]) === @SArray [11, 12] - @test (@view m[1, 1])[] === m[1, 1] + @test (@inferred view(m, :, :)) === m + @test (@inferred view(m, :, 1)) === @SArray [11, 12] + @test (@inferred view(m, SVector{2,Int}(1,2), 1)) === @SArray [11, 12] + @test (@inferred view(m, SMatrix{2,2,Int}(1,2,3,4))) === m + @test (@inferred view(m, SOneTo(2), 1)) === @SArray [11, 12] + @test (@inferred view(m, 1, 1)) === Scalar(m[1, 1]) + @test (@inferred view(m, CartesianIndex(1, 1))) === Scalar(m[1, 1]) + @test (@inferred view(m, CartesianIndex(1, 1, 1))) === Scalar(m[1, 1]) + @test (@inferred view(m, 1, 1, CartesianIndex(1))) === Scalar(m[1, 1]) end @testset "promotion" begin diff --git a/test/SVector.jl b/test/SVector.jl index 33a04a53..5e9310d7 100644 --- a/test/SVector.jl +++ b/test/SVector.jl @@ -82,6 +82,14 @@ @test length(v) === 3 @test_throws Exception v[1] = 1 + + @test (@inferred view(v, :)) === v + @test (@inferred view(v, 1)) === Scalar(v[1]) + @test (@inferred view(v, CartesianIndex(1))) === Scalar(v[1]) + @test (@inferred view(v, CartesianIndex(1,1))) === Scalar(v[1]) + @test (@inferred view(v, 1, CartesianIndex(1))) === Scalar(v[1]) + @test (@inferred view(v, SVector{2,Int}(1,2))) === @SArray [11, 12] + @test (@inferred view(v, SOneTo(2))) === @SArray [11, 12] end @testset "CartesianIndex" begin From d16e0b0c314c6cb43500f4b5f2320de98c8ac7de Mon Sep 17 00:00:00 2001 From: jishnub Date: Wed, 12 May 2021 19:33:15 +0400 Subject: [PATCH 7/7] bump version to v1.2.0 --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index da2ed6be..0575ed08 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "StaticArrays" uuid = "90137ffa-7385-5640-81b9-e52037218182" -version = "1.1.3" +version = "1.2.0" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"