From 1f1ef02cec81320ffde2e27b0eaf3d28d8fd05a7 Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Thu, 17 Jul 2025 13:55:59 -0400 Subject: [PATCH 1/2] Specialize indexing with a `AbstractFill{Bool}` index --- Project.toml | 2 +- src/trues.jl | 9 +++++++++ test/runtests.jl | 21 +++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index d0d3e609..6a51fba7 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "FillArrays" uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" -version = "1.14.0" +version = "1.15.0" [deps] LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" diff --git a/src/trues.jl b/src/trues.jl index 3c3f2070..8baab8e0 100644 --- a/src/trues.jl +++ b/src/trues.jl @@ -34,3 +34,12 @@ function Base.to_indices(A::AbstractArray{T,N}, inds, I::Tuple{Trues{N}}) where @boundscheck axes(A) == axes(I[1]) || Base.throw_boundserror(A, I[1]) (vec(LinearIndices(A)),) end + +Base.@propagate_inbounds function getindex(v::AbstractArray, f::AbstractFill{Bool}) + @boundscheck checkbounds(v, f) + v[range(begin, length = getindex_value(f) ? length(v) : 0)] +end +Base.@propagate_inbounds function getindex(v::AbstractFill, f::AbstractFill{Bool}) + @boundscheck checkbounds(v, f) + fillsimilar(v, getindex_value(f) ? length(v) : 0) +end \ No newline at end of file diff --git a/test/runtests.jl b/test/runtests.jl index 32cd2ed7..a4b64f1f 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -342,6 +342,27 @@ end @test StepRangeLen(z) ≡ convert(StepRangeLen, z) ≡ convert(StepRangeLen{Int}, z) ≡ convert(typeof(s), z) ≡ convert(AbstractRange, z) ≡ s end end + @testset "indexing with a Bool AbstractFill" begin + @testset for v in ([1, 2, 3], 1:3, rand(Int,3,1), Base.IdentityUnitRange(1:3)) + n = length(v) + @test v[Trues(n)] == v[Fill(true, n)] == v[trues(n)] == vec(v) + @test v[Falses(n)] == v[Fill(false, n)] == v[falses(n)] == Int[] + @test v[Trues(n,1)] == v[Fill(true, n,1)] == v[trues(n,1)] == vec(v) + @test v[Falses(n,1)] == v[Fill(false, n,1)] == v[falses(n,1)] == Int[] + end + + for f in (Fill(3, 4), Fill(3, 4, 1)) + n = length(f) + @test f[Trues(n)] === f[Fill(true, n)] === vec(f) + @test f[Falses(n)] === f[Fill(false, n)] === Fill(3,0) + @test f[Trues(n)] == f[trues(n)] + @test f[Falses(n)] == f[falses(n)] + @test f[Trues(n,1)] === f[Fill(true, n,1)] === vec(f) + @test f[Falses(n,1)] === f[Fill(false, n,1)] === Fill(3,0) + @test f[Trues(n,1)] == f[trues(n,1)] + @test f[Falses(n,1)] == f[falses(n,1)] + end + end end @testset "RectDiagonal" begin From 07a1b62f5cc84aad8cf4c297ce88d2114c243841 Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Thu, 17 Jul 2025 15:03:07 -0400 Subject: [PATCH 2/2] Trailing Newline --- src/trues.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trues.jl b/src/trues.jl index 8baab8e0..39088af8 100644 --- a/src/trues.jl +++ b/src/trues.jl @@ -42,4 +42,4 @@ end Base.@propagate_inbounds function getindex(v::AbstractFill, f::AbstractFill{Bool}) @boundscheck checkbounds(v, f) fillsimilar(v, getindex_value(f) ? length(v) : 0) -end \ No newline at end of file +end