Skip to content

Commit ef77887

Browse files
author
David Widmann
committed
Improve and test conversions
1 parent 8639725 commit ef77887

File tree

2 files changed

+15
-17
lines changed

2 files changed

+15
-17
lines changed

src/symbolic_dimensions.jl

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,27 +71,23 @@ end
7171
function Base.convert(::Type{Quantity{T,SymbolicDimensions}}, q::Quantity{<:Any,<:Dimensions}) where {T}
7272
return convert(Quantity{T,SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}}, q)
7373
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)
8884
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())
9187
d = dimension(q)
9288
for (idx, value) in zip(getfield(d, :nzdims), getfield(d, :nzvals))
9389
if !iszero(value)
94-
result = result * convert(Q, ALL_VALUES[idx]) ^ value
90+
result = result * convert(Quantity{T,D}, ALL_VALUES[idx]) ^ value
9591
end
9692
end
9793
return result

test/unittests.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,8 @@ end
580580

581581
# Test conversion
582582
@test typeof(SymbolicDimensions{Rational{Int}}(dimension(us"km/s"))) == SymbolicDimensions{Rational{Int}}
583+
@test convert(Quantity{Float64,SymbolicDimensions}, u"kg") == us"1kg"
584+
@test convert(Quantity{Float64,Dimensions}, us"3.5kg/s") == u"3.5kg/s"
583585

584586
# Helpful error if symbol not found:
585587
sym5 = dimension(us"km/s")

0 commit comments

Comments
 (0)