Skip to content

Commit 38139a6

Browse files
committed
AxisArray constructor improvements
* Allow mixed vectors and axes. * Improve type stability.
1 parent 4e30a82 commit 38139a6

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

src/core.jl

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -163,26 +163,29 @@ end
163163
#
164164
_defaultdimname(i) = i == 1 ? (:row) : i == 2 ? (:col) : i == 3 ? (:page) : Symbol(:dim_, i)
165165

166-
default_axes(A::AbstractArray) = _default_axes(A, indices(A), ())
167-
_default_axes{T,N}(A::AbstractArray{T,N}, inds, axs::NTuple{N,Axis}) = axs
168-
@inline _default_axes{T,N,M}(A::AbstractArray{T,N}, inds, axs::NTuple{M,Axis}) =
169-
_default_axes(A, inds, (axs..., _nextaxistype(axs)(inds[M+1])))
170166
# Why doesn't @pure work here?
171167
@generated function _nextaxistype{M}(axs::NTuple{M,Axis})
172168
name = _defaultdimname(M+1)
173169
:(Axis{$(Expr(:quote, name))})
174170
end
175171

176-
AxisArray(A::AbstractArray, axs::Axis...) = AxisArray(A, axs)
172+
173+
@inline default_axes(A::AbstractArray, args=indices(A)) = _default_axes(A, args, ())
174+
_default_axes{T,N}(A::AbstractArray{T,N}, args::Tuple{}, axs::NTuple{N,Axis}) = axs
175+
_default_axes{T,N}(A::AbstractArray{T,N}, args::Tuple{Any, Vararg{Any}}, axs::NTuple{N,Axis}) = throw(ArgumentError("too many axes provided"))
176+
_default_axes{T,N}(A::AbstractArray{T,N}, args::Tuple{Axis, Vararg{Any}}, axs::NTuple{N,Axis}) = throw(ArgumentError("too many axes provided"))
177+
@inline _default_axes{T,N}(A::AbstractArray{T,N}, args::Tuple{}, axs::Tuple) =
178+
_default_axes(A, args, (axs..., _nextaxistype(axs)(indices(A, length(axs)+1))))
179+
@inline _default_axes{T,N}(A::AbstractArray{T,N}, args::Tuple{Any, Vararg{Any}}, axs::Tuple) =
180+
_default_axes(A, Base.tail(args), (axs..., _nextaxistype(axs)(args[1])))
181+
@inline _default_axes{T,N}(A::AbstractArray{T,N}, args::Tuple{Axis, Vararg{Any}}, axs::Tuple) =
182+
_default_axes(A, Base.tail(args), (axs..., args[1]))
183+
177184
function AxisArray{T,N}(A::AbstractArray{T,N}, axs::NTuple{N,Axis})
178185
checksizes(axs, _size(A)) || throw(ArgumentError("the length of each axis must match the corresponding size of data"))
179186
checknames(axisnames(axs...)...)
180187
AxisArray{T,N,typeof(A),typeof(axs)}(A, axs)
181188
end
182-
function AxisArray{L}(A::AbstractArray, axs::NTuple{L,Axis})
183-
newaxs = _default_axes(A, indices(A), axs)
184-
AxisArray(A, newaxs)
185-
end
186189

187190
@inline checksizes(axs, sz) =
188191
(length(axs[1]) == sz[1]) & checksizes(tail(axs), tail(sz))
@@ -202,7 +205,8 @@ checknames() = ()
202205
# Simple non-type-stable constructors to specify just the name or axis values
203206
AxisArray(A::AbstractArray) = AxisArray(A, ()) # Disambiguation
204207
AxisArray(A::AbstractArray, names::Symbol...) = (inds = indices(A); AxisArray(A, ntuple(i->Axis{names[i]}(inds[i]), length(names))))
205-
AxisArray(A::AbstractArray, vects::AbstractVector...) = AxisArray(A, ntuple(i->Axis{_defaultdimname(i)}(vects[i]), length(vects)))
208+
AxisArray(A::AbstractArray, vects::Union{AbstractVector, Axis}...) = AxisArray(A, vects)
209+
AxisArray(A::AbstractArray, vects::Tuple{Vararg{Union{AbstractVector, Axis}}}) = AxisArray(A, default_axes(A, vects))
206210
function AxisArray{T,N}(A::AbstractArray{T,N}, names::NTuple{N,Symbol}, steps::NTuple{N,Number}, offsets::NTuple{N,Number}=map(zero, steps))
207211
axs = ntuple(i->Axis{names[i]}(range(offsets[i], steps[i], size(A,i))), N)
208212
AxisArray(A, axs...)

0 commit comments

Comments
 (0)