@@ -57,16 +57,37 @@ struct ArrayOfSimilarArrays{
57
57
} <: AbstractArrayOfSimilarArrays{T,M,N}
58
58
data:: P
59
59
60
- function ArrayOfSimilarArrays {M} (parent:: AbstractArray{T ,L} ) where {T,M,L}
60
+ function ArrayOfSimilarArrays {T, M} (parent:: AbstractArray{U ,L} ) where {T,M,L,U }
61
61
size_inner, size_outer = split_tuple (size (parent), Val {M} ())
62
62
N = length (size_outer)
63
- P = typeof (parent)
64
- new {T,M,N,L,P} (parent)
63
+ conv_parent = _convert_elype (T, parent)
64
+ P = typeof (conv_parent)
65
+ new {T,M,N,L,P} (conv_parent)
65
66
end
66
67
end
67
68
68
69
export ArrayOfSimilarArrays
69
70
71
+ function ArrayOfSimilarArrays {T,M,N} (A:: AbstractArray{<:AbstractArray{U,M},N} ) where {T,M,N,U}
72
+ B = ArrayOfSimilarArrays {T,M} (Array {T} (_size_inner (A)... , size (A)... ))
73
+ copy! (B, A)
74
+ end
75
+
76
+ ArrayOfSimilarArrays {T} (A:: AbstractArray{<:AbstractArray{U,M},N} ) where {T,M,N,U} =
77
+ ArrayOfSimilarArrays {T,M,N} (A)
78
+
79
+ ArrayOfSimilarArrays (A:: AbstractArray{<:AbstractArray{T,M},N} ) where {T,M,N} =
80
+ ArrayOfSimilarArrays {T,M,N} (A)
81
+
82
+
83
+ @static if VERSION < v " 0.7.0-DEV.3138"
84
+ Base. convert (R:: Type{ArrayOfSimilarArrays{T,M}} , parent:: AbstractArray{U,L} ) where {T,M,L,U} = R (parent)
85
+
86
+ Base. convert (R:: Type{ArrayOfSimilarArrays{T,M,N}} , A:: AbstractArray{<:AbstractArray{U,M},N} ) where {T,M,N,U} = R (A)
87
+ Base. convert (R:: Type{ArrayOfSimilarArrays{T}} , A:: AbstractArray{<:AbstractArray{U,M},N} ) where {T,M,N,U} = R (A)
88
+ Base. convert (R:: Type{ArrayOfSimilarArrays} , A:: AbstractArray{<:AbstractArray{T,M},N} ) where {T,M,N} = R (A)
89
+ end
90
+
70
91
71
92
function _size_inner (A:: AbstractArray{<:AbstractArray{T,M},N} ) where {T,M,N}
72
93
s = if ! isempty (A)
@@ -86,12 +107,6 @@ function _size_inner(A::ArrayOfSimilarArrays{T,M,N}) where {T,M,N}
86
107
end
87
108
88
109
89
- function ArrayOfSimilarArrays (A:: AbstractArray{<:AbstractArray{T,M},N} ) where {T,M,N}
90
- B = ArrayOfSimilarArrays {M} (Array {T,M+N} (_size_inner (A)... , size (A)... ))
91
- copy! (B, A)
92
- end
93
-
94
-
95
110
import Base.==
96
111
(== )(A:: ArrayOfSimilarArrays{T,M,N} , B:: ArrayOfSimilarArrays{T,M,N} ) where {T,M,N} =
97
112
(A. data == B. data)
128
143
function Base. similar (A:: ArrayOfSimilarArrays{T,M,N} , :: Type{<:AbstractArray{U}} , dims:: Dims ) where {T,M,N,U}
129
144
data = A. data
130
145
size_inner, size_outer = split_tuple (size (data), Val {M} ())
131
- ArrayOfSimilarArrays {M} (similar (data, U, size_inner... , dims... ))
146
+ ArrayOfSimilarArrays {T, M} (similar (data, U, size_inner... , dims... ))
132
147
end
133
148
134
149
@@ -160,7 +175,7 @@ Base.prepend!(dest::ArrayOfSimilarArrays{T,M,N}, src::AbstractArray{<:AbstractAr
160
175
161
176
162
177
UnsafeArrays. unsafe_uview (A:: ArrayOfSimilarArrays{T,M,N} ) where {T,M,N} =
163
- ArrayOfSimilarArrays {M} (uview (A. data))
178
+ ArrayOfSimilarArrays {T, M} (uview (A. data))
164
179
165
180
166
181
@@ -171,8 +186,21 @@ const VectorOfSimilarArrays{
171
186
172
187
export VectorOfSimilarArrays
173
188
174
- VectorOfSimilarArrays (parent:: AbstractArray{T,L} ) where {T,L} =
175
- ArrayOfSimilarArrays {L-1} (parent)
189
+ VectorOfSimilarArrays {T} (parent:: AbstractArray{U,L} ) where {T,U,L} =
190
+ ArrayOfSimilarArrays {T,length(Base.front(size(parent)))} (parent)
191
+
192
+ VectorOfSimilarArrays {T} (A:: AbstractVector{<:AbstractArray{U,M}} ) where {T,M,U} =
193
+ VectorOfSimilarArrays {T,M} (A)
194
+
195
+ VectorOfSimilarArrays (A:: AbstractVector{<:AbstractArray{T,M}} ) where {T,M} =
196
+ VectorOfSimilarArrays {T,M} (A)
197
+
198
+
199
+ @static if VERSION < v " 0.7.0-DEV.3138"
200
+ Base. convert (R:: Type{VectorOfSimilarArrays{T}} , parent:: AbstractArray{U,L} ) where {T,U,L} = R (parent)
201
+ Base. convert (R:: Type{VectorOfSimilarArrays{T}} , A:: AbstractVector{<:AbstractArray{U,M}} ) where {T,M,U} = R (A)
202
+ Base. convert (R:: Type{VectorOfSimilarArrays} , A:: AbstractVector{<:AbstractArray{T,M}} ) where {T,M} = R (A)
203
+ end
176
204
177
205
178
206
@inline Base. IndexStyle (V:: VectorOfSimilarArrays ) = IndexLinear ()
@@ -209,10 +237,18 @@ const ArrayOfSimilarVectors{
209
237
210
238
export ArrayOfSimilarVectors
211
239
212
- ArrayOfSimilarVectors (parent:: AbstractArray{T,L} ) where {T,L} =
213
- ArrayOfSimilarArrays {1} (parent)
240
+ ArrayOfSimilarVectors {T} (A:: AbstractArray{<:AbstractVector{U},N} ) where {T,N,U} =
241
+ ArrayOfSimilarVectors {T,N} (A)
242
+
243
+ ArrayOfSimilarVectors (A:: AbstractArray{<:AbstractVector{T},N} ) where {T,N} =
244
+ ArrayOfSimilarVectors {T,N} (A)
214
245
215
246
247
+ @static if VERSION < v " 0.7.0-DEV.3138"
248
+ Base. convert (R:: Type{ArrayOfSimilarVectors{T}} , A:: AbstractArray{<:AbstractVector{U},N} ) where {T,N,U} = R (A)
249
+ Base. convert (R:: Type{ArrayOfSimilarVectors} , A:: AbstractArray{<:AbstractVector{T},N} ) where {T,N} = R (A)
250
+ end
251
+
216
252
217
253
const VectorOfSimilarVectors{
218
254
T,
@@ -221,5 +257,21 @@ const VectorOfSimilarVectors{
221
257
222
258
export VectorOfSimilarVectors
223
259
260
+ VectorOfSimilarVectors {T} (parent:: AbstractArray{U,2} ) where {T,U} =
261
+ ArrayOfSimilarArrays {T,1} (parent)
262
+
224
263
VectorOfSimilarVectors (parent:: AbstractArray{T,2} ) where {T} =
225
- ArrayOfSimilarArrays {1} (parent)
264
+ VectorOfSimilarVectors {T} (parent)
265
+
266
+ VectorOfSimilarVectors {T} (A:: AbstractVector{<:AbstractVector{U}} ) where {T,U} =
267
+ ArrayOfSimilarArrays {T,1} (A)
268
+
269
+ VectorOfSimilarVectors (A:: AbstractVector{<:AbstractVector{T}} ) where {T} =
270
+ VectorOfSimilarVectors {T} (A)
271
+
272
+ @static if VERSION < v " 0.7.0-DEV.3138"
273
+ Base. convert (R:: Type{VectorOfSimilarVectors{T}} , parent:: AbstractArray{U,2} ) where {T,U} = R (parent)
274
+ Base. convert (R:: Type{VectorOfSimilarVectors} , parent:: AbstractArray{T,2} ) where {T} = R (parent)
275
+ Base. convert (R:: Type{VectorOfSimilarVectors{T}} , A:: AbstractVector{<:AbstractVector{U}} ) where {T,U} = R (A)
276
+ Base. convert (R:: Type{VectorOfSimilarVectors} , A:: AbstractVector{<:AbstractVector{T}} ) where {T} = R (A)
277
+ end
0 commit comments