roo_quantity
API Documentation for roo_quantity
Loading...
Searching...
No Matches
mass.h
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4
5#include "roo_flags.h"
6#include "roo_logging.h"
7
8#if defined(ESP32) || defined(ESP8266) || defined(__linux__)
9#include <string>
10#endif
11
12#if defined(ARDUINO)
13#include <Arduino.h>
14#endif
15
16namespace roo_quantity {
17
18/// Representation of mass, internally stored as floating-point kilograms.
19class Mass {
20 public:
21 /// Creates a mass object representing an 'unknown' mass.
22 Mass() : mass_(std::nanf("")) {}
23
24 /// Returns the mass in metric tonnes.
25 float inTons() const { return mass_ * 0.001f; }
26
27 /// Returns the mass in kilograms.
28 float inKilograms() const { return mass_; }
29
30 float inKg() const { return inKilograms(); }
31
32 /// Returns the mass in grams.
33 float inGrams() const { return mass_ * 1000.0f; }
34
35 /// Returns the mass in milligrams.
36 float inMilligrams() const { return mass_ * 1000000.0f; }
37
38 /// Returns the mass in micrograms.
39 float inMicrograms() const { return mass_ * 1000000000.0f; }
40
41 /// Returns the mass in pounds.
42 float inPounds() const { return mass_ * 2.2046226218f; }
43
44 /// Returns the mass in pounds.
45 float inLbs() const { return inPounds(); }
46
47 /// Returns whether the object represents an unknown mass.
48 bool isUnknown() const { return std::isnan(mass_); }
49
50 bool operator<(const Mass& other) const { return mass_ < other.mass_; }
51
52 bool operator==(const Mass& other) const { return mass_ == other.mass_; }
53
54 bool operator>(const Mass& other) const { return other.mass_ < mass_; }
55
56 bool operator<=(const Mass& other) const { return !(other.mass_ < mass_); }
57
58 bool operator>=(const Mass& other) const { return !(mass_ < other.mass_); }
59
60 bool operator!=(const Mass& other) const { return !(mass_ == other.mass_); }
61
62 inline Mass& operator+=(const Mass& other) {
63 mass_ += other.inKg();
64 return *this;
65 }
66
67 inline Mass& operator-=(const Mass& other) {
68 mass_ -= other.inKg();
69 return *this;
70 }
71
72 inline Mass& operator*=(float multi) {
73 mass_ *= multi;
74 return *this;
75 }
76
77 inline Mass& operator/=(float div) {
78 mass_ /= div;
79 return *this;
80 }
81
82#if defined(ESP32) || defined(ESP8266) || defined(__linux__)
83 /// Returns the string representation of the mass.
84 std::string asString() const;
85#endif
86
87#if defined(ARDUINO)
88 String asArduinoString() const;
89#endif
90
91 private:
92 friend Mass UnknownMass();
93
94 friend Mass MassInKilograms(float);
95
96 explicit Mass(float mass) : mass_(mass) {}
97
98 /// Stored in kg.
99 float mass_;
100};
101
102inline Mass MassInGrams(float mass);
103
104/// Returns a mass object representing an unknown mass.
105inline Mass UnknownMass() { return Mass(); }
106
107/// Returns a mass object equivalent to the specified mass
108/// expressed in kilograms.
109inline Mass MassInKilograms(float mass) { return Mass(mass); }
110
111/// Returns a mass object equivalent to the specified mass
112/// expressed in kilograms.
113inline Mass MassInKg(float mass) { return MassInKilograms(mass); }
114
115/// Returns a mass object equivalent to the specified mass
116/// expressed in metric tons.
117inline Mass MassInTons(float mass) { return MassInKilograms(mass * 1000.0f); }
118
119/// Returns a mass object equivalent to the specified mass
120/// expressed in grams.
121inline Mass MassInGrams(float mass) { return MassInKg(mass * 0.001f); }
122
123/// Returns a mass object equivalent to the specified mass
124/// expressed in milligrams.
125inline Mass MassInMilligrams(float mass) {
126 return MassInKilograms(mass * 0.000001f);
127}
128
129/// Returns a mass object equivalent to the specified mass
130/// expressed in micrograms.
131inline Mass MassInMicrograms(float mass) {
132 return MassInKg(mass * 0.000000001f);
133}
134
135/// Returns a mass object equivalent to the specified mass
136/// expressed in pounds.
137inline Mass MassInPounds(float mass) { return MassInKg(mass * 0.45359237f); }
138
139inline Mass MassInLbs(float mass) { return MassInPounds(mass); }
140
141inline Mass operator+(Mass a, Mass b) { return MassInKg(a.inKg() + b.inKg()); }
142
143inline Mass operator-(Mass a, Mass b) { return MassInKg(a.inKg() - b.inKg()); }
144
145inline Mass operator-(Mass a) { return MassInKg(-a.inKg()); }
146
147inline Mass operator*(Mass a, float b) { return MassInKg(a.inKg() * b); }
148
149inline Mass operator*(float a, Mass b) { return MassInKg(a * b.inKg()); }
150
151inline Mass operator/(Mass a, float b) { return MassInKg(a.inKg() / b); }
152
153inline float operator/(Mass a, Mass b) { return a.inKg() / b.inKg(); }
154
155roo_logging::Stream& operator<<(roo_logging::Stream& os, const Mass& val);
156
157} // namespace roo_quantity
Representation of mass, internally stored as floating-point kilograms.
Definition mass.h:19
bool isUnknown() const
Returns whether the object represents an unknown mass.
Definition mass.h:48
Mass & operator+=(const Mass &other)
Definition mass.h:62
bool operator!=(const Mass &other) const
Definition mass.h:60
float inTons() const
Returns the mass in metric tonnes.
Definition mass.h:25
friend Mass UnknownMass()
Returns a mass object representing an unknown mass.
Definition mass.h:105
float inMilligrams() const
Returns the mass in milligrams.
Definition mass.h:36
Mass()
Creates a mass object representing an 'unknown' mass.
Definition mass.h:22
Mass & operator-=(const Mass &other)
Definition mass.h:67
Mass & operator*=(float multi)
Definition mass.h:72
bool operator<=(const Mass &other) const
Definition mass.h:56
bool operator>=(const Mass &other) const
Definition mass.h:58
float inPounds() const
Returns the mass in pounds.
Definition mass.h:42
float inMicrograms() const
Returns the mass in micrograms.
Definition mass.h:39
friend Mass MassInKilograms(float)
Returns a mass object equivalent to the specified mass expressed in kilograms.
Definition mass.h:109
float inLbs() const
Returns the mass in pounds.
Definition mass.h:45
float inKilograms() const
Returns the mass in kilograms.
Definition mass.h:28
Mass & operator/=(float div)
Definition mass.h:77
float inGrams() const
Returns the mass in grams.
Definition mass.h:33
bool operator<(const Mass &other) const
Definition mass.h:50
float inKg() const
Definition mass.h:30
bool operator>(const Mass &other) const
Definition mass.h:54
bool operator==(const Mass &other) const
Definition mass.h:52
For convenience conversion from roo_time::Duration.
Definition area.cpp:3
roo_logging::Stream & operator<<(roo_logging::Stream &os, const Area &val)
Definition area.cpp:57
Mass MassInLbs(float mass)
Definition mass.h:139
Mass UnknownMass()
Returns a mass object representing an unknown mass.
Definition mass.h:105
Area operator+(Area a, Area b)
Definition area.h:171
Area operator-(Area a, Area b)
Definition area.h:175
Mass MassInKg(float mass)
Returns a mass object equivalent to the specified mass expressed in kilograms.
Definition mass.h:113
Mass MassInMilligrams(float mass)
Returns a mass object equivalent to the specified mass expressed in milligrams.
Definition mass.h:125
Mass MassInGrams(float mass)
Returns a mass object equivalent to the specified mass expressed in grams.
Definition mass.h:121
Mass MassInPounds(float mass)
Returns a mass object equivalent to the specified mass expressed in pounds.
Definition mass.h:137
Mass MassInTons(float mass)
Returns a mass object equivalent to the specified mass expressed in metric tons.
Definition mass.h:117
Area operator/(Area a, float b)
Definition area.h:191
Area operator*(Area a, float b)
Definition area.h:183
Mass MassInMicrograms(float mass)
Returns a mass object equivalent to the specified mass expressed in micrograms.
Definition mass.h:131
Mass MassInKilograms(float mass)
Returns a mass object equivalent to the specified mass expressed in kilograms.
Definition mass.h:109