Skip to content

Commit 957ec74

Browse files
committed
Add proper one, zero, and oneunit calls
1 parent 45748b2 commit 957ec74

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

src/utils.jl

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,26 @@ Base.iterate(::Dimensions, ::Nothing) = nothing
4545
Base.iterate(q::Quantity) = (q, nothing)
4646
Base.iterate(::Quantity, ::Nothing) = nothing
4747

48-
Base.zero(::Type{Quantity{T,R}}) where {T,R} = Quantity(zero(T), R)
48+
# Multiplicative identities:
4949
Base.one(::Type{Quantity{T,R}}) where {T,R} = Quantity(one(T), R)
50-
Base.one(::Type{Dimensions{R}}) where {R} = Dimensions{R}()
51-
52-
Base.zero(::Type{Quantity{T}}) where {T} = zero(Quantity{T,DEFAULT_DIM_TYPE})
5350
Base.one(::Type{Quantity{T}}) where {T} = one(Quantity{T,DEFAULT_DIM_TYPE})
54-
55-
Base.zero(::Type{Quantity}) = zero(Quantity{DEFAULT_VALUE_TYPE})
5651
Base.one(::Type{Quantity}) = one(Quantity{DEFAULT_VALUE_TYPE})
52+
Base.one(::Type{Dimensions{R}}) where {R} = Dimensions{R}()
5753
Base.one(::Type{Dimensions}) = one(Dimensions{DEFAULT_DIM_TYPE})
54+
Base.one(q::Quantity) = one(typeof(q))
55+
Base.one(d::Dimensions) = one(typeof(d))
56+
57+
# Additive identities:
58+
Base.zero(q::Q) where {T,Q<:Quantity{T}} = Quantity(zero(ustrip(q)), dimension(q))
59+
Base.zero(::D) where {D<:Dimensions} = error("There is no such thing as an additive identity for a `Dimensions` object, as + is only defined for `Quantity`.")
60+
Base.zero(::Type{Q}) where {Q<:Quantity} = error("Cannot create an additive identity for a `Quantity` type, as the dimensions are unknown. Please use `zero(::Quantity)` instead.")
61+
Base.zero(::Type{D}) where {D<:Dimensions} = error("There is no such thing as an additive identity for a `Dimensions` type, as + is only defined for `Quantity`.")
62+
63+
# Dimensionful 1:
64+
Base.oneunit(q::Q) where {T,Q<:Quantity{T}} = Quantity(oneunit(ustrip(q)), dimension(q))
65+
Base.oneunit(::Type{Q}) where {Q<:Quantity} = error("Cannot create a dimensionful 1 for a `Quantity` type without knowing the dimensions. Please use `oneunit(::Quantity)` instead.")
66+
Base.oneunit(::D) where {D<:Dimensions} = error("There is no such thing as a dimensionful 1 for a `Dimensions` object, as + is only defined for `Quantity`.")
67+
Base.oneunit(::Type{D}) where {D<:Dimensions} = error("There is no such thing as a dimensionful 1 for a `Dimensions` type, as + is only defined for `Quantity`.")
5868

5969
Base.show(io::IO, d::Dimensions) =
6070
let tmp_io = IOBuffer()

0 commit comments

Comments
 (0)