|
1 | 1 | using DataArrays, Base.@get!
|
2 | 2 | using Base.Broadcast: bitcache_chunks, bitcache_size, dumpbitcache,
|
3 |
| - promote_eltype, broadcast_shape, eltype_plus, type_minus, type_div, |
4 |
| - type_pow |
| 3 | + promote_eltype, broadcast_shape, eltype_plus |
| 4 | + |
| 5 | +if isdefined(Base.Broadcast, :type_minus) |
| 6 | + using Base.Broadcast: type_minus, type_div, type_pow |
| 7 | + const _type_minus = type_minus |
| 8 | + const _type_rdiv = type_div |
| 9 | + const _type_ldiv = type_div |
| 10 | + const _type_pow = type_pow |
| 11 | +else |
| 12 | + using Base.Broadcast: promote_op |
| 13 | + _type_minus(T, S) = promote_op(Base.SubFun(), T, S) |
| 14 | + _type_rdiv(T, S) = promote_op(Base.RDivFun(), T, S) |
| 15 | + _type_ldiv(T, S) = promote_op(Base.LDivFun(), T, S) |
| 16 | + _type_pow(T, S) = promote_op(Base.PowFun(), T, S) |
| 17 | +end |
5 | 18 |
|
6 | 19 | # Check that all arguments are broadcast compatible with shape
|
7 | 20 | # Differs from Base in that we check for exact matches
|
@@ -282,30 +295,30 @@ Base.(:(.*))(A::(@compat Union{DataArray{Bool}, PooledDataArray{Bool}}), B::BitA
|
282 | 295 | @da_broadcast_vararg Base.(:(.*))(As...) = databroadcast(*, As...)
|
283 | 296 | @da_broadcast_binary Base.(:(.%))(A, B) = databroadcast(%, A, B)
|
284 | 297 | @da_broadcast_vararg Base.(:(.+))(As...) = broadcast!(+, DataArray(eltype_plus(As...), broadcast_shape(As...)), As...)
|
285 |
| -@da_broadcast_binary Base.(:(.-))(A, B) = broadcast!(-, DataArray(type_minus(eltype(A), eltype(B)), broadcast_shape(A,B)), A, B) |
286 |
| -@da_broadcast_binary Base.(:(./))(A, B) = broadcast!(/, DataArray(type_div(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
287 |
| -@da_broadcast_binary Base.(:(.\))(A, B) = broadcast!(\, DataArray(type_div(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
| 298 | +@da_broadcast_binary Base.(:(.-))(A, B) = broadcast!(-, DataArray(_type_minus(eltype(A), eltype(B)), broadcast_shape(A,B)), A, B) |
| 299 | +@da_broadcast_binary Base.(:(./))(A, B) = broadcast!(/, DataArray(_type_rdiv(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
| 300 | +@da_broadcast_binary Base.(:(.\))(A, B) = broadcast!(\, DataArray(_type_ldiv(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
288 | 301 | Base.(:(.^))(A::(@compat Union{DataArray{Bool}, PooledDataArray{Bool}}), B::(@compat Union{DataArray{Bool}, PooledDataArray{Bool}})) = databroadcast(>=, A, B)
|
289 | 302 | Base.(:(.^))(A::BitArray, B::(@compat Union{DataArray{Bool}, PooledDataArray{Bool}})) = databroadcast(>=, A, B)
|
290 | 303 | Base.(:(.^))(A::AbstractArray{Bool}, B::(@compat Union{DataArray{Bool}, PooledDataArray{Bool}})) = databroadcast(>=, A, B)
|
291 | 304 | Base.(:(.^))(A::(@compat Union{DataArray{Bool}, PooledDataArray{Bool}}), B::BitArray) = databroadcast(>=, A, B)
|
292 | 305 | Base.(:(.^))(A::(@compat Union{DataArray{Bool}, PooledDataArray{Bool}}), B::AbstractArray{Bool}) = databroadcast(>=, A, B)
|
293 |
| -@da_broadcast_binary Base.(:(.^))(A, B) = broadcast!(^, DataArray(type_pow(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
| 306 | +@da_broadcast_binary Base.(:(.^))(A, B) = broadcast!(^, DataArray(_type_pow(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
294 | 307 |
|
295 | 308 | # XXX is a PDA the right return type for these?
|
296 | 309 | Base.broadcast(f::Function, As::PooledDataArray...) = pdabroadcast(f, As...)
|
297 | 310 | Base.(:(.*))(As::PooledDataArray...) = pdabroadcast(*, As...)
|
298 | 311 | Base.(:(.%))(A::PooledDataArray, B::PooledDataArray) = pdabroadcast(%, A, B)
|
299 | 312 | Base.(:(.+))(As::PooledDataArray...) = broadcast!(+, PooledDataArray(eltype_plus(As...), broadcast_shape(As...)), As...)
|
300 | 313 | Base.(:(.-))(A::PooledDataArray, B::PooledDataArray) =
|
301 |
| - broadcast!(-, PooledDataArray(type_minus(eltype(A), eltype(B)), broadcast_shape(A,B)), A, B) |
| 314 | + broadcast!(-, PooledDataArray(_type_minus(eltype(A), eltype(B)), broadcast_shape(A,B)), A, B) |
302 | 315 | Base.(:(./))(A::PooledDataArray, B::PooledDataArray) =
|
303 |
| - broadcast!(/, PooledDataArray(type_div(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
| 316 | + broadcast!(/, PooledDataArray(_type_rdiv(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
304 | 317 | Base.(:(.\))(A::PooledDataArray, B::PooledDataArray) =
|
305 |
| - broadcast!(\, PooledDataArray(type_div(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
| 318 | + broadcast!(\, PooledDataArray(_type_ldiv(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
306 | 319 | Base.(:(.^))(A::PooledDataArray{Bool}, B::PooledDataArray{Bool}) = databroadcast(>=, A, B)
|
307 | 320 | Base.(:(.^))(A::PooledDataArray, B::PooledDataArray) =
|
308 |
| - broadcast!(^, PooledDataArray(type_pow(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
| 321 | + broadcast!(^, PooledDataArray(_type_pow(eltype(A), eltype(B)), broadcast_shape(A, B)), A, B) |
309 | 322 |
|
310 | 323 | for (sf, vf) in zip(scalar_comparison_operators, array_comparison_operators)
|
311 | 324 | @eval begin
|
|
0 commit comments