Skip to content

Commit 3cbedb9

Browse files
committed
More constructors and resizing methods
1 parent c343186 commit 3cbedb9

File tree

1 file changed

+123
-26
lines changed

1 file changed

+123
-26
lines changed

src/MetadataArrays.jl

Lines changed: 123 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,15 @@ export
2020

2121
@nospecialize
2222

23-
struct MetadataArray{T, N, P<:AbstractArray,M<:Union{NamedTuple, AbstractDict{Symbol}}} <: AbstractArray{T, N}
24-
parent::P
25-
metadata::M
26-
27-
global function _MDArray(p, md)
28-
new{eltype(p), ndims(p), typeof(p), typeof(md)}(p, md)
29-
end
30-
end
31-
32-
BitArray(mda::MetadataArray) = BitArray(parent(mda))
23+
const MDType = Union{NamedTuple, AbstractDict{Symbol}}
3324

3425
"""
35-
MetadataArray(parent::AbstractArray, metadata)
26+
MetadataArray(x::AbstractArray, md::Union{AbstractDict{Symbol}, NamedTuple})
27+
MetadataArray(x::AbstractArray, md::Pair{Symbol}) -> MetadataArray(x, Dict(md...))
28+
MetadataArray(x::AbstractArray; md...) -> MetadataArray(x, NamedTuple(md))
3629
37-
Custom `AbstractArray` object to store an `AbstractArray` `parent` as well as some `metadata`.
30+
Custom `AbstractArray` object to store an `AbstractArray` (`x`) as well as some
31+
metadata (`md`).
3832
3933
# Examples
4034
@@ -56,29 +50,86 @@ Dict{String, String} with 3 entries:
5650
5751
```
5852
"""
59-
MetadataArray(p::AbstractArray, mdn::Union{NamedTuple, AbstractDict{Symbol}, AbstractDict{String}}) = _MDArray(p, mdn)
60-
MetadataArray(p::AbstractArray, md) = MetadataArray(p, NamedTuple(md))
61-
MetadataArray(p::AbstractArray; kwargs...) = MetadataArray(p, values(kwargs))
53+
struct MetadataArray{T, N, P<:AbstractArray{T, N}, M<:MDType} <: AbstractArray{T, N}
54+
parent::P
55+
metadata::M
56+
57+
global function _MDArray(p, md)
58+
new{eltype(p), ndims(p), typeof(p), typeof(md)}(p, md)
59+
end
60+
61+
function MetadataArray{T, N, P, M}(p::AbstractArray, md::MDType) where {T, N, P, M}
62+
new{T, N, P, M}(p, md)
63+
end
64+
function MetadataArray{T, N, P, M}(p::AbstractArray, kv::Pair{Symbol}, kvs::Pair{Symbol}...) where {T, N, P, M}
65+
MetadataArray{T, N, P, M}(p, M(kv, kvs...))
66+
end
67+
function MetadataArray{T, N, P, M}(p::AbstractArray; kwargs...) where {T, N, P, M}
68+
if isempty(kwargs) && isa(p, MetadataArray)
69+
return convert(MetadataArray{T, N, P, M}, p)
70+
else
71+
return MetadataArray{T, N, P, M}(p, M(; kwargs...))
72+
end
73+
end
74+
75+
76+
function MetadataArray{T, N, P}(p::AbstractArray, md::MDType) where {T, N, P}
77+
MetadataArray{T, N, P, typeof(md)}(p, md)
78+
end
79+
function MetadataArray{T, N, P}(p::AbstractArray; kwargs...) where {T, N, P}
80+
if isempty(kwargs) && isa(p, MetadataArray)
81+
return convert(MetadataArray{T, N, P}, p)
82+
else
83+
return MetadataArray{T, N, P}(p, values(kwargs))
84+
end
85+
end
86+
function MetadataArray{T, N, P}(p::AbstractArray, kv::Pair{Symbol}, kvs::Pair{Symbol}...) where {T, N, P}
87+
MetadataArray{T, N, P}(p, Dict(kv, kvs...))
88+
end
89+
90+
91+
function MetadataArray{T, N}(p::AbstractArray, args...; kwargs...) where {T, N}
92+
MetadataArray{T, N, typeof(p)}(p, args...; kwargs...)
93+
end
94+
function MetadataArray{T}(p::AbstractArray, args...; kwargs...) where {T}
95+
MetadataArray{eltype(p), ndims(p)}(p, args...; kwargs...)
96+
end
97+
function MetadataArray(p::AbstractArray, args...; kwargs...)
98+
MetadataArray{eltype(p)}(p, args...; kwargs...)
99+
end
100+
end
62101

63102
"""
64103
MetadataMatrix
65104
66-
Shorthand for `MetadataVector{T,P<:AbstractArray{T,2},M}`.
105+
Shorthand for `MetadataVector{T, P<:AbstractArray{T,2}, M}`.
67106
68107
See also: [`MetadataArray`](@ref), [`MetadataMatrix`](@ref)
69108
"""
70-
const MetadataMatrix{T,P<:AbstractArray{T,2},M} = MetadataArray{T, 2, P, M}
71-
MetadataMatrix(m::AbstractMatrix, md) = MetadataArray(m, md)
109+
const MetadataMatrix{T, P<:AbstractMatrix{T}, M} = MetadataArray{T, 2, P, M}
110+
function MetadataMatrix{T}(p::AbstractMatrix, args...; kwargs...) where {T}
111+
MetadataArray{T, 2}(p, args...; kwargs...)
112+
end
113+
function MetadataMatrix(p::AbstractMatrix, args...; kwargs...)
114+
MetadataMatrix{eltype(p)}(p, args...; kwargs...)
115+
end
72116

