Skip to content

Commit d89b623

Browse files
authored
Make Chunked Fill Array hold chunks (#37)
* Make Chunked Fill Array hold chunks This moves the construction of regular chunks from the eachchunk call to the constructor of the Chunked FillArray. This enables to reuse the existing chunking pattern of actual data when constructing a ChunkedFillArray. * Make the chunk type a typeparameter of ChunkedFillArray
1 parent 54d1e7e commit d89b623

File tree

2 files changed

+46
-10
lines changed

2 files changed

+46
-10
lines changed

src/DiskArrayTools.jl

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -378,16 +378,28 @@ function eachchunk(aconc::ConcatDiskArray)
378378
end
379379

380380
"""
381-
ChunkedFillArray(v::T, size, chunksize)
382-
Construct a lazy fill array with a value `v` with the n-dimensional `size` which behaves as a chunked DiskArray with chunks of the size `chunksize`.
381+
ChunkedFillArray(value::T, size, chunks)
382+
Construct a lazy fill array with a value `value` with the n-dimensional `size` which behaves as a chunked DiskArray with a chunking structure of `chunks`.
383383
"""
384-
struct ChunkedFillArray{T,N} <: AbstractDiskArray{T,N}
385-
v::T
386-
s::NTuple{N,Int}
387-
chunksize::NTuple{N,Int}
388-
end
389-
Base.size(x::ChunkedFillArray) = x.s
390-
readblock!(x::ChunkedFillArray,aout,r::AbstractVector...) = aout .= x.v
391-
eachchunk(x::ChunkedFillArray) = GridChunks(x.s,x.chunksize)
384+
struct ChunkedFillArray{T,N,C} <: AbstractDiskArray{T,N}
385+
value::T
386+
arrsize::NTuple{N,Int}
387+
chunks::C
388+
function ChunkedFillArray{T,N}(value, arrsize, chunksize::NTuple{N, Int}) where {T,N}
389+
chunks = GridChunks(arrsize, chunksize)
390+
new{T,N, typeof(chunks)}(value, arrsize, chunks)
391+
end
392+
ChunkedFillArray{T,N}(value, arrsize, chunks::GridChunks{N}) where {T,N} = new{T,N, typeof(chunks)}(value, arrsize, chunks)
393+
end
394+
395+
ChunkedFillArray(value::T, arrsize::NTuple{N, Int}, chunksize::NTuple{N,Int}) where {T,N} = ChunkedFillArray{T,N}(value, arrsize, GridChunks(arrsize, chunksize))
396+
ChunkedFillArray(value::T, arrsize::NTuple{N, Int}, chunks::GridChunks{N}) where {T,N} = ChunkedFillArray{T,N}(value, arrsize, chunks)
397+
ChunkedFillArray{T}(value, arrsize::NTuple{N, Int}, chunksize::NTuple{N,Int}) where {T,N} = ChunkedFillArray{T,N}(value, arrsize, GridChunks(arrsize, chunksize))
398+
ChunkedFillArray{T}(value, arrsize::NTuple{N, Int}, chunks::GridChunks{N}) where {T,N} = ChunkedFillArray{T,N}(value, arrsize, chunks)
399+
400+
401+
Base.size(x::ChunkedFillArray) = x.arrsize
402+
readblock!(x::ChunkedFillArray,aout,r::AbstractVector...) = aout .= x.value
403+
eachchunk(x::ChunkedFillArray) = x.chunks
392404

393405
end # module

test/chunkedfillarray.jl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,28 @@ using DiskArrays, DiskArrayTools
55
@test eltype(a) == Int
66
@test all(==(1), a)
77
@test eachchunk(a) isa DiskArrays.GridChunks
8+
afloat = ChunkedFillArray{Float64,2}(1,(100,100), (10,10))
9+
@test eltype(afloat) == Float64
10+
@test all(==(1.), a)
11+
@test eachchunk(a) isa DiskArrays.GridChunks
12+
afloat = ChunkedFillArray{Float64}(1,(100,100), (10,10))
13+
@test eltype(afloat) == Float64
14+
@test all(==(1.), a)
15+
@test eachchunk(a) isa DiskArrays.GridChunks
16+
end
17+
18+
@testset "Chunked Fill Array Chunks provided" begin
19+
chunks = DiskArrays.GridChunks(DiskArrays.IrregularChunks([0,20,50,100]), DiskArrays.RegularChunks(10,0,100))
20+
a = ChunkedFillArray(1, (100,100),chunks)
21+
@test eltype(a) == Int
22+
@test all(==(1), a)
23+
@test eachchunk(a) isa DiskArrays.GridChunks
24+
afloat = ChunkedFillArray{Float64,2}(1,(100,100), chunks)
25+
@test eltype(afloat) == Float64
26+
@test all(==(1.), a)
27+
@test eachchunk(a) isa DiskArrays.GridChunks
28+
afloat = ChunkedFillArray{Float64}(1,(100,100), chunks)
29+
@test eltype(afloat) == Float64
30+
@test all(==(1.), a)
31+
@test eachchunk(a) isa DiskArrays.GridChunks
832
end

0 commit comments

Comments
 (0)