Skyward boardcore
Loading...
Searching...
No Matches
Units.h
Go to the documentation of this file.
1/* Copyright (c) 2023 Skyward Experimental Rocketry
2 * Author: Davide Basso
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#pragma once
24
25#include <utils/Debug.h>
26
27#include <ostream>
28#include <ratio>
29#include <typeinfo>
30
31namespace Boardcore
32{
33namespace Units
34{
35
39enum class UnitKind
40{
41 Angle,
42 Length,
43 Pressure,
44 Time,
45 Speed,
46 Acceleration,
47 Frequency,
48};
49
60template <UnitKind Kind, class Ratio = std::ratio<1>>
61class Unit
62{
63public:
64 constexpr explicit Unit(float val) : _value(val) {}
65
66 template <UnitKind FromKind, class FromRatio>
67 constexpr explicit Unit(Unit<FromKind, FromRatio> const& from)
68 : _value(from.template value<Ratio>())
69 {
70 }
71
75 template <class TargetRatio = Ratio>
76 constexpr float value() const
77 {
78 constexpr auto currentRatio =
79 static_cast<float>(Ratio::num) / static_cast<float>(Ratio::den);
80 constexpr auto targetRatio = static_cast<float>(TargetRatio::num) /
81 static_cast<float>(TargetRatio::den);
82
83 return _value * currentRatio / targetRatio;
84 }
85
86 template <UnitKind TargetKind, class TargetRatio = Ratio>
87 constexpr operator Unit<TargetKind, TargetRatio>() const
88 {
89 return Unit<TargetKind, TargetRatio>(value<TargetRatio>());
90 }
91
92 template <UnitKind PKind, class PRatio>
93 friend std::istream& operator>>(std::istream& is,
94 Unit<PKind, PRatio>& unit);
95
96private:
97 float _value;
98};
99
100// Sum, Subtraction, Multiplication, Division
101template <UnitKind Kind, class Ratio>
102constexpr auto operator+(const Unit<Kind, Ratio>& lhs,
103 const Unit<Kind, Ratio>& rhs)
104{
105 return Unit<Kind, Ratio>(lhs.template value() + rhs.template value());
106}
107
108template <UnitKind Kind, class Ratio>
109constexpr auto operator-(const Unit<Kind, Ratio>& lhs,
110 const Unit<Kind, Ratio>& rhs)
111{
112 return Unit<Kind, Ratio>(lhs.template value() - rhs.template value());
113}
114
115template <UnitKind Kind, class Ratio>
116constexpr auto operator*(const Unit<Kind, Ratio>& lhs, float rhs)
117{
118 return Unit<Kind, Ratio>(lhs.template value() * rhs);
119}
120
121template <UnitKind Kind, class Ratio>
122constexpr auto operator*(float lhs, const Unit<Kind, Ratio>& rhs)
123{
124 return Unit<Kind, Ratio>(lhs * rhs.template value());
125}
126
127template <UnitKind Kind, class Ratio>
128constexpr auto operator/(const Unit<Kind, Ratio>& lhs, float rhs)
129{
130 return Unit<Kind, Ratio>(lhs.template value() / rhs);
131}
132
133template <UnitKind Kind, class Ratio>
134constexpr auto operator/(float lhs, const Unit<Kind, Ratio>& rhs)
135{
136 return Unit<Kind, Ratio>(lhs / rhs.template value());
137}
138
139// Comparison operators
140template <UnitKind Kind, class Ratio>
141constexpr bool operator==(const Unit<Kind, Ratio>& lhs,
142 const Unit<Kind, Ratio>& rhs)
143{
144 return lhs.template value() == rhs.template value();
145}
146
147template <UnitKind Kind, class Ratio>
148constexpr bool operator!=(const Unit<Kind, Ratio>& lhs,
149 const Unit<Kind, Ratio>& rhs)
150{
151 return lhs.template value() != rhs.template value();
152}
153
154template <UnitKind Kind, class Ratio>
155constexpr bool operator<(const Unit<Kind, Ratio>& lhs,
156 const Unit<Kind, Ratio>& rhs)
157{
158 return lhs.template value() < rhs.template value();
159}
160
161template <UnitKind Kind, class Ratio>
162constexpr bool operator>(const Unit<Kind, Ratio>& lhs,
163 const Unit<Kind, Ratio>& rhs)
164{
165 return lhs.template value() > rhs.template value();
166}
167
168template <UnitKind Kind, class Ratio>
169constexpr bool operator<=(const Unit<Kind, Ratio>& lhs,
170 const Unit<Kind, Ratio>& rhs)
171{
172 return lhs.template value() <= rhs.template value();
173}
174
175template <UnitKind Kind, class Ratio>
176constexpr bool operator>=(const Unit<Kind, Ratio>& lhs,
177 const Unit<Kind, Ratio>& rhs)
178{
179 return lhs.template value() >= rhs.template value();
180}
181
182// Direct assignment operators
183template <UnitKind Kind, class Ratio>
184constexpr Unit<Kind, Ratio>& operator+=(Unit<Kind, Ratio>& lhs,
185 const Unit<Kind, Ratio>& rhs)
186{
187 lhs = lhs + rhs;
188 return lhs;
189}
190
191template <UnitKind Kind, class Ratio>
192constexpr Unit<Kind, Ratio>& operator-=(Unit<Kind, Ratio>& lhs,
193 const Unit<Kind, Ratio>& rhs)
194{
195 lhs = lhs - rhs;
196 return lhs;
197}
198
199template <UnitKind Kind, class Ratio>
200constexpr Unit<Kind, Ratio>& operator*=(Unit<Kind, Ratio>& lhs, float rhs)
201{
202 lhs = lhs * rhs;
203 return lhs;
204}
205
206template <UnitKind Kind, class Ratio>
207constexpr Unit<Kind, Ratio>& operator/=(Unit<Kind, Ratio>& lhs, float rhs)
208{
209 lhs = lhs / rhs;
210 return lhs;
211}
212
213// Unary operators
214template <UnitKind Kind, class Ratio>
215constexpr Unit<Kind, Ratio> operator+(const Unit<Kind, Ratio>& unit)
216{
217 return Unit<Kind, Ratio>(unit.template value());
218}
219
220template <UnitKind Kind, class Ratio>
221constexpr Unit<Kind, Ratio> operator-(const Unit<Kind, Ratio>& unit)
222{
223 return Unit<Kind, Ratio>(-unit.template value());
224}
225
226template <UnitKind Kind, class Ratio>
227constexpr bool operator!(const Unit<Kind, Ratio>& unit)
228{
229 return !unit.template value();
230}
231
232// Stream operators
233template <UnitKind Kind, class Ratio>
234std::ostream& operator<<(std::ostream& os, const Unit<Kind, Ratio>& unit)
235{
236 os << unit.template value();
237 return os;
238}
239
240template <UnitKind Kind, class Ratio>
241inline std::istream& operator>>(std::istream& is, Unit<Kind, Ratio>& unit)
242{
243 is >> unit._value;
244 return is;
245}
246
247} // namespace Units
248} // namespace Boardcore
constexpr float value() const
Return the value of the unit in the target ratio.
Definition Units.h:76
constexpr Unit(float val)
Definition Units.h:64
friend std::istream & operator>>(std::istream &is, Unit< PKind, PRatio > &unit)
constexpr Unit(Unit< FromKind, FromRatio > const &from)
Definition Units.h:67
constexpr bool operator!(const Unit< Kind, Ratio > &unit)
Definition Units.h:227
constexpr bool operator==(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:141
constexpr Unit< Kind, Ratio > & operator-=(Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:192
constexpr bool operator>(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:162
constexpr bool operator<=(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:169
std::istream & operator>>(std::istream &is, Unit< Kind, Ratio > &unit)
Definition Units.h:241
constexpr auto operator/(const Unit< Kind, Ratio > &lhs, float rhs)
Definition Units.h:128
constexpr bool operator!=(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:148
constexpr Unit< Kind, Ratio > & operator*=(Unit< Kind, Ratio > &lhs, float rhs)
Definition Units.h:200
constexpr auto operator-(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:109
constexpr bool operator<(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:155
std::ostream & operator<<(std::ostream &os, const Unit< Kind, Ratio > &unit)
Definition Units.h:234
constexpr bool operator>=(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:176
constexpr auto operator*(const Unit< Kind, Ratio > &lhs, float rhs)
Definition Units.h:116
constexpr Unit< Kind, Ratio > & operator+=(Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:184
constexpr auto operator+(const Unit< Kind, Ratio > &lhs, const Unit< Kind, Ratio > &rhs)
Definition Units.h:102
constexpr Unit< Kind, Ratio > & operator/=(Unit< Kind, Ratio > &lhs, float rhs)
Definition Units.h:207
UnitKind
Enumeration of the different kinds of units.
Definition Units.h:40
This file includes all the types the logdecoder script will decode.