6 #ifndef VNIX_UNITS_DIMVAL_HPP 7 #define VNIX_UNITS_DIMVAL_HPP 10 #include <vnix/units/dim.hpp> 11 #include <vnix/units/dyndim-base.hpp> 12 #include <vnix/units/number.hpp> 13 #include <vnix/units/statdim-base.hpp> 22 template <
typename T,
typename B>
class dimval;
23 template <
typename T>
class basic_dyndim;
24 template <dim::word D,
typename T>
class basic_statdim;
31 template <
typename T>
constexpr auto invert(T v) {
return T(1) / v; }
34 template <
typename S,
int R,
int C,
int OPT,
int MR,
int MC>
35 constexpr auto invert(
Eigen::Matrix<S, R, C, OPT, MR, MC>
const &m) {
47 template <
typename OT>
using otest =
typename number<OT>::test;
53 template <
typename T,
typename B>
54 class dimval :
protected number<T>,
public B {
94 template <
typename OT,
typename OB>
95 constexpr dimval(dimval<OT, OB>
const &v) :
number<T>(v.v_), B(v.d()) {}
109 constexpr dim::rat
d(dim::off off)
const {
return B::d()[off]; }
117 template <
typename OT,
typename OB>
118 constexpr auto operator==(dimval<OT, OB>
const &v)
const {
129 template <
typename OT,
typename OB>
130 constexpr auto operator!=(dimval<OT, OB>
const &v)
const {
131 return !(*
this == v);
140 template <
typename OT,
typename OB>
141 constexpr auto operator<(dimval<OT, OB>
const &v)
const {
152 template <
typename OT,
typename OB>
153 constexpr auto operator<=(dimval<OT, OB>
const &v)
const {
164 template <
typename OT,
typename OB>
165 constexpr auto operator>(dimval<OT, OB>
const &v)
const {
166 return !(*
this <= v);
175 template <
typename OT,
typename OB>
176 constexpr auto operator>=(dimval<OT, OB>
const &v)
const {
185 template <
typename OT,
typename OB>
186 constexpr auto operator+(dimval<OT, OB>
const &v)
const {
187 auto const sdim = B::sum(v);
188 auto sum = v_ + v.v_;
189 return dimval<
decltype(sum), B>(sum, sdim.d());
197 template <
typename OT,
typename OB>
198 constexpr auto operator-(dimval<OT, OB>
const &v)
const {
199 auto const ddim = B::diff(v);
200 auto diff = v_ - v.v_;
201 return dimval<
decltype(diff), B>(diff, ddim.d());
209 template <
typename OT,
typename OB>
210 constexpr dimval &
operator+=(dimval<OT, OB>
const &v) {
221 template <
typename OT,
typename OB>
222 constexpr dimval &
operator-=(dimval<OT, OB>
const &v) {
236 template <
typename OT, otest<OT> = 0>
239 return dimval<
decltype(prod), B>(prod, d());
262 template <
typename OT,
typename OB>
263 constexpr auto operator*(dimval<OT, OB>
const &v)
const {
264 auto const pdim = B::prod(v);
265 auto prod = v_ * v.v_;
266 return dimval<
decltype(prod),
decltype(pdim)>(prod, pdim.d());
273 return dimval<
decltype(e), B>(e, d());
280 template <
typename OT, otest<OT> = 0>
constexpr auto dot(OT
const &n)
const {
281 auto prod = v_.dot(n);
282 return dimval<
decltype(prod), B>(prod, d());
290 template <
typename OT,
typename OB>
291 constexpr auto dot(dimval<OT, OB>
const &v)
const {
292 auto const pdim = B::prod(v);
293 auto prod = v_.dot(v.v_);
294 return dimval<
decltype(prod),
decltype(pdim)>(prod, pdim.d());
301 template <
typename OT, otest<OT> = 0>
302 constexpr auto cross(OT
const &n)
const {
303 auto prod = v_.cross(n);
304 return dimval<
decltype(prod), B>(prod, d());
312 template <
typename OT,
typename OB>
313 constexpr auto cross(dimval<OT, OB>
const &v)
const {
314 auto const pdim = B::prod(v);
315 auto prod = v_.cross(v.v_);
316 return dimval<
decltype(prod),
decltype(pdim)>(prod, pdim.d());
327 template <
typename OT, otest<OT> = 0>
330 return dimval<
decltype(quot), B>(quot, d());
336 auto const br =
this->recip();
337 return dimval<T,
typename B::recip_basedim>(invert(v_), br.d());
345 template <
typename OT,
typename OB>
346 constexpr auto operator/(dimval<OT, OB>
const &v)
const {
347 auto const qdim = B::quot(v);
348 auto quot = v_ / v.v_;
349 return dimval<
decltype(quot),
decltype(qdim)>(v_ / v.v_, qdim.d());
360 template <
typename OT, otest<OT> = 0>
374 template <
typename OT, otest<OT> = 0>
384 template <int64_t PN, int64_t PD = 1>
constexpr auto power()
const {
385 auto const pdim = B::
template pow<PN, PD>();
386 auto const powr = pow(v_, PN * 1.0 / PD);
387 return dimval<T,
decltype(pdim)>(powr, pdim.d());
393 constexpr auto power(dim::rat p)
const {
394 auto const pdim = B::pow(p);
396 return dimval<T,
decltype(pdim)>(powr, pdim.d());
401 auto const rdim = B::sqrt();
402 T
const root = sqrt(v_);
403 return dimval<T,
decltype(rdim)>(root, rdim.d());
408 return s <<
v.
v_ <<
v.
d();
424 template <
typename OT,
typename T,
typename B, otest<OT> = 0>
425 constexpr auto operator/(OT
const &d, dimval<T, B>
const &v) {
426 return d * v.inverse();
435 template <
typename T,
typename B, otest<T> = 0>
436 constexpr auto sqrt(dimval<T, B>
const &v) {
437 return v.square_root();
447 template <int64_t PN, int64_t PD = 1,
typename T,
typename B>
448 constexpr auto pow(dimval<T, B>
const &v) {
449 return v.
template power<PN, PD>();
459 template <
typename T,
typename B>
460 constexpr auto pow(dimval<T, B>
const &v, dim::rat p) {
467 template <
typename T>
class basic_dyndim :
public dimval<T,
dyndim_base> {
475 template <
typename OT,
typename OB>
490 template <dim::word D,
typename T>
491 class basic_statdim :
public dimval<T,
statdim_base<D>> {
494 template <
typename OT>
using stat = dimval<OT, statdim_base<D>>;
509 template <
typename OT>
515 template <
typename OT>
524 template <
typename T>
528 template <
typename OT>
using stat = dimval<OT, statdim_base<nul_code>>;
536 template <
typename OT>
542 template <
typename OT>
constexpr auto operator[](size_t off) const
Support element-access in case it be supported by numeric type.
constexpr word encode() const
Encode data for this dim into a word.
constexpr basic_statdim(T v)
Initialize from number.
constexpr auto invert(Eigen::Matrix< S, R, C, OPT, MR, MC > const &m)
Specialization of invert() for Eigen::Matrix.
constexpr auto dot(OT const &n) const
Support dot-product in case it be supported by numeric type.
constexpr auto operator/(OT const &n) const
Scale dimensioned quantity by dividing by number.
constexpr dimval(T const &n)
Initialize from dimensionless number.
constexpr basic_statdim(dimval< OT, dyndim_base > const &v)
Initialize from dyndim.
constexpr auto pow(dimval< T, B > const &v)
Raise dimensioned value to rational power.
constexpr auto operator<(dimval< OT, OB > const &v) const
Less-than comparison of two dimensioned values.
constexpr dimval & operator+=(dimval< OT, OB > const &v)
Modify present instance by adding in a dimensioned value.
constexpr auto sqrt(dimval< T, B > const &v)
Take the squre root of a dimensioned quantity.
Base-type for a dimensioned value whose dimension is specified, perhaps dynamically at run-time...
constexpr auto square_root() const
Square-root of a dimensioned quantity.
constexpr dimval & operator/=(OT const &v)
Modify present instance by dividing it by a dimensionless value.
constexpr auto power(dim::rat p) const
Raise dimensioned value to rational power.
constexpr auto operator*(OT const &n) const
Scale dimensioned value.
constexpr dimval(T const &v, dim const &d)
Initialize from numeric value and from dimension.
constexpr basic_statdim(stat< OT > dv)
Initialize from compatible statdim.
constexpr basic_statdim(dimval< OT, dyndim_base > const &v)
Initialize from dyndim.
dimval()
< Allow access to dimension.
constexpr auto operator*(dimval< OT, OB > const &v) const
Multiply two dimensioned values.
constexpr double to_double() const
Convert to double.
constexpr auto operator==(dimval< OT, OB > const &v) const
Equality-comparison of two dimensioned values.
constexpr auto operator/(OT const &d, dimval< T, B > const &v)
Invert dimensioned value by dividing it into number.
constexpr dimval & operator-=(dimval< OT, OB > const &v)
Modify present instance by subtracting out a dimensioned value.
constexpr dimval(dimval< OT, OB > const &v)
Initialize from other dimensioned value.
constexpr auto operator/(dimval< OT, OB > const &v) const
Divide two dimensioned values.
constexpr dimval< T, typename B::recip_basedim > inverse() const
Invert dimensioned value.
constexpr auto cross(OT const &n) const
Support cross-product in case it be supported by numeric type.
static constexpr dim nul_dim
Null dimension.
constexpr auto operator-(dimval< OT, OB > const &v) const
Difference between two dimensioned values.
constexpr auto operator!=(dimval< OT, OB > const &v) const
Inequality-comparison of two dimensioned values.
friend std::ostream & operator<<(std::ostream &s, basic_dim d)
Print to to output stream.
constexpr T to_number() const
Convert to dimensionless number.
constexpr auto operator+(dimval< OT, OB > const &v) const
Sum of two dimensioned values.
dimval(dim const &d)
Initialize dimension, but leave number undefined.
constexpr basic_statdim(stat< OT > dv)
< Allow access to number.
constexpr auto operator>=(dimval< OT, OB > const &v) const
Greater-than-or-equal comparison of two dimensioned values.
constexpr dim::rat d(dim::off off) const
Exponent for base at specified offset.
constexpr auto dot(dimval< OT, OB > const &v) const
Support dot-product in case it be supported by numeric type.
constexpr auto invert(T v)
Return the reciprocal of an instance of type T.
constexpr auto cross(dimval< OT, OB > const &v) const
Support cross-product in case it be supported by numeric type.
basic_statdim()
By default, initialize dimension, but leave number uninitialized.
constexpr basic_dyndim(dimval< OT, OB > const &v)
< Allow access to number.
constexpr operator T() const
Convert to number.
constexpr auto operator>(dimval< OT, OB > const &v) const
Greater-than comparison of two dimensioned values.
Base-type for a dimensioned value whose dimension is specified statically at compile-time by way of a...
constexpr auto pow(dimval< T, B > const &v, dim::rat p)
Raise dimensioned value to rational power.
constexpr dimval & operator*=(OT const &v)
Modify present instance by multiplying in a dimensionless value.
Thomas E. Vaughan's public software.
Classes and functions supporting a model of physically dimensioned quantities.
Generic template for wrapper to disambiguate scalar from dimval and protected storage for numeric val...
constexpr auto operator<=(dimval< OT, OB > const &v) const
Less-than-or-equal comparison of two dimensioned values.
constexpr basic_dyndim(T v)
Convert from number.
constexpr auto power() const
Raise dimensioned value to rational power.