|
1 |
| -import StaticArrays: StaticArray, FieldArray, tuple_prod, StaticArrayStyle |
| 1 | +using StaticArrays: StaticArrays, StaticArray, FieldArray, tuple_prod, StaticArrayStyle |
| 2 | +import StaticArrays: Size |
| 3 | +import Base.Broadcast: instantiate |
2 | 4 |
|
3 | 5 | """
|
4 | 6 | StructArrays.staticschema(::Type{<:StaticArray{S, T}}) where {S, T}
|
|
28 | 30 | StructArrays.component(s::FieldArray, i) = invoke(StructArrays.component, Tuple{Any, Any}, s, i)
|
29 | 31 | StructArrays.createinstance(T::Type{<:FieldArray}, args...) = invoke(createinstance, Tuple{Type{<:Any}, Vararg}, T, args...)
|
30 | 32 |
|
| 33 | +@static if isdefined(StaticArrays, :static_combine_axes) |
31 | 34 | # StaticArrayStyle has no similar defined.
|
32 |
| -# Convert to `DefaultArrayStyle` to return a sized (Struct)Array. |
33 |
| -# TODO: return a StaticArray? |
34 |
| -function Base.copy(bc::Broadcasted{StructArrayStyle{StaticArrayStyle{N},N}}) where {N} |
35 |
| - bc′ = convert(Broadcasted{StructArrayStyle{Broadcast.DefaultArrayStyle{N},N}}, bc) |
| 35 | +# Convert to `StaticArrayStyle` to return a StaticArray instead. |
| 36 | +StructStaticArrayStyle{N} = StructArrayStyle{StaticArrayStyle{N}, N} |
| 37 | +@inline function Base.copy(bc::Broadcasted{StructStaticArrayStyle{M}}) where {M} |
| 38 | + bc′ = convert(Broadcasted{StaticArrayStyle{M}}, bc) |
36 | 39 | return copy(bc′)
|
37 | 40 | end
|
| 41 | +function instantiate(bc::Broadcasted{StructStaticArrayStyle{M}}) where {M} |
| 42 | + bc′ = instantiate(convert(Broadcasted{StaticArrayStyle{M}}, bc)) |
| 43 | + return convert(Broadcasted{StructStaticArrayStyle{M}}, bc′) |
| 44 | +end |
| 45 | +function Broadcast._axes(bc::Broadcasted{<:StructStaticArrayStyle}, ::Nothing) |
| 46 | + return StaticArrays.static_combine_axes(bc.args...) |
| 47 | +end |
| 48 | +Size(::Type{SA}) where {SA<:StructArray} = Size(fieldtype(fieldtype(SA, 1), 1)) |
| 49 | +StaticArrays.isstatic(::SA) where {SA<:StructArray} = cst(SA) isa StaticArrayStyle |
| 50 | +function StaticArrays.similar_type(::Type{SA}, ::Type{T}, s::Size{S}) where {SA<:StructArray, T, S} |
| 51 | + return StaticArrays.similar_type(fieldtype(fieldtype(SA, 1), 1), T, s) |
| 52 | +end |
| 53 | +end |
0 commit comments