Skip to content

Commit d59da43

Browse files
Specialize on operations
1 parent 0523c23 commit d59da43

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "NullBroadcasts"
22
uuid = "0d71be07-595a-4f89-9529-4065a4ab43a6"
33
authors = ["CliMA Contributors <[email protected]>"]
4-
version = "0.1.0"
4+
version = "0.1.1"
55

66
[compat]
77
Aqua = "0.8"

src/NullBroadcasts.jl

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,21 @@ broadcasted_sum(args) =
4646
Base.broadcasted(::NullBroadcasted, ::typeof(+), args...) =
4747
broadcasted_sum(filter(arg -> !(arg isa NullBroadcasted), args))
4848

49+
#! format: off
50+
4951
Base.broadcasted(op::typeof(-), ::NullBroadcasted, arg) = Base.broadcasted(op, arg)
50-
Base.broadcasted(op::typeof(-), arg, ::NullBroadcasted) =
51-
Base.broadcasted(Base.identity, arg)
5252
Base.broadcasted(op::typeof(-), a::NullBroadcasted) = NullBroadcasted()
53-
Base.broadcasted(op::typeof(-), a::NullBroadcasted, ::NullBroadcasted) =
54-
Base.broadcasted(op, a)
53+
Base.broadcasted(op::typeof(-), a::NullBroadcasted, ::NullBroadcasted) = Base.broadcasted(op, a)
54+
# Specialize on identity cases:
55+
Base.broadcasted(::typeof(-), a, ::NullBroadcasted) = a
56+
57+
Base.broadcasted(op::typeof(+), ::NullBroadcasted, a, args...) = Base.broadcasted(op, a, args...)
58+
Base.broadcasted(op::typeof(+), arg, ::NullBroadcasted, a, args...) = Base.broadcasted(op, arg, a, args...)
59+
Base.broadcasted(op::typeof(+), a::NullBroadcasted, ::NullBroadcasted, args...) = Base.broadcasted(op, a, args...)
5560

56-
Base.broadcasted(op::typeof(+), ::NullBroadcasted, args...) = Base.broadcasted(op, args...)
57-
Base.broadcasted(op::typeof(+), arg, ::NullBroadcasted, args...) =
58-
Base.broadcasted(op, arg, args...)
59-
Base.broadcasted(op::typeof(+), a::NullBroadcasted, ::NullBroadcasted, args...) =
60-
Base.broadcasted(op, a, args...)
61+
# Specialize on identity cases:
62+
Base.broadcasted(::typeof(+), ::NullBroadcasted, a) = a
63+
Base.broadcasted(::typeof(+), a, ::NullBroadcasted) = a
6164

6265
Base.broadcasted(op::typeof(*), ::NullBroadcasted, args...) = NullBroadcasted()
6366
Base.broadcasted(op::typeof(*), arg, ::NullBroadcasted) = NullBroadcasted()
@@ -68,6 +71,8 @@ Base.broadcasted(op::typeof(/), ::NullBroadcasted, ::NullBroadcasted) = NullBroa
6871

6972
Base.broadcasted(op::typeof(identity), a::NullBroadcasted) = a
7073

74+
#! format: on
75+
7176
function skip_materialize(dest, bc::Base.Broadcast.Broadcasted)
7277
if typeof(bc.f) <: typeof(+) || typeof(bc.f) <: typeof(-)
7378
if length(bc.args) == 2 &&

test/runtests.jl

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,16 @@ import Base.Broadcast: instantiate, materialize, Broadcasted, DefaultArrayStyle
1212
@testset "NullBroadcasted" begin
1313
x = [1]
1414
a = NullBroadcasted()
15-
@test typeof(lazy.(x .+ a)) <: Broadcasted{
15+
@test typeof(lazy.(x .* 1 .+ a)) <: Broadcasted{
1616
DefaultArrayStyle{1},
1717
Tuple{Base.OneTo{Int64}},
18-
typeof(+),
19-
Tuple{Vector{Int64}},
18+
typeof(*),
19+
Tuple{Vector{Int64}, Int64}
2020
}
21-
@test typeof(lazy.(a .+ x)) <: Broadcasted{
21+
@test typeof(lazy.(a .+ x .* 1)) <: Broadcasted{
2222
DefaultArrayStyle{1},
2323
Tuple{Base.OneTo{Int64}},
24-
typeof(+),
25-
Tuple{Vector{Int64}},
24+
typeof(*), Tuple{Vector{Int64}, Int64}
2625
}
2726
@test lazy.(a .* x) isa NullBroadcasted
2827
@test lazy.(a ./ x) isa NullBroadcasted

0 commit comments

Comments
 (0)