Skip to content

Commit d8f82ad

Browse files
authored
avoid ind2sub in view with Block{1} (#268)
1 parent 881e81e commit d8f82ad

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

src/abstractblockarray.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,10 @@ end
133133

134134
viewblock(block_arr, block) = Base.invoke(view, Tuple{AbstractArray, Any}, block_arr, block)
135135
@inline Base.view(block_arr::AbstractBlockArray{<:Any,N}, block::Block{N}) where N = viewblock(block_arr, block)
136-
@inline Base.view(block_arr::AbstractBlockArray{<:Any,N}, block::Block{1}) where N = view(block_arr, Block(Base._ind2sub(map(Base.OneTo, blocksize(block_arr)), Int(block))...))
136+
@inline function Base.view(block_arr::AbstractBlockArray, block::Block{1})
137+
blkind = BlockRange(blocksize(block_arr))[Int(block)]
138+
view(block_arr, blkind)
139+
end
137140
@inline Base.view(block_arr::AbstractBlockVector, block::Block{1}) = viewblock(block_arr, block)
138141
@inline @propagate_inbounds Base.view(block_arr::AbstractBlockArray, block::Block{1}...) = view(block_arr, Block(block))
139142

src/blockindices.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,10 @@ BlockRange(inds::NTuple{N,AbstractUnitRange{Int}}) where {N} =
325325
BlockRange(inds::Vararg{AbstractUnitRange{Int},N}) where {N} =
326326
BlockRange(inds)
327327

328+
BlockRange() = BlockRange(())
329+
BlockRange(sizes::Tuple{Int, Vararg{Int}}) = BlockRange(map(Base.OneTo, sizes))
330+
BlockRange(sizes::Vararg{Int}) = BlockRange(sizes)
331+
328332
(:)(start::Block{1}, stop::Block{1}) = BlockRange((first(start.n):first(stop.n),))
329333
(:)(start::Block, stop::Block) = throw(ArgumentError("Use `BlockRange` to construct a cartesian range of blocks"))
330334
Base.BroadcastStyle(::Type{<:BlockRange{1}}) = DefaultArrayStyle{1}()

test/test_blockviews.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ bview(a, b) = Base.invoke(view, Tuple{AbstractArray,Any}, a, b)
4444
V[1,1] = -1
4545
@test A[2,8] == -1
4646
@test A[Block(4)] == A[Block(1),Block(2)]
47-
@test_throws BlockBoundsError A[Block(10)]
47+
@test_throws BoundsError A[Block(10)]
4848

4949
V = view(A, Block(3, 2))
5050
@test size(V) == (3, 4)

0 commit comments

Comments
 (0)