@@ -33,9 +33,9 @@ StructArrays.createinstance(T::Type{<:FieldArray}, args...) = invoke(StructArray
3333
3434#  Broadcast overload
3535using  StaticArrays:  StaticArrayStyle, similar_type, Size, SOneTo
36- using  StaticArrays:  broadcast_flatten, broadcast_sizes, first_statictype, __broadcast 
36+ using  StaticArrays:  broadcast_flatten, broadcast_sizes, first_statictype
3737using  StructArrays:  isnonemptystructtype
38- using  Base. Broadcast:  Broadcasted
38+ using  Base. Broadcast:  Broadcasted, _broadcast_getindex 
3939
4040#  StaticArrayStyle has no similar defined.
4141#  Overload `try_struct_copy` instead.
7979    end 
8080end 
8181
82+ #  The `__broadcast` kernal is copied from `StaticArrays.jl`.
83+ #  see https://github.com/JuliaArrays/StaticArrays.jl/blob/master/src/broadcast.jl
84+ @generated  function  __broadcast (f, :: Size{newsize} , s:: Tuple{Vararg{Size}} , a... ) where  newsize
85+     sizes =  [sz. parameters[1 ] for  sz ∈  s. parameters]
86+ 
87+     indices =  CartesianIndices (newsize)
88+     exprs =  similar (indices, Expr)
89+     for  (j, current_ind) ∈  enumerate (indices)
90+         exprs_vals =  (broadcast_getindex (sz, i, current_ind) for  (i, sz) in  enumerate (sizes))
91+         exprs[j] =  :(f ($ (exprs_vals... )))
92+     end 
93+ 
94+     return  quote 
95+         Base. @_inline_meta 
96+         return  tuple ($ (exprs... ))
97+     end 
98+ end 
99+ 
100+ broadcast_getindex (:: Tuple{} , i:: Int , I:: CartesianIndex ) =  return  :(_broadcast_getindex (a[$ i], $ I))
101+ function  broadcast_getindex (oldsize:: Tuple , i:: Int , newindex:: CartesianIndex )
102+     li =  LinearIndices (oldsize)
103+     ind =  _broadcast_getindex (li, newindex)
104+     return  :(a[$ i][$ ind])
105+ end 
106+ 
82107end 
0 commit comments