1- """ 
2-     Dynamic() 
3- 
4- Used to signify that a dimension of an array is not known statically. 
5- """ 
6- struct  Dynamic end 
7- 
8- const  StaticDimension =  Union{Int, Dynamic}
91
102""" 
113    dimmatch(x::StaticDimension, y::StaticDimension) 
@@ -19,85 +11,13 @@ function dimmatch end
1911@inline  dimmatch (x:: Int , y:: Int ) =  x ===  y
2012@inline  dimmatch (x:: StaticDimension , y:: StaticDimension ) =  true 
2113
22- """ 
23-     Size(dims::Int...) 
24- 
25- `Size` is used extensively throughout the `StaticArrays` API to describe _compile-time_ 
26- knowledge of the size of an array. The dimensions are stored as a type parameter and are 
27- statically propagated by the compiler, resulting in efficient, type-inferrable code. For 
28- example, to create a static matrix of zeros, use `A = zeros(SMatrix{3,3})`. The static 
29- size of `A` can be obtained by `Size(A)`. (rather than `size(zeros(3,3))`, which returns 
30- `Base.Tuple{2,Int}`). 
31- 
32- Note that if dimensions are not known statically (e.g., for standard `Array`s), 
33- [`Dynamic()`](@ref) should be used instead of an `Int`. 
34- 
35-     Size(a::AbstractArray) 
36-     Size(::Type{T<:AbstractArray}) 
37- 
38- The `Size` constructor can be used to extract static dimension information from a given 
39- array. For example: 
40- 
41- ```julia-repl 
42- julia> Size(zeros(SMatrix{3, 4})) 
43- Size(3, 4) 
44- 
45- julia> Size(zeros(3, 4)) 
46- Size(StaticArrays.Dynamic(), StaticArrays.Dynamic()) 
47- ``` 
48- 
49- This has multiple uses, including "trait"-based dispatch on the size of a statically-sized 
50- array. For example: 
51- 
52- ```julia 
53- det(x::StaticMatrix) = _det(Size(x), x) 
54- _det(::Size{(1,1)}, x::StaticMatrix) = x[1,1] 
55- _det(::Size{(2,2)}, x::StaticMatrix) = x[1,1]*x[2,2] - x[1,2]*x[2,1] 
56- # and other definitions as necessary 
57- ``` 
58- 
59- """ 
60- struct  Size{S}
61-     function  Size {S} () where  {S}
62-         new {S::Tuple{Vararg{StaticDimension}}} ()
63-     end 
64- end 
65- 
66- @pure  Size (s:: Tuple{Vararg{StaticDimension}} ) =  Size {s} ()
67- @pure  Size (s:: StaticDimension... ) =  Size {s} ()
68- @pure  Size (s:: Type{<:Tuple} ) =  Size {tuple(s.parameters...)} ()
69- 
70- Base. show (io:: IO , :: Size{S} ) where  {S} =  print (io, " Size" 
71- 
72- function  missing_size_error (:: Type{SA} ) where  SA
73-     error (""" 
74-         The size of type `$SA ` is not known. 
75- 
76-         If you were trying to construct (or `convert` to) a `StaticArray` you 
77-         may need to add the size explicitly as a type parameter so its size is 
78-         inferrable to the Julia compiler (or performance would be terrible). For 
79-         example, you might try 
80- 
81-             m = zeros(3,3) 
82-             SMatrix(m)            # this error 
83-             SMatrix{3,3}(m)       # correct - size is inferrable 
84-             SArray{Tuple{3,3}}(m) # correct, note Tuple{3,3} 
85-         """  )
86- end 
87- 
88- Size (a:: T ) where  {T<: AbstractArray } =  Size (T)
89- Size (:: Type{SA} ) where  {SA <:  StaticArray } =  missing_size_error (SA)
90- Size (:: Type{SA} ) where  {SA <:  StaticArray{S} } where  {S<: Tuple } =  @isdefined (S) ?  Size (S) :  missing_size_error (SA)
91- 
9214Size (:: Type{Adjoint{T, A}} ) where  {T, A <:  AbstractVecOrMat{T} } =  Size (Size (A)[2 ], Size (A)[1 ])
9315Size (:: Type{Transpose{T, A}} ) where  {T, A <:  AbstractVecOrMat{T} } =  Size (Size (A)[2 ], Size (A)[1 ])
9416Size (:: Type{Symmetric{T, A}} ) where  {T, A <:  AbstractMatrix{T} } =  Size (A)
9517Size (:: Type{Hermitian{T, A}} ) where  {T, A <:  AbstractMatrix{T} } =  Size (A)
9618Size (:: Type{Diagonal{T, A}} ) where  {T, A <:  AbstractVector{T} } =  Size (Size (A)[1 ], Size (A)[1 ])
9719Size (:: Type{<:LinearAlgebra.AbstractTriangular{T, A}} ) where  {T,A} =  Size (A)
9820
99- @pure  Size (:: Type{<:AbstractArray{<:Any, N}} ) where  {N} =  Size (ntuple (_ ->  Dynamic (), N))
100- 
10121struct  Length{L}
10222    function  Length {L} () where  L
10323        check_length (L)
0 commit comments