@@ -57,11 +57,11 @@ if they wish to overload the default behavior.
57
57
"""
58
58
function similar_type end
59
59
60
- similar_type (:: SA ) where {SA<: StaticArray } = similar_type (SA,eltype (SA))
61
- similar_type (:: Type{SA} ) where {SA<: StaticArray } = similar_type (SA,eltype (SA))
60
+ similar_type (:: SA ) where {SA<: StaticArrayLike } = similar_type (SA,eltype (SA))
61
+ similar_type (:: Type{SA} ) where {SA<: StaticArrayLike } = similar_type (SA,eltype (SA))
62
62
63
- similar_type (:: SA ,:: Type{T} ) where {SA<: StaticArray ,T} = similar_type (SA,T,Size (SA))
64
- similar_type (:: Type{SA} ,:: Type{T} ) where {SA<: StaticArray ,T} = similar_type (SA,T,Size (SA))
63
+ similar_type (:: SA ,:: Type{T} ) where {SA<: StaticArrayLike ,T} = similar_type (SA,T,Size (SA))
64
+ similar_type (:: Type{SA} ,:: Type{T} ) where {SA<: StaticArrayLike ,T} = similar_type (SA,T,Size (SA))
65
65
66
66
similar_type (:: A ,s:: Size{S} ) where {A<: AbstractArray ,S} = similar_type (A,eltype (A),s)
67
67
similar_type (:: Type{A} ,s:: Size{S} ) where {A<: AbstractArray ,S} = similar_type (A,eltype (A),s)
@@ -79,6 +79,22 @@ similar_type(::A,::Type{T}, shape::Tuple{SOneTo, Vararg{SOneTo}}) where {A<:Abst
79
79
similar_type (:: Type{A} ,:: Type{T} , shape:: Tuple{SOneTo, Vararg{SOneTo}} ) where {A<: AbstractArray ,T} = similar_type (A, T, Size (last .(shape)))
80
80
81
81
82
+ # unwrapping arrays (see issue #828)
83
+ const SimilarTypeArrayWrapper{T,AW} = Union{
84
+ Transpose{T,AW},
85
+ Adjoint{T,AW},
86
+ Symmetric{T,AW},
87
+ Hermitian{T,AW},
88
+ UpperTriangular{T,AW},
89
+ LowerTriangular{T,AW},
90
+ UnitUpperTriangular{T,AW},
91
+ UnitLowerTriangular{T,AW},
92
+ Diagonal{T,AW}}
93
+
94
+ function similar_type (:: Type{A} , :: Type{T} , shape:: Size ) where {T,AW<: AbstractArray ,A<: SimilarTypeArrayWrapper{<:Any,AW} }
95
+ return similar_type (AW, T, shape)
96
+ end
97
+
82
98
# Default types
83
99
# Generally, use SArray
84
100
similar_type (:: Type{A} ,:: Type{T} ,s:: Size{S} ) where {A<: AbstractArray ,T,S} = default_similar_type (T,s,length_val (s))
0 commit comments