|
1 |
| -import Compat: allequal |
| 1 | +using Compat: allequal |
| 2 | +using PrecompileTools: @recompile_invalidations |
2 | 3 |
|
3 | 4 | function map_dimensions(f::F, args::AbstractDimensions...) where {F<:Function}
|
4 | 5 | dimension_type = promote_type(typeof(args).parameters...)
|
|
26 | 27 | end
|
27 | 28 |
|
28 | 29 | for (type, base_type, _) in ABSTRACT_QUANTITY_TYPES
|
29 |
| - @eval Base.convert(::Type{$base_type}, q::$type) = q |
| 30 | + @eval @recompile_invalidations Base.convert(::Type{$base_type}, q::$type) = q |
30 | 31 | end
|
31 | 32 | function Base.convert(::Type{T}, q::UnionAbstractQuantity) where {T<:Number}
|
32 | 33 | @assert iszero(dimension(q)) "$(typeof(q)): $(q) has dimensions! Use `ustrip` instead."
|
@@ -80,14 +81,16 @@ const AMBIGUOUS_NUMERIC_TYPES = (Bool, BigFloat)
|
80 | 81 |
|
81 | 82 | for (type, _, _) in ABSTRACT_QUANTITY_TYPES
|
82 | 83 | @eval begin
|
83 |
| - function Base.convert(::Type{Q}, x::BASE_NUMERIC_TYPES) where {T,D,Q<:$type{T,D}} |
84 |
| - return new_quantity(Q, convert(T, x), D()) |
85 |
| - end |
86 |
| - function Base.promote_rule(::Type{Q}, ::Type{T2}) where {T,D,Q<:$type{T,D},T2<:BASE_NUMERIC_TYPES} |
87 |
| - return with_type_parameters(promote_quantity(Q, T2), promote_type(T, T2), D) |
88 |
| - end |
89 |
| - function Base.promote_rule(::Type{T2}, ::Type{Q}) where {T,D,Q<:$type{T,D},T2<:BASE_NUMERIC_TYPES} |
90 |
| - return with_type_parameters(promote_quantity(Q, T2), promote_type(T, T2), D) |
| 84 | + @recompile_invalidations begin |
| 85 | + function Base.convert(::Type{Q}, x::BASE_NUMERIC_TYPES) where {T,D,Q<:$type{T,D}} |
| 86 | + return new_quantity(Q, convert(T, x), D()) |
| 87 | + end |
| 88 | + function Base.promote_rule(::Type{Q}, ::Type{T2}) where {T,D,Q<:$type{T,D},T2<:BASE_NUMERIC_TYPES} |
| 89 | + return with_type_parameters(promote_quantity(Q, T2), promote_type(T, T2), D) |
| 90 | + end |
| 91 | + function Base.promote_rule(::Type{T2}, ::Type{Q}) where {T,D,Q<:$type{T,D},T2<:BASE_NUMERIC_TYPES} |
| 92 | + return with_type_parameters(promote_quantity(Q, T2), promote_type(T, T2), D) |
| 93 | + end |
91 | 94 | end
|
92 | 95 | end
|
93 | 96 | for numeric_type in AMBIGUOUS_NUMERIC_TYPES
|
@@ -158,32 +161,36 @@ for op in (:(<=), :(<), :(>=), :(>), :isless, :isgreater),
|
158 | 161 | (type, base_type, _) in ABSTRACT_QUANTITY_TYPES
|
159 | 162 |
|
160 | 163 | @eval begin
|
161 |
| - function Base.$(op)(l::$type, r::$type) |
162 |
| - l, r = promote_except_value(l, r) |
163 |
| - dimension(l) == dimension(r) || throw(DimensionError(l, r)) |
164 |
| - return $(op)(ustrip(l), ustrip(r)) |
165 |
| - end |
166 |
| - function Base.$(op)(l::$type, r::$base_type) |
167 |
| - iszero(dimension(l)) || throw(DimensionError(l, r)) |
168 |
| - return $(op)(ustrip(l), r) |
169 |
| - end |
170 |
| - function Base.$(op)(l::$base_type, r::$type) |
171 |
| - iszero(dimension(r)) || throw(DimensionError(l, r)) |
172 |
| - return $(op)(l, ustrip(r)) |
| 164 | + @recompile_invalidations begin |
| 165 | + function Base.$(op)(l::$type, r::$type) |
| 166 | + l, r = promote_except_value(l, r) |
| 167 | + dimension(l) == dimension(r) || throw(DimensionError(l, r)) |
| 168 | + return $(op)(ustrip(l), ustrip(r)) |
| 169 | + end |
| 170 | + function Base.$(op)(l::$type, r::$base_type) |
| 171 | + iszero(dimension(l)) || throw(DimensionError(l, r)) |
| 172 | + return $(op)(ustrip(l), r) |
| 173 | + end |
| 174 | + function Base.$(op)(l::$base_type, r::$type) |
| 175 | + iszero(dimension(r)) || throw(DimensionError(l, r)) |
| 176 | + return $(op)(l, ustrip(r)) |
| 177 | + end |
173 | 178 | end
|
174 | 179 | end
|
175 | 180 | end
|
176 | 181 | for op in (:isequal, :(==)), (type, base_type, _) in ABSTRACT_QUANTITY_TYPES
|
177 | 182 | @eval begin
|
178 |
| - function Base.$(op)(l::$type, r::$type) |
179 |
| - l, r = promote_except_value(l, r) |
180 |
| - return $(op)(ustrip(l), ustrip(r)) && dimension(l) == dimension(r) |
181 |
| - end |
182 |
| - function Base.$(op)(l::$type, r::$base_type) |
183 |
| - return $(op)(ustrip(l), r) && iszero(dimension(l)) |
184 |
| - end |
185 |
| - function Base.$(op)(l::$base_type, r::$type) |
186 |
| - return $(op)(l, ustrip(r)) && iszero(dimension(r)) |
| 183 | + @recompile_invalidations begin |
| 184 | + function Base.$(op)(l::$type, r::$type) |
| 185 | + l, r = promote_except_value(l, r) |
| 186 | + return $(op)(ustrip(l), ustrip(r)) && dimension(l) == dimension(r) |
| 187 | + end |
| 188 | + function Base.$(op)(l::$type, r::$base_type) |
| 189 | + return $(op)(ustrip(l), r) && iszero(dimension(l)) |
| 190 | + end |
| 191 | + function Base.$(op)(l::$base_type, r::$type) |
| 192 | + return $(op)(l, ustrip(r)) && iszero(dimension(r)) |
| 193 | + end |
187 | 194 | end
|
188 | 195 | end
|
189 | 196 | end
|
|
0 commit comments