@@ -12,18 +12,22 @@ immutable SubArray{T,N,P,I,L} <: AbstractArray{T,N}
12
12
offset1:: Int # for linear indexing and pointer, only valid when L==true
13
13
stride1:: Int # used only for linear indexing
14
14
function SubArray (parent, indexes, offset1, stride1)
15
+ @_inline_meta
15
16
check_parent_index_match (parent, indexes)
16
17
new (parent, indexes, offset1, stride1)
17
18
end
18
19
end
19
20
# Compute the linear indexability of the indices, and combine it with the linear indexing of the parent
20
- function SubArray (parent:: AbstractArray , indexes:: Tuple , dims:: Tuple )
21
- SubArray (linearindexing (viewindexing (indexes), linearindexing (parent)), parent, indexes, dims)
21
+ function SubArray (parent:: AbstractArray , indexes:: Tuple )
22
+ @_inline_meta
23
+ SubArray (linearindexing (viewindexing (indexes), linearindexing (parent)), parent, indexes, index_dimsum (indexes... ))
22
24
end
23
- function SubArray {P, I, N} (:: LinearSlow , parent:: P , indexes:: I , dims:: NTuple{N} )
25
+ function SubArray {P, I, N} (:: LinearSlow , parent:: P , indexes:: I , :: NTuple{N} )
26
+ @_inline_meta
24
27
SubArray {eltype(P), N, P, I, false} (parent, indexes, 0 , 0 )
25
28
end
26
- function SubArray {P, I, N} (:: LinearFast , parent:: P , indexes:: I , dims:: NTuple{N} )
29
+ function SubArray {P, I, N} (:: LinearFast , parent:: P , indexes:: I , :: NTuple{N} )
30
+ @_inline_meta
27
31
# Compute the stride and offset
28
32
stride1 = compute_stride1 (parent, indexes)
29
33
SubArray {eltype(P), N, P, I, true} (parent, indexes, compute_offset1 (parent, stride1, indexes), stride1)
@@ -92,7 +96,7 @@ view(A::AbstractArray, I::Union{ViewIndex, AbstractCartesianIndex}...) = view(A,
92
96
function unsafe_view (A:: AbstractArray , I:: ViewIndex... )
93
97
@_inline_meta
94
98
J = to_indexes (I... )
95
- SubArray (A, J, map (unsafe_length, index_shape (A, J ... )) )
99
+ SubArray (A, J)
96
100
end
97
101
# When we take the view of a view, it's often possible to "reindex" the parent
98
102
# view's indices such that we can "pop" the parent view and keep just one layer
@@ -103,15 +107,15 @@ end
103
107
unsafe_view (V:: SubArray , I:: ViewIndex... ) = (@_inline_meta ; _maybe_reindex (V, to_indexes (I... )))
104
108
_maybe_reindex (V, I) = (@_inline_meta ; _maybe_reindex (V, I, I))
105
109
_maybe_reindex {C<:AbstractCartesianIndex} (V, I, :: Tuple{AbstractArray{C}, Vararg{Any}} ) =
106
- (@_inline_meta ; SubArray (V, I, map (unsafe_length, index_shape (V, I ... )) ))
110
+ (@_inline_meta ; SubArray (V, I))
107
111
# But allow arrays of CartesianIndex{1}; they behave just like arrays of Ints
108
112
_maybe_reindex {C<:AbstractCartesianIndex{1}} (V, I, A:: Tuple{AbstractArray{C}, Vararg{Any}} ) =
109
113
(@_inline_meta ; _maybe_reindex (V, I, tail (A)))
110
114
_maybe_reindex (V, I, A:: Tuple{Any, Vararg{Any}} ) = (@_inline_meta ; _maybe_reindex (V, I, tail (A)))
111
115
function _maybe_reindex (V, I, :: Tuple{} )
112
116
@_inline_meta
113
117
idxs = reindex (V, V. indexes, to_indexes (I... ))
114
- SubArray (V. parent, idxs, map (unsafe_length, ( index_shape (V . parent, idxs ... ))) )
118
+ SubArray (V. parent, idxs)
115
119
end
116
120
117
121
# # Re-indexing is the heart of a view, transforming A[i, j][x, y] to A[i[x], j[y]]
@@ -222,7 +226,7 @@ substrides(s, parent, dim, I::Tuple{Any, Vararg{Any}}) = throw(ArgumentError("st
222
226
stride (V:: SubArray , d:: Integer ) = d <= ndims (V) ? strides (V)[d] : strides (V)[end ] * size (V)[end ]
223
227
224
228
compute_stride1 {N} (parent:: AbstractArray , I:: NTuple{N} ) =
225
- compute_stride1 (1 , fill_to_length (indices (parent), OneTo (1 ), Val{N}), I)
229
+ ( @_inline_meta ; compute_stride1 (1 , fill_to_length (indices (parent), OneTo (1 ), Val{N}), I) )
226
230
compute_stride1 (s, inds, I:: Tuple{} ) = s
227
231
compute_stride1 (s, inds, I:: Tuple{Real, Vararg{Any}} ) =
228
232
(@_inline_meta ; compute_stride1 (s* unsafe_length (inds[1 ]), tail (inds), tail (I)))
@@ -252,11 +256,15 @@ end
252
256
# If the result is one-dimensional and it's a Colon, then linear
253
257
# indexing uses the indices along the given dimension. Otherwise
254
258
# linear indexing always starts with 1.
255
- compute_offset1 (parent, stride1:: Integer , I:: Tuple ) = (@_inline_meta ; compute_offset1 (parent, stride1, find_extended_dims (I)... , I))
256
- compute_offset1 (parent, stride1:: Integer , dims:: Tuple{Int} , inds:: Tuple{Colon} , I:: Tuple ) = compute_linindex (parent, I) - stride1* first (indices (parent, dims[1 ])) # index-preserving case
257
- compute_offset1 (parent, stride1:: Integer , dims, inds, I:: Tuple ) = compute_linindex (parent, I) - stride1 # linear indexing starts with 1
259
+ compute_offset1 (parent, stride1:: Integer , I:: Tuple ) =
260
+ (@_inline_meta ; compute_offset1 (parent, stride1, find_extended_dims (I)... , I))
261
+ compute_offset1 (parent, stride1:: Integer , dims:: Tuple{Int} , inds:: Tuple{Colon} , I:: Tuple ) =
262
+ (@_inline_meta ; compute_linindex (parent, I) - stride1* first (indices (parent, dims[1 ]))) # index-preserving case
263
+ compute_offset1 (parent, stride1:: Integer , dims, inds, I:: Tuple ) =
264
+ (@_inline_meta ; compute_linindex (parent, I) - stride1) # linear indexing starts with 1
258
265
259
266
function compute_linindex {N} (parent, I:: NTuple{N} )
267
+ @_inline_meta
260
268
IP = fill_to_length (indices (parent), OneTo (1 ), Val{N})
261
269
compute_linindex (1 , 1 , IP, I)
262
270
end
@@ -278,10 +286,13 @@ end
278
286
compute_linindex (f, s, IP:: Tuple , I:: Tuple{} ) = f
279
287
280
288
find_extended_dims (I) = (@_inline_meta ; _find_extended_dims ((), (), 1 , I... ))
281
- _find_extended_dims (dims, inds, dim) = dims, inds
282
- _find_extended_dims (dims, inds, dim, :: Real , I... ) = _find_extended_dims (dims, inds, dim+ 1 , I... )
283
- _find_extended_dims (dims, inds, dim, i1:: AbstractCartesianIndex , I... ) = _find_extended_dims (dims, inds, dim, i1. I... , I... )
284
- _find_extended_dims (dims, inds, dim, i1, I... ) = _find_extended_dims ((dims... , dim), (inds... , i1), dim+ 1 , I... )
289
+ _find_extended_dims (dims, inds, dim) = (@_inline_meta ; return (dims, inds))
290
+ _find_extended_dims (dims, inds, dim, :: Real , I... ) =
291
+ (@_inline_meta ; _find_extended_dims (dims, inds, dim+ 1 , I... ))
292
+ _find_extended_dims (dims, inds, dim, i1:: AbstractCartesianIndex , I... ) =
293
+ (@_inline_meta ; _find_extended_dims (dims, inds, dim, i1. I... , I... ))
294
+ _find_extended_dims (dims, inds, dim, i1, I... ) =
295
+ (@_inline_meta ; _find_extended_dims ((dims... , dim), (inds... , i1), dim+ 1 , I... ))
285
296
286
297
unsafe_convert {T,N,P,I<:Tuple{Vararg{RangeIndex}}} (:: Type{Ptr{T}} , V:: SubArray{T,N,P,I} ) =
287
298
unsafe_convert (Ptr{T}, V. parent) + (first_index (V)- 1 )* sizeof (T)
0 commit comments