41
41
@pure function similar_type {SA<:StaticArray,T} (:: Union{SA,Type{SA}} , :: Type{T} , size:: Int )
42
42
similar_type (similar_type (SA, T), size)
43
43
end
44
+ @pure function similar_type {SA<:StaticArray,T,S} (:: Union{SA,Type{SA}} , :: Type{T} , size:: Size{S} )
45
+ similar_type (similar_type (SA, T), size)
46
+ end
44
47
@generated function similar_type {SA<:StaticArray,T} (:: Union{SA,Type{SA}} , :: Type{T} )
45
48
# This function has a strange error (on tests) regarding double-inference, if it is marked @pure
46
49
if T == eltype (SA)
115
118
116
119
@pure similar_type {SA<:StaticArray,N} (:: Union{SA,Type{SA}} , sizes:: Tuple{Vararg{Int,N}} ) = SArray{sizes, eltype (SA), N, prod (sizes)}
117
120
121
+ @generated function similar_type {SA <: StaticArray,S} (:: Union{SA,Type{SA}} , :: Size{S} )
122
+ if length (S) == 1
123
+ return quote
124
+ $ (Expr (:meta , :inline ))
125
+ SVector{$ (S[1 ]), $ (eltype (SA))}
126
+ end
127
+ elseif length (S) == 2
128
+ return quote
129
+ $ (Expr (:meta , :inline ))
130
+ SMatrix{$ (S[1 ]), $ (S[2 ]), $ (eltype (SA))}
131
+ end
132
+ else
133
+ return quote
134
+ $ (Expr (:meta , :inline ))
135
+ SArray{S, $ (eltype (SA)), $ (length (S)), $ (prod (S))}
136
+ end
137
+ end
138
+ end
139
+
118
140
# Some specializations for the mutable case
119
141
@pure similar_type {MA<:Union{MVector,MMatrix,MArray,SizedArray}} (:: Union{MA,Type{MA}} , size:: Int ) = MVector{size, eltype (MA)}
120
142
@pure similar_type {MA<:Union{MVector,MMatrix,MArray,SizedArray}} (:: Union{MA,Type{MA}} , sizes:: Tuple{Int} ) = MVector{sizes[1 ], eltype (MA)}
@@ -123,23 +145,73 @@ end
123
145
124
146
@pure similar_type {MA<:Union{MVector,MMatrix,MArray,SizedArray},N} (:: Union{MA,Type{MA}} , sizes:: Tuple{Vararg{Int,N}} ) = MArray{sizes, eltype (MA), N, prod (sizes)}
125
147
148
+ @generated function similar_type {MA<:Union{MVector,MMatrix,MArray,SizedArray},S} (:: Union{MA,Type{MA}} , :: Size{S} )
149
+ if length (S) == 1
150
+ return quote
151
+ $ (Expr (:meta , :inline ))
152
+ MVector{$ (S[1 ]), $ (eltype (MA))}
153
+ end
154
+ elseif length (S) == 2
155
+ return quote
156
+ $ (Expr (:meta , :inline ))
157
+ MMatrix{$ (S[1 ]), $ (S[2 ]), $ (eltype (MA))}
158
+ end
159
+ else
160
+ return quote
161
+ $ (Expr (:meta , :inline ))
162
+ MArray{S, $ (eltype (MA)), $ (length (S)), $ (prod (S))}
163
+ end
164
+ end
165
+ end
166
+
126
167
# And also similar() returning mutable StaticArrays
127
168
@inline similar {SV <: StaticVector} (:: SV ) = MVector {length(SV),eltype(SV)} ()
128
169
@inline similar {SV <: StaticVector, T} (:: SV , :: Type{T} ) = MVector {length(SV),T} ()
129
- @inline similar {SA <: StaticArray} (:: SA , sizes:: Tuple{Int} ) = MVector {sizes[1], eltype(SA)} ()
130
- @inline similar {SA <: StaticArray} (:: SA , size:: Int ) = MVector {size, eltype(SA)} ()
131
- @inline similar {T} (:: StaticArray , :: Type{T} , sizes:: Tuple{Int} ) = MVector {sizes[1],T} ()
132
- @inline similar {T} (:: StaticArray , :: Type{T} , size:: Int ) = MVector {size,T} ()
133
170
134
171
@inline similar {SM <: StaticMatrix} (m:: SM ) = MMatrix {size(SM,1),size(SM,2),eltype(SM),length(SM)} ()
135
172
@inline similar {SM <: StaticMatrix, T} (:: SM , :: Type{T} ) = MMatrix {size(SM,1),size(SM,2),T,length(SM)} ()
136
- @inline similar {SA <: StaticArray} (:: SA , sizes:: Tuple{Int,Int} ) = MMatrix {sizes[1], sizes[2], eltype(SA), sizes[1]*sizes[2]} ()
137
- @inline similar (a:: StaticArray , T:: Type , sizes:: Tuple{Int,Int} ) = MMatrix {sizes[1], sizes[2], T, sizes[1]*sizes[2]} ()
138
173
139
174
@inline similar {SA <: StaticArray} (m:: SA ) = MArray {size(SA),eltype(SA),ndims(SA),length(SA)} ()
140
175
@inline similar {SA <: StaticArray,T} (m:: SA , :: Type{T} ) = MArray {size(SA),T,ndims(SA),length(SA)} ()
141
- @inline similar {SA <: StaticArray,N} (m:: SA , sizes:: NTuple{N, Int} ) = MArray {sizes,eltype(SA),N,prod(sizes)} ()
142
- @inline similar {SA <: StaticArray,N,T} (m:: SA , :: Type{T} , sizes:: NTuple{N, Int} ) = MArray {sizes,T,N,prod(sizes)} ()
176
+
177
+ @generated function similar {SA <: StaticArray,S} (:: SA , :: Size{S} )
178
+ if length (S) == 1
179
+ return quote
180
+ $ (Expr (:meta , :inline ))
181
+ MVector {$(S[1]), $(eltype(SA))} ()
182
+ end
183
+ elseif length (S) == 2
184
+ return quote
185
+ $ (Expr (:meta , :inline ))
186
+ MMatrix {$(S[1]), $(S[2]), $(eltype(SA))} ()
187
+ end
188
+ else
189
+ return quote
190
+ $ (Expr (:meta , :inline ))
191
+ MArray {S, $(eltype(SA))} ()
192
+ end
193
+ end
194
+ end
195
+
196
+ @generated function similar {SA <: StaticArray, T, S} (:: SA , :: Type{T} , :: Size{S} )
197
+ if length (S) == 1
198
+ return quote
199
+ $ (Expr (:meta , :inline ))
200
+ MVector {$(S[1]), T} ()
201
+ end
202
+ elseif length (S) == 2
203
+ return quote
204
+ $ (Expr (:meta , :inline ))
205
+ MMatrix {$(S[1]), $(S[2]), T} ()
206
+ end
207
+ else
208
+ return quote
209
+ $ (Expr (:meta , :inline ))
210
+ MArray {S, T} ()
211
+ end
212
+ end
213
+ end
214
+
143
215
144
216
# This is used in Base.LinAlg quite a lot, and it impacts type stability
145
217
# since some functions like expm() branch on a check for Hermitian or Symmetric
0 commit comments