|
71 | 71 | function Base.convert(::Type{Quantity{T,SymbolicDimensions}}, q::Quantity{<:Any,<:Dimensions}) where {T} |
72 | 72 | return convert(Quantity{T,SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}}, q) |
73 | 73 | end |
74 | | -function Base.convert(::Type{Q}, q::Quantity{<:Any,<:Dimensions}) where {T,R,Q<:Quantity{T,SymbolicDimensions{R}}} |
75 | | - return new_quantity( |
76 | | - Q, |
77 | | - convert(T, ustrip(q)), |
78 | | - SymbolicDimensions{R}(; |
79 | | - m=ulength(q), |
80 | | - kg=umass(q), |
81 | | - s=utime(q), |
82 | | - A=ucurrent(q), |
83 | | - K=utemperature(q), |
84 | | - cd=uluminosity(q), |
85 | | - mol=uamount(q), |
86 | | - ) |
87 | | - ) |
| 74 | +function Base.convert(::Type{Quantity{T,SymbolicDimensions{R}}}, q::Quantity{<:Any,<:Dimensions}) where {T,R} |
| 75 | + syms = (:m, :kg, :s, :A, :K, :cd, :mol) |
| 76 | + vals = (ulength(q), umass(q), utime(q), ucurrent(q), utemperature(q), uluminosity(q), uamount(q)) |
| 77 | + I = INDEX_TYPE[ALL_MAPPING[s] for (s, v) in zip(syms, vals) if !iszero(v)] |
| 78 | + V = R[tryrationalize(R, v) for v in vals if !iszero(v)] |
| 79 | + p = sortperm(I) |
| 80 | + permute!(I, p) |
| 81 | + permute!(V, p) |
| 82 | + dims = SymbolicDimensions{R}(I, V) |
| 83 | + return Quantity(convert(T, ustrip(q)), dims) |
88 | 84 | end |
89 | | -function Base.convert(::Type{Q}, q::Quantity{<:Any,<:SymbolicDimensions}) where {T,D<:Dimensions,Q<:Quantity{T,D}} |
90 | | - result = new_quantity(Q, ustrip(q), dim_type(Q)) |
| 85 | +function Base.convert(::Type{Quantity{T,D}}, q::Quantity{<:Any,<:SymbolicDimensions}) where {T,D<:Dimensions} |
| 86 | + result = Quantity(T(ustrip(q)), D()) |
91 | 87 | d = dimension(q) |
92 | 88 | for (idx, value) in zip(getfield(d, :nzdims), getfield(d, :nzvals)) |
93 | 89 | if !iszero(value) |
94 | | - result = result * convert(Q, ALL_VALUES[idx]) ^ value |
| 90 | + result = result * convert(Quantity{T,D}, ALL_VALUES[idx]) ^ value |
95 | 91 | end |
96 | 92 | end |
97 | 93 | return result |
|
0 commit comments