Skip to content

Commit 1b737cf

Browse files
committed
Fix IndexStyle, getindex and setindex for ArrayOfSimilarArrays
1 parent c4b39a9 commit 1b737cf

File tree

1 file changed

+52
-11
lines changed

1 file changed

+52
-11
lines changed

src/array_of_similar_arrays.jl

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,13 @@ function _size_inner(A::AbstractArray{<:AbstractArray{T,M},N}) where {T,M,N}
9999
s
100100
end
101101

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))
105109
end
106110

107111

@@ -116,20 +120,16 @@ Base.parent(A::ArrayOfSimilarArrays) = A.data
116120
Base.size(A::ArrayOfSimilarArrays{T,M,N}) where {T,M,N} = split_tuple(size(A.data), Val{M}())[2]
117121

118122

119-
Base.IndexStyle(A::ArrayOfSimilarArrays) = IndexLinear()
120123

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...)
121126

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
128127

129128
Base.@propagate_inbounds Base.setindex!(A::ArrayOfSimilarArrays{T,M,N}, x::AbstractArray{U,M}, idxs::Vararg{Integer,N}) where {T,M,N,U} =
130129
setindex!(A.data, x, _ncolons(Val{M}())..., idxs...)
131130

132131

132+
133133
@inline function Base.resize!(A::ArrayOfSimilarArrays{T,M,N}, dims::Vararg{Integer,N}) where {T,M,N}
134134
resize!(A.data, _size_inner(A)..., dims...)
135135
A
@@ -211,7 +211,7 @@ Base.convert(R::Type{VectorOfSimilarArrays{T}}, A::AbstractVector{<:AbstractArra
211211
Base.convert(R::Type{VectorOfSimilarArrays}, A::AbstractVector{<:AbstractArray{T,M}}) where {T,M} = R(A)
212212

213213

214-
@inline Base.IndexStyle(V::VectorOfSimilarArrays) = IndexLinear()
214+
@inline Base.IndexStyle(A::VectorOfSimilarArrays) = IndexLinear()
215215

216216

217217
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
260260
Base.convert(R::Type{ArrayOfSimilarVectors}, A::AbstractArray{<:AbstractVector{T},N}) where {T,N} = R(A)
261261

262262

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+
263295
const VectorOfSimilarVectors{
264296
T,
265297
P<:AbstractArray{T,2}
@@ -283,3 +315,12 @@ Base.convert(R::Type{VectorOfSimilarVectors{T}}, parent::AbstractArray{U,2}) whe
283315
Base.convert(R::Type{VectorOfSimilarVectors}, parent::AbstractArray{T,2}) where {T} = R(parent)
284316
Base.convert(R::Type{VectorOfSimilarVectors{T}}, A::AbstractVector{<:AbstractVector{U}}) where {T,U} = R(A)
285317
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

Comments
 (0)