15 #include <Utility/String/NRE_String.hpp> 16 #include <Utility/Interfaces/Stringable/NRE_Stringable.hpp> 35 template <
class M,
class L,
class T,
class A>
36 class Unit :
public Utility::Stringable<Unit<M, L, T, A>> {
45 constexpr
Unit() : value(0.0) {
51 constexpr
Unit(
double val) : value(val) {
57 constexpr
Unit(
long double val) : value(static_cast <double> (val)) {
76 return Unit<std::ratio_divide<M, std::ratio<2>>, std::ratio_divide<L, std::ratio<2>>, std::ratio_divide<T, std::ratio<2>>, std::ratio_divide<A, std::ratio<2>>>(value);
113 return Unit(*
this) += u;
121 return Unit(*
this) -= u;
131 return Math::almostEqual(value, u.value);
139 return !(*
this == u);
147 return value <= u.value;
155 return value >= u.value;
163 return value < u.value;
171 return value > u.value;
190 template <
class M,
class L,
class T,
class A>
191 std::ostream& operator <<(std::ostream& stream, Unit<M, L, T, A>
const& o) {
192 return stream << o.toString();
201 template <
class M,
class L,
class T,
class A,
202 class M2,
class L2,
class T2,
class A2>
203 constexpr
Unit<std::ratio_subtract<M, M2>, std::ratio_subtract<L, L2>, std::ratio_subtract<T, T2>, std::ratio_subtract<A, A2>>
operator/(
Unit<M, L, T, A> const& u1,
Unit<M2, L2, T2, A2> const& u2) {
204 return Unit<std::ratio_subtract<M, M2>, std::ratio_subtract<L, L2>, std::ratio_subtract<T, T2>, std::ratio_subtract<A, A2>>(u1.
getValue() / u2.
getValue());
213 template <
class M,
class L,
class T,
class A>
214 constexpr
Unit<std::ratio_subtract<std::ratio<0>, M>, std::ratio_subtract<std::ratio<0>, L>, std::ratio_subtract<std::ratio<0>, T>, std::ratio_subtract<std::ratio<0>, A>>
operator/(
long double x,
Unit<M, L, T, A> const& u) {
215 return Unit<std::ratio_subtract<std::ratio<0>, M>, std::ratio_subtract<std::ratio<0>, L>, std::ratio_subtract<std::ratio<0>, T>, std::ratio_subtract<std::ratio<0>, A>>(x / u.
getValue());
224 template <
class M,
class L,
class T,
class A>
235 template <
class M,
class L,
class T,
class A,
236 class M2,
class L2,
class T2,
class A2>
237 constexpr
Unit<std::ratio_add<M, M2>, std::ratio_add<L, L2>, std::ratio_add<T, T2>, std::ratio_add<A, A2>>
operator*(
Unit<M, L, T, A> const& u1,
Unit<M2, L2, T2, A2> const& u2) {
238 return Unit<std::ratio_add<M, M2>, std::ratio_add<L, L2>, std::ratio_add<T, T2>, std::ratio_add<A, A2>>(u1.
getValue() * u2.
getValue());
247 template <
class M,
class L,
class T,
class A>
258 template <
class M,
class L,
class T,
class A>
264 #define TYPEDEF_UNIT(M, L, T, A, name) typedef Unit<std::ratio<M>, std::ratio<L>, std::ratio<T>, std::ratio<A>> name 289 constexpr UMass kilogramme(1.0);
290 constexpr UMass gramme = 0.001 * kilogramme;
291 constexpr UMass tonne = 1000 * kilogramme;
300 constexpr UArea
decimetre2 = decimetre * decimetre;
305 constexpr UVolume
metre3 = metre2 * metre;
306 constexpr UVolume
decimetre3 = decimetre2 * decimetre;
310 constexpr UVolume
litre = decimetre3;
314 constexpr UTime
hour = 60 * minute;
315 constexpr UTime
day = 24 * hour;
317 constexpr UFrequency
Hz(1.0);
319 constexpr UAcceleration
G = 9.80665 * metre / (
second *
second);
320 constexpr UForce
newton(1.0);
328 constexpr ULength
operator"" _mm(
long double x) {
return static_cast <
double> (x) * millimetre; }
334 constexpr ULength
operator"" _cm(
long double x) {
return static_cast <
double> (x) * centimetre; }
340 constexpr ULength
operator"" _m(
long double x) {
return static_cast <
double> (x) * metre; }
346 constexpr ULength
operator"" _km(
long double x) {
return static_cast <
double> (x) * kilometre; }
352 constexpr ULength
operator"" _mm(
unsigned long long int x) {
return static_cast <
double> (x) * millimetre; }
358 constexpr ULength
operator"" _cm(
unsigned long long int x) {
return static_cast <
double> (x) * centimetre; }
364 constexpr ULength
operator"" _m(
unsigned long long int x) {
return static_cast <
double> (x) * metre; }
370 constexpr ULength
operator"" _km(
unsigned long long int x) {
return static_cast <
double> (x) * kilometre; }
376 constexpr USpeed
operator"" _kmph(
long double x) {
return static_cast <
double> (x) * kilometre / hour; }
382 constexpr USpeed
operator"" _kmph(
unsigned long long int x) {
return static_cast <
double> (x) * kilometre / hour; }
388 constexpr UFrequency
operator"" _Hz(
long double x) {
return UFrequency(x); }
394 constexpr UFrequency
operator"" _Hz(
unsigned long long int x) {
return UFrequency(static_cast <double> (x)); }
400 constexpr UTime
operator"" _s(
long double x) {
return UTime(x); }
406 constexpr UTime
operator"" _min(
long double x) {
return static_cast <
double> (x) * minute; }
412 constexpr UTime
operator"" _h(
long double x) {
return static_cast <
double> (x) * hour; }
418 constexpr UTime
operator"" _day(
long double x) {
return static_cast <
double> (x) * day; }
424 constexpr UTime
operator"" _s(
unsigned long long int x) {
return UTime(static_cast <double> (x)); }
430 constexpr UTime
operator"" _min(
unsigned long long int x) {
return static_cast <
double> (x) * minute; }
436 constexpr UTime
operator"" _h(
unsigned long long int x) {
return static_cast <
double> (x) * hour; }
442 constexpr UTime
operator"" _day(
unsigned long long int x) {
return static_cast <
double> (x) * day; }
448 constexpr UMass
operator"" _kg(
long double x) {
return UMass(x); }
454 constexpr UMass
operator"" _g(
long double x) {
return static_cast <
double> (x) * gramme; }
460 constexpr UMass
operator"" _t(
long double x) {
return static_cast <
double> (x) * tonne; }
466 constexpr UMass
operator"" _kg(
unsigned long long int x) {
return UMass(static_cast <double> (x)); }
472 constexpr UMass
operator"" _g(
unsigned long long int x) {
return static_cast <
double> (x) * gramme; }
478 constexpr UMass
operator"" _t(
unsigned long long int x) {
return static_cast <
double> (x) * tonne; }
484 constexpr UAcceleration
operator"" _mps2(
long double x) {
return UAcceleration(x); }
490 constexpr UAcceleration
operator"" _mps2(
unsigned long long int x) {
return UAcceleration(static_cast <double> (x)); }
496 constexpr UAcceleration
operator"" _G(
long double x) {
return static_cast <
double> (x) * G; }
502 constexpr UAcceleration
operator"" _G(
unsigned long long int x) {
return static_cast <
double> (x) * G; }
508 constexpr UForce
operator"" _N(
long double x) {
return UForce(x); }
514 constexpr UForce
operator"" _N(
unsigned long long int x) {
return UForce(static_cast <double> (x)); }
520 constexpr UPressure
operator"" _Pa(
long double x) {
return UPressure(x); }
526 constexpr UPressure
operator"" _Pa(
unsigned long long int x) {
return UPressure(static_cast <double> (x)); }
532 constexpr
long double operator"" _pi(
long double x) {
return static_cast <
double> (x) * PI; }
538 constexpr
long double operator"" _pi(
unsigned long long int x) {
return static_cast <
double> (x) * PI; }
541 constexpr Angle
degree = (PI / 180.0f) * radian;
548 constexpr Angle
operator"" _rad(
long double x) {
return Angle(x); }
554 constexpr Angle
operator"" _rad(
unsigned long long int x) {
return Angle(static_cast <double> (x)); }
560 constexpr Angle
operator"" _deg(
long double x) {
return static_cast <
double> (x) * degree; }
566 constexpr Angle
operator"" _deg(
unsigned long long int x) {
return static_cast <
double> (x) * degree; }
573 inline double sin(Angle
const& u) {
574 return std::sin(u.getValue());
581 inline double cos(Angle
const& u) {
582 return std::cos(u.getValue());
589 inline double tan(Angle
const& u) {
590 return std::tan(u.getValue());
597 inline double asin(Angle
const& u) {
598 return std::asin(u.getValue());
605 inline double acos(Angle
const& u) {
606 return std::acos(u.getValue());
613 inline double atan(Angle
const& u) {
614 return std::atan(u.getValue());
622 inline double toRad(Angle
const& u) {
631 inline double toDeg(Angle
const& u) {
632 return (u / degree).getValue();
constexpr Unit const & operator+=(Unit const &u)
Definition: NRE_Unit.hpp:85
constexpr Unit< std::ratio_divide< M, std::ratio< 2 > >, std::ratio_divide< L, std::ratio< 2 > >, std::ratio_divide< T, std::ratio< 2 > >, std::ratio_divide< A, std::ratio< 2 > > > sqrt()
Definition: NRE_Unit.hpp:75
constexpr UForce newton(1.0)
constexpr bool operator<(Unit const &u) const
Definition: NRE_Unit.hpp:162
#define TYPEDEF_UNIT(M, L, T, A, name)
Definition: NRE_Unit.hpp:264
constexpr Unit const & operator-=(Unit const &u)
Definition: NRE_Unit.hpp:94
constexpr Unit(long double val)
Definition: NRE_Unit.hpp:57
constexpr UPressure pascal(1.0)
constexpr Unit< std::ratio_add< M, M2 >, std::ratio_add< L, L2 >, std::ratio_add< T, T2 >, std::ratio_add< A, A2 > > operator*(Unit< M, L, T, A > const &u1, Unit< M2, L2, T2, A2 > const &u2)
Definition: NRE_Unit.hpp:237
constexpr bool operator!=(Unit const &u) const
Definition: NRE_Unit.hpp:138
double toRad(Angle const &u)
Definition: NRE_Unit.hpp:624
constexpr UTime second(1.0)
constexpr UVolume litre
Definition: NRE_Unit.hpp:312
constexpr ULength millimetre
Definition: NRE_Unit.hpp:298
constexpr bool operator==(Unit const &u) const
Definition: NRE_Unit.hpp:130
constexpr Unit operator-(Unit const &u) const
Definition: NRE_Unit.hpp:120
constexpr UVolume decimetre3
Definition: NRE_Unit.hpp:308
double sin(Angle const &u)
Definition: NRE_Unit.hpp:575
constexpr Unit operator+(Unit const &u) const
Definition: NRE_Unit.hpp:112
constexpr ULength decimetre
Definition: NRE_Unit.hpp:296
constexpr bool operator>=(Unit const &u) const
Definition: NRE_Unit.hpp:154
constexpr bool operator<=(Unit const &u) const
Definition: NRE_Unit.hpp:146
double asin(Angle const &u)
Definition: NRE_Unit.hpp:599
double toDeg(Angle const &u)
Definition: NRE_Unit.hpp:633
constexpr UArea millimetre2
Definition: NRE_Unit.hpp:304
constexpr UFrequency Hz(1.0)
Implementation of Math's API's function.
constexpr bool operator>(Unit const &u) const
Definition: NRE_Unit.hpp:170
constexpr UAcceleration G
Definition: NRE_Unit.hpp:321
constexpr UArea metre2
Definition: NRE_Unit.hpp:301
constexpr ULength centimetre
Definition: NRE_Unit.hpp:297
constexpr Unit()
Definition: NRE_Unit.hpp:45
double cos(Angle const &u)
Definition: NRE_Unit.hpp:583
constexpr UVolume metre3
Definition: NRE_Unit.hpp:307
constexpr UTime minute
Definition: NRE_Unit.hpp:315
constexpr UTime day
Definition: NRE_Unit.hpp:317
constexpr UVolume centimetre3
Definition: NRE_Unit.hpp:309
Used to define clear physical unit.
Definition: NRE_Unit.hpp:36
constexpr UArea decimetre2
Definition: NRE_Unit.hpp:302
constexpr UArea centimetre2
Definition: NRE_Unit.hpp:303
double atan(Angle const &u)
Definition: NRE_Unit.hpp:615
constexpr Unit(double val)
Definition: NRE_Unit.hpp:51
Utility::String toString() const
Definition: NRE_Unit.hpp:177
The NearlyRealEngine's global namespace.
constexpr UVolume kilometre3
Definition: NRE_Unit.hpp:311
constexpr UVolume millimetre3
Definition: NRE_Unit.hpp:310
constexpr UArea kilometre2
Definition: NRE_Unit.hpp:305
double tan(Angle const &u)
Definition: NRE_Unit.hpp:591
constexpr ULength kilometre
Definition: NRE_Unit.hpp:299
constexpr double getValue() const
Definition: NRE_Unit.hpp:65
constexpr Unit< std::ratio_subtract< M, M2 >, std::ratio_subtract< L, L2 >, std::ratio_subtract< T, T2 >, std::ratio_subtract< A, A2 > > operator/(Unit< M, L, T, A > const &u1, Unit< M2, L2, T2, A2 > const &u2)
Definition: NRE_Unit.hpp:203
double acos(Angle const &u)
Definition: NRE_Unit.hpp:607
constexpr ULength metre(1.0)
constexpr UTime hour
Definition: NRE_Unit.hpp:316
constexpr Unit operator-() const
Definition: NRE_Unit.hpp:102
constexpr Angle degree
Definition: NRE_Unit.hpp:543
constexpr Angle radian(1.0)