@@ -103,7 +103,27 @@ axes(A::ReshapedArray) = Base.axes(A)
103
103
axes (A:: PermutedDimsArray ) = permute (axes (parent (A)), to_parent_dims (A))
104
104
axes (A:: MatAdjTrans ) = permute (axes (parent (A)), to_parent_dims (A))
105
105
axes (A:: VecAdjTrans ) = (SOneTo {1} (), axes (parent (A), 1 ))
106
- axes (A:: SubArray{<:Any,N} ) where {N} = map (Base. Fix1 (axes, A), Static. nstatic (Val (N)))
106
+ axes (A:: SubArray ) = _sub_axes (parent (A), A. indices)
107
+ @generated function _sub_axes (A, inds:: I ) where {N,P,I}
108
+ out = Expr (:block , Expr (:meta , :inline ))
109
+ t = Expr (:tuple )
110
+ for i in 1 : fieldcount (I)
111
+ I_i = fieldtype (I, i)
112
+ if I_i <: Base.Slice{Base.OneTo{Int}}
113
+ push! (t. args, :(axes (A, $ i)))
114
+ elseif ndims (I_i) === 1
115
+ push! (t. args, :(getfield (axes (getfield (inds, $ i)), 1 )))
116
+ else
117
+ axsi = Symbol (:axes_ , i)
118
+ push! (out. args, :(axes (getfield (inds, $ i))))
119
+ for j in 1 : ndims (I_i)
120
+ push! (t. args, :(getfield ($ (axsi), $ j)))
121
+ end
122
+ end
123
+ end
124
+ push! (out. args, t)
125
+ out
126
+ end
107
127
108
128
@inline axes (A, dim) = _axes (A, to_dims (A, dim))
109
129
@inline function _axes (A, dim:: Int )
120
140
return getfield (axes (A), Int (dim))
121
141
end
122
142
end
123
- @inline function _inbound_axes (A:: SubArray , dim)
124
- pd = to_parent_dims (A, to_dims (A, dim))
125
- ax = getindex (A. indices, pd)
126
- ax isa Base. Slice || return axes (ax, 1 )
127
- axes (parent (A))[pd]
128
- end
129
- @inline function axes (A:: SubArray , dim:: CanonicalInt )
130
- if dim > ndims (A)
131
- return OneTo (1 )
132
- else
133
- return _inbound_axes (A, dim)
134
- end
135
- end
136
- @inline function axes (A:: SubArray , :: StaticInt{dim} ) where {dim}
137
- if dim > ndims (A)
138
- return SOneTo {1} ()
139
- else
140
- return _inbound_axes (A, StaticInt (dim))
141
- end
142
- end
143
-
144
143
function axes_types (:: Type{A} ) where {T,N,S,A<: Base.ReshapedReinterpretArray{T,N,S} }
145
144
if sizeof (S) > sizeof (T)
146
145
return merge_tuple_type (Tuple{SOneTo{div (sizeof (S), sizeof (T))}}, axes_types (parent_type (A)))
0 commit comments