LibrePCB Developers Documentation
ratio.h
Go to the documentation of this file.
1 /*
2  * LibrePCB - Professional EDA for everyone!
3  * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4  * https://librepcb.org/
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef LIBREPCB_CORE_RATIO_H
21 #define LIBREPCB_CORE_RATIO_H
22 
23 /*******************************************************************************
24  * Includes
25  ******************************************************************************/
26 #include "../exceptions.h"
27 
28 #include <type_safe/constrained_type.hpp>
29 
30 #include <QtCore>
31 
32 /*******************************************************************************
33  * Namespace / Forward Declarations
34  ******************************************************************************/
35 namespace librepcb {
36 
37 /*******************************************************************************
38  * Class Ratio
39  ******************************************************************************/
40 
44 class Ratio {
45  Q_DECLARE_TR_FUNCTIONS(Ratio)
46 
47 public:
48  // Constructors / Destructor
49 
53  constexpr Ratio() noexcept : Ratio(0) {}
54 
60  constexpr Ratio(const Ratio& ratio) noexcept : mPpm(ratio.mPpm) {}
61 
67  constexpr explicit Ratio(qint32 ppm) noexcept : mPpm(ppm) {}
68 
72  ~Ratio() = default;
73 
74  // Setters
75 
81  void setRatioPpm(qint32 ppm) noexcept { mPpm = ppm; }
82 
93  void setRatioPercent(qreal percent) noexcept { mPpm = percent * 1e4; }
94 
105  void setRatioNormalized(qreal normalized) noexcept {
106  mPpm = normalized * 1e6;
107  }
108 
119  void setRatioNormalized(const QString& normalized) {
120  mPpm = normalizedStringToPpm(normalized);
121  }
122 
123  // Conversions
124 
130  qint32 toPpm() const noexcept { return mPpm; }
131 
137  qreal toPercent() const noexcept { return (qreal)mPpm / 1e4; }
138 
144  qreal toNormalized() const noexcept { return (qreal)mPpm / 1e6; }
145 
153  QString toNormalizedString() const noexcept;
154 
155  // Static Methods
156 
164  static Ratio fromPercent(qreal percent) noexcept;
165 
173  static Ratio fromNormalized(qreal normalized) noexcept;
174 
192  static Ratio fromNormalized(const QString& normalized);
193 
194  // Static Methods to create often used ratios
195  static Ratio percent0() noexcept { return Ratio(0); }
196  static Ratio percent1() noexcept { return Ratio(10000); }
197  static Ratio percent5() noexcept { return Ratio(50000); }
198  static Ratio percent10() noexcept { return Ratio(100000); }
199  static Ratio percent50() noexcept { return Ratio(500000); }
200  static Ratio percent100() noexcept { return Ratio(1000000); }
201 
202  // Operators
203  Ratio& operator=(const Ratio& rhs) {
204  mPpm = rhs.mPpm;
205  return *this;
206  }
207  Ratio& operator+=(const Ratio& rhs) {
208  mPpm += rhs.mPpm;
209  return *this;
210  }
211  Ratio& operator-=(const Ratio& rhs) {
212  mPpm -= rhs.mPpm;
213  return *this;
214  }
215  Ratio& operator*=(const Ratio& rhs) {
216  mPpm *= rhs.mPpm;
217  return *this;
218  }
219  Ratio& operator*=(qint32 rhs) {
220  mPpm *= rhs;
221  return *this;
222  }
223  Ratio& operator/=(const Ratio& rhs) {
224  mPpm /= rhs.mPpm;
225  return *this;
226  }
227  Ratio& operator/=(qint32 rhs) {
228  mPpm /= rhs;
229  return *this;
230  }
231  Ratio operator+(const Ratio& rhs) const { return Ratio(mPpm + rhs.mPpm); }
232  Ratio operator-() const { return Ratio(-mPpm); }
233  Ratio operator-(const Ratio& rhs) const { return Ratio(mPpm - rhs.mPpm); }
234  Ratio operator*(const Ratio& rhs) const { return Ratio(mPpm * rhs.mPpm); }
235  Ratio operator*(qint32 rhs) const { return Ratio(mPpm * rhs); }
236  Ratio operator/(const Ratio& rhs) const { return Ratio(mPpm / rhs.mPpm); }
237  Ratio operator/(qint32 rhs) const { return Ratio(mPpm / rhs); }
238  Ratio operator%(const Ratio& rhs) const { return Ratio(mPpm % rhs.mPpm); }
239  constexpr bool operator>(const Ratio& rhs) const { return mPpm > rhs.mPpm; }
240  constexpr bool operator>(qint32 rhs) const { return mPpm > rhs; }
241  constexpr bool operator<(const Ratio& rhs) const { return mPpm < rhs.mPpm; }
242  constexpr bool operator<(qint32 rhs) const { return mPpm < rhs; }
243  constexpr bool operator>=(const Ratio& rhs) const { return mPpm >= rhs.mPpm; }
244  constexpr bool operator>=(qint32 rhs) const { return mPpm >= rhs; }
245  constexpr bool operator<=(const Ratio& rhs) const { return mPpm <= rhs.mPpm; }
246  constexpr bool operator<=(qint32 rhs) const { return mPpm <= rhs; }
247  constexpr bool operator==(const Ratio& rhs) const { return mPpm == rhs.mPpm; }
248  constexpr bool operator==(qint32 rhs) const { return mPpm == rhs; }
249  constexpr bool operator!=(const Ratio& rhs) const { return mPpm != rhs.mPpm; }
250  constexpr bool operator!=(qint32 rhs) const { return mPpm != rhs; }
251  explicit operator bool() const { return mPpm != 0; }
252 
253 private:
254  // Private Static Functions
255 
269  static qint32 normalizedStringToPpm(const QString& normalized);
270 
271  // Private Member Variables
272  qint32 mPpm;
273 };
274 
275 /*******************************************************************************
276  * Non-Member Functions
277  ******************************************************************************/
278 
279 inline QDataStream& operator<<(QDataStream& stream, const Ratio& ratio) {
280  stream << ratio.toNormalizedString();
281  return stream;
282 }
283 
284 inline QDebug operator<<(QDebug stream, const Ratio& ratio) {
285  stream << QString("Ratio(%1%%°)").arg(ratio.toPercent());
286  return stream;
287 }
288 
289 inline uint qHash(const Ratio& key, uint seed = 0) noexcept {
290  return ::qHash(key.toPpm(), seed);
291 }
292 
293 /*******************************************************************************
294  * Class UnsignedRatio
295  ******************************************************************************/
296 
298  template <typename Value, typename Predicate>
299  static constexpr auto verify(Value&& val, const Predicate& p) ->
300  typename std::decay<Value>::type {
301  return p(val) ? std::forward<Value>(val)
302  : (throw RuntimeError(__FILE__, __LINE__,
303  Ratio::tr("Value must be >= 0!")),
304  std::forward<Value>(val));
305  }
306 };
307 
309  constexpr bool operator()(const Ratio& r) const noexcept { return r >= 0; }
310 };
311 
319 using UnsignedRatio =
320  type_safe::constrained_type<Ratio, UnsignedRatioConstraint,
322 
323 inline QDataStream& operator<<(QDataStream& stream,
324  const UnsignedRatio& ratio) {
325  stream << ratio->toNormalizedString();
326  return stream;
327 }
328 
329 inline QDebug operator<<(QDebug stream, const UnsignedRatio& ratio) {
330  stream << QString("UnsignedRatio(%1%%)").arg(ratio->toPercent());
331  return stream;
332 }
333 
334 inline uint qHash(const UnsignedRatio& key, uint seed = 0) noexcept {
335  return ::qHash(key->toPpm(), seed);
336 }
337 
338 /*******************************************************************************
339  * Class UnsignedLimitedRatio
340  ******************************************************************************/
341 
343  template <typename Value, typename Predicate>
344  static constexpr auto verify(Value&& val, const Predicate& p) ->
345  typename std::decay<Value>::type {
346  return p(val) ? std::forward<Value>(val)
347  : (throw RuntimeError(__FILE__, __LINE__,
348  Ratio::tr("Value must be 0..1!")),
349  std::forward<Value>(val));
350  }
351 };
352 
354  constexpr bool operator()(const Ratio& r) const noexcept {
355  return (r >= 0) && (r <= Ratio::percent100());
356  }
357 };
358 
366 using UnsignedLimitedRatio =
367  type_safe::constrained_type<Ratio, UnsignedLimitedRatioConstraint,
369 
370 inline QDataStream& operator<<(QDataStream& stream,
371  const UnsignedLimitedRatio& ratio) {
372  stream << ratio->toNormalizedString();
373  return stream;
374 }
375 
376 inline QDebug operator<<(QDebug stream, const UnsignedLimitedRatio& ratio) {
377  stream << QString("UnsignedLimitedRatio(%1%%)").arg(ratio->toPercent());
378  return stream;
379 }
380 
381 inline uint qHash(const UnsignedLimitedRatio& key, uint seed = 0) noexcept {
382  return ::qHash(key->toPpm(), seed);
383 }
384 
385 /*******************************************************************************
386  * End of File
387  ******************************************************************************/
388 
389 } // namespace librepcb
390 
391 #endif
Ratio operator*(const Ratio &rhs) const
Definition: ratio.h:234
~Ratio()=default
Destructor.
constexpr bool operator==(qint32 rhs) const
Definition: ratio.h:248
void setRatioNormalized(qreal normalized) noexcept
Set the ratio as a normalized number.
Definition: ratio.h:105
static Ratio percent0() noexcept
Definition: ratio.h:195
QDataStream & operator<<(QDataStream &stream, const AttributeKey &obj)
Definition: attributekey.h:108
Ratio operator%(const Ratio &rhs) const
Definition: ratio.h:238
static Ratio percent5() noexcept
Definition: ratio.h:197
Ratio operator/(const Ratio &rhs) const
Definition: ratio.h:236
constexpr bool operator==(const Ratio &rhs) const
Definition: ratio.h:247
constexpr bool operator!=(const Ratio &rhs) const
Definition: ratio.h:249
Ratio & operator*=(const Ratio &rhs)
Definition: ratio.h:215
static Ratio fromNormalized(qreal normalized) noexcept
Get a Ratio object with a specific ratio.
Definition: ratio.cpp:51
void setRatioPercent(qreal percent) noexcept
Set the ratio in percent.
Definition: ratio.h:93
Definition: occmodel.cpp:76
static constexpr auto verify(Value &&val, const Predicate &p) -> typename std::decay< Value >::type
Definition: ratio.h:299
qreal toPercent() const noexcept
Get the ratio in percent.
Definition: ratio.h:137
constexpr bool operator>=(qint32 rhs) const
Definition: ratio.h:244
constexpr bool operator>(const Ratio &rhs) const
Definition: ratio.h:239
Ratio operator-(const Ratio &rhs) const
Definition: ratio.h:233
static Ratio fromPercent(qreal percent) noexcept
Get a Ratio object with a specific ratio.
Definition: ratio.cpp:45
constexpr bool operator<=(qint32 rhs) const
Definition: ratio.h:246
Ratio & operator=(const Ratio &rhs)
Definition: ratio.h:203
constexpr bool operator>=(const Ratio &rhs) const
Definition: ratio.h:243
type_safe::constrained_type< Ratio, UnsignedRatioConstraint, UnsignedRatioVerifier > UnsignedRatio
Definition: ratio.h:321
qint32 toPpm() const noexcept
Get the ratio in PPM.
Definition: ratio.h:130
constexpr bool operator()(const Ratio &r) const noexcept
Definition: ratio.h:354
Ratio operator*(qint32 rhs) const
Definition: ratio.h:235
Ratio & operator/=(qint32 rhs)
Definition: ratio.h:227
Ratio & operator-=(const Ratio &rhs)
Definition: ratio.h:211
Ratio operator/(qint32 rhs) const
Definition: ratio.h:237
Ratio operator-() const
Definition: ratio.h:232
static qint32 normalizedStringToPpm(const QString &normalized)
Convert a normalized ratio from a QString to an integer (in PPM)
Definition: ratio.cpp:65
static Ratio percent50() noexcept
Definition: ratio.h:199
static Ratio percent100() noexcept
Definition: ratio.h:200
Definition: ratio.h:308
constexpr Ratio(const Ratio &ratio) noexcept
Copy Constructor.
Definition: ratio.h:60
The RuntimeError class.
Definition: exceptions.h:216
Ratio operator+(const Ratio &rhs) const
Definition: ratio.h:231
constexpr Ratio(qint32 ppm) noexcept
Constructor with a ratio in PPM.
Definition: ratio.h:67
QString toNormalizedString() const noexcept
Get the ratio as a normalized QString.
Definition: ratio.cpp:39
constexpr Ratio() noexcept
Default Constructor.
Definition: ratio.h:53
constexpr bool operator()(const Ratio &r) const noexcept
Definition: ratio.h:309
qreal toNormalized() const noexcept
Get the ratio as a normalized number.
Definition: ratio.h:144
static Ratio percent1() noexcept
Definition: ratio.h:196
type_safe::constrained_type< Ratio, UnsignedLimitedRatioConstraint, UnsignedLimitedRatioVerifier > UnsignedLimitedRatio
Definition: ratio.h:368
The Ratio class is used to represent a ratio number (e.g. 13.37%)
Definition: ratio.h:44
static Ratio percent10() noexcept
Definition: ratio.h:198
static constexpr auto verify(Value &&val, const Predicate &p) -> typename std::decay< Value >::type
Definition: ratio.h:344
Definition: ratio.h:297
constexpr bool operator<=(const Ratio &rhs) const
Definition: ratio.h:245
constexpr bool operator<(const Ratio &rhs) const
Definition: ratio.h:241
constexpr bool operator<(qint32 rhs) const
Definition: ratio.h:242
qint32 mPpm
the ratio in PPM
Definition: ratio.h:272
Ratio & operator*=(qint32 rhs)
Definition: ratio.h:219
Ratio & operator+=(const Ratio &rhs)
Definition: ratio.h:207
void setRatioPpm(qint32 ppm) noexcept
Set the ratio in PPM.
Definition: ratio.h:81
void setRatioNormalized(const QString &normalized)
Set the ratio as a normalized number, represented in a QString.
Definition: ratio.h:119
constexpr bool operator>(qint32 rhs) const
Definition: ratio.h:240
uint qHash(const AttributeKey &key, uint seed=0) noexcept
Definition: attributekey.h:118
uint qHash(const UnsignedLimitedRatio &key, uint seed=0) noexcept
Definition: ratio.h:381
constexpr bool operator!=(qint32 rhs) const
Definition: ratio.h:250
Ratio & operator/=(const Ratio &rhs)
Definition: ratio.h:223