@@ -167,16 +167,28 @@ BroadcastStyle(a::AbstractArrayStyle{M}, ::DefaultArrayStyle{N}) where {M,N} =
167167# copyto!(dest::AbstractArray, bc::Broadcasted{MyStyle})
168168
169169struct Broadcasted{Style<: Union{Nothing,BroadcastStyle} , Axes, F, Args<: Tuple } <: Base.AbstractBroadcasted
170+ style:: Style
170171 f:: F
171172 args:: Args
172173 axes:: Axes # the axes of the resulting object (may be bigger than implied by `args` if this is nested inside a larger `Broadcasted`)
173- end
174174
175- Broadcasted (f:: F , args:: Args , axes= nothing ) where {F, Args<: Tuple } =
176- Broadcasted {typeof(combine_styles(args...))} (f, args, axes)
177- function Broadcasted {Style} (f:: F , args:: Args , axes= nothing ) where {Style, F, Args<: Tuple }
178- # using Core.Typeof rather than F preserves inferrability when f is a type
179- Broadcasted {Style, typeof(axes), Core.Typeof(f), Args} (f, args, axes)
175+ Broadcasted (style:: Union{Nothing,BroadcastStyle} , f:: Tuple , args:: Tuple ) = error () # disambiguation: tuple is not callable
176+ function Broadcasted (style:: Union{Nothing,BroadcastStyle} , f:: F , args:: Tuple , axes= nothing ) where {F}
177+ # using Core.Typeof rather than F preserves inferrability when f is a type
178+ return new {typeof(style), typeof(axes), Core.Typeof(f), typeof(args)} (style, f, args, axes)
179+ end
180+
181+ function Broadcasted (f:: F , args:: Tuple , axes= nothing ) where {F}
182+ Broadcasted (combine_styles (args... ):: BroadcastStyle , f, args, axes)
183+ end
184+
185+ function Broadcasted {Style} (f:: F , args, axes= nothing ) where {Style, F}
186+ return new {Style, typeof(axes), Core.Typeof(f), typeof(args)} (Style ():: Style , f, args, axes)
187+ end
188+
189+ function Broadcasted {Style,Axes,F,Args} (f, args, axes) where {Style,Axes,F,Args}
190+ return new {Style, Axes, F, Args} (Style ():: Style , f, args, axes)
191+ end
180192end
181193
182194struct AndAnd end
@@ -194,16 +206,16 @@ function broadcasted(::OrOr, a, bc::Broadcasted)
194206 broadcasted ((a, args... ) -> a || bcf. f (args... ), a, bcf. args... )
195207end
196208
197- Base. convert (:: Type{Broadcasted{NewStyle}} , bc:: Broadcasted{Style ,Axes,F,Args} ) where {NewStyle,Style ,Axes,F,Args} =
209+ Base. convert (:: Type{Broadcasted{NewStyle}} , bc:: Broadcasted{<:Any ,Axes,F,Args} ) where {NewStyle,Axes,F,Args} =
198210 Broadcasted {NewStyle,Axes,F,Args} (bc. f, bc. args, bc. axes):: Broadcasted{NewStyle,Axes,F,Args}
199211
200212function Base. show (io:: IO , bc:: Broadcasted{Style} ) where {Style}
201213 print (io, Broadcasted)
202214 # Only show the style parameter if we have a set of axes — representing an instantiated
203215 # "outermost" Broadcasted. The styles of nested Broadcasteds represent an intermediate
204216 # computation that is not relevant for dispatch, confusing, and just extra line noise.
205- bc. axes isa Tuple && print (io, ' { ' , Style, ' } ' )
206- print (io, ' ( ' , bc. f, " , " , bc. args, ' ) ' )
217+ bc. axes isa Tuple && print (io, " { " , Style, " } " )
218+ print (io, " ( " , bc. f, " , " , bc. args, " ) " )
207219 nothing
208220end
209221
@@ -231,7 +243,7 @@ BroadcastStyle(::Type{<:Broadcasted{Style}}) where {Style} = Style()
231243BroadcastStyle (:: Type{<:Broadcasted{S}} ) where {S<: Union{Nothing,Unknown} } =
232244 throw (ArgumentError (" Broadcasted{Unknown} wrappers do not have a style assigned" ))
233245
234- argtype (:: Type{Broadcasted{Style,Axes,F,Args}} ) where {Style,Axes,F,Args } = Args
246+ argtype (:: Type{BC} ) where {BC <: Broadcasted } = fieldtype (BC, :args )
235247argtype (bc:: Broadcasted ) = argtype (typeof (bc))
236248
237249@inline Base. eachindex (bc:: Broadcasted ) = _eachindex (axes (bc))
@@ -262,7 +274,7 @@ Base.@propagate_inbounds function Base.iterate(bc::Broadcasted, s)
262274end
263275
264276Base. IteratorSize (:: Type{T} ) where {T<: Broadcasted } = Base. HasShape {ndims(T)} ()
265- Base. ndims (BC:: Type{<:Broadcasted{<:Any,Nothing}} ) = _maxndims (fieldtype (BC, 2 ))
277+ Base. ndims (BC:: Type{<:Broadcasted{<:Any,Nothing}} ) = _maxndims (fieldtype (BC, :args ))
266278Base. ndims (:: Type{<:Broadcasted{<:AbstractArrayStyle{N},Nothing}} ) where {N<: Integer } = N
267279
268280_maxndims (T:: Type{<:Tuple} ) = reduce (max, (ntuple (n -> _ndims (fieldtype (T, n)), Base. _counttuple (T))))
@@ -289,14 +301,14 @@ Custom [`BroadcastStyle`](@ref)s may override this default in cases where it is
289301to compute and verify the resulting `axes` on-demand, leaving the `axis` field
290302of the `Broadcasted` object empty (populated with [`nothing`](@ref)).
291303"""
292- @inline function instantiate (bc:: Broadcasted{Style} ) where {Style}
304+ @inline function instantiate (bc:: Broadcasted )
293305 if bc. axes isa Nothing # Not done via dispatch to make it easier to extend instantiate(::Broadcasted{Style})
294306 axes = combine_axes (bc. args... )
295307 else
296308 axes = bc. axes
297309 check_broadcast_axes (axes, bc. args... )
298310 end
299- return Broadcasted {Style} ( bc. f, bc. args, axes)
311+ return Broadcasted (bc . style, bc. f, bc. args, axes)
300312end
301313instantiate (bc:: Broadcasted{<:AbstractArrayStyle{0}} ) = bc
302314# Tuples don't need axes, but when they have axes (for .= assignment), we need to check them (#33020)
@@ -325,7 +337,7 @@ becomes
325337This is an optional operation that may make custom implementation of broadcasting easier in
326338some cases.
327339"""
328- function flatten (bc:: Broadcasted{Style} ) where {Style}
340+ function flatten (bc:: Broadcasted )
329341 isflat (bc) && return bc
330342 # concatenate the nested arguments into {a, b, c, d}
331343 args = cat_nested (bc)
@@ -341,7 +353,7 @@ function flatten(bc::Broadcasted{Style}) where {Style}
341353 newf = @inline function (args:: Vararg{Any,N} ) where N
342354 f (makeargs (args... )... )
343355 end
344- return Broadcasted {Style} ( newf, args, bc. axes)
356+ return Broadcasted (bc . style, newf, args, bc. axes)
345357 end
346358end
347359
@@ -895,11 +907,11 @@ materialize(x) = x
895907 return materialize! (dest, instantiate (Broadcasted (identity, (x,), axes (dest))))
896908end
897909
898- @inline function materialize! (dest, bc:: Broadcasted{Style} ) where {Style}
910+ @inline function materialize! (dest, bc:: Broadcasted{<:Any} )
899911 return materialize! (combine_styles (dest, bc), dest, bc)
900912end
901- @inline function materialize! (:: BroadcastStyle , dest, bc:: Broadcasted{Style} ) where {Style}
902- return copyto! (dest, instantiate (Broadcasted {Style} ( bc. f, bc. args, axes (dest))))
913+ @inline function materialize! (:: BroadcastStyle , dest, bc:: Broadcasted{<:Any} )
914+ return copyto! (dest, instantiate (Broadcasted (bc . style, bc. f, bc. args, axes (dest))))
903915end
904916
905917# # general `copy` methods
@@ -909,7 +921,7 @@ copy(bc::Broadcasted{<:Union{Nothing,Unknown}}) =
909921
910922const NonleafHandlingStyles = Union{DefaultArrayStyle,ArrayConflict}
911923
912- @inline function copy (bc:: Broadcasted{Style} ) where {Style}
924+ @inline function copy (bc:: Broadcasted )
913925 ElType = combine_eltypes (bc. f, bc. args)
914926 if Base. isconcretetype (ElType)
915927 # We can trust it and defer to the simpler `copyto!`
@@ -968,7 +980,7 @@ broadcast_unalias(::Nothing, src) = src
968980# Preprocessing a `Broadcasted` does two things:
969981# * unaliases any arguments from `dest`
970982# * "extrudes" the arguments where it is advantageous to pre-compute the broadcasted indices
971- @inline preprocess (dest, bc:: Broadcasted{Style} ) where {Style} = Broadcasted {Style} ( bc. f, preprocess_args (dest, bc. args), bc. axes)
983+ @inline preprocess (dest, bc:: Broadcasted ) = Broadcasted (bc . style, bc. f, preprocess_args (dest, bc. args), bc. axes)
972984preprocess (dest, x) = extrude (broadcast_unalias (dest, x))
973985
974986@inline preprocess_args (dest, args:: Tuple ) = (preprocess (dest, args[1 ]), preprocess_args (dest, tail (args))... )
@@ -1038,11 +1050,11 @@ ischunkedbroadcast(R, args::Tuple{<:BroadcastedChunkableOp,Vararg{Any}}) = ischu
10381050ischunkedbroadcast (R, args:: Tuple{} ) = true
10391051
10401052# Convert compatible functions to chunkable ones. They must also be green-lighted as ChunkableOps
1041- liftfuncs (bc:: Broadcasted{Style } ) where {Style} = Broadcasted {Style} ( bc. f, map (liftfuncs, bc. args), bc. axes)
1042- liftfuncs (bc:: Broadcasted{Style ,<:Any,typeof(sign)} ) where {Style} = Broadcasted {Style} ( identity, map (liftfuncs, bc. args), bc. axes)
1043- liftfuncs (bc:: Broadcasted{Style ,<:Any,typeof(!)} ) where {Style} = Broadcasted {Style} ( ~ , map (liftfuncs, bc. args), bc. axes)
1044- liftfuncs (bc:: Broadcasted{Style ,<:Any,typeof(*)} ) where {Style} = Broadcasted {Style} ( & , map (liftfuncs, bc. args), bc. axes)
1045- liftfuncs (bc:: Broadcasted{Style ,<:Any,typeof(==)} ) where {Style} = Broadcasted {Style} ( (~ )∘ (xor), map (liftfuncs, bc. args), bc. axes)
1053+ liftfuncs (bc:: Broadcasted{<:Any,<:Any,<:Any } ) = Broadcasted (bc . style, bc. f, map (liftfuncs, bc. args), bc. axes)
1054+ liftfuncs (bc:: Broadcasted{<:Any ,<:Any,typeof(sign)} ) = Broadcasted (bc . style, identity, map (liftfuncs, bc. args), bc. axes)
1055+ liftfuncs (bc:: Broadcasted{<:Any ,<:Any,typeof(!)} ) = Broadcasted (bc . style, ~ , map (liftfuncs, bc. args), bc. axes)
1056+ liftfuncs (bc:: Broadcasted{<:Any ,<:Any,typeof(*)} ) = Broadcasted (bc . style, & , map (liftfuncs, bc. args), bc. axes)
1057+ liftfuncs (bc:: Broadcasted{<:Any ,<:Any,typeof(==)} ) = Broadcasted (bc . style, (~ )∘ (xor), map (liftfuncs, bc. args), bc. axes)
10461058liftfuncs (x) = x
10471059
10481060liftchunks (:: Tuple{} ) = ()
@@ -1315,26 +1327,26 @@ end
13151327 return broadcasted ((args... ) -> f (args... ; kwargs... ), args... )
13161328 end
13171329end
1318- @inline function broadcasted (f, args... )
1330+ @inline function broadcasted (f:: F , args... ) where {F}
13191331 args′ = map (broadcastable, args)
13201332 broadcasted (combine_styles (args′... ), f, args′... )
13211333end
13221334# Due to the current Type{T}/DataType specialization heuristics within Tuples,
13231335# the totally generic varargs broadcasted(f, args...) method above loses Type{T}s in
13241336# mapping broadcastable across the args. These additional methods with explicit
13251337# arguments ensure we preserve Type{T}s in the first or second argument position.
1326- @inline function broadcasted (f, arg1, args... )
1338+ @inline function broadcasted (f:: F , arg1, args... ) where {F}
13271339 arg1′ = broadcastable (arg1)
13281340 args′ = map (broadcastable, args)
13291341 broadcasted (combine_styles (arg1′, args′... ), f, arg1′, args′... )
13301342end
1331- @inline function broadcasted (f, arg1, arg2, args... )
1343+ @inline function broadcasted (f:: F , arg1, arg2, args... ) where {F}
13321344 arg1′ = broadcastable (arg1)
13331345 arg2′ = broadcastable (arg2)
13341346 args′ = map (broadcastable, args)
13351347 broadcasted (combine_styles (arg1′, arg2′, args′... ), f, arg1′, arg2′, args′... )
13361348end
1337- @inline broadcasted (:: S , f, args... ) where S <: BroadcastStyle = Broadcasted {S} ( f, args)
1349+ @inline broadcasted (style :: BroadcastStyle , f:: F , args... ) where {F} = Broadcasted (style, f, args)
13381350
13391351"""
13401352 BroadcastFunction{F} <: Function
0 commit comments