From 0ae0262324034dfeebb86b733df48462a716e2f1 Mon Sep 17 00:00:00 2001 From: Sacha Verweij Date: Fri, 30 Dec 2016 17:42:01 -0800 Subject: [PATCH] Restore a few methods for &, |, and xor over BitArrays as broadcast specializations. --- base/bitarray.jl | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/base/bitarray.jl b/base/bitarray.jl index 162845406b236..f0ee068839fc9 100644 --- a/base/bitarray.jl +++ b/base/bitarray.jl @@ -1237,6 +1237,32 @@ end (/)(B::BitArray, x::Number) = (/)(Array(B), x) (/)(x::Number, B::BitArray) = (/)(x, Array(B)) +# broadcast specializations for &, |, and xor/⊻ +broadcast(::typeof(&), B::BitArray, x::Bool) = x ? copy(B) : falses(size(B)) +broadcast(::typeof(&), x::Bool, B::BitArray) = broadcast(&, B, x) +broadcast(::typeof(|), B::BitArray, x::Bool) = x ? trues(size(B)) : copy(B) +broadcast(::typeof(|), x::Bool, B::BitArray) = broadcast(|, B, x) +broadcast(::typeof(xor), B::BitArray, x::Bool) = x ? ~B : copy(B) +broadcast(::typeof(xor), x::Bool, B::BitArray) = broadcast(xor, B, x) +for f in (:&, :|, :xor) + @eval begin + function broadcast(::typeof($f), A::BitArray, B::BitArray) + F = BitArray(promote_shape(size(A),size(B))...) + Fc = F.chunks + Ac = A.chunks + Bc = B.chunks + (isempty(Ac) || isempty(Bc)) && return F + for i = 1:length(Fc) + Fc[i] = ($f)(Ac[i], Bc[i]) + end + Fc[end] &= _msk_end(F) + return F + end + broadcast(::typeof($f), A::DenseArray{Bool}, B::BitArray) = broadcast($f, BitArray(A), B) + broadcast(::typeof($f), B::BitArray, A::DenseArray{Bool}) = broadcast($f, B, BitArray(A)) + end +end + ## promotion to complex ##