3typedef dim<0, 0, 0, 0, 1, 0, 0, 0> dim_temperature;
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"; }
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"; }
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"; }
32class TemperatureDelta :
public quantity_base<TemperatureDelta, dim_temperature> {
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));
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; }
54struct is_quantity<TemperatureDelta> : std::true_type {};
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; }
75inline constexpr TemperatureDelta operator-(
const Temperature& left,
const Temperature& right) {
76 return TemperatureDelta::from_canonical(left.canonical_value() - right.canonical_value());
78inline constexpr Temperature operator+(
const Temperature& temperature,
const TemperatureDelta& delta) {
79 return Temperature::from_canonical(temperature.canonical_value() + delta.canonical_value());
81inline constexpr Temperature operator+(
const TemperatureDelta& delta,
const Temperature& temperature) {
82 return temperature + delta;
84inline constexpr Temperature operator-(
const Temperature& temperature,
const TemperatureDelta& delta) {
85 return Temperature::from_canonical(temperature.canonical_value() - delta.canonical_value());
87inline constexpr bool operator==(
const Temperature& left,
const Temperature& right) {
88 return left.canonical_value() == right.canonical_value();
90inline constexpr bool operator!=(
const Temperature& left,
const Temperature& right) {
91 return !(left == right);
93inline constexpr bool operator<(
const Temperature& left,
const Temperature& right) {
94 return left.canonical_value() < right.canonical_value();
96inline constexpr bool operator<=(
const Temperature& left,
const Temperature& right) {
97 return left.canonical_value() <= right.canonical_value();
99inline constexpr bool operator>(
const Temperature& left,
const Temperature& right) {
100 return left.canonical_value() > right.canonical_value();
102inline constexpr bool operator>=(
const Temperature& left,
const Temperature& right) {
103 return left.canonical_value() >= right.canonical_value();
106TemperatureDelta quantity_for_dimension_probe(dim_temperature*,
int);
109struct default_unit_for_quantity<Temperature> {
110 typedef kelvin_t type;
113struct default_unit_for_quantity<TemperatureDelta> {
114 typedef kelvin_t type;
117template <
class UnitTag>
118struct text_temperature_value;
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(); }
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(); }
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(); }
134template <
class UnitTag>
135inline double unit_value_for_text(
const Temperature& temperature) {
136 return text_temperature_value<UnitTag>::get(temperature);
138template <
class UnitTag>
139inline double unit_value_for_text(
const TemperatureDelta& temperature) {
140 return text_temperature_value<UnitTag>::get(temperature);
144constexpr Temperature
operator""_K(
long double value) {
145 return Temperature::from_kelvin(
static_cast<double>(value));
147constexpr Temperature
operator""_K(
unsigned long long value) {
148 return Temperature::from_kelvin(
static_cast<double>(value));
150constexpr Temperature
operator""_degC(
long double value) {
151 return Temperature::from_celsius(
static_cast<double>(value));
153constexpr Temperature
operator""_degC(
unsigned long long value) {
154 return Temperature::from_celsius(
static_cast<double>(value));
156constexpr Temperature
operator""_degF(
long double value) {
157 return Temperature::from_fahrenheit(
static_cast<double>(value));
159constexpr Temperature
operator""_degF(
unsigned long long value) {
160 return Temperature::from_fahrenheit(
static_cast<double>(value));
162constexpr TemperatureDelta
operator""_K_delta(
long double value) {
163 return TemperatureDelta::from_K(
static_cast<double>(value));
165constexpr TemperatureDelta
operator""_K_delta(
unsigned long long value) {
166 return TemperatureDelta::from_K(
static_cast<double>(value));
168constexpr TemperatureDelta
operator""_degC_delta(
long double value) {
169 return TemperatureDelta::from_degC(
static_cast<double>(value));
171constexpr TemperatureDelta
operator""_degC_delta(
unsigned long long value) {
172 return TemperatureDelta::from_degC(
static_cast<double>(value));
174constexpr TemperatureDelta
operator""_degF_delta(
long double value) {
175 return TemperatureDelta::from_degF(
static_cast<double>(value));
177constexpr TemperatureDelta
operator""_degF_delta(
unsigned long long value) {
178 return TemperatureDelta::from_degF(
static_cast<double>(value));