NRE_Unit.hpp
Go to the documentation of this file.
1 
10  #pragma once
11 
12  #include <iostream>
13  #include <ratio>
14 
15  #include <Utility/String/NRE_String.hpp>
16  #include <Utility/Interfaces/Stringable/NRE_Stringable.hpp>
17 
18  #include "NRE_Math.hpp"
19 
24  namespace NRE {
29  namespace Math {
30 
35  template <class M, class L, class T, class A>
36  class Unit : public Utility::Stringable<Unit<M, L, T, A>> {
37  private: //Fields
38  double value;
40  public: // Methods
41  //## Constructor ##//
45  constexpr Unit() : value(0.0) {
46  }
51  constexpr Unit(double val) : value(val) {
52  }
57  constexpr Unit(long double val) : value(static_cast <double> (val)) {
58  }
59 
60  //## Getter ##//
65  constexpr double getValue() const {
66  return value;
67  }
68 
69  //## Methods ##//
74  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>>>
75  sqrt() {
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);
77  }
78 
79  //## Shortcut Operator ##//
85  constexpr Unit const& operator+=(Unit const& u) {
86  value += u.value;
87  return *this;
88  }
94  constexpr Unit const& operator-=(Unit const& u) {
95  value -= u.value;
96  return *this;
97  }
102  constexpr Unit operator-() const {
103  return Unit(-value);
104  }
105 
106  //## Arithmetic Operator ##//
112  constexpr Unit operator+(Unit const& u) const {
113  return Unit(*this) += u;
114  }
120  constexpr Unit operator-(Unit const& u) const {
121  return Unit(*this) -= u;
122  }
123 
124  //## Comparison Operator ##//
130  constexpr bool operator==(Unit const& u) const {
131  return Math::almostEqual(value, u.value);
132  }
138  constexpr bool operator!=(Unit const& u) const {
139  return !(*this == u);
140  }
146  constexpr bool operator<=(Unit const& u) const {
147  return value <= u.value;
148  }
154  constexpr bool operator>=(Unit const& u) const {
155  return value >= u.value;
156  }
162  constexpr bool operator<(Unit const& u) const {
163  return value < u.value;
164  }
170  constexpr bool operator>(Unit const& u) const {
171  return value > u.value;
172  }
177  Utility::String toString() const {
178  Utility::String res;
179  res << value;
180  return res;
181  }
182  };
183 
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();
193  }
194 
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());
205  }
206 
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());
216  }
217 
224  template <class M, class L, class T, class A>
225  constexpr Unit<M, L, T, A> operator/(Unit<M, L, T, A> const& u, long double x) {
226  return Unit<M, L, T, A>(u.getValue() / x);
227  }
228 
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());
239  }
240 
247  template <class M, class L, class T, class A>
248  constexpr Unit<M, L, T, A> operator*(long double x, Unit<M, L, T, A> const& u) {
249  return Unit<M, L, T, A>(x * u.getValue());
250  }
251 
258  template <class M, class L, class T, class A>
259  constexpr Unit<M, L, T, A> operator*(Unit<M, L, T, A> const& u, long double x) {
260  return Unit<M, L, T, A>(u.getValue() * x);
261  }
262 
264  #define TYPEDEF_UNIT(M, L, T, A, name) typedef Unit<std::ratio<M>, std::ratio<L>, std::ratio<T>, std::ratio<A>> name
265 
267  TYPEDEF_UNIT(1, 0, 0, 0, UMass);
269  TYPEDEF_UNIT(0, 1, 0, 0, ULength);
271  TYPEDEF_UNIT(0, 2, 0, 0, UArea);
273  TYPEDEF_UNIT(0, 3, 0, 0, UVolume);
275  TYPEDEF_UNIT(0, 0, 1, 0, UTime);
277  TYPEDEF_UNIT(0, 1, -1, 0, USpeed);
279  TYPEDEF_UNIT(0, 1, -2, 0, UAcceleration);
281  TYPEDEF_UNIT(0, 0, -1, 0, UFrequency);
283  TYPEDEF_UNIT(1, 1, -2, 0, UForce);
285  TYPEDEF_UNIT(1, -1, -2, 0, UPressure);
287  TYPEDEF_UNIT(0, 0, 0, 1, Angle);
288 
289  constexpr UMass kilogramme(1.0);
290  constexpr UMass gramme = 0.001 * kilogramme;
291  constexpr UMass tonne = 1000 * kilogramme;
293  constexpr ULength metre(1.0);
294  constexpr ULength decimetre = metre / 10;
295  constexpr ULength centimetre = metre / 100;
296  constexpr ULength millimetre = metre / 1000;
297  constexpr ULength kilometre = 1000 * metre;
299  constexpr UArea metre2 = metre * metre;
300  constexpr UArea decimetre2 = decimetre * decimetre;
301  constexpr UArea centimetre2 = centimetre * centimetre;
302  constexpr UArea millimetre2 = millimetre * millimetre;
303  constexpr UArea kilometre2 = kilometre * kilometre;
305  constexpr UVolume metre3 = metre2 * metre;
306  constexpr UVolume decimetre3 = decimetre2 * decimetre;
307  constexpr UVolume centimetre3 = centimetre2 * centimetre;
308  constexpr UVolume millimetre3 = millimetre2 * millimetre;
309  constexpr UVolume kilometre3 = kilometre2 * kilometre;
310  constexpr UVolume litre = decimetre3;
312  constexpr UTime second(1.0);
313  constexpr UTime minute = 60 * second;
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);
321  constexpr UPressure pascal(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; }
539 
540  constexpr Angle radian(1.0);
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; }
567 
573  inline double sin(Angle const& u) {
574  return std::sin(u.getValue());
575  }
581  inline double cos(Angle const& u) {
582  return std::cos(u.getValue());
583  }
589  inline double tan(Angle const& u) {
590  return std::tan(u.getValue());
591  }
597  inline double asin(Angle const& u) {
598  return std::asin(u.getValue());
599  }
605  inline double acos(Angle const& u) {
606  return std::acos(u.getValue());
607  }
613  inline double atan(Angle const& u) {
614  return std::atan(u.getValue());
615  }
616 
622  inline double toRad(Angle const& u) {
623  return u.getValue();
624  }
625 
631  inline double toDeg(Angle const& u) {
632  return (u / degree).getValue();
633  }
634  }
635  }
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)
Math&#39;s API.
Implementation of Math&#39;s API&#39;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&#39;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)