Skip to content

Commit 5bcce75

Browse files
committed
Remove ::Number restrictions on math
1 parent 060d147 commit 5bcce75

File tree

3 files changed

+29
-14
lines changed

3 files changed

+29
-14
lines changed

src/math.jl

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,28 @@ Base.:*(l::Dimensions, r::Dimensions) = @map_dimensions(+, l, r)
22
Base.:*(l::Quantity, r::Quantity) = Quantity(l.value * r.value, l.dimensions * r.dimensions)
33
Base.:*(l::Quantity, r::Dimensions) = Quantity(l.value, l.dimensions * r)
44
Base.:*(l::Dimensions, r::Quantity) = Quantity(r.value, l * r.dimensions)
5-
Base.:*(l::Quantity, r::Number) = Quantity(l.value * r, l.dimensions)
6-
Base.:*(l::Number, r::Quantity) = Quantity(l * r.value, r.dimensions)
7-
Base.:*(l::Dimensions, r::Number) = Quantity(r, l)
8-
Base.:*(l::Number, r::Dimensions) = Quantity(l, r)
5+
Base.:*(l::Quantity, r) = Quantity(l.value * r, l.dimensions)
6+
Base.:*(l, r::Quantity) = Quantity(l * r.value, r.dimensions)
7+
Base.:*(l::Dimensions, r) = Quantity(r, l)
8+
Base.:*(l, r::Dimensions) = Quantity(l, r)
99

1010
Base.:/(l::Dimensions, r::Dimensions) = @map_dimensions(-, l, r)
1111
Base.:/(l::Quantity, r::Quantity) = Quantity(l.value / r.value, l.dimensions / r.dimensions)
1212
Base.:/(l::Quantity, r::Dimensions) = Quantity(l.value, l.dimensions / r)
1313
Base.:/(l::Dimensions, r::Quantity) = Quantity(inv(r.value), l / r.dimensions)
14-
Base.:/(l::Quantity, r::Number) = Quantity(l.value / r, l.dimensions)
15-
Base.:/(l::Number, r::Quantity) = l * inv(r)
16-
Base.:/(l::Dimensions, r::Number) = Quantity(inv(r), l)
17-
Base.:/(l::Number, r::Dimensions) = Quantity(l, inv(r))
14+
Base.:/(l::Quantity, r) = Quantity(l.value / r, l.dimensions)
15+
Base.:/(l, r::Quantity) = l * inv(r)
16+
Base.:/(l::Dimensions, r) = Quantity(inv(r), l)
17+
Base.:/(l, r::Dimensions) = Quantity(l, inv(r))
1818

1919
Base.:+(l::Quantity, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l.value + r.value, l.dimensions) : throw(DimensionError(l, r))
2020
Base.:-(l::Quantity) = Quantity(-l.value, l.dimensions)
2121
Base.:-(l::Quantity, r::Quantity) = l + (-r)
2222

23-
Base.:+(l::Quantity, r::Number) = dimension(l) == dimension(r) ? Quantity(l.value + r, l.dimensions) : throw(DimensionError(l, r))
24-
Base.:+(l::Number, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l + r.value, r.dimensions) : throw(DimensionError(l, r))
25-
Base.:-(l::Quantity, r::Number) = l + (-r)
26-
Base.:-(l::Number, r::Quantity) = l + (-r)
23+
Base.:+(l::Quantity, r) = dimension(l) == dimension(r) ? Quantity(l.value + r, l.dimensions) : throw(DimensionError(l, r))
24+
Base.:+(l, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l + r.value, r.dimensions) : throw(DimensionError(l, r))
25+
Base.:-(l::Quantity, r) = l + (-r)
26+
Base.:-(l, r::Quantity) = l + (-r)
2727

2828
_pow(l::Dimensions{R}, r::R) where {R} = @map_dimensions(Base.Fix1(*, r), l)
2929
_pow(l::Quantity{T,R}, r::R) where {T,R} = Quantity(l.value^convert(T, r), _pow(l.dimensions, r))

src/utils.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,17 @@ Base.convert(::Type{Dimensions{R}}, d::Dimensions) where {R} = Dimensions{R}(d)
111111
Remove the units from a quantity.
112112
"""
113113
ustrip(q::Quantity) = q.value
114-
ustrip(q::Number) = q
114+
ustrip(::Dimensions) = error("Cannot remove units from a `Dimensions` object.")
115+
ustrip(q) = q
115116

116117
"""
117118
dimension(q::Quantity)
118119
119120
Get the dimensions of a quantity, returning a `Dimensions` object.
120121
"""
121122
dimension(q::Quantity) = q.dimensions
122-
dimension(::Number) = Dimensions()
123+
dimension(d::Dimensions) = d
124+
dimension(_) = Dimensions()
123125

124126
"""
125127
ulength(q::Quantity)

test/unittests.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,12 @@ end
129129

130130
@testset "Fallbacks" begin
131131
@test ustrip(0.5) == 0.5
132+
@test ustrip(ones(32)) == ones(32)
132133
@test dimension(0.5) == Dimensions()
134+
@test dimension(ones(32)) == Dimensions()
135+
@test dimension(Dimensions()) === Dimensions()
136+
137+
@test_throws ErrorException ustrip(Dimensions())
133138
end
134139

135140
@testset "Arrays" begin
@@ -147,6 +152,14 @@ end
147152

148153
uX = X .* Quantity(2, length=2.5, luminosity=0.5)
149154
@test sum(X) == 0.5 * ustrip(sum(uX))
155+
156+
x = Quantity(ones(T, 32))
157+
@test ustrip(x + ones(T, 32))[32] == 2
158+
@test typeof(x + ones(T, 32)) <: Quantity{Vector{T}}
159+
@test typeof(x - ones(T, 32)) <: Quantity{Vector{T}}
160+
@test typeof(ones(T, 32) * Dimensions(length=1)) <: Quantity{Vector{T}}
161+
@test typeof(ones(T, 32) / Dimensions(length=1)) <: Quantity{Vector{T}}
162+
@test ones(T, 32) / Dimensions(length=1) == Quantity(ones(T, 32), length=-1)
150163
end
151164
end
152165

0 commit comments

Comments
 (0)