Skip to content

Commit 1b29fce

Browse files
Fix more methods with zero-element array (#1123)
* add more tests for zero-element array * fix more methods for zero-element array * bump version to v1.5.13 * add more fill tests * update tests for zero * add more tests for fill * fix _fill function * fix _fill function * fix fill tests * add more tests for `ones`
1 parent 169d081 commit 1b29fce

File tree

3 files changed

+91
-5
lines changed

3 files changed

+91
-5
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "StaticArrays"
22
uuid = "90137ffa-7385-5640-81b9-e52037218182"
3-
version = "1.5.12"
3+
version = "1.5.13"
44

55
[deps]
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

src/arraymath.jl

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@
55
T = Float64
66
end
77
v = [:(zero($T)) for i = 1:prod(s)]
8+
if SA <: SArray
9+
SA = SArray{Tuple{s...}, T, length(s), prod(s)}
10+
elseif SA <: MArray
11+
SA = MArray{Tuple{s...}, T, length(s), prod(s)}
12+
elseif SA <: SizedArray
13+
SA = SizedArray{Tuple{s...}, T, length(s)}
14+
end
815
return quote
916
@_inline_meta
1017
$SA(tuple($(v...)))
@@ -18,6 +25,13 @@ end
1825
T = Float64
1926
end
2027
v = [:(one($T)) for i = 1:prod(s)]
28+
if SA <: SArray
29+
SA = SArray{Tuple{s...}, T, length(s), prod(s)}
30+
elseif SA <: MArray
31+
SA = MArray{Tuple{s...}, T, length(s), prod(s)}
32+
elseif SA <: SizedArray
33+
SA = SizedArray{Tuple{s...}, T, length(s)}
34+
end
2135
return quote
2236
@_inline_meta
2337
$SA(tuple($(v...)))
@@ -26,8 +40,19 @@ end
2640

2741
@inline fill(val, ::SA) where {SA <: StaticArray} = _fill(val, Size(SA), SA)
2842
@inline fill(val, ::Type{SA}) where {SA <: StaticArray} = _fill(val, Size(SA), SA)
29-
@generated function _fill(val, ::Size{s}, ::Type{SA}) where {s, SA <: StaticArray}
43+
@generated function _fill(val::U, ::Size{s}, ::Type{SA}) where {U, s, SA <: StaticArray}
44+
T = eltype(SA)
45+
if T == Any
46+
T = U
47+
end
3048
v = [:val for i = 1:prod(s)]
49+
if SA <: SArray
50+
SA = SArray{Tuple{s...}, T, length(s), prod(s)}
51+
elseif SA <: MArray
52+
SA = MArray{Tuple{s...}, T, length(s), prod(s)}
53+
elseif SA <: SizedArray
54+
SA = SizedArray{Tuple{s...}, T, length(s)}
55+
end
3156
return quote
3257
@_inline_meta
3358
$SA(tuple($(v...)))

test/arraymath.jl

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import StaticArrays.arithmetic_closure
77
@test @inferred(zeros(SVector{3,Int})) === @SVector [0, 0, 0]
88
@test @inferred(ones(SVector{3,Float64})) === @SVector [1.0, 1.0, 1.0]
99
@test @inferred(ones(SVector{3,Int})) === @SVector [1, 1, 1]
10+
@test @inferred(zeros(SVector{0,Float64})) === @SVector Float64[]
11+
@test @inferred(zeros(SVector{0,Int})) === @SVector Int[]
12+
@test @inferred(ones(SVector{0,Float64})) === @SVector Float64[]
13+
@test @inferred(ones(SVector{0,Int})) === @SVector Int[]
1014

1115
@test @inferred(zeros(SVector{3})) === @SVector [0.0, 0.0, 0.0]
1216
@test @inferred(zeros(SMatrix{2,2})) === @SMatrix [0.0 0.0; 0.0 0.0]
@@ -32,20 +36,77 @@ import StaticArrays.arithmetic_closure
3236
@test bigones[1] !== bigones[2]
3337
end
3438

39+
@testset "ones()" begin
40+
for T in (SVector, MVector, SizedVector)
41+
m = @inferred ones(T{3, Float64})
42+
@test m == [1.0, 1.0, 1.0]
43+
@test m isa T{3, Float64}
44+
m = @inferred ones(T{3, Int})
45+
@test m == [1, 1, 1]
46+
@test m isa T{3, Int}
47+
m = @inferred ones(T{3})
48+
@test m == [1.0, 1.0, 1.0]
49+
@test m isa T{3}
50+
m = @inferred ones(T{0, Float64})
51+
@test m == Float64[]
52+
@test m isa T{0, Float64}
53+
m = @inferred ones(T{0, Int})
54+
@test m == Int[]
55+
@test m isa T{0, Int}
56+
m = @inferred ones(T{0})
57+
@test m == Float64[]
58+
@test m isa T{0}
59+
end
60+
end
61+
3562
@testset "zero()" begin
36-
@test @inferred(zero(SVector{3, Float64})) === @SVector [0.0, 0.0, 0.0]
37-
@test @inferred(zero(SVector{3, Int})) === @SVector [0, 0, 0]
63+
for T in (SVector, MVector, SizedVector)
64+
m = @inferred zero(T{3, Float64})
65+
@test m == [0.0, 0.0, 0.0]
66+
@test m isa T{3, Float64}
67+
m = @inferred zero(T{3, Int})
68+
@test m == [0, 0, 0]
69+
@test m isa T{3, Int}
70+
m = @inferred zero(T{3})
71+
@test m == [0.0, 0.0, 0.0]
72+
@test m isa T{3}
73+
m = @inferred zero(T{0, Float64})
74+
@test m == Float64[]
75+
@test m isa T{0, Float64}
76+
m = @inferred zero(T{0, Int})
77+
@test m == Int[]
78+
@test m isa T{0, Int}
79+
m = @inferred zero(T{0})
80+
@test m == Float64[]
81+
@test m isa T{0}
82+
end
3883
end
3984

4085
@testset "fill()" begin
41-
@test all(@inferred(fill(3., SMatrix{4, 16, Float64})) .== 3.)
4286
@test @allocated(fill(0., SMatrix{1, 16, Float64})) == 0 # #81
87+
@test @allocated(fill(0., SMatrix{0, 5, Float64})) == 0
88+
89+
for T in (SMatrix, MMatrix, SizedMatrix)
90+
m = @inferred(fill(3., T{4, 16, Float64}))
91+
@test m isa T{4, 16, Float64}
92+
@test all(m .== 3.)
93+
m = @inferred(fill(3., T{0, 5, Float64}))
94+
@test m isa T{0, 5, Float64}
95+
m = @inferred(fill(3, T{4, 16, Float64}))
96+
@test m isa T{4, 16, Float64}
97+
@test all(m .== 3.)
98+
m = @inferred(fill(3, T{0, 5, Float64}))
99+
@test m isa T{0, 5, Float64}
100+
end
43101
end
44102

45103
@testset "fill!()" begin
46104
m = MMatrix{4,16,Float64}(undef)
47105
fill!(m, 3)
48106
@test all(m .== 3.)
107+
m = MMatrix{0,5,Float64}(undef)
108+
fill!(m, 3)
109+
@test all(m .== 3.)
49110
end
50111

51112
@testset "rand()" begin

0 commit comments

Comments
 (0)