Skip to content

Commit 0ae0262

Browse files
committed
Restore a few methods for &, |, and xor over BitArrays as broadcast specializations.
1 parent d447a60 commit 0ae0262

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

base/bitarray.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,6 +1237,32 @@ end
12371237
(/)(B::BitArray, x::Number) = (/)(Array(B), x)
12381238
(/)(x::Number, B::BitArray) = (/)(x, Array(B))
12391239

1240+
# broadcast specializations for &, |, and xor/⊻
1241+
broadcast(::typeof(&), B::BitArray, x::Bool) = x ? copy(B) : falses(size(B))
1242+
broadcast(::typeof(&), x::Bool, B::BitArray) = broadcast(&, B, x)
1243+
broadcast(::typeof(|), B::BitArray, x::Bool) = x ? trues(size(B)) : copy(B)
1244+
broadcast(::typeof(|), x::Bool, B::BitArray) = broadcast(|, B, x)
1245+
broadcast(::typeof(xor), B::BitArray, x::Bool) = x ? ~B : copy(B)
1246+
broadcast(::typeof(xor), x::Bool, B::BitArray) = broadcast(xor, B, x)
1247+
for f in (:&, :|, :xor)
1248+
@eval begin
1249+
function broadcast(::typeof($f), A::BitArray, B::BitArray)
1250+
F = BitArray(promote_shape(size(A),size(B))...)
1251+
Fc = F.chunks
1252+
Ac = A.chunks
1253+
Bc = B.chunks
1254+
(isempty(Ac) || isempty(Bc)) && return F
1255+
for i = 1:length(Fc)
1256+
Fc[i] = ($f)(Ac[i], Bc[i])
1257+
end
1258+
Fc[end] &= _msk_end(F)
1259+
return F
1260+
end
1261+
broadcast(::typeof($f), A::DenseArray{Bool}, B::BitArray) = broadcast($f, BitArray(A), B)
1262+
broadcast(::typeof($f), B::BitArray, A::DenseArray{Bool}) = broadcast($f, B, BitArray(A))
1263+
end
1264+
end
1265+
12401266

12411267
## promotion to complex ##
12421268

0 commit comments

Comments
 (0)