Skip to content

Commit c643ea6

Browse files
committed
Back to Quantity as default
1 parent 664b188 commit c643ea6

File tree

7 files changed

+40
-35
lines changed

7 files changed

+40
-35
lines changed

src/arrays.jl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ and so can be used in most places where a normal array would be used, including
1515
# Constructors
1616
1717
- `QuantityArray(v::AbstractArray, d::AbstractDimensions)`: Create a `QuantityArray` with value `v` and dimensions `d`,
18-
using `RealQuantity` if the eltype of `v` is real, `Quantity` if it is numeric, and `GenericQuantity` otherwise.
18+
using `Quantity` if it is numeric, and `GenericQuantity` otherwise.
1919
- `QuantityArray(v::AbstractArray{<:Number}, q::AbstractQuantity)`: Create a `QuantityArray` with value `v` and dimensions inferred
2020
with `dimension(q)`. This is so that you can easily create an array with the units module, like so:
2121
```julia
@@ -54,9 +54,11 @@ end
5454

5555
QuantityArray(v::AbstractArray; kws...) = QuantityArray(v, DEFAULT_DIM_TYPE(; kws...))
5656
for (type, base_type, default_type) in ABSTRACT_QUANTITY_TYPES
57-
@eval begin
58-
QuantityArray(v::AbstractArray{<:$base_type}, q::$type) = QuantityArray(v .* ustrip(q), dimension(q), typeof(q))
59-
QuantityArray(v::AbstractArray{<:$base_type}, d::AbstractDimensions) = QuantityArray(v, d, $default_type)
57+
@eval QuantityArray(v::AbstractArray{<:$base_type}, q::$type) = QuantityArray(v .* ustrip(q), dimension(q), typeof(q))
58+
59+
# Only define defaults for Quantity and GenericQuantity. Other types, the user needs to declare explicitly.
60+
if type in (AbstractQuantity, AbstractGenericQuantity)
61+
@eval QuantityArray(v::AbstractArray{<:$base_type}, d::AbstractDimensions) = QuantityArray(v, d, $default_type)
6062
end
6163
end
6264
QuantityArray(v::QA) where {Q<:UnionAbstractQuantity,QA<:AbstractArray{Q}} =

src/constants.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
module Constants
22

33
import ..DEFAULT_QUANTITY_TYPE
4-
import ..RealQuantity
54
import ..Units as U
65
import ..Units: _add_prefixes
76

src/symbolic_dimensions.jl

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ function map_dimensions(op::O, l::SymbolicDimensions{L}, r::SymbolicDimensions{R
264264
return SymbolicDimensions(I, V)
265265
end
266266

267+
const DEFAULT_SYMBOLIC_QUANTITY_TYPE = with_type_parameters(DEFAULT_QUANTITY_TYPE, DEFAULT_VALUE_TYPE, SymbolicDimensions{DEFAULT_DIM_BASE_TYPE})
268+
267269
"""
268270
SymbolicUnitsParse
269271
@@ -277,7 +279,8 @@ module SymbolicUnitsParse
277279
import ..SYMBOL_CONFLICTS
278280
import ..SymbolicDimensions
279281

280-
import ...RealQuantity
282+
import ...constructorof
283+
import ...DEFAULT_SYMBOLIC_QUANTITY_TYPE
281284
import ...DEFAULT_VALUE_TYPE
282285
import ...DEFAULT_DIM_BASE_TYPE
283286

@@ -287,7 +290,8 @@ module SymbolicUnitsParse
287290
import ..SYMBOL_CONFLICTS
288291
import ..SymbolicDimensions
289292

290-
import ..RealQuantity
293+
import ..constructorof
294+
import ..DEFAULT_SYMBOLIC_QUANTITY_TYPE
291295
import ..DEFAULT_VALUE_TYPE
292296
import ..DEFAULT_DIM_BASE_TYPE
293297

@@ -299,11 +303,11 @@ module SymbolicUnitsParse
299303
CONSTANT_SYMBOLS_EXIST[] || lock(CONSTANT_SYMBOLS_LOCK) do
300304
CONSTANT_SYMBOLS_EXIST[] && return nothing
301305
for unit in setdiff(CONSTANT_SYMBOLS, SYMBOL_CONFLICTS)
302-
@eval const $unit = RealQuantity(DEFAULT_VALUE_TYPE(1.0), SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}; $(unit)=1)
306+
@eval const $unit = constructorof(DEFAULT_SYMBOLIC_QUANTITY_TYPE)(DEFAULT_VALUE_TYPE(1.0), SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}; $(unit)=1)
303307
end
304308
# Evaluate conflicting symbols to non-symbolic form:
305309
for unit in SYMBOL_CONFLICTS
306-
@eval const $unit = convert(RealQuantity{DEFAULT_VALUE_TYPE,SymbolicDimensions}, EagerConstants.$unit)
310+
@eval const $unit = convert(DEFAULT_SYMBOLIC_QUANTITY_TYPE, EagerConstants.$unit)
307311
end
308312
CONSTANT_SYMBOLS_EXIST[] = true
309313
end
@@ -318,7 +322,7 @@ module SymbolicUnitsParse
318322
UNIT_SYMBOLS_EXIST[] || lock(UNIT_SYMBOLS_LOCK) do
319323
UNIT_SYMBOLS_EXIST[] && return nothing
320324
for unit in UNIT_SYMBOLS
321-
@eval const $unit = RealQuantity(DEFAULT_VALUE_TYPE(1.0), SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}; $(unit)=1)
325+
@eval const $unit = constructorof(DEFAULT_SYMBOLIC_QUANTITY_TYPE)(DEFAULT_VALUE_TYPE(1.0), SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}; $(unit)=1)
322326
end
323327
UNIT_SYMBOLS_EXIST[] = true
324328
end
@@ -329,27 +333,27 @@ module SymbolicUnitsParse
329333
sym_uparse(raw_string::AbstractString)
330334
331335
Parse a string containing an expression of units and return the
332-
corresponding `RealQuantity` object with `Float64` value.
336+
corresponding `Quantity` object with `Float64` value.
333337
However, that unlike the regular `u"..."` macro, this macro uses
334338
`SymbolicDimensions` for the dimension type, which means that all units and
335339
constants are stored symbolically and will not automatically expand to SI
336340
units. For example, `sym_uparse("km/s^2")` would be parsed to
337-
`RealQuantity(1.0, SymbolicDimensions, km=1, s=-2)`.
341+
`Quantity(1.0, SymbolicDimensions, km=1, s=-2)`.
338342
339343
Note that inside this expression, you also have access to the `Constants`
340344
module. So, for example, `sym_uparse("Constants.c^2 * Hz^2")` would evaluate to
341-
`RealQuantity(1.0, SymbolicDimensions, c=2, Hz=2)`. However, note that due to
345+
`Quantity(1.0, SymbolicDimensions, c=2, Hz=2)`. However, note that due to
342346
namespace collisions, a few physical constants are automatically converted.
343347
"""
344348
function sym_uparse(raw_string::AbstractString)
345349
_generate_unit_symbols()
346350
Constants._generate_unit_symbols()
347351
raw_result = eval(Meta.parse(raw_string))
348-
return copy(as_quantity(raw_result))::RealQuantity{DEFAULT_VALUE_TYPE,SymbolicDimensions{DEFAULT_DIM_BASE_TYPE}}
352+
return copy(as_quantity(raw_result))::DEFAULT_SYMBOLIC_QUANTITY_TYPE
349353
end
350354

351-
as_quantity(q::RealQuantity) = q
352-
as_quantity(x::Number) = RealQuantity(convert(DEFAULT_VALUE_TYPE, x), SymbolicDimensions{DEFAULT_DIM_BASE_TYPE})
355+
as_quantity(q::DEFAULT_SYMBOLIC_QUANTITY_TYPE) = q
356+
as_quantity(x::Number) = convert(DEFAULT_SYMBOLIC_QUANTITY_TYPE, x)
353357
as_quantity(x) = error("Unexpected type evaluated: $(typeof(x))")
354358
end
355359

@@ -359,15 +363,15 @@ import .SymbolicUnitsParse: sym_uparse
359363
us"[unit expression]"
360364
361365
Parse a string containing an expression of units and return the
362-
corresponding `RealQuantity` object with `Float64` value. However,
366+
corresponding `Quantity` object with `Float64` value. However,
363367
unlike the regular `u"..."` macro, this macro uses `SymbolicDimensions`
364368
for the dimension type, which means that all units and constants
365369
are stored symbolically and will not automatically expand to SI units.
366-
For example, `us"km/s^2"` would be parsed to `RealQuantity(1.0, SymbolicDimensions, km=1, s=-2)`.
370+
For example, `us"km/s^2"` would be parsed to `Quantity(1.0, SymbolicDimensions, km=1, s=-2)`.
367371
368372
Note that inside this expression, you also have access to the `Constants`
369373
module. So, for example, `us"Constants.c^2 * Hz^2"` would evaluate to
370-
`RealQuantity(1.0, SymbolicDimensions, c=2, Hz=2)`. However, note that due to
374+
`Quantity(1.0, SymbolicDimensions, c=2, Hz=2)`. However, note that due to
371375
namespace collisions, a few physical constants are automatically converted.
372376
"""
373377
macro us_str(s)

src/types.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ for (type, base_type, _) in ABSTRACT_QUANTITY_TYPES
214214
end
215215
end
216216

217-
const DEFAULT_QUANTITY_TYPE = RealQuantity{DEFAULT_VALUE_TYPE, DEFAULT_DIM_TYPE}
217+
const DEFAULT_QUANTITY_TYPE = Quantity{DEFAULT_VALUE_TYPE, DEFAULT_DIM_TYPE}
218218

219219
@inline function new_dimensions(::Type{D}, dims...) where {D<:AbstractDimensions}
220220
return constructorof(D)(dims...)

src/units.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ module Units
33
import ..DEFAULT_DIM_TYPE
44
import ..DEFAULT_VALUE_TYPE
55
import ..DEFAULT_QUANTITY_TYPE
6-
import ..RealQuantity
76

87
@assert DEFAULT_VALUE_TYPE == Float64 "`units.jl` must be updated to support a different default value type."
98

src/uparse.jl

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module UnitsParse
22

3-
import ..RealQuantity
3+
import ..constructorof
4+
import ..DEFAULT_QUANTITY_TYPE
45
import ..DEFAULT_DIM_TYPE
56
import ..DEFAULT_VALUE_TYPE
67
import ..Units: UNIT_SYMBOLS
@@ -24,28 +25,28 @@ end
2425
uparse(s::AbstractString)
2526
2627
Parse a string containing an expression of units and return the
27-
corresponding `RealQuantity` object with `Float64` value. For example,
28-
`uparse("m/s")` would be parsed to `RealQuantity(1.0, length=1, time=-1)`.
28+
corresponding `Quantity` object with `Float64` value. For example,
29+
`uparse("m/s")` would be parsed to `Quantity(1.0, length=1, time=-1)`.
2930
3031
Note that inside this expression, you also have access to the `Constants`
3132
module. So, for example, `uparse("Constants.c^2 * Hz^2")` would evaluate to
3233
the quantity corresponding to the speed of light multiplied by Hertz,
3334
squared.
3435
"""
3536
function uparse(s::AbstractString)
36-
return as_quantity(eval(Meta.parse(s)))::RealQuantity{DEFAULT_VALUE_TYPE,DEFAULT_DIM_TYPE}
37+
return as_quantity(eval(Meta.parse(s)))::DEFAULT_QUANTITY_TYPE
3738
end
3839

39-
as_quantity(q::RealQuantity) = q
40-
as_quantity(x::Number) = RealQuantity(convert(DEFAULT_VALUE_TYPE, x), DEFAULT_DIM_TYPE)
40+
as_quantity(q::DEFAULT_QUANTITY_TYPE) = q
41+
as_quantity(x::Number) = convert(DEFAULT_QUANTITY_TYPE, x)
4142
as_quantity(x) = error("Unexpected type evaluated: $(typeof(x))")
4243

4344
"""
4445
u"[unit expression]"
4546
4647
Parse a string containing an expression of units and return the
47-
corresponding `RealQuantity` object with `Float64` value. For example,
48-
`u"km/s^2"` would be parsed to `RealQuantity(1000.0, length=1, time=-2)`.
48+
corresponding `Quantity` object with `Float64` value. For example,
49+
`u"km/s^2"` would be parsed to `Quantity(1000.0, length=1, time=-2)`.
4950
5051
Note that inside this expression, you also have access to the `Constants`
5152
module. So, for example, `u"Constants.c^2 * Hz^2"` would evaluate to

test/unittests.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ end
499499
@eval struct MyNumber <: Real
500500
x::Float64
501501
end
502-
a = 0.5u"km/s"
502+
a = RealQuantity(0.5u"km/s")
503503
b = MyNumber(0.5)
504504
ar = [a, b]
505505
@test ar isa Vector{Real}
@@ -704,13 +704,13 @@ end
704704
@test_throws DimensionError uconvert(us"nm * J", 5e-9u"m")
705705

706706
# Types:
707-
@test typeof(uconvert(us"nm", 5e-9u"m")) <: RealQuantity{Float64,<:SymbolicDimensions}
707+
@test typeof(uconvert(us"nm", 5e-9u"m")) <: constructorof(DEFAULT_QUANTITY_TYPE){Float64,<:SymbolicDimensions}
708708
@test typeof(uconvert(us"nm", GenericQuantity(5e-9u"m"))) <: GenericQuantity{Float64,<:SymbolicDimensions}
709709
@test uconvert(GenericQuantity(us"nm"), GenericQuantity(5e-9u"m")) 5us"nm"
710710
@test uconvert(GenericQuantity(us"nm"), GenericQuantity(5e-9u"m")) GenericQuantity(5us"nm")
711711

712712
# We only want to convert the dimensions, and ignore the quantity type:
713-
@test typeof(uconvert(GenericQuantity(us"nm"), 5e-9u"m")) <: RealQuantity{Float64,<:SymbolicDimensions}
713+
@test typeof(uconvert(GenericQuantity(us"nm"), 5e-9u"m")) <: constructorof(DEFAULT_QUANTITY_TYPE){Float64,<:SymbolicDimensions}
714714

715715
q = 1.5u"Constants.M_sun"
716716
qs = uconvert(us"Constants.M_sun", 5.0 * q)
@@ -803,7 +803,7 @@ end
803803
end
804804

805805
@testset "Rational power law" begin
806-
x = 1.0u"m"
806+
x = RealQuantity(1.0u"m")
807807
y = x ^ (3//2)
808808
@test y == Quantity(1.0, length=3//2)
809809
@test typeof(y) == RealQuantity{Float64,DEFAULT_DIM_TYPE}
@@ -1201,8 +1201,8 @@ end
12011201
qy = QuantityArray(y; length=1)
12021202

12031203
@test typeof(convert(typeof(qx), qy)) == typeof(qx)
1204-
@test convert(typeof(qx), qy)[1] isa RealQuantity{Float64}
1205-
@test convert(typeof(qx), qy)[1] == convert(RealQuantity{Float64}, qy[1])
1204+
@test convert(typeof(qx), qy)[1] isa Quantity{Float64}
1205+
@test convert(typeof(qx), qy)[1] == convert(Quantity{Float64}, qy[1])
12061206
end
12071207
end
12081208

0 commit comments

Comments
 (0)