60template <UnitKind Kind,
class Ratio = std::ratio<1>>
64 constexpr explicit Unit(
float val) : _value(val) {}
66 template <UnitKind FromKind,
class FromRatio>
67 constexpr explicit Unit(Unit<FromKind, FromRatio>
const& from)
68 : _value(from.template
value<Ratio>())
75 template <
class TargetRatio = Ratio>
78 constexpr auto currentRatio =
79 static_cast<float>(Ratio::num) /
static_cast<float>(Ratio::den);
80 constexpr auto targetRatio =
static_cast<float>(TargetRatio::num) /
81 static_cast<float>(TargetRatio::den);
83 return _value * currentRatio / targetRatio;
86 template <UnitKind TargetKind,
class TargetRatio = Ratio>
87 constexpr operator Unit<TargetKind, TargetRatio>()
const
89 return Unit<TargetKind, TargetRatio>(value<TargetRatio>());
92 template <UnitKind PKind,
class PRatio>
94 Unit<PKind, PRatio>& unit);
101template <UnitKind Kind,
class Ratio>
103 const Unit<Kind, Ratio>& rhs)
105 return Unit<Kind, Ratio>(lhs.template value() + rhs.template value());
108template <UnitKind Kind,
class Ratio>
110 const Unit<Kind, Ratio>& rhs)
112 return Unit<Kind, Ratio>(lhs.template value() - rhs.template value());
115template <UnitKind Kind,
class Ratio>
116constexpr auto operator*(
const Unit<Kind, Ratio>& lhs,
float rhs)
118 return Unit<Kind, Ratio>(lhs.template value() * rhs);
121template <UnitKind Kind,
class Ratio>
122constexpr auto operator*(
float lhs,
const Unit<Kind, Ratio>& rhs)
124 return Unit<Kind, Ratio>(lhs * rhs.template value());
127template <UnitKind Kind,
class Ratio>
128constexpr auto operator/(
const Unit<Kind, Ratio>& lhs,
float rhs)
130 return Unit<Kind, Ratio>(lhs.template value() / rhs);
133template <UnitKind Kind,
class Ratio>
134constexpr auto operator/(
float lhs,
const Unit<Kind, Ratio>& rhs)
136 return Unit<Kind, Ratio>(lhs / rhs.template value());
140template <UnitKind Kind,
class Ratio>
142 const Unit<Kind, Ratio>& rhs)
144 return lhs.template value() == rhs.template value();
147template <UnitKind Kind,
class Ratio>
149 const Unit<Kind, Ratio>& rhs)
151 return lhs.template value() != rhs.template value();
154template <UnitKind Kind,
class Ratio>
156 const Unit<Kind, Ratio>& rhs)
158 return lhs.template value() < rhs.template value();
161template <UnitKind Kind,
class Ratio>
163 const Unit<Kind, Ratio>& rhs)
165 return lhs.template value() > rhs.template value();
168template <UnitKind Kind,
class Ratio>
170 const Unit<Kind, Ratio>& rhs)
172 return lhs.template value() <= rhs.template value();
175template <UnitKind Kind,
class Ratio>
177 const Unit<Kind, Ratio>& rhs)
179 return lhs.template value() >= rhs.template value();
183template <UnitKind Kind,
class Ratio>
184constexpr Unit<Kind, Ratio>&
operator+=(Unit<Kind, Ratio>& lhs,
185 const Unit<Kind, Ratio>& rhs)
191template <UnitKind Kind,
class Ratio>
192constexpr Unit<Kind, Ratio>&
operator-=(Unit<Kind, Ratio>& lhs,
193 const Unit<Kind, Ratio>& rhs)
199template <UnitKind Kind,
class Ratio>
200constexpr Unit<Kind, Ratio>&
operator*=(Unit<Kind, Ratio>& lhs,
float rhs)
206template <UnitKind Kind,
class Ratio>
207constexpr Unit<Kind, Ratio>&
operator/=(Unit<Kind, Ratio>& lhs,
float rhs)
214template <UnitKind Kind,
class Ratio>
215constexpr Unit<Kind, Ratio>
operator+(
const Unit<Kind, Ratio>& unit)
217 return Unit<Kind, Ratio>(unit.template value());
220template <UnitKind Kind,
class Ratio>
221constexpr Unit<Kind, Ratio>
operator-(
const Unit<Kind, Ratio>& unit)
223 return Unit<Kind, Ratio>(-unit.template value());
226template <UnitKind Kind,
class Ratio>
229 return !unit.template value();
233template <UnitKind Kind,
class Ratio>
234std::ostream&
operator<<(std::ostream& os,
const Unit<Kind, Ratio>& unit)
236 os << unit.template value();
240template <UnitKind Kind,
class Ratio>
241inline std::istream&
operator>>(std::istream& is, Unit<Kind, Ratio>& unit)
constexpr float value() const
Return the value of the unit in the target ratio.
constexpr Unit(float val)
friend std::istream & operator>>(std::istream &is, Unit< PKind, PRatio > &unit)
constexpr Unit(Unit< FromKind, FromRatio > const &from)
constexpr bool operator!(const Unit< Kind, Ratio > &unit)
constexpr bool operator==(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr Unit< Kind, Ratio > & operator-=(Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr bool operator>(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr bool operator<=(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
std::istream & operator>>(std::istream &is, Unit< Kind, Ratio > &unit)
constexpr auto operator/(const Unit< Kind, Ratio > &lhs, float rhs)
constexpr bool operator!=(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr Unit< Kind, Ratio > & operator*=(Unit< Kind, Ratio > &lhs, float rhs)
constexpr auto operator-(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr bool operator<(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
std::ostream & operator<<(std::ostream &os, const Unit< Kind, Ratio > &unit)
constexpr bool operator>=(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr auto operator*(const Unit< Kind, Ratio > &lhs, float rhs)
constexpr Unit< Kind, Ratio > & operator+=(Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr auto operator+(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
constexpr Unit< Kind, Ratio > & operator/=(Unit< Kind, Ratio > &lhs, float rhs)
UnitKind
Enumeration of the different kinds of units.
This file includes all the types the logdecoder script will decode.