@@ -20,21 +20,15 @@ export
20
20
21
21
@nospecialize
22
22
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}}
33
24
34
25
"""
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))
36
29
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`).
38
32
39
33
# Examples
40
34
@@ -56,29 +50,86 @@ Dict{String, String} with 3 entries:
56
50
57
51
```
58
52
"""
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
62
101
63
102
"""
64
103
MetadataMatrix
65
104
66
- Shorthand for `MetadataVector{T,P<:AbstractArray{T,2},M}`.
105
+ Shorthand for `MetadataVector{T, P<:AbstractArray{T,2}, M}`.
67
106
68
107
See also: [`MetadataArray`](@ref), [`MetadataMatrix`](@ref)
69
108
"""
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
72
116
73
117
"""
74
118
MetadataVector
75
119
76
- Shorthand for `MetadataVector{T,P<:AbstractArray{T,1},M}`.
120
+ Shorthand for `MetadataVector{T, P<:AbstractArray{T,1}, M}`.
77
121
78
122
See also: [`MetadataArray`](@ref), [`MetadataMatrix`](@ref)
79
123
"""
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))
82
133
83
134
# avoid new methods for every new parent, metadata type permutation
84
135
function Base. convert (T:: Type{<:MetadataArray} , mda:: MetadataArray )
@@ -116,6 +167,7 @@ Base.firstindex(mda::MetadataArray) = firstindex(parent(mda))
116
167
Base. lastindex (mda:: MetadataArray ) = lastindex (parent (mda))
117
168
118
169
Base. pointer (mda:: MetadataArray ) = pointer (parent (mda))
170
+ Base. pointer (mda:: MetadataArray , i:: Integer ) = pointer (parent (mda), i)
119
171
120
172
Base. in (val, mda:: MetadataArray ) = in (val, parent (mda))
121
173
Base. sizehint! (mda:: MetadataArray , n:: Integer ) = sizehint! (parent (mda), n)
@@ -172,16 +224,61 @@ function Base.read!(io::IO, mda::MetadataArray)
172
224
return mda
173
225
end
174
226
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
+
175
272
@specialize
176
273
177
274
@inline function Base. similar (mda:: MetadataArray )
178
- _MDArray (similar (parent (mda)), getfield (mda, :metadata ))
275
+ MetadataArray (similar (parent (mda)), metadata (mda))
179
276
end
180
277
@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))
182
279
end
183
280
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))
185
282
end
186
283
187
284
function Base. reshape (s:: MetadataArray , d:: Dims )
@@ -191,10 +288,10 @@ end
191
288
# region indexing
192
289
Base. @propagate_inbounds Base. getindex (mda:: MetadataArray , i:: Int... ) = parent (mda)[i... ]
193
290
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 ))
195
292
end
196
293
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 ))
198
295
end
199
296
Base. @propagate_inbounds function Base. setindex! (mda:: MetadataArray , val, inds... )
200
297
setindex! (parent (mda),val, inds... )
0 commit comments