9292# TODO : Move to `GradedUnitRanges` or `BlockArraysExtensions`.
9393to_block (I:: Block{1} ) = I
9494to_block (I:: BlockIndexRange{1} ) = Block (I)
95+ to_block (I:: BlockIndexVector ) = Block (I)
9596to_block_indices (I:: Block{1} ) = Colon ()
9697to_block_indices (I:: BlockIndexRange{1} ) = only (I. indices)
98+ to_block_indices (I:: BlockIndexVector ) = I. indices
9799
98100function Base. view (
99- a:: AbstractBlockSparseArray{<:Any,N} , I:: Vararg{Union{Block{1},BlockIndexRange{1}},N}
101+ a:: AbstractBlockSparseArray{<:Any,N} ,
102+ I:: Vararg{Union{Block{1},BlockIndexRange{1},BlockIndexVector},N} ,
100103) where {N}
101104 return @views a[to_block .(I)... ][to_block_indices .(I)... ]
102105end
@@ -108,7 +111,7 @@ function Base.view(
108111end
109112function Base. view (
110113 a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N}} ,
111- I:: Vararg{Union{Block{1},BlockIndexRange{1}},N} ,
114+ I:: Vararg{Union{Block{1},BlockIndexRange{1},BlockIndexVector },N} ,
112115) where {T,N}
113116 return @views a[to_block .(I)... ][to_block_indices .(I)... ]
114117end
@@ -205,8 +208,21 @@ function BlockArrays.viewblock(
205208end
206209
207210function to_blockindexrange (
208- a:: BlockIndices {<: BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange{1}}} },
209- I:: Block{1} ,
211+ a:: BlockSlice {<: BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange{1}}} }, I:: Block{1}
212+ )
213+ # TODO : Ideally we would just use `a.blocks[I]` but that doesn't
214+ # work right now.
215+ return blocks (a. block)[Int (I)]
216+ end
217+ function to_blockindexrange (
218+ a:: BlockIndices{<:BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange}}} , I:: Block{1}
219+ )
220+ # TODO : Ideally we would just use `a.blocks[I]` but that doesn't
221+ # work right now.
222+ return blocks (a. blocks)[Int (I)]
223+ end
224+ function to_blockindexrange (
225+ a:: BlockIndices{<:BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexVector}}} , I:: Block{1}
210226)
211227 # TODO : Ideally we would just use `a.blocks[I]` but that doesn't
212228 # work right now.
@@ -245,47 +261,61 @@ function BlockArrays.viewblock(
245261 return view (viewblock (a, Block .(block)... ), map (b -> only (b. indices), block)... )
246262end
247263
248- # Block slice of the result of slicing `@view a[2:5, 2:5]`.
249- # TODO : Move this to `BlockArraysExtensions`.
250- const BlockedSlice = BlockSlice{
251- <: BlockVector{<:BlockIndex{1},<:Vector{<:BlockIndexRange{1}}}
252- }
253-
254264function Base. view (
255- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
265+ a:: SubArray {
266+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
267+ },
256268 block:: Union{Block{N},BlockIndexRange{N}} ,
257269) where {T,N}
258270 return viewblock (a, block)
259271end
260272function Base. view (
261- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
262- block:: Vararg{Union{Block{1},BlockIndexRange{1}},N} ,
273+ a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockIndexRangeSlice,N}}} ,
274+ block:: Union{Block{N},BlockIndexRange{N}} ,
275+ ) where {T,N}
276+ return viewblock (a, block)
277+ end
278+ function Base. view (
279+ a:: SubArray {
280+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
281+ },
282+ block:: Vararg{Union{Block{1},BlockIndexRange{1},BlockIndexVector},N} ,
263283) where {T,N}
264284 return viewblock (a, block... )
265285end
266286function BlockArrays. viewblock (
267- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
287+ a:: SubArray {
288+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
289+ },
268290 block:: Union{Block{N},BlockIndexRange{N}} ,
269291) where {T,N}
270292 return viewblock (a, to_tuple (block)... )
271293end
294+
295+ blockedslice_blocks (x:: BlockSlice ) = x. block
296+ blockedslice_blocks (x:: BlockIndices ) = x. blocks
297+
272298# TODO : Define `@interface BlockSparseArrayInterface() viewblock`.
273299function BlockArrays. viewblock (
274- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
300+ a:: SubArray {
301+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
302+ },
275303 I:: Vararg{Block{1},N} ,
276304) where {T,N}
277305 # TODO : Use `reindex`, `to_indices`, etc.
278306 brs = ntuple (ndims (a)) do dim
279307 # TODO : Ideally we would use this but it outputs a Vector,
280308 # not a range:
281309 # return parentindices(a)[dim].block[I[dim]]
282- return blocks (parentindices (a)[dim]. block )[Int (I[dim])]
310+ return blocks (blockedslice_blocks ( parentindices (a)[dim]) )[Int (I[dim])]
283311 end
284312 return @view parent (a)[brs... ]
285313end
286314# TODO : Define `@interface BlockSparseArrayInterface() viewblock`.
287315function BlockArrays. viewblock (
288- a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockedSlice,N}}} ,
316+ a:: SubArray {
317+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
318+ },
289319 block:: Vararg{BlockIndexRange{1},N} ,
290320) where {T,N}
291321 return view (viewblock (a, Block .(block)... ), map (b -> only (b. indices), block)... )
0 commit comments