@@ -190,6 +190,26 @@ function Base.view(
190190 return viewblock (a, block... )
191191end
192192
193+ # Disambiguate between block reindexing of blockwise views
194+ # (`BlockSliceCollection`) and subblockwise views (`SubBlockSliceCollection`),
195+ # which both include `Base.Slice`.
196+ function Base. view (
197+ a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{Base.Slice,N}}} ,
198+ block:: Block{N} ,
199+ ) where {T,N}
200+ return viewblock (a, block)
201+ end
202+
203+ # Block reindexing of blockwise views (`BlockSliceCollection`).
204+ function viewblock_blockslice (a:: SubArray{<:Any,N} , block:: Vararg{Block{1},N} ) where {N}
205+ I = CartesianIndex (Int .(block))
206+ # TODO : Use `eachblockstoredindex`.
207+ if I ∈ eachstoredindex (blocks (a))
208+ return blocks (a)[I]
209+ end
210+ return BlockView (parent (a), Block .(Base. reindex (parentindices (blocks (a)), Tuple (I))))
211+ end
212+
193213# XXX : TODO : Distinguish if a sub-view of the block needs to be taken!
194214# Define a new `SubBlockSlice` which is used in:
195215# `@interface interface(a) to_indices(a, inds, I::Tuple{UnitRange{<:Integer},Vararg{Any}})`
@@ -199,12 +219,17 @@ function BlockArrays.viewblock(
199219 a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockSliceCollection,N}}} ,
200220 block:: Vararg{Block{1},N} ,
201221) where {T,N}
202- I = CartesianIndex (Int .(block))
203- # TODO : Use `eachblockstoredindex`.
204- if I ∈ eachstoredindex (blocks (a))
205- return blocks (a)[I]
206- end
207- return BlockView (parent (a), Block .(Base. reindex (parentindices (blocks (a)), Tuple (I))))
222+ return viewblock_blockslice (a, block... )
223+ end
224+
225+ # Disambiguate between block reindexing of blockwise views
226+ # (`BlockSliceCollection`) and subblockwise views (`SubBlockSliceCollection`),
227+ # which both include `Base.Slice`.
228+ function BlockArrays. viewblock (
229+ a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{Base.Slice,N}}} ,
230+ block:: Vararg{Block{1},N} ,
231+ ) where {T,N}
232+ return viewblock_blockslice (a, block... )
208233end
209234
210235function to_blockindexrange (
@@ -291,6 +316,15 @@ function Base.view(
291316) where {T,N}
292317 return viewblock (a, block... )
293318end
319+ # Fix ambiguity error.
320+ function Base. view (
321+ a:: SubArray {
322+ T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
323+ },
324+ block:: Vararg{Block{1},N} ,
325+ ) where {T,N}
326+ return viewblock (a, block... )
327+ end
294328function BlockArrays. viewblock (
295329 a:: SubArray {
296330 T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
302336
303337blockedslice_blocks (x:: BlockSlice ) = x. block
304338blockedslice_blocks (x:: BlockIndices ) = x. blocks
339+ # Reinterpret the slice blockwise.
340+ function blockedslice_blocks (x:: Base.Slice )
341+ return mortar (
342+ map (BlockRange (x. indices)) do b
343+ return BlockIndexRange (b, Base. Slice (Base. axes1 (x. indices[b])))
344+ end ,
345+ )
346+ end
305347
306348# TODO : Define `@interface interface(a) viewblock`.
307349function BlockArrays. viewblock (
@@ -319,6 +361,7 @@ function BlockArrays.viewblock(
319361 end
320362 return @view parent (a)[brs... ]
321363end
364+
322365# TODO : Define `@interface interface(a) viewblock`.
323366function BlockArrays. viewblock (
324367 a:: SubArray {
0 commit comments