diff --git a/Project.toml b/Project.toml index da6648c..59c022c 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "InfiniteArrays" uuid = "4858937d-0d70-526a-a4dd-2d5cb5dd786c" -version = "0.13.7" +version = "0.13.8" [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" diff --git a/src/infarrays.jl b/src/infarrays.jl index 373ef2e..4d0208b 100644 --- a/src/infarrays.jl +++ b/src/infarrays.jl @@ -19,12 +19,16 @@ Matrix{T}(::UndefInitializer, ::Integer, ::PosInfinity) where T = throw(Argument Vector{T}(::UndefInitializer, ::Tuple{PosInfinity}) where T = throw(ArgumentError("Cannot create infinite Array")) Vector{T}(::UndefInitializer, ::PosInfinity) where T = throw(ArgumentError("Cannot create infinite Array")) -similar(A::AbstractArray, ::Type{T}, axes::Tuple{OneToInf{Int}}) where T = cache(Zeros{T}(axes)) -similar(A::AbstractArray, ::Type{T}, axes::Tuple{OneToInf{Int},OneToInf{Int}}) where T = cache(Zeros{T}(axes)) -similar(A::AbstractArray, ::Type{T}, dims::Tuple{PosInfinity}) where T = cache(Zeros{T}(dims)) -similar(A::AbstractArray, ::Type{T}, dims::Tuple{PosInfinity,PosInfinity}) where T = cache(Zeros{T}(dims)) -similar(A::AbstractArray, ::Type{T}, dims::Tuple{Integer,PosInfinity}) where T = cache(Zeros{T}(dims)) -similar(A::AbstractArray, ::Type{T}, dims::Tuple{PosInfinity,Integer}) where T = cache(Zeros{T}(dims)) +filltype(_, ::Type{T}, axes) where T = Zeros{T}(axes) +filltype(F::AbstractFill, ::Type{T}, axes) where T = Fill{T}(getindex_value(F), axes) +filltype(F::Vcat, ::Type{T}, axes) where T = filltype(F.args[end], T, axes) + +similar(A::AbstractArray, ::Type{T}, axes::Tuple{OneToInf{Int}}) where T = cache(filltype(A, T, axes)) +similar(A::AbstractArray, ::Type{T}, axes::Tuple{OneToInf{Int},OneToInf{Int}}) where T = cache(filltype(A, T, axes)) +similar(A::AbstractArray, ::Type{T}, dims::Tuple{PosInfinity}) where T = cache(filltype(A, T, dims)) +similar(A::AbstractArray, ::Type{T}, dims::Tuple{PosInfinity,PosInfinity}) where T = cache(filltype(A, T, dims)) +similar(A::AbstractArray, ::Type{T}, dims::Tuple{Integer,PosInfinity}) where T = cache(filltype(A, T, dims)) +similar(A::AbstractArray, ::Type{T}, dims::Tuple{PosInfinity,Integer}) where T = cache(filltype(A, T, dims)) similar(::Type{<:AbstractArray{T}}, axes::Tuple{OneToInf{Int}}) where T = cache(Zeros{T}(axes)) similar(::Type{<:AbstractArray{T}}, axes::Tuple{OneToInf{Int},OneToInf{Int}}) where T = cache(Zeros{T}(axes)) @@ -35,6 +39,7 @@ similar(::Type{<:AbstractArray{T}}, dims::Tuple{PosInfinity,PosInfinity}) where similar(::Type{<:AbstractArray{T}}, dims::Tuple{Integer,PosInfinity}) where T = cache(Zeros{T}(dims)) similar(::Type{<:AbstractArray{T}}, dims::Tuple{PosInfinity,Integer}) where T = cache(Zeros{T}(dims)) + similar(arr::AbstractArray{T}, sz::Union{Infinity,Integer,AbstractUnitRange}...) where T = similar(arr, Base.to_shape(sz)...) similar(arr::AbstractArray, ::Type{T}, sz::Union{Infinity,Integer,AbstractUnitRange}...) where T = similar(arr, T, Base.to_shape(sz)...) diff --git a/test/runtests.jl b/test/runtests.jl index 2eb85df..fc338c9 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -750,6 +750,9 @@ end @test [randn(2,2); Zeros(∞,2)] isa Vcat{<:Any,2,<:Tuple{Array,Zeros}} + x = [[1, 3]; Fill(2,∞)] + @test similar(x)[1:10] == fill(2,10) + a = [[1,2,3]; zeros(Int,∞)] @test a[3:∞][1:5] == a[3:7] @test cache(1:∞)[2:∞][1:5] == 2:6