diff --git a/Project.toml b/Project.toml index 1935c38a..9b9fde7d 100644 --- a/Project.toml +++ b/Project.toml @@ -2,6 +2,7 @@ name = "BlockArrays" uuid = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" version = "1.7.0" + [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" BandedMatrices = "aae01518-5342-5314-be14-df237901396f" diff --git a/src/blockbroadcast.jl b/src/blockbroadcast.jl index 0c645817..d386b313 100644 --- a/src/blockbroadcast.jl +++ b/src/blockbroadcast.jl @@ -276,3 +276,13 @@ for op in (:*, :\) broadcasted(::AbstractBlockStyle, ::typeof($op), a::AbstractArray{T}, b::Ones{V}) where {T,V} = LinearAlgebra.copy_oftype(a, Base.promote_op(*, T, V)) end end + + + +### +# Ranges +### + +broadcasted(::DefaultArrayStyle{1}, ::typeof(+), r::AbstractBlockedUnitRange, x::Integer) = _BlockedUnitRange(first(r) + x, blocklasts(r) .+ x) +broadcasted(::DefaultArrayStyle{1}, ::typeof(+), x::Integer, r::AbstractBlockedUnitRange) = _BlockedUnitRange(x + first(r), x .+ blocklasts(r)) +broadcasted(::DefaultArrayStyle{1}, ::typeof(-), r::AbstractBlockedUnitRange, x::Integer) = _BlockedUnitRange(first(r) - x, blocklasts(r) .- x) diff --git a/test/test_blockbroadcast.jl b/test/test_blockbroadcast.jl index 240eaed4..5ed43a4f 100644 --- a/test/test_blockbroadcast.jl +++ b/test/test_blockbroadcast.jl @@ -193,6 +193,24 @@ using StaticArrays @test blockisequal(axes(A .* Ones(axes(A))), axes(Ones(axes(A)) .* A), axes(A .* ones(6))) end + @testset "Blocked unit range broadcast" begin + r = blockedrange([2,3]) + @test r .+ 3 == blockedrange(4, [2,3]) + @test blocklengths(r .+ 3) == [2,3] + @test 3 .+ r == blockedrange(4, [2,3]) + @test blocklengths(3 .+ r .+ 3) == [2,3] + @test r .- 3 == blockedrange(-2, [2,3]) + @test blocklengths(r .- 3) == [2,3] + + r = blockedrange(2, [2,3]) + @test r .+ 3 == blockedrange(5, [2,3]) + @test blocklengths(r .+ 3) == [2,3] + @test 3 .+ r == blockedrange(5, [2,3]) + @test blocklengths(3 .+ r .+ 3) == [2,3] + @test r .- 3 == blockedrange(-1, [2,3]) + @test blocklengths(r .- 3) == [2,3] + end + @testset "type inference" begin u = BlockArray(randn(5), [2,3]); A = zeros(size(u))