RIT VEXU Core API
Loading...
Searching...
No Matches
temperature.h
1#pragma once
2
3typedef dim<0, 0, 0, 0, 1, 0, 0, 0> dim_temperature;
4
5struct kelvin_t {
6 typedef dim_temperature dimension;
7 static constexpr double scale_num = static_cast<double>(1);
8 static constexpr double scale_den = static_cast<double>(1);
9 static constexpr bool is_affine = false;
10 static const char* symbol() { return "K"; }
11 static const char* name() { return "kelvin"; }
12};
13
14struct celsius_t {
15 typedef dim_temperature dimension;
16 static constexpr double scale_num = static_cast<double>(1);
17 static constexpr double scale_den = static_cast<double>(1);
18 static constexpr bool is_affine = false;
19 static const char* symbol() { return "degC"; }
20 static const char* name() { return "degrees_celsius"; }
21};
22
23struct fahrenheit_t {
24 typedef dim_temperature dimension;
25 static constexpr double scale_num = static_cast<double>(5);
26 static constexpr double scale_den = static_cast<double>(9);
27 static constexpr bool is_affine = false;
28 static const char* symbol() { return "degF"; }
29 static const char* name() { return "degrees_fahrenheit"; }
30};
31
32class TemperatureDelta : public quantity_base<TemperatureDelta, dim_temperature> {
33 public:
34 typedef quantity_base<TemperatureDelta, dim_temperature> base_type;
35 typedef dim_temperature dimension;
36 constexpr explicit TemperatureDelta(double kelvin_delta = 0.0) : base_type(kelvin_delta) {}
37 static constexpr TemperatureDelta from_canonical(double value) { return TemperatureDelta(value); }
38 template <class UnitTag>
39 static constexpr TemperatureDelta from(double value) {
40 return TemperatureDelta(base_type::template to_canonical<UnitTag>(value));
41 }
42 static constexpr TemperatureDelta from_K(double value) { return TemperatureDelta(value); }
43 static constexpr TemperatureDelta from_degC(double value) { return TemperatureDelta(value); }
44 static constexpr TemperatureDelta from_degF(double value) { return TemperatureDelta(value * 5.0 / 9.0); }
45 constexpr double K() const { return canonical_value(); }
46 constexpr double kelvin() const { return canonical_value(); }
47 constexpr double degC() const { return canonical_value(); }
48 constexpr double celsius() const { return canonical_value(); }
49 constexpr double degF() const { return canonical_value() * 9.0 / 5.0; }
50 constexpr double fahrenheit() const { return canonical_value() * 9.0 / 5.0; }
51};
52
53template <>
54struct is_quantity<TemperatureDelta> : std::true_type {};
55
56class Temperature {
57 public:
58 constexpr explicit Temperature(double kelvin = 0.0) : kelvin_(kelvin) {}
59 static constexpr Temperature from_kelvin(double value) { return Temperature(value); }
60 static constexpr Temperature from_celsius(double value) { return Temperature(value + 273.15); }
61 static constexpr Temperature from_fahrenheit(double value) { return Temperature((value + 459.67) * 5.0 / 9.0); }
62 static constexpr Temperature from_canonical(double value) { return Temperature(value); }
63 constexpr double canonical_value() const { return kelvin_; }
64 constexpr double K() const { return kelvin_; }
65 constexpr double kelvin() const { return kelvin_; }
66 constexpr double degC() const { return kelvin_ - 273.15; }
67 constexpr double celsius() const { return kelvin_ - 273.15; }
68 constexpr double degF() const { return kelvin_ * 9.0 / 5.0 - 459.67; }
69 constexpr double fahrenheit() const { return kelvin_ * 9.0 / 5.0 - 459.67; }
70
71 private:
72 double kelvin_;
73};
74
75inline constexpr TemperatureDelta operator-(const Temperature& left, const Temperature& right) {
76 return TemperatureDelta::from_canonical(left.canonical_value() - right.canonical_value());
77}
78inline constexpr Temperature operator+(const Temperature& temperature, const TemperatureDelta& delta) {
79 return Temperature::from_canonical(temperature.canonical_value() + delta.canonical_value());
80}
81inline constexpr Temperature operator+(const TemperatureDelta& delta, const Temperature& temperature) {
82 return temperature + delta;
83}
84inline constexpr Temperature operator-(const Temperature& temperature, const TemperatureDelta& delta) {
85 return Temperature::from_canonical(temperature.canonical_value() - delta.canonical_value());
86}
87inline constexpr bool operator==(const Temperature& left, const Temperature& right) {
88 return left.canonical_value() == right.canonical_value();
89}
90inline constexpr bool operator!=(const Temperature& left, const Temperature& right) {
91 return !(left == right);
92}
93inline constexpr bool operator<(const Temperature& left, const Temperature& right) {
94 return left.canonical_value() < right.canonical_value();
95}
96inline constexpr bool operator<=(const Temperature& left, const Temperature& right) {
97 return left.canonical_value() <= right.canonical_value();
98}
99inline constexpr bool operator>(const Temperature& left, const Temperature& right) {
100 return left.canonical_value() > right.canonical_value();
101}
102inline constexpr bool operator>=(const Temperature& left, const Temperature& right) {
103 return left.canonical_value() >= right.canonical_value();
104}
105
106TemperatureDelta quantity_for_dimension_probe(dim_temperature*, int);
107
108template <>
109struct default_unit_for_quantity<Temperature> {
110 typedef kelvin_t type;
111};
112template <>
113struct default_unit_for_quantity<TemperatureDelta> {
114 typedef kelvin_t type;
115};
116
117template <class UnitTag>
118struct text_temperature_value;
119template <>
120struct text_temperature_value<kelvin_t> {
121 static double get(const Temperature& temperature) { return temperature.K(); }
122 static double get(const TemperatureDelta& temperature) { return temperature.K(); }
123};
124template <>
125struct text_temperature_value<celsius_t> {
126 static double get(const Temperature& temperature) { return temperature.degC(); }
127 static double get(const TemperatureDelta& temperature) { return temperature.degC(); }
128};
129template <>
130struct text_temperature_value<fahrenheit_t> {
131 static double get(const Temperature& temperature) { return temperature.degF(); }
132 static double get(const TemperatureDelta& temperature) { return temperature.degF(); }
133};
134template <class UnitTag>
135inline double unit_value_for_text(const Temperature& temperature) {
136 return text_temperature_value<UnitTag>::get(temperature);
137}
138template <class UnitTag>
139inline double unit_value_for_text(const TemperatureDelta& temperature) {
140 return text_temperature_value<UnitTag>::get(temperature);
141}
142
143namespace literals {
144constexpr Temperature operator""_K(long double value) {
145 return Temperature::from_kelvin(static_cast<double>(value));
146}
147constexpr Temperature operator""_K(unsigned long long value) {
148 return Temperature::from_kelvin(static_cast<double>(value));
149}
150constexpr Temperature operator""_degC(long double value) {
151 return Temperature::from_celsius(static_cast<double>(value));
152}
153constexpr Temperature operator""_degC(unsigned long long value) {
154 return Temperature::from_celsius(static_cast<double>(value));
155}
156constexpr Temperature operator""_degF(long double value) {
157 return Temperature::from_fahrenheit(static_cast<double>(value));
158}
159constexpr Temperature operator""_degF(unsigned long long value) {
160 return Temperature::from_fahrenheit(static_cast<double>(value));
161}
162constexpr TemperatureDelta operator""_K_delta(long double value) {
163 return TemperatureDelta::from_K(static_cast<double>(value));
164}
165constexpr TemperatureDelta operator""_K_delta(unsigned long long value) {
166 return TemperatureDelta::from_K(static_cast<double>(value));
167}
168constexpr TemperatureDelta operator""_degC_delta(long double value) {
169 return TemperatureDelta::from_degC(static_cast<double>(value));
170}
171constexpr TemperatureDelta operator""_degC_delta(unsigned long long value) {
172 return TemperatureDelta::from_degC(static_cast<double>(value));
173}
174constexpr TemperatureDelta operator""_degF_delta(long double value) {
175 return TemperatureDelta::from_degF(static_cast<double>(value));
176}
177constexpr TemperatureDelta operator""_degF_delta(unsigned long long value) {
178 return TemperatureDelta::from_degF(static_cast<double>(value));
179}
180} // namespace literals