Skip to content

Commit f6b2407

Browse files
committed
Constructor and convertor clean.
With `construct_type`, there's no need to keep all these dispatches. This also fix empty construction for `S/MVector`, and remove most of the ambiguities.
1 parent e0fbf13 commit f6b2407

File tree

10 files changed

+45
-202
lines changed

10 files changed

+45
-202
lines changed

src/MArray.jl

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,42 +20,23 @@ the compiler (the element type may optionally also be specified).
2020
mutable struct MArray{S <: Tuple, T, N, L} <: StaticArray{S, T, N}
2121
data::NTuple{L,T}
2222

23-
function MArray{S,T,N,L}(x::NTuple{L,T}) where {S,T,N,L}
23+
function MArray{S,T,N,L}(x::NTuple{L,T}) where {S<:Tuple,T,N,L}
2424
check_array_parameters(S, T, Val{N}, Val{L})
2525
new{S,T,N,L}(x)
2626
end
2727

28-
function MArray{S,T,N,L}(x::NTuple{L,Any}) where {S,T,N,L}
28+
function MArray{S,T,N,L}(x::NTuple{L,Any}) where {S<:Tuple,T,N,L}
2929
check_array_parameters(S, T, Val{N}, Val{L})
3030
new{S,T,N,L}(convert_ntuple(T, x))
3131
end
3232

33-
function MArray{S,T,N,L}(::UndefInitializer) where {S,T,N,L}
33+
function MArray{S,T,N,L}(::UndefInitializer) where {S<:Tuple,T,N,L}
3434
check_array_parameters(S, T, Val{N}, Val{L})
3535
new{S,T,N,L}()
3636
end
3737
end
3838

39-
@generated function (::Type{MArray{S,T,N}})(x::Tuple) where {S,T,N}
40-
return quote
41-
$(Expr(:meta, :inline))
42-
MArray{S,T,N,$(tuple_prod(S))}(x)
43-
end
44-
end
45-
46-
@generated function (::Type{MArray{S,T}})(x::Tuple) where {S,T}
47-
return quote
48-
$(Expr(:meta, :inline))
49-
MArray{S,T,$(tuple_length(S)),$(tuple_prod(S))}(x)
50-
end
51-
end
52-
53-
@generated function (::Type{MArray{S}})(x::T) where {S, T <: Tuple}
54-
return quote
55-
$(Expr(:meta, :inline))
56-
MArray{S,promote_tuple_eltype(T),$(tuple_length(S)),$(tuple_prod(S))}(x)
57-
end
58-
end
39+
@inline MArray{S,T,N}(x::Tuple) where {S<:Tuple,T,N} = MArray{S,T,N,length(x)}(x)
5940

6041
@generated function (::Type{MArray{S,T,N}})(::UndefInitializer) where {S,T,N}
6142
return quote
@@ -71,8 +52,6 @@ end
7152
end
7253
end
7354

74-
@inline MArray(a::StaticArray{S,T}) where {S<:Tuple,T} = MArray{S,T}(Tuple(a))
75-
7655
####################
7756
## MArray methods ##
7857
####################

src/MMatrix.jl

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,43 +17,13 @@ unknown to the compiler (the element type may optionally also be specified).
1717
"""
1818
const MMatrix{S1, S2, T, L} = MArray{Tuple{S1, S2}, T, 2, L}
1919

20-
@generated function (::Type{MMatrix{S1}})(x::NTuple{L}) where {S1,L}
21-
S2 = div(L, S1)
22-
if S1*S2 != L
23-
throw(DimensionMismatch("Incorrect matrix sizes. $S1 does not divide $L elements"))
24-
end
25-
return quote
26-
$(Expr(:meta, :inline))
27-
T = eltype(typeof(x))
28-
MMatrix{S1, $S2, T, L}(x)
29-
end
30-
end
31-
32-
@generated function (::Type{MMatrix{S1,S2}})(x::NTuple{L}) where {S1,S2,L}
33-
return quote
34-
$(Expr(:meta, :inline))
35-
T = eltype(typeof(x))
36-
MMatrix{S1, S2, T, L}(x)
37-
end
38-
end
39-
40-
@generated function (::Type{MMatrix{S1,S2,T}})(x::NTuple{L}) where {S1,S2,T,L}
41-
return quote
42-
$(Expr(:meta, :inline))
43-
MMatrix{S1, S2, T, L}(x)
44-
end
45-
end
46-
4720
@generated function (::Type{MMatrix{S1,S2,T}})(::UndefInitializer) where {S1,S2,T}
4821
return quote
4922
$(Expr(:meta, :inline))
5023
MMatrix{S1, S2, T, $(S1*S2)}(undef)
5124
end
5225
end
5326

54-
@inline convert(::Type{MMatrix{S1,S2}}, a::StaticArray{<:Tuple, T}) where {S1,S2,T} = MMatrix{S1,S2,T}(Tuple(a))
55-
@inline MMatrix(a::StaticMatrix{N,M,T}) where {N,M,T} = MMatrix{N,M,T}(Tuple(a))
56-
5727
# Some more advanced constructor-like functions
5828
@inline one(::Type{MMatrix{N}}) where {N} = one(MMatrix{N,N})
5929

src/MVector.jl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@ compiler (the element type may optionally also be specified).
1616
"""
1717
const MVector{S, T} = MArray{Tuple{S}, T, 1, S}
1818

