Skip to content

Commit eac147a

Browse files
committed
Replace generated functions by normal ones
1 parent 150f55c commit eac147a

File tree

2 files changed

+25
-40
lines changed

2 files changed

+25
-40
lines changed

src/blockarray.jl

+21-32
Original file line numberDiff line numberDiff line change
@@ -174,17 +174,13 @@ end
174174
BlockArray(arr::AbstractArray{T, N}, block_sizes::Vararg{AbstractVector{<:Integer}, N}) where {T,N} =
175175
BlockArray{T}(arr, block_sizes...)
176176

177-
@generated function BlockArray{T}(arr::AbstractArray{T, N}, baxes::NTuple{N,AbstractUnitRange{Int}}) where {T,N}
178-
return quote
179-
block_arr = _BlockArray(Array{typeof(arr),N}, baxes)
180-
@nloops $N i i->blockaxes(baxes[i],1) begin
181-
block_index = @ntuple $N i
182-
indices = getindex.(baxes,block_index)
183-
block_arr[block_index...] = arr[indices...]
184-
end
185-
186-
return block_arr
177+
function BlockArray{T}(arr::AbstractArray{T, N}, baxes::NTuple{N,AbstractUnitRange{Int}}) where {T,N}
178+
block_arr = _BlockArray(Array{typeof(arr),N}, baxes)
179+
for block_index in Iterators.product(blockaxes.(baxes,1)...)
180+
indices = getindex.(baxes,block_index)
181+
block_arr[block_index...] = arr[indices...]
187182
end
183+
return block_arr
188184
end
189185

190186
BlockArray{T}(arr::AbstractArray{<:Any, N}, baxes::NTuple{N,AbstractUnitRange{Int}}) where {T,N} =
@@ -277,19 +273,17 @@ end
277273

278274
getsizes(block_sizes, block_index) = getindex.(block_sizes, block_index)
279275

280-
@generated function checksizes(fullsizes::Array{NTuple{N,Int}, N}, block_sizes::NTuple{N,Vector{Int}}) where N
281-
quote
282-
@nloops $N i fullsizes begin
283-
block_index = @ntuple $N i
284-
if fullsizes[block_index...] != getsizes(block_sizes, block_index)
285-
error("size(blocks[", strip(repr(block_index), ['(', ')']),
286-
"]) (= ", fullsizes[block_index...],
287-
") is incompatible with expected size: ",
288-
getsizes(block_sizes, block_index))
289-
end
276+
function checksizes(fullsizes::Array{NTuple{N,Int}, N}, block_sizes::NTuple{N,Vector{Int}}) where N
277+
for I in CartesianIndices(fullsizes)
278+
block_index = Tuple(I)
279+
if fullsizes[block_index...] != getsizes(block_sizes, block_index)
280+
error("size(blocks[", strip(repr(block_index), ['(', ')']),
281+
"]) (= ", fullsizes[block_index...],
282+
") is incompatible with expected size: ",
283+
getsizes(block_sizes, block_index))
290284
end
291-
return fullsizes
292285
end
286+
return fullsizes
293287
end
294288

295289
"""
@@ -452,18 +446,13 @@ end
452446
# Misc #
453447
########
454448

455-
@generated function Base.Array(block_array::BlockArray{T, N, R}) where {T,N,R}
456-
# TODO: This will fail for empty block array
457-
return quote
458-
arr = Array{eltype(T)}(undef, size(block_array))
459-
@nloops $N i i->blockaxes(block_array,i) begin
460-
block_index = @ntuple $N i
461-
indices = getindex.(axes(block_array), block_index)
462-
arr[indices...] = @view block_array[block_index...]
463-
end
464-
465-
return arr
449+
function Base.Array(block_array::BlockArray{T, N, R}) where {T,N,R}
450+
arr = Array{eltype(T)}(undef, size(block_array))
451+
for block_index in Iterators.product(blockaxes(block_array)...)
452+
indices = getindex.(axes(block_array), block_index)
453+
arr[indices...] = @view block_array[block_index...]
466454
end
455+
return arr
467456
end
468457

469458
function Base.fill!(block_array::BlockArray, v)

src/blockindices.jl

+4-8
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,10 @@ end
154154
@inline BlockIndex(a::Block, b::Tuple) = BlockIndex(a.n, b)
155155
@inline BlockIndex(a::Block, b::Int) = BlockIndex(a, (b,))
156156

157-
@generated function BlockIndex(I::NTuple{N, Int}, α::NTuple{M, Int}) where {M,N}
158-
@assert M < N
159-
α_ex = Expr(:tuple, [k <= M ? :(α[$k]) : :(1) for k = 1:N]...)
160-
return quote
161-
$(Expr(:meta, :inline))
162-
@inbounds α2 = $α_ex
163-
BlockIndex(I, α2)
164-
end
157+
@inline function BlockIndex(I::NTuple{N, Int}, α::NTuple{M, Int}) where {M,N}
158+
M <= N || throw(ArgumentError("number of indices must not exceed the number of blocks"))
159+
α2 = ntuple(k -> k <= M ? α[k] : 1, N)
160+
BlockIndex(I, α2)
165161
end
166162

167163
block(b::BlockIndex) = Block(b.I...)

0 commit comments

Comments
 (0)