@@ -48,30 +48,30 @@ function _unblock(cum_sizes, I::Tuple{BlockRange{1,R}, Vararg{Any}}) where {R}
48
48
end
49
49
50
50
51
- @inline _cumul_sizes (A:: AbstractArray , j) = cumulsizes (A,j)
51
+ _sub_cumul_sizes (cs, inds) = _sub_cumul_sizes (cs, inds[1 ], tail (inds))
52
+ _sub_cumul_sizes (:: Tuple{} , :: Tuple{} ) = ()
52
53
53
-
54
- # For a SubArray, we need to shift the block indices appropriately
55
- _cumul_sizes (V:: SubArray , j) = _sub_cumul_sizes (_cumul_sizes (parent (V), j), parentindices (V)[j])
56
-
57
- function _sub_cumul_sizes (cs, sl:: BlockSlice {BlockRange{1 ,Tuple{UnitRange{Int}}}})
58
- ret = view (cs, sl. block. indices[1 ][1 ]: (sl. block. indices[1 ][end ]+ 1 ))
59
- ret .- ret[1 ] .+ 1
54
+ function _sub_cumul_sizes (cs, inds1:: BlockSlice{Block{1,Int}} , inds)
55
+ B = Int (inds1. block)
56
+ ret = view (cs[1 ], B: B+ 1 )
57
+ (ret .- ret[1 ] .+ 1 , _sub_cumul_sizes (tail (cs), inds)... )
60
58
end
61
59
62
- function _sub_cumul_sizes (cs, sl:: BlockSlice{Block{1,Int}} )
63
- b = Int (sl. block)
64
- ret = view (cs, b: (b+ 1 ))
65
- ret .- ret[1 ] .+ 1
60
+ function _sub_cumul_sizes (cs, inds1:: BlockSlice {BlockRange{1 ,Tuple{UnitRange{Int}}}}, inds)
61
+ ret = view (cs[1 ], inds1. block. indices[1 ][1 ]: (inds1. block. indices[1 ][end ]+ 1 ))
62
+ (ret .- ret[1 ] .+ 1 , _sub_cumul_sizes (tail (cs), inds)... )
66
63
end
67
64
65
+
66
+ blocksizes (V:: SubArray ) = BlockSizes (_sub_cumul_sizes (cumulsizes (parent (V)), parentindices (V)))
67
+
68
+
68
69
"""
69
70
unblock(block_sizes, inds, I)
70
71
71
72
Returns the indices associated with a block as a `BlockSlice`.
72
73
"""
73
- unblock (A:: AbstractArray{T,N} , inds, I) where {T, N} =
74
- _unblock (_cumul_sizes (A, N - length (inds) + 1 ), I)
74
+ unblock (A:: AbstractArray{T,N} , inds, I) where {T, N} = _unblock (cumulsizes (A, N - length (inds) + 1 ), I)
75
75
76
76
77
77
0 commit comments