@@ -46,8 +46,8 @@ promote_array_type{S<:Integer}(::typeof(.\), ::Type{S}, ::Type{Bool}, T::Type) =
4646promote_array_type {S<:Integer} (F, :: Type{S} , :: Type{Bool} , T:: Type ) = T
4747
4848for f in (:+ , :- , :div , :mod , :& , :| , :$ )
49- @eval ($ f)(A:: AbstractArray , B:: AbstractArray ) =
50- _elementwise ($ f, promote_op ($ f, eltype (A), eltype (B) ), A, B)
49+ @eval ($ f){R,S} (A:: AbstractArray{R} , B:: AbstractArray{S} ) =
50+ _elementwise ($ f, promote_op ($ f, R, S ), A, B)
5151end
5252function _elementwise (op, :: Type{Any} , A:: AbstractArray , B:: AbstractArray )
5353 promote_shape (A, B) # check size compatibility
6363
6464for f in (:.+ , :.- , :.* , :./ , :.\ , :.^ , :.÷ , :.% , :.<< , :.>> , :div , :mod , :rem , :& , :| , :$ )
6565 @eval begin
66- function ($ f)(A:: Number , B:: AbstractArray )
67- P = promote_op ($ f, typeof (A), eltype (B) )
68- T = promote_array_type ($ f, typeof (A), eltype (B), P )
69- T === Any && return [($ f)(A, b) for b in B]
70- F = similar (B, T )
66+ function ($ f){T} (A:: Number , B:: AbstractArray{T} )
67+ R = promote_op ($ f, typeof (A), T )
68+ S = promote_array_type ($ f, typeof (A), T, R )
69+ S === Any && return [($ f)(A, b) for b in B]
70+ F = similar (B, S )
7171 for (iF, iB) in zip (eachindex (F), eachindex (B))
7272 @inbounds F[iF] = ($ f)(A, B[iB])
7373 end
7474 return F
7575 end
76- function ($ f)(A:: AbstractArray , B:: Number )
77- P = promote_op ($ f, eltype (A) , typeof (B))
78- T = promote_array_type ($ f, typeof (B), eltype (A), P )
79- T === Any && return [($ f)(a, B) for a in A]
80- F = similar (A, T )
76+ function ($ f){T} (A:: AbstractArray{T} , B:: Number )
77+ R = promote_op ($ f, T , typeof (B))
78+ S = promote_array_type ($ f, typeof (B), T, R )
79+ S === Any && return [($ f)(a, B) for a in A]
80+ F = similar (A, S )
8181 for (iF, iA) in zip (eachindex (F), eachindex (A))
8282 @inbounds F[iF] = ($ f)(A[iA], B)
8383 end
0 commit comments