@@ -57,11 +57,11 @@ if they wish to overload the default behavior.
5757"""
5858function similar_type end
5959
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))
6262
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))
6565
6666similar_type (:: A ,s:: Size{S} ) where {A<: AbstractArray ,S} = similar_type (A,eltype (A),s)
6767similar_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
7979similar_type (:: Type{A} ,:: Type{T} , shape:: Tuple{SOneTo, Vararg{SOneTo}} ) where {A<: AbstractArray ,T} = similar_type (A, T, Size (last .(shape)))
8080
8181
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+
8298# Default types
8399# Generally, use SArray
84100similar_type (:: Type{A} ,:: Type{T} ,s:: Size{S} ) where {A<: AbstractArray ,T,S} = default_similar_type (T,s,length_val (s))
0 commit comments