73117
"""
74118
MetadataVector
75119
76-
Shorthand for `MetadataVector{T,P<:AbstractArray{T,1},M}`.
120+
Shorthand for `MetadataVector{T, P<:AbstractArray{T,1}, M}`.
77121
78122
See also: [`MetadataArray`](@ref), [`MetadataMatrix`](@ref)
79123
"""
80-
const MetadataVector{T,P<:AbstractArray{T,1},M} = MetadataArray{T, 1, P, M}
81-
MetadataVector(v::AbstractVector, md) = MetadataArray(v, md)
124+
const MetadataVector{T, P<:AbstractVector{T}, M} = MetadataArray{T, 1, P, M}
125+
function MetadataVector{T}(p::AbstractVector{T}, args...; kwargs...) where {T}
126+
MetadataArray{T, 1}(p, args...; kwargs...)
127+
end
128+
function MetadataVector(p::AbstractVector, args...; kwargs...)
129+
MetadataVector{eltype(p)}(p, args...; kwargs...)
130+
end
131+
132+
Base.BitArray(mda::MetadataArray) = BitArray(parent(mda))
82133

83134
# avoid new methods for every new parent, metadata type permutation
84135
function Base.convert(T::Type{<:MetadataArray}, mda::MetadataArray)
@@ -116,6 +167,7 @@ Base.firstindex(mda::MetadataArray) = firstindex(parent(mda))
116167
Base.lastindex(mda::MetadataArray) = lastindex(parent(mda))
117168

118169
Base.pointer(mda::MetadataArray) = pointer(parent(mda))
170+
Base.pointer(mda::MetadataArray, i::Integer) = pointer(parent(mda), i)
119171

120172
Base.in(val, mda::MetadataArray) = in(val, parent(mda))
121173
Base.sizehint!(mda::MetadataArray, n::Integer) = sizehint!(parent(mda), n)
@@ -172,16 +224,61 @@ function Base.read!(io::IO, mda::MetadataArray)
172224
return mda
173225
end
174226

227+
#region resizing!
228+
function Base.resize!(v::MetadataVector, n::Integer)
229+
resize!(parent(v), n)
230+
return v
231+
end
232+
function Base.insert!(v::MetadataVector, i::Integer, item)
233+
insert!(parent(v), i, item)
234+
return v
235+
end
236+
function Base.push!(v::MetadataVector, item)
237+
push!(parent(v), item)
238+
return v
239+
end
240+
function Base.pushfirst!(v::MetadataVector, item)
241+
pushfirst!(parent(v), item)
242+
return v
243+
end
244+
function Base.append!(v::MetadataVector, iters...)
245+
append!(parent(v), iters...)
246+
return v
247+
end
248+
function Base.prepend!(v::MetadataVector, iters...)
249+
prepend!(parent(v), iters...)
250+
return v
251+
end
252+
function Base.deleteat!(v::MetadataVector, inds)
253+
deleteat!(parent(v), inds)
254+
return v
255+
end
256+
function Base.keepat!(v::MetadataVector, inds)
257+
keepat!(parent(v), inds)
258+
return v
259+
end
260+
function Base.empty!(v::MetadataVector)
261+
empty!(parent(v))
262+
return v
263+
end
264+
265+
Base.pop!(v::MetadataVector) = pop!(parent(v))
266+
Base.popfirst!(v::MetadataVector) = popfirst!(parent(v))
267+
Base.popat!(v::MetadataVector, i::Integer) = popat!(parent(v), i)
268+
Base.popat!(v::MetadataVector, i::Integer, default) = popat!(parent(v), i, default)
269+
270+
#endregion resizing!
271+
175272
@specialize
176273

177274
@inline function Base.similar(mda::MetadataArray)
178-
_MDArray(similar(parent(mda)), getfield(mda, :metadata))
275+
MetadataArray(similar(parent(mda)), metadata(mda))
179276
end
180277
@inline function Base.similar(mda::MetadataArray, ::Type{T}) where {T}
181-
_MDArray(similar(parent(mda), T), metadata(mda))
278+
MetadataArray(similar(parent(mda), T), metadata(mda))
182279
end
183280
function Base.similar(mda::MetadataArray, ::Type{T}, dims::Dims) where {T}
184-
_MDArray(similar(parent(mda), T, dims), metadata(mda))
281+
MetadataArray(similar(parent(mda), T, dims), metadata(mda))
185282
end
186283

187284
function Base.reshape(s::MetadataArray, d::Dims)
@@ -191,10 +288,10 @@ end
191288
#region indexing
192289
Base.@propagate_inbounds Base.getindex(mda::MetadataArray, i::Int...) = parent(mda)[i...]
193290
Base.@propagate_inbounds function Base.getindex(mda::MetadataArray, inds...)
194-
_MDArray(parent(mda)[inds...], getfield(mda, :metadata))
291+
MetadataArray(parent(mda)[inds...], getfield(mda, :metadata))
195292
end
196293
Base.@propagate_inbounds function Base.view(mda::MetadataArray, inds...)
197-
_MDArray(view(parent(mda), inds...), getfield(mda, :metadata))
294+
MetadataArray(view(parent(mda), inds...), getfield(mda, :metadata))
198295
end
199296
Base.@propagate_inbounds function Base.setindex!(mda::MetadataArray, val, inds...)
200297
setindex!(parent(mda),val, inds...)

0 commit comments

Comments
 (0)