@@ -24,7 +24,7 @@ const ALL_MAPPING = NamedTuple([s => i for (i, s) in enumerate(ALL_SYMBOLS)])
24
24
"""
25
25
SymbolicDimensions{R} <: AbstractDimensions{R}
26
26
27
- An `AbstractDimensions` with one dimension for every unit symbol.
27
+ An `AbstractDimensions` with one dimension for every unit and constant symbol.
28
28
This is to allow for lazily reducing to SI base units, whereas
29
29
`Dimensions` is always in SI base units. Furthermore, `SymbolicDimensions`
30
30
stores dimensions using a sparse vector for efficiency (since there
@@ -58,6 +58,21 @@ SymbolicDimensions{R}(d::SymbolicDimensions) where {R} = SymbolicDimensions{R}(d
58
58
return constructor (data)
59
59
end
60
60
61
+ function Base. convert (:: Type{Qout} , q:: Quantity{<:Any,<:Dimensions} ) where {T,D<: SymbolicDimensions ,Qout<: Quantity{T,D} }
62
+ output = Qout (
63
+ convert (T, ustrip (q)),
64
+ D;
65
+ m= ulength (q),
66
+ kg= umass (q),
67
+ s= utime (q),
68
+ A= ucurrent (q),
69
+ K= utemperature (q),
70
+ cd= uluminosity (q),
71
+ mol= uamount (q),
72
+ )
73
+ SA. dropzeros! (data (dimension (output)))
74
+ return output
75
+ end
61
76
function Base. convert (:: Type{Q} , q:: Quantity{<:Any,<:SymbolicDimensions} ) where {T,D<: Dimensions ,Q<: Quantity{T,D} }
62
77
result = one (Q) * ustrip (q)
63
78
d = dimension (q)
@@ -115,6 +130,8 @@ module SymbolicUnitsParse
115
130
import .. DEFAULT_VALUE_TYPE
116
131
import .. DEFAULT_DIM_BASE_TYPE
117
132
133
+ import ... Constants as EagerConstants
134
+
118
135
const CONSTANT_SYMBOLS_EXIST = Ref {Bool} (false )
119
136
const CONSTANT_SYMBOLS_LOCK = Threads. SpinLock ()
120
137
function _generate_unit_symbols ()
@@ -123,6 +140,10 @@ module SymbolicUnitsParse
123
140
for unit in setdiff (CONSTANT_SYMBOLS, SYMBOL_CONFLICTS)
124
141
@eval const $ unit = Quantity (DEFAULT_VALUE_TYPE (1.0 ), SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}; $ (unit)= 1 )
125
142
end
143
+ # Evaluate conflicting symbols to non-symbolic form:
144
+ for unit in SYMBOL_CONFLICTS
145
+ @eval const $ unit = convert (Quantity{DEFAULT_VALUE_TYPE,SymbolicDimensions}, EagerConstants.$ unit)
146
+ end
126
147
CONSTANT_SYMBOLS_EXIST[] = true
127
148
end
128
149
return nothing
0 commit comments