|
1 |
| -Base.:*(l::Dimensions, r::Dimensions) = @map_dimensions(+, l, r) |
2 |
| -Base.:*(l::Quantity, r::Quantity) = Quantity(l.value * r.value, l.dimensions * r.dimensions) |
3 |
| -Base.:*(l::Quantity, r::Dimensions) = Quantity(l.value, l.dimensions * r) |
4 |
| -Base.:*(l::Dimensions, r::Quantity) = Quantity(r.value, l * r.dimensions) |
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) |
| 1 | +Base.:*(l::AbstractDimensions, r::AbstractDimensions) = map_dimensions(+, l, r) |
| 2 | +Base.:*(l::AbstractQuantity, r::AbstractQuantity) = new_quantity(typeof(l), ustrip(l) * ustrip(r), dimension(l) * dimension(r)) |
| 3 | +Base.:*(l::AbstractQuantity, r::AbstractDimensions) = new_quantity(typeof(l), ustrip(l), dimension(l) * r) |
| 4 | +Base.:*(l::AbstractDimensions, r::AbstractQuantity) = new_quantity(typeof(r), ustrip(r), l * dimension(r)) |
| 5 | +Base.:*(l::AbstractQuantity, r) = new_quantity(typeof(l), ustrip(l) * r, dimension(l)) |
| 6 | +Base.:*(l, r::AbstractQuantity) = new_quantity(typeof(r), l * ustrip(r), dimension(r)) |
| 7 | +Base.:*(l::AbstractDimensions, r) = error("Please use an `AbstractQuantity` for multiplication. You used multiplication on types: $(typeof(l)) and $(typeof(r)).") |
| 8 | +Base.:*(l, r::AbstractDimensions) = error("Please use an `AbstractQuantity` for multiplication. You used multiplication on types: $(typeof(l)) and $(typeof(r)).") |
9 | 9 |
|
10 |
| -Base.:/(l::Dimensions, r::Dimensions) = @map_dimensions(-, l, r) |
11 |
| -Base.:/(l::Quantity, r::Quantity) = Quantity(l.value / r.value, l.dimensions / r.dimensions) |
12 |
| -Base.:/(l::Quantity, r::Dimensions) = Quantity(l.value, l.dimensions / r) |
13 |
| -Base.:/(l::Dimensions, r::Quantity) = Quantity(inv(r.value), l / r.dimensions) |
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)) |
| 10 | +Base.:/(l::AbstractDimensions, r::AbstractDimensions) = map_dimensions(-, l, r) |
| 11 | +Base.:/(l::AbstractQuantity, r::AbstractQuantity) = new_quantity(typeof(l), ustrip(l) / ustrip(r), dimension(l) / dimension(r)) |
| 12 | +Base.:/(l::AbstractQuantity, r::AbstractDimensions) = new_quantity(typeof(l), ustrip(l), dimension(l) / r) |
| 13 | +Base.:/(l::AbstractDimensions, r::AbstractQuantity) = new_quantity(typeof(r), inv(ustrip(r)), l / dimension(r)) |
| 14 | +Base.:/(l::AbstractQuantity, r) = new_quantity(typeof(l), ustrip(l) / r, dimension(l)) |
| 15 | +Base.:/(l, r::AbstractQuantity) = l * inv(r) |
| 16 | +Base.:/(l::AbstractDimensions, r) = error("Please use an `AbstractQuantity` for division. You used division on types: $(typeof(l)) and $(typeof(r)).") |
| 17 | +Base.:/(l, r::AbstractDimensions) = error("Please use an `AbstractQuantity` for division. You used division on types: $(typeof(l)) and $(typeof(r)).") |
18 | 18 |
|
19 |
| -Base.:+(l::Quantity, r::Quantity) = dimension(l) == dimension(r) ? Quantity(l.value + r.value, l.dimensions) : throw(DimensionError(l, r)) |
20 |
| -Base.:-(l::Quantity) = Quantity(-l.value, l.dimensions) |
21 |
| -Base.:-(l::Quantity, r::Quantity) = l + (-r) |
| 19 | +Base.:+(l::AbstractQuantity, r::AbstractQuantity) = dimension(l) == dimension(r) ? new_quantity(typeof(l), ustrip(l) + ustrip(r), dimension(l)) : throw(DimensionError(l, r)) |
| 20 | +Base.:-(l::AbstractQuantity) = new_quantity(typeof(l), -ustrip(l), dimension(l)) |
| 21 | +Base.:-(l::AbstractQuantity, r::AbstractQuantity) = l + (-r) |
22 | 22 |
|
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) |
| 23 | +Base.:+(l::AbstractQuantity, r) = iszero(dimension(l)) ? new_quantity(typeof(l), ustrip(l) + r, dimension(l)) : throw(DimensionError(l, r)) |
| 24 | +Base.:+(l, r::AbstractQuantity) = iszero(dimension(r)) ? new_quantity(typeof(r), l + ustrip(r), dimension(r)) : throw(DimensionError(l, r)) |
| 25 | +Base.:-(l::AbstractQuantity, r) = l + (-r) |
| 26 | +Base.:-(l, r::AbstractQuantity) = l + (-r) |
27 | 27 |
|
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) |
32 |
| -Base.:^(l::Dimensions{R}, r::Number) where {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)) |
| 28 | +# We don't promote on the dimension types: |
| 29 | +_pow(l::AbstractDimensions{R}, r::R) where {R} = map_dimensions(Base.Fix1(*, r), l) |
| 30 | +Base.:^(l::AbstractDimensions{R}, r::Number) where {R} = _pow(l, tryrationalize(R, r)) |
| 31 | +Base.:^(l::AbstractQuantity{T,D}, r::Integer) where {T,R,D<:AbstractDimensions{R}} = new_quantity(typeof(l), ustrip(l)^r, dimension(l)^r) |
| 32 | +Base.:^(l::AbstractQuantity{T,D}, r::Number) where {T,R,D<:AbstractDimensions{R}} = |
| 33 | + let dim_pow = tryrationalize(R, r), val_pow = convert(T, dim_pow) |
| 34 | + # Need to ensure we take the numerical power by the rationalized quantity: |
| 35 | + return new_quantity(typeof(l), ustrip(l)^val_pow, dimension(l)^dim_pow) |
| 36 | + end |
35 | 37 |
|
36 |
| -Base.inv(d::Dimensions) = @map_dimensions(-, d) |
37 |
| -Base.inv(q::Quantity) = Quantity(inv(q.value), inv(q.dimensions)) |
| 38 | +Base.inv(d::AbstractDimensions) = map_dimensions(-, d) |
| 39 | +Base.inv(q::AbstractQuantity) = new_quantity(typeof(q), inv(ustrip(q)), inv(dimension(q))) |
38 | 40 |
|
39 |
| -Base.sqrt(d::Dimensions{R}) where {R} = d^inv(convert(R, 2)) |
40 |
| -Base.sqrt(q::Quantity) = Quantity(sqrt(q.value), sqrt(q.dimensions)) |
41 |
| -Base.cbrt(d::Dimensions{R}) where {R} = d^inv(convert(R, 3)) |
42 |
| -Base.cbrt(q::Quantity) = Quantity(cbrt(q.value), cbrt(q.dimensions)) |
| 41 | +Base.sqrt(d::AbstractDimensions{R}) where {R} = d^inv(convert(R, 2)) |
| 42 | +Base.sqrt(q::AbstractQuantity) = new_quantity(typeof(q), sqrt(ustrip(q)), sqrt(dimension(q))) |
| 43 | +Base.cbrt(d::AbstractDimensions{R}) where {R} = d^inv(convert(R, 3)) |
| 44 | +Base.cbrt(q::AbstractQuantity) = new_quantity(typeof(q), cbrt(ustrip(q)), cbrt(dimension(q))) |
43 | 45 |
|
44 |
| -Base.abs(q::Quantity) = Quantity(abs(q.value), q.dimensions) |
| 46 | +Base.abs(q::AbstractQuantity) = new_quantity(typeof(q), abs(ustrip(q)), dimension(q)) |
0 commit comments