Skip to content

Commit 684280d

Browse files
committed
specialize real/imag/conj for real arrays
1 parent ec06e4c commit 684280d

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

src/fillbroadcast.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,12 @@ function broadcast_preserving_0d(f, As...)
145145
end
146146
for f in (:real, :imag, :conj)
147147
@eval ($f)(A::AbstractFill) = broadcast_preserving_0d($f, A)
148+
@eval ($f)(A::AbstractZeros) = A
149+
end
150+
for T in (:AbstractOnes, :(AbstractFill{<:Real}))
151+
@eval real(A::$T) = A
152+
@eval imag(A::$T) = Zeros{eltype(A)}(axes(A))
153+
@eval conj(A::$T) = A
148154
end
149155

150156
### Binary broadcasting

test/runtests.jl

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,9 +1199,25 @@ end
11991199
end
12001200

12011201
@testset "preserve 0d" begin
1202-
@test real(Fill(4 + 5im)) == real(fill(4 + 5im))
1203-
@test imag(Fill(4 + 5im)) == imag(fill(4 + 5im))
1204-
@test conj(Fill(4 + 5im)) == conj(fill(4 + 5im))
1202+
for f in (real, imag, conj),
1203+
(F, A) in ((Fill(4 + 5im), fill(4 + 5im)),
1204+
(Zeros{ComplexF64}(), zeros(ComplexF64)),
1205+
(Zeros(), zeros()),
1206+
(Ones(), ones()),
1207+
(Ones{ComplexF64}(), ones(ComplexF64)),
1208+
)
1209+
x = f(F)
1210+
y = f(A)
1211+
@test x == y
1212+
@test x isa FillArrays.AbstractFill
1213+
if F[] isa Real
1214+
if f === imag
1215+
@test x isa Zeros
1216+
else
1217+
@test x isa typeof(F)
1218+
end
1219+
end
1220+
end
12051221
end
12061222
end
12071223

0 commit comments

Comments
 (0)