@@ -99,9 +99,13 @@ function _size_inner(A::AbstractArray{<:AbstractArray{T,M},N}) where {T,M,N}
99
99
s
100
100
end
101
101
102
- function _size_inner (A:: ArrayOfSimilarArrays{T,M,N} ) where {T,M,N}
103
- sz_inner, sz_outer = split_tuple (size (A. data), Val {M} ())
104
- sz_inner
102
+ @inline function _size_inner (A:: ArrayOfSimilarArrays{T,M,N} ) where {T,M,N}
103
+ front_tuple (size (A. data), Val {M} ())
104
+ end
105
+
106
+
107
+ @inline function _length_inner (A:: AbstractArray{<:AbstractArray{T,M},N} ) where {T,M,N}
108
+ prod (_size_inner (A))
105
109
end
106
110
107
111
@@ -116,20 +120,16 @@ Base.parent(A::ArrayOfSimilarArrays) = A.data
116
120
Base. size (A:: ArrayOfSimilarArrays{T,M,N} ) where {T,M,N} = split_tuple (size (A. data), Val {M} ())[2 ]
117
121
118
122
119
- Base. IndexStyle (A:: ArrayOfSimilarArrays ) = IndexLinear ()
120
123
124
+ Base. @propagate_inbounds Base. getindex (A:: ArrayOfSimilarArrays{T,M,N} , idxs:: Vararg{Integer,N} ) where {T,M,N} =
125
+ view (A. data, _ncolons (Val {M} ())... , idxs... )
121
126
122
- Base. @propagate_inbounds function Base. getindex (A:: ArrayOfSimilarArrays{T,M,N} , idxs:: Vararg{Integer,N} ) where {T,M,N}
123
- @boundscheck checkbounds (A, idxs... )
124
- J = Base. to_indices (A. data, (_ncolons (Val {M} ())... , idxs... ))
125
- @boundscheck checkbounds (A. data, J... )
126
- Base. unsafe_view (A. data, J... )
127
- end
128
127
129
128
Base. @propagate_inbounds Base. setindex! (A:: ArrayOfSimilarArrays{T,M,N} , x:: AbstractArray{U,M} , idxs:: Vararg{Integer,N} ) where {T,M,N,U} =
130
129
setindex! (A. data, x, _ncolons (Val {M} ())... , idxs... )
131
130
132
131
132
+
133
133
@inline function Base. resize! (A:: ArrayOfSimilarArrays{T,M,N} , dims:: Vararg{Integer,N} ) where {T,M,N}
134
134
resize! (A. data, _size_inner (A)... , dims... )
135
135
A
@@ -211,7 +211,7 @@ Base.convert(R::Type{VectorOfSimilarArrays{T}}, A::AbstractVector{<:AbstractArra
211
211
Base. convert (R:: Type{VectorOfSimilarArrays} , A:: AbstractVector{<:AbstractArray{T,M}} ) where {T,M} = R (A)
212
212
213
213
214
- @inline Base. IndexStyle (V :: VectorOfSimilarArrays ) = IndexLinear ()
214
+ @inline Base. IndexStyle (A :: VectorOfSimilarArrays ) = IndexLinear ()
215
215
216
216
217
217
function Base. push! (V:: VectorOfSimilarArrays{T,M} , x:: AbstractArray{U,M} ) where {T,M,U}
@@ -260,6 +260,38 @@ Base.convert(R::Type{ArrayOfSimilarVectors{T}}, A::AbstractArray{<:AbstractVecto
260
260
Base. convert (R:: Type{ArrayOfSimilarVectors} , A:: AbstractArray{<:AbstractVector{T},N} ) where {T,N} = R (A)
261
261
262
262
263
+ # @inline Base.IndexStyle(A::ArrayOfSimilarVectors) = IndexLinear()
264
+
265
+
266
+ # Base.@propagate_inbounds function _linear_data_idxs(A::ArrayOfSimilarVectors, i::Integer)
267
+ # @boundscheck checkbounds(A, i)
268
+ # n_inner = _length_inner(A)
269
+ # i0 = firstindex(A.data)
270
+ # from = (i - i0) * n_inner + i0
271
+ # to = from + n_inner - 1
272
+ # from:to
273
+ # end
274
+
275
+
276
+ # # Base.@propagate_inbounds function _linear_data_idxs(A::ArrayOfSimilarVectors, idxs::AbstractUnitRange{<:Integer})
277
+ # # @boundscheck checkbounds(A, idxs)
278
+ # # n_inner = _length_inner(A)
279
+ # # i0 = firstindex(A.data)
280
+ # # a = first(idxs)
281
+ # # b = last(idxs) + 1
282
+ # # from = (a - i0) * n_inner + i0
283
+ # # to = (b - i0) * n_inner + i0 - 1
284
+ # # from:to
285
+ # # end
286
+
287
+
288
+ # Base.@propagate_inbounds Base.getindex(A::ArrayOfSimilarVectors{T}, i::Integer) where {T} =
289
+ # Base.view(A.data, _linear_data_idxs(A, i))
290
+ #
291
+ # Base.@propagate_inbounds Base.setindex!(A::ArrayOfSimilarVectors{T}, x::AbstractVector{U}, i::Integer) where {T,U} =
292
+ # setindex!(A.data, x, _linear_data_idxs(A, i))
293
+
294
+
263
295
const VectorOfSimilarVectors{
264
296
T,
265
297
P<: AbstractArray{T,2}
@@ -283,3 +315,12 @@ Base.convert(R::Type{VectorOfSimilarVectors{T}}, parent::AbstractArray{U,2}) whe
283
315
Base. convert (R:: Type{VectorOfSimilarVectors} , parent:: AbstractArray{T,2} ) where {T} = R (parent)
284
316
Base. convert (R:: Type{VectorOfSimilarVectors{T}} , A:: AbstractVector{<:AbstractVector{U}} ) where {T,U} = R (A)
285
317
Base. convert (R:: Type{VectorOfSimilarVectors} , A:: AbstractVector{<:AbstractVector{T}} ) where {T} = R (A)
318
+
319
+
320
+ @inline Base. IndexStyle (A:: VectorOfSimilarVectors ) = IndexLinear ()
321
+
322
+ # Base.@propagate_inbounds Base.getindex(A::VectorOfSimilarVectors{T}, i::Integer) where {T} =
323
+ # Base.view(A.data, :, i)
324
+ #
325
+ # Base.@propagate_inbounds Base.setindex!(A::VectorOfSimilarVectors{T}, x::AbstractVector{U}, i::Integer) where {T,U} =
326
+ # setindex!(A.data, x, :, i)
0 commit comments