1
+ import ConstructionBase: constructorof
1
2
import Tricks: static_fieldnames, static_fieldtypes
2
3
3
4
const DEFAULT_DIM_BASE_TYPE = FixedRational{DEFAULT_NUMERATOR_TYPE,DEFAULT_DENOM}
@@ -17,7 +18,7 @@ the need to define many other functions.
17
18
The key function that one could wish to overload is
18
19
`DynamicQuantities.dimension_name(::AbstractDimensions, k::Symbol)` for mapping from a field name
19
20
to a base unit (e.g., `length` by default maps to `m`). You may also need to overload
20
- `DynamicQuantities.constructor_of (::Type{T})` in case of non-standard construction.
21
+ `ConstructionBase.constructorof (::Type{T})` in case of non-standard construction.
21
22
"""
22
23
abstract type AbstractDimensions{R} end
23
24
@@ -87,8 +88,8 @@ struct Dimensions{R<:Real} <: AbstractDimensions{R}
87
88
amount:: R
88
89
end
89
90
90
- (:: Type{D} )(:: Type{R} ; kws... ) where {R,D<: AbstractDimensions } = constructor_of (D){R}((tryrationalize (R, get (kws, k, zero (R))) for k in static_fieldnames (D)). .. )
91
- (:: Type{D} )(; kws... ) where {R,D<: AbstractDimensions{R} } = constructor_of (D)(R; kws... )
91
+ (:: Type{D} )(:: Type{R} ; kws... ) where {R,D<: AbstractDimensions } = constructorof (D){R}((tryrationalize (R, get (kws, k, zero (R))) for k in static_fieldnames (D)). .. )
92
+ (:: Type{D} )(; kws... ) where {R,D<: AbstractDimensions{R} } = constructorof (D)(R; kws... )
92
93
(:: Type{D} )(; kws... ) where {D<: AbstractDimensions } = D (DEFAULT_DIM_BASE_TYPE; kws... )
93
94
function (:: Type{D} )(d:: D2 ) where {R,D<: AbstractDimensions{R} ,D2<: AbstractDimensions }
94
95
issetequal (static_fieldnames (D), static_fieldnames (D2)) ||
@@ -151,28 +152,31 @@ end
151
152
152
153
for (type, base_type) in ABSTRACT_QUANTITY_TYPES
153
154
@eval begin
154
- (:: Type{Q} )(x:: T , :: Type{D} ; kws... ) where {D<: AbstractDimensions ,T<: $base_type ,T2,Q<: $type{T2} } = constructor_of (Q)(convert (T2, x), D (; kws... ))
155
- (:: Type{Q} )(x:: $base_type , :: Type{D} ; kws... ) where {D<: AbstractDimensions ,Q<: $type } = constructor_of (Q)(x, D (; kws... ))
156
- (:: Type{Q} )(x:: T ; kws... ) where {T<: $base_type ,T2,Q<: $type{T2} } = constructor_of (Q)(convert (T2, x), dim_type (Q)(; kws... ))
157
- (:: Type{Q} )(x:: $base_type ; kws... ) where {Q<: $type } = constructor_of (Q)(x, dim_type (Q)(; kws... ))
155
+ (:: Type{Q} )(x:: T , :: Type{D} ; kws... ) where {D<: AbstractDimensions ,T<: $base_type ,T2,Q<: $type{T2} } = constructorof (Q)(convert (T2, x), D (; kws... ))
156
+ (:: Type{Q} )(x:: $base_type , :: Type{D} ; kws... ) where {D<: AbstractDimensions ,Q<: $type } = constructorof (Q)(x, D (; kws... ))
157
+ (:: Type{Q} )(x:: T ; kws... ) where {T<: $base_type ,T2,Q<: $type{T2} } = constructorof (Q)(convert (T2, x), dim_type (Q)(; kws... ))
158
+ (:: Type{Q} )(x:: $base_type ; kws... ) where {Q<: $type } = constructorof (Q)(x, dim_type (Q)(; kws... ))
158
159
end
159
160
for (type2, _) in ABSTRACT_QUANTITY_TYPES
160
161
@eval begin
161
- (:: Type{Q} )(q:: $type2 ) where {T,D<: AbstractDimensions ,Q<: $type{T,D} } = constructor_of (Q)(convert (T, ustrip (q)), convert (D, dimension (q)))
162
- (:: Type{Q} )(q:: $type2 ) where {T,Q<: $type{T} } = constructor_of (Q)(convert (T, ustrip (q)), dimension (q))
163
- (:: Type{Q} )(q:: $type2 ) where {Q<: $type } = constructor_of (Q)(ustrip (q), dimension (q))
162
+ (:: Type{Q} )(q:: $type2 ) where {T,D<: AbstractDimensions ,Q<: $type{T,D} } = constructorof (Q)(convert (T, ustrip (q)), convert (D, dimension (q)))
163
+ (:: Type{Q} )(q:: $type2 ) where {T,Q<: $type{T} } = constructorof (Q)(convert (T, ustrip (q)), dimension (q))
164
+ (:: Type{Q} )(q:: $type2 ) where {Q<: $type } = constructorof (Q)(ustrip (q), dimension (q))
164
165
end
165
166
end
166
167
end
167
168
168
169
const DEFAULT_QUANTITY_TYPE = Quantity{DEFAULT_VALUE_TYPE, DEFAULT_DIM_TYPE}
169
170
170
- new_dimensions (:: Type{D} , dims... ) where {D<: AbstractDimensions } = constructor_of (D)(dims... )
171
- new_quantity (:: Type{Q} , l, r) where {Q<: AbstractUnionQuantity } = constructor_of (Q)(l, r)
171
+ new_dimensions (:: Type{D} , dims... ) where {D<: AbstractDimensions } = constructorof (D)(dims... )
172
+ new_quantity (:: Type{Q} , l, r) where {Q<: AbstractUnionQuantity } = constructorof (Q)(l, r)
172
173
173
174
dim_type (:: Type{Q} ) where {T,D<: AbstractDimensions ,Q<: AbstractUnionQuantity{T,D} } = D
174
175
dim_type (:: Type{<:AbstractUnionQuantity} ) = DEFAULT_DIM_TYPE
175
- constructor_of (:: Type{T} ) where {T} = Base. typename (T). wrapper
176
+
177
+ constructorof (:: Type{<:Dimensions} ) = Dimensions
178
+ constructorof (:: Type{<:Quantity} ) = Quantity
179
+ constructorof (:: Type{<:GenericQuantity} ) = GenericQuantity
176
180
177
181
struct DimensionError{Q1,Q2} <: Exception
178
182
q1:: Q1
0 commit comments