@@ -190,6 +190,26 @@ function Base.view(
190
190
return viewblock (a, block... )
191
191
end
192
192
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
+
193
213
# XXX : TODO : Distinguish if a sub-view of the block needs to be taken!
194
214
# Define a new `SubBlockSlice` which is used in:
195
215
# `@interface interface(a) to_indices(a, inds, I::Tuple{UnitRange{<:Integer},Vararg{Any}})`
@@ -199,12 +219,17 @@ function BlockArrays.viewblock(
199
219
a:: SubArray{T,N,<:AbstractBlockSparseArray{T,N},<:Tuple{Vararg{BlockSliceCollection,N}}} ,
200
220
block:: Vararg{Block{1},N} ,
201
221
) 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... )
208
233
end
209
234
210
235
function to_blockindexrange (
@@ -291,6 +316,15 @@ function Base.view(
291
316
) where {T,N}
292
317
return viewblock (a, block... )
293
318
end
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
294
328
function BlockArrays. viewblock (
295
329
a:: SubArray {
296
330
T,N,<: AbstractBlockSparseArray{T,N} ,<: Tuple{Vararg{SubBlockSliceCollection,N}}
302
336
303
337
blockedslice_blocks (x:: BlockSlice ) = x. block
304
338
blockedslice_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
305
347
306
348
# TODO : Define `@interface interface(a) viewblock`.
307
349
function BlockArrays. viewblock (
@@ -319,6 +361,7 @@ function BlockArrays.viewblock(
319
361
end
320
362
return @view parent (a)[brs... ]
321
363
end
364
+
322
365
# TODO : Define `@interface interface(a) viewblock`.
323
366
function BlockArrays. viewblock (
324
367
a:: SubArray {
0 commit comments