19-
@inline MVector(a::StaticVector{N,T}) where {N,T} = MVector{N,T}(a)
20-
@inline MVector(x::NTuple{S,Any}) where {S} = MVector{S}(x)
21-
@inline MVector{S}(x::NTuple{S,T}) where {S, T} = MVector{S, T}(x)
22-
@inline MVector{S}(x::NTuple{S,Any}) where {S} = MVector{S, promote_tuple_eltype(typeof(x))}(x)
23-
2419
# Some more advanced constructor-like functions
2520
@inline zeros(::Type{MVector{N}}) where {N} = zeros(MVector{N,Float64})
2621
@inline ones(::Type{MVector{N}}) where {N} = ones(MVector{N,Float64})

src/SArray.jl

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,38 +18,18 @@ compiler (the element type may optionally also be specified).
1818
struct SArray{S <: Tuple, T, N, L} <: StaticArray{S, T, N}
1919
data::NTuple{L,T}
2020

21-
function SArray{S, T, N, L}(x::NTuple{L,T}) where {S, T, N, L}
21+
function SArray{S, T, N, L}(x::NTuple{L,T}) where {S<:Tuple, T, N, L}
2222
check_array_parameters(S, T, Val{N}, Val{L})
2323
new{S, T, N, L}(x)
2424
end
2525

26-
function SArray{S, T, N, L}(x::NTuple{L,Any}) where {S, T, N, L}
26+
function SArray{S, T, N, L}(x::NTuple{L,Any}) where {S<:Tuple, T, N, L}
2727
check_array_parameters(S, T, Val{N}, Val{L})
2828
new{S, T, N, L}(convert_ntuple(T, x))
2929
end
3030
end
3131

32-
@generated function (::Type{SArray{S, T, N}})(x::Tuple) where {S <: Tuple, T, N}
33-
return quote
34-
@_inline_meta
35-
SArray{S, T, N, $(tuple_prod(S))}(x)
36-
end
37-
end
38-
39-
@generated function (::Type{SArray{S, T}})(x::Tuple) where {S <: Tuple, T}
40-
return quote
41-
@_inline_meta
42-
SArray{S, T, $(tuple_length(S)), $(tuple_prod(S))}(x)
43-
end
44-
end
45-
46-
@generated function (::Type{SArray{S}})(x::T) where {S <: Tuple, T <: Tuple}
47-
return quote
48-
@_inline_meta
49-
SArray{S, promote_tuple_eltype(T), $(tuple_length(S)), $(tuple_prod(S))}(x)
50-
end
51-
end
52-
32+
@inline SArray{S,T,N}(x::Tuple) where {S<:Tuple,T,N} = SArray{S,T,N,length(x)}(x)
5333

5434
@noinline function generator_too_short_error(inds::CartesianIndices, i::CartesianIndex)
5535
error("Generator produced too few elements: Expected exactly $(shape_string(inds)) elements, but generator stopped at $(shape_string(i))")
@@ -106,8 +86,6 @@ sacollect
10686
@inline (::Type{SA})(gen::Base.Generator) where {SA <: StaticArray} =
10787
sacollect(SA, gen)
10888

109-
@inline SArray(a::StaticArray{S,T}) where {S<:Tuple,T} = SArray{S,T}(Tuple(a))
110-
11189
####################
11290
## SArray methods ##
11391
####################

src/SHermitianCompact.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ lowertriangletype(::Type{SHermitianCompact{N}}) where {N} = SVector{triangularnu
6060
end
6161

6262
@generated function SHermitianCompact{N, T, L}(a::Tuple) where {N, T, L}
63+
_check_hermitian_parameters(Val(N), Val(L))
6364
expr = Vector{Expr}(undef, L)
6465
i = 0
6566
for col = 1 : N, row = col : N
@@ -77,15 +78,13 @@ end
7778
SHermitianCompact{N, T, L}(a)
7879
end
7980

80-
@inline SHermitianCompact{N}(a::Tuple) where {N} = SHermitianCompact{N, promote_tuple_eltype(a)}(a)
81-
@inline SHermitianCompact{N}(a::NTuple{M, T}) where {N, T, M} = SHermitianCompact{N, T}(a)
82-
@inline SHermitianCompact(a::StaticMatrix{N, N, T}) where {N, T} = SHermitianCompact{N, T}(a)
83-
8481
@inline (::Type{SSC})(a::SHermitianCompact) where {SSC <: SHermitianCompact} = SSC(a.lowertriangle)
85-
@inline (::Type{SSC})(a::SSC) where {SSC <: SHermitianCompact} = a
8682

8783
@inline (::Type{SSC})(a::AbstractVector) where {SSC <: SHermitianCompact} = SSC(convert(lowertriangletype(SSC), a))
8884

85+
# disambiguation
86+
@inline (::Type{SSC})(a::StaticArray{<:Tuple,<:Any,1}) where {SSC <: SHermitianCompact} = SSC(convert(SVector, a))
87+
8988
@generated function _hermitian_compact_indices(::Val{N}) where N
9089
# Returns a Tuple{Pair{Int, Bool}} I such that for linear index i,
9190
# * I[i][1] is the index into the lowertriangle field of an SHermitianCompact{N};

src/SMatrix.jl

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,50 +16,11 @@ unknown to the compiler (the element type may optionally also be specified).
1616
"""
1717
const SMatrix{S1, S2, T, L} = SArray{Tuple{S1, S2}, T, 2, L}
1818

19-
@generated function SMatrix{S1}(x::NTuple{L,Any}) where {S1,L}
20-
S2 = div(L, S1)
21-
if S1*S2 != L
22-
throw(DimensionMismatch("Incorrect matrix sizes. $S1 does not divide $L elements"))
23-
end
24-
25-
return quote
26-
$(Expr(:meta, :inline))
27-
T = promote_tuple_eltype(typeof(x))
28-
SMatrix{S1, $S2, T, L}(x)
29-
end
30-
end
31-
32-
@generated function SMatrix{S1,S2}(x::NTuple{L,Any}) where {S1,S2,L}
33-
return quote
34-
$(Expr(:meta, :inline))
35-
T = promote_tuple_eltype(typeof(x))
36-
SMatrix{S1, S2, T, L}(x)
37-
end
38-
end
39-
SMatrixNoType{S1, S2, L, T} = SMatrix{S1, S2, T, L}
40-
@generated function SMatrixNoType{S1, S2, L}(x::NTuple{L,Any}) where {S1,S2,L}
41-
return quote
42-
$(Expr(:meta, :inline))
43-
T = promote_tuple_eltype(typeof(x))
44-
SMatrix{S1, S2, T, L}(x)
45-
end
46-
end
47-
48-
@generated function SMatrix{S1,S2,T}(x::NTuple{L,Any}) where {S1,S2,T,L}
49-
return quote
50-
$(Expr(:meta, :inline))
51-
SMatrix{S1, S2, T, L}(x)
52-
end
53-
end
54-
5519
@inline SMatrix{M, N, T}(gen::Base.Generator) where {M, N, T} =
5620
sacollect(SMatrix{M, N, T}, gen)
5721
@inline SMatrix{M, N}(gen::Base.Generator) where {M, N} =
5822
sacollect(SMatrix{M, N}, gen)
5923

60-
@inline convert(::Type{SMatrix{S1,S2}}, a::StaticArray{<:Tuple, T}) where {S1,S2,T} = SMatrix{S1,S2,T}(Tuple(a))
61-
@inline SMatrix(a::StaticMatrix{S1, S2, T}) where {S1, S2, T} = SMatrix{S1, S2, T}(Tuple(a))
62-
6324
# Some more advanced constructor-like functions
6425
@inline one(::Type{SMatrix{N}}) where {N} = one(SMatrix{N,N})
6526

src/SVector.jl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ compiler (the element type may optionally also be specified).
1515
"""
1616
const SVector{S, T} = SArray{Tuple{S}, T, 1, S}
1717

18-
@inline SVector(a::StaticVector{N,T}) where {N,T} = SVector{N,T}(a)
19-
@inline SVector(x::NTuple{S,Any}) where {S} = SVector{S}(x)
20-
@inline SVector{S}(x::NTuple{S,T}) where {S, T} = SVector{S,T}(x)
21-
@inline SVector{S}(x::T) where {S, T <: Tuple} = SVector{S,promote_tuple_eltype(T)}(x)
22-
2318
@inline SVector{N, T}(gen::Base.Generator) where {N, T} =
2419
sacollect(SVector{N, T}, gen)
2520
@inline SVector{N}(gen::Base.Generator) where {N} =

src/Scalar.jl

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@ Construct a statically-sized 0-dimensional array that contains a single element,
66
"""
77
const Scalar{T} = SArray{Tuple{},T,0,1}
88

9-
@inline Scalar(x::Tuple{T}) where {T} = Scalar{T}(x[1])
109
@inline Scalar(a::AbstractArray) = Scalar{typeof(a)}((a,))
10+
@inline Scalar(a::StaticArray) = Scalar{typeof(a)}((a,)) # disambiguation
11+
1112
@inline Scalar(a::AbstractScalar) = Scalar{eltype(a)}((a[],)) # Do we want this to convert or wrap?
12-
@inline function convert(::Type{SA}, a::AbstractArray) where {SA <: Scalar}
13-
return SA((a[],))
14-
end
15-
@inline convert(::Type{SA}, sa::SA) where {SA <: Scalar} = sa
13+
@inline Scalar(a::StaticScalar) = Scalar{eltype(a)}((a[],)) # disambiguation
1614

1715
@propagate_inbounds function getindex(v::Scalar, i::Int)
1816
@boundscheck if i != 1

0 commit comments

Comments
 (0)