Skip to content

Commit 7dcbccf

Browse files
authored
similar_type checks inside array wrappers (#830)
1 parent 4c477c0 commit 7dcbccf

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

src/abstractarray.jl

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ if they wish to overload the default behavior.
5757
"""
5858
function 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

6666
similar_type(::A,s::Size{S}) where {A<:AbstractArray,S} = similar_type(A,eltype(A),s)
6767
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
7979
similar_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
84100
similar_type(::Type{A},::Type{T},s::Size{S}) where {A<:AbstractArray,T,S} = default_similar_type(T,s,length_val(s))

test/abstractarray.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ using StaticArrays, Test, LinearAlgebra
4747
@test @inferred(similar_type(MArray{Tuple{4,4,4},Int,3,64}, Float64)) == MArray{Tuple{4,4,4}, Float64, 3, 64}
4848
@test @inferred(similar_type(MVector{2,Int}, Size(3,3,3))) == MArray{Tuple{3,3,3}, Int, 3, 27}
4949
@test @inferred(similar_type(MVector{2,Int}, Float64, Size(3,3,3))) == MArray{Tuple{3,3,3}, Float64, 3, 27}
50+
51+
# wrapped mutable cases (issue #828)
52+
for Wrapper in [Symmetric, Hermitian, Adjoint, Transpose, UpperTriangular, LowerTriangular, UnitUpperTriangular, UnitLowerTriangular]
53+
@test @inferred(similar_type(Wrapper{Int,MArray{Tuple{4,4},Int,2,16}}, Float64)) === MArray{Tuple{4,4}, Float64, 2, 16}
54+
end
55+
@test @inferred(similar_type(Diagonal{Int,MArray{Tuple{4},Int,1,4}}, Float64)) === MArray{Tuple{4,4}, Float64, 2, 16}
5056
end
5157

5258
@testset "similar" begin

test/matrix_multiply.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,15 @@ mul_wrappers = [
112112

113113
cv = MMatrix{4,1}(cv_array)
114114
rv = MVector{4}(rv_array)
115-
@test (cv*adjoint(rv))::SMatrix a_array
115+
@test (cv*adjoint(rv))::MMatrix a_array
116116

117117
cv = SMatrix{4,1}(cv_array)
118118
rv = SVector{4}(rv_array)
119119
@test (cv*transpose(rv))::SMatrix a_array
120120

121121
cv = MMatrix{4,1}(cv_array)
122122
rv = MVector{4}(rv_array)
123-
@test (cv*transpose(rv))::SMatrix a_array
123+
@test (cv*transpose(rv))::MMatrix a_array
124124

125125
cv_bad = @SMatrix rand(4,2)
126126
rv = @SVector rand(4)

0 commit comments

Comments
 (0)