|
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