diff --git a/src/modules/axisunit.h b/src/modules/axisunit.h index fbe91e4..5c3a340 100644 --- a/src/modules/axisunit.h +++ b/src/modules/axisunit.h @@ -73,13 +73,22 @@ struct AxisUnit { typedef T type_t; typedef AxisUnit self_t; - constexpr self_t operator+(const self_t r) { return { v + r.v }; } - constexpr self_t operator-(const self_t r) { return { v - r.v }; } - constexpr self_t operator-() { return { -v }; } - constexpr self_t operator*(const self_t r) { return { v * r.v }; } - constexpr self_t operator/(const self_t r) { return { v / r.v }; } + // same-type operations + constexpr self_t operator+(const self_t r) const { return { v + r.v }; } + constexpr self_t operator-(const self_t r) const { return { v - r.v }; } + constexpr self_t operator-() const { return { -v }; } + constexpr self_t operator*(const self_t r) const { return { v * r.v }; } + constexpr self_t operator/(const self_t r) const { return { v / r.v }; } + + // allow an unitless multiplier to scale the quantity: AU * f => AU + constexpr self_t operator*(const long double f) const { return { (T)(v * f) }; } + constexpr self_t operator/(const long double f) const { return { (T)(v / f) }; } }; +// complementary f * AU => AU * f +template +constexpr AxisUnit operator*(const long double f, const AxisUnit u) { return u * f; } + /// Axis type conversion table for template expansion struct AxisScale { unit::UnitBase base; diff --git a/src/unit.h b/src/unit.h index 9364d08..38e3405 100644 --- a/src/unit.h +++ b/src/unit.h @@ -47,13 +47,22 @@ struct Unit { typedef T type_t; typedef Unit self_t; - constexpr self_t operator+(const self_t r) { return { v + r.v }; } - constexpr self_t operator-(const self_t r) { return { v - r.v }; } - constexpr self_t operator-() { return { -v }; } - constexpr self_t operator*(const self_t r) { return { v * r.v }; } - constexpr self_t operator/(const self_t r) { return { v / r.v }; } + // same-type operations + constexpr self_t operator+(const self_t r) const { return { v + r.v }; } + constexpr self_t operator-(const self_t r) const { return { v - r.v }; } + constexpr self_t operator-() const { return { -v }; } + constexpr self_t operator*(const self_t r) const { return { v * r.v }; } + constexpr self_t operator/(const self_t r) const { return { v / r.v }; } + + // allow an unitless multiplier to scale the quantity: U * f => U + constexpr self_t operator*(const long double f) const { return { (T)(v * f) }; } + constexpr self_t operator/(const long double f) const { return { (T)(v / f) }; } }; +// complementary f * U => U * f +template +constexpr Unit operator*(const long double f, const Unit u) { return u * f; } + // Millimiters typedef Unit U_mm; typedef Unit U_mm_s;