diff --git a/Project.toml b/Project.toml index df1e6cc4..91c8ddd3 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ComponentArrays" uuid = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66" authors = ["Jonnie Diegelman <47193959+jonniedie@users.noreply.github.com>"] -version = "0.13.12" +version = "0.13.13" [deps] ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" diff --git a/src/array_interface.jl b/src/array_interface.jl index 5bbd7542..745dde5a 100644 --- a/src/array_interface.jl +++ b/src/array_interface.jl @@ -59,10 +59,10 @@ function Base.vcat(x::AbstractComponentVecOrMat, y::AbstractComponentVecOrMat) end Base.vcat(x::CV...) where {CV<:AdjOrTransComponentArray} = ComponentArray(reduce(vcat, map(y->getdata(y.parent)', x)), getaxes(x[1])) Base.vcat(x::ComponentVector, args...) = vcat(getdata(x), getdata.(args)...) -Base.vcat(x::ComponentVector, args::Union{Number, UniformScaling, AbstractVecOrMat}...) = vcat(getdata(x), getdata.(args)...) +Base.vcat(x::ComponentVector, args::Vararg{Union{Number, UniformScaling, AbstractVecOrMat}}) = vcat(getdata(x), getdata.(args)...) Base.vcat(x::ComponentVector, args::Vararg{AbstractVector{T}, N}) where {T,N} = vcat(getdata(x), getdata.(args)...) -function Base.hvcat(row_lengths::NTuple{N,Int}, xs::AbstractComponentVecOrMat...) where {N} +function Base.hvcat(row_lengths::NTuple{N,Int}, xs::Vararg{AbstractComponentVecOrMat}) where {N} i = 1 idxs = UnitRange{Int}[] for row_length in row_lengths @@ -91,28 +91,28 @@ Base.to_index(x::ComponentArray, i) = i # Get ComponentArray index Base.@propagate_inbounds Base.getindex(x::ComponentArray, idx::CartesianIndex) = getdata(x)[idx] -Base.@propagate_inbounds Base.getindex(x::ComponentArray, idx::FlatIdx...) = getdata(x)[idx...] -Base.@propagate_inbounds function Base.getindex(x::ComponentArray, idx::FlatOrColonIdx...) +Base.@propagate_inbounds Base.getindex(x::ComponentArray, idx::Vararg{FlatIdx}) = getdata(x)[idx...] +Base.@propagate_inbounds function Base.getindex(x::ComponentArray, idx::Vararg{FlatOrColonIdx}) axs = map((ax, i) -> getindex(ax, i).ax, getaxes(x), idx) axs = remove_nulls(axs...) return ComponentArray(getdata(x)[idx...], axs...) end Base.@propagate_inbounds Base.getindex(x::ComponentArray, ::Colon) = getdata(x)[:] -Base.@propagate_inbounds Base.getindex(x::ComponentArray, ::Colon...) = x +Base.@propagate_inbounds Base.getindex(x::ComponentArray, ::Colon, ::Vararg{Colon}) = x @inline Base.getindex(x::ComponentArray, idx...) = getindex(x, toval.(idx)...) -@inline Base.getindex(x::ComponentArray, idx::Val...) = _getindex(getindex, x, idx...) +@inline Base.getindex(x::ComponentArray, idx::Vararg{Val}) = _getindex(getindex, x, idx...) # Set ComponentArray index Base.@propagate_inbounds Base.setindex!(x::ComponentArray, v, idx::FlatOrColonIdx...) = setindex!(getdata(x), v, idx...) Base.@propagate_inbounds Base.setindex!(x::ComponentArray, v, ::Colon) = setindex!(getdata(x), v, :) @inline Base.setindex!(x::ComponentArray, v, idx...) = setindex!(x, v, toval.(idx)...) -@inline Base.setindex!(x::ComponentArray, v, idx::Val...) = _setindex!(x, v, idx...) +@inline Base.setindex!(x::ComponentArray, v, idx::Vararg{Val}) = _setindex!(x, v, idx...) # Explicitly view -Base.@propagate_inbounds Base.view(x::ComponentArray, idx::ComponentArrays.FlatIdx...) = view(getdata(x), idx...) +Base.@propagate_inbounds Base.view(x::ComponentArray, idx::Vararg{ComponentArrays.FlatIdx}) = view(getdata(x), idx...) Base.@propagate_inbounds Base.view(x::ComponentArray, idx...) = _getindex(view, x, toval.(idx)...) -Base.@propagate_inbounds Base.maybeview(x::ComponentArray, idx::ComponentArrays.FlatIdx...) = Base.maybeview(getdata(x), idx...) +Base.@propagate_inbounds Base.maybeview(x::ComponentArray, idx::Vararg{ComponentArrays.FlatIdx}) = Base.maybeview(getdata(x), idx...) Base.@propagate_inbounds Base.maybeview(x::ComponentArray, idx...) = _getindex(Base.maybeview, x, toval.(idx)...) # Generated get and set index methods to do all of the heavy lifting in the type domain diff --git a/src/axis.jl b/src/axis.jl index 8b5ab406..afa5d7d0 100644 --- a/src/axis.jl +++ b/src/axis.jl @@ -7,7 +7,7 @@ abstract type AbstractAxis{IdxMap} end # struct FlatAxis <: AbstractAxis{NamedTuple()} end struct NullAxis <: AbstractAxis{nothing} end -const VarAxes = Tuple{Vararg{<:AbstractAxis}} +const VarAxes = Tuple{Vararg{AbstractAxis}} """ @@ -50,7 +50,7 @@ Axis(;kwargs...) = Axis((;kwargs...)) function Axis(symbols::Union{AbstractVector{Symbol}, NTuple{N,Symbol}}) where {N} return Axis(NamedTuple{(symbols...,)}((eachindex(symbols)...,))) end -Axis(symbols::Symbol...) = Axis(symbols) +Axis(symbols::Vararg{Symbol}) = Axis(symbols) const FlatAxis = Axis{NamedTuple()} const NullorFlatAxis = Union{NullAxis, FlatAxis} @@ -138,7 +138,7 @@ const NotPartitionedAxis = Union{Axis{IdxMap}, FlatAxis, NullAxis, ShapedAxis{Sh const NotShapedOrPartitionedAxis = Union{Axis{IdxMap}, FlatAxis, NullAxis} where {IdxMap} -Base.merge(axs::Axis...) = Axis(merge(indexmap.(axs)...)) +Base.merge(axs::Vararg{Axis}) = Axis(merge(indexmap.(axs)...)) Base.firstindex(ax::AbstractAxis) = first(viewindex(first(indexmap(ax)))) Base.lastindex(ax::AbstractAxis) = last(viewindex(last(indexmap(ax)))) diff --git a/src/componentarray.jl b/src/componentarray.jl index 7c6a0650..975f3e8e 100644 --- a/src/componentarray.jl +++ b/src/componentarray.jl @@ -31,7 +31,7 @@ julia> collect(x) 2 ``` """ -struct ComponentArray{T,N,A<:AbstractArray{T,N},Axes<:Tuple{Vararg{<:AbstractAxis}}} <: DenseArray{T,N} +struct ComponentArray{T,N,A<:AbstractArray{T,N},Axes<:Tuple{Vararg{AbstractAxis}}} <: DenseArray{T,N} data::A axes::Axes end diff --git a/src/similar_convert_copy.jl b/src/similar_convert_copy.jl index b0b35c4a..19533abc 100644 --- a/src/similar_convert_copy.jl +++ b/src/similar_convert_copy.jl @@ -1,6 +1,6 @@ -const CombinedAnyDims = Tuple{<:CombinedAxis, Vararg{<:CombinedOrRegularAxis}} -const AnyCombinedAnyDims = Tuple{<:CombinedOrRegularAxis, <:CombinedAxis, Vararg{<:CombinedOrRegularAxis}} -const CombinedCombinedAnyDims = Tuple{<:CombinedAxis, <:CombinedAxis, Vararg{<:CombinedOrRegularAxis}} +const CombinedAnyDims = Tuple{<:CombinedAxis, Vararg{CombinedOrRegularAxis}} +const AnyCombinedAnyDims = Tuple{<:CombinedOrRegularAxis, <:CombinedAxis, Vararg{CombinedOrRegularAxis}} +const CombinedCombinedAnyDims = Tuple{<:CombinedAxis, <:CombinedAxis, Vararg{CombinedOrRegularAxis}} # Similar Base.similar(x::ComponentArray) = ComponentArray(similar(getdata(x)), getaxes(x)...) diff --git a/test/Project.toml b/test/Project.toml index 27a30e71..a4818730 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,5 +1,6 @@ [deps] ArrayInterfaceCore = "30b0a656-2188-435a-8636-2ec0e6a096e2" +BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41" ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" Functors = "d9f16b24-f501-4c13-a1f2-28368ffc5196" diff --git a/test/runtests.jl b/test/runtests.jl index 4779ac1e..f25b76cc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,4 +1,5 @@ using ComponentArrays +using BenchmarkTools using ForwardDiff using InvertedIndices using LabelledArrays @@ -37,6 +38,16 @@ _a, _b, _c = Val.((:a, :b, :c)) ## Tests +@testset "Allocations and Inference" begin + @test @ballocated($ca.c.a.a) == 0 + @test @ballocated(@view $ca[:c]) == 0 + @test @ballocated(@view $cmat[:c, :c]) == 0 + + f = (out, x) -> (out .= x .+ x) + out = deepcopy(ca) + @test @ballocated($f($out, $ca)) == 0 +end + @testset "Utilities" begin @test_deprecated ComponentArrays.getval.(fastindices(:a, :b, :c)) == (:a, :b, :c) @test_deprecated fastindices(:a, Val(:b)) == (Val(:a), Val(:b))