Skip to content

Commit 2412d55

Browse files
committed
Merge branch 'units' into additional-utils
2 parents bada5cf + 243017d commit 2412d55

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

src/fixed_rational.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ Base.convert(::Type{Rational{R}}, x::F) where {R,F<:FixedRational} = Rational{R}
4343
Base.convert(::Type{Rational}, x::F) where {F<:FixedRational} = Rational{eltype(F)}(x.num, denom(F))
4444
Base.convert(::Type{AF}, x::F) where {AF<:AbstractFloat,F<:FixedRational} = convert(AF, x.num) / convert(AF, denom(F))
4545
Base.round(::Type{T}, x::F) where {T,F<:FixedRational} = div(convert(T, x.num), convert(T, denom(F)), RoundNearest)
46+
Base.promote(x::Integer, y::F) where {F<:FixedRational} = (F(x), y)
47+
Base.promote(x::F, y::Integer) where {F<:FixedRational} = (x, F(y))
4648
Base.promote(x, y::F) where {F<:FixedRational} = promote(x, convert(Rational, y))
4749
Base.promote(x::F, y) where {F<:FixedRational} = promote(convert(Rational, x), y)
4850
Base.show(io::IO, x::F) where {F<:FixedRational} = show(io, convert(Rational, x))

src/math.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@ Base.:+(l, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l + r.value, r
2525
Base.:-(l::Quantity, r) = l + (-r)
2626
Base.:-(l, r::Quantity) = l + (-r)
2727

28-
_pow(l::Dimensions{R}, r::R) where {R} = @map_dimensions(Base.Fix1(*, r), l)
29-
_pow(l::Quantity{T,R}, r::R) where {T,R} = Quantity(l.value^convert(T, r), _pow(l.dimensions, r))
28+
_pow(l::Dimensions, r) = @map_dimensions(Base.Fix1(*, r), l)
29+
_pow(l::Quantity{T}, r) where {T} = Quantity(l.value^r, _pow(l.dimensions, r))
30+
_pow_as_T(l::Quantity{T}, r) where {T} = Quantity(l.value^convert(T, r), _pow(l.dimensions, r))
31+
Base.:^(l::Dimensions{R}, r::Integer) where {R} = _pow(l, r)
3032
Base.:^(l::Dimensions{R}, r::Number) where {R} = _pow(l, tryrationalize(R, r))
31-
Base.:^(l::Quantity{T,R}, r::Number) where {T,R} = _pow(l, tryrationalize(R, r))
33+
Base.:^(l::Quantity{T,R}, r::Integer) where {T,R} = _pow(l, r)
34+
Base.:^(l::Quantity{T,R}, r::Number) where {T,R} = _pow_as_T(l, tryrationalize(R, r))
3235

3336
Base.inv(d::Dimensions) = @map_dimensions(-, d)
3437
Base.inv(q::Quantity) = Quantity(inv(q.value), inv(q.dimensions))

src/units.jl

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ end
1515
function _add_prefixes(base_unit::Symbol, prefixes)
1616
all_prefixes = (
1717
f=1e-15, p=1e-12, n=1e-9, μ=1e-6, u=1e-6, m=1e-3, c=1e-2, d=1e-1,
18-
k=1e3, M=1e6, G=1e9, T=1e12, P=1e15
18+
k=1e3, M=1e6, G=1e9
1919
)
2020
expr = Expr(:block)
2121
for (prefix, value) in zip(keys(all_prefixes), values(all_prefixes))
@@ -90,11 +90,6 @@ const bar = 100 * kPa
9090

9191
@add_prefixes bar ()
9292

93-
## Energy
94-
const eV = 1.602176634e-19 * J
95-
96-
@add_prefixes eV (m, k, M, G, T)
97-
9893
# Do not wish to define Gaussian units, as it changes
9994
# some formulas. Safer to force user to work exclusively in one unit system.
10095

@@ -109,9 +104,13 @@ corresponding `Quantity` object. For example, `uparse("m/s")`
109104
would be parsed to `Quantity(1.0, length=1, time=-1)`.
110105
"""
111106
function uparse(s::AbstractString)
112-
return eval(Meta.parse(s))::Quantity{DEFAULT_VALUE_TYPE,DEFAULT_DIM_TYPE}
107+
return as_quantity(eval(Meta.parse(s)))::Quantity{DEFAULT_VALUE_TYPE,DEFAULT_DIM_TYPE}
113108
end
114109

110+
as_quantity(q::Quantity) = q
111+
as_quantity(x::Number) = Quantity(convert(DEFAULT_VALUE_TYPE, x), DEFAULT_DIM_TYPE)
112+
as_quantity(x) = error("Unexpected type evaluated: $(typeof(x))")
113+
115114
"""
116115
@u_str(s::AbstractString)
117116

test/unittests.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,15 @@ end
293293
z = u"yr"
294294
@test utime(z) == 1
295295
@test ustrip(z) 60 * 60 * 24 * 365.25
296+
297+
# Test type stability of extreme range of units
298+
@test typeof(u"1") == Quantity{Float64,DEFAULT_DIM_TYPE}
299+
@test typeof(u"1f0") == Quantity{Float64,DEFAULT_DIM_TYPE}
300+
@test typeof(u"s"^2) == Quantity{Float64,DEFAULT_DIM_TYPE}
301+
@test typeof(u"") == Quantity{Float64,DEFAULT_DIM_TYPE}
302+
@test typeof(u"Gyr") == Quantity{Float64,DEFAULT_DIM_TYPE}
303+
@test typeof(u"fm") == Quantity{Float64,DEFAULT_DIM_TYPE}
304+
@test typeof(u"fm"^2) == Quantity{Float64,DEFAULT_DIM_TYPE}
305+
306+
@test_throws LoadError eval(:(u":x"))
296307
end

0 commit comments

Comments
 (0)