ad_physics
AngularAcceleration.hpp
Go to the documentation of this file.
1 /*
2  * ----------------- BEGIN LICENSE BLOCK ---------------------------------
3  *
4  * Copyright (C) 2018-2020 Intel Corporation
5  *
6  * SPDX-License-Identifier: MIT
7  *
8  * ----------------- END LICENSE BLOCK -----------------------------------
9  */
10 
18 #pragma once
19 
20 #include <cmath>
21 #include <iostream>
22 #include <limits>
23 #include <sstream>
24 #include <stdexcept>
25 #include "spdlog/fmt/ostr.h"
26 #include "spdlog/spdlog.h"
30 namespace ad {
34 namespace physics {
35 
39 #define AD_PHYSICS_ANGULARACCELERATION_THROWS_EXCEPTION 1
40 
41 #if SAFE_DATATYPES_EXPLICIT_CONVERSION
42 
45 #define _AD_PHYSICS_ANGULARACCELERATION_EXPLICIT_CONVERSION_ explicit
46 #else
47 
50 #define _AD_PHYSICS_ANGULARACCELERATION_EXPLICIT_CONVERSION_
51 #endif
52 
60 {
61 public:
65  static const double cMinValue;
66 
70  static const double cMaxValue;
71 
76  static const double cPrecisionValue;
77 
85  : mAngularAcceleration(std::numeric_limits<double>::quiet_NaN())
86  {
87  }
88 
96  : mAngularAcceleration(iAngularAcceleration)
97  {
98  }
99 
103  AngularAcceleration(const AngularAcceleration &other) = default;
104 
108  AngularAcceleration(AngularAcceleration &&other) = default;
109 
117  AngularAcceleration &operator=(const AngularAcceleration &other) = default;
118 
127 
135  bool operator==(const AngularAcceleration &other) const
136  {
137  ensureValid();
138  other.ensureValid();
139  return std::fabs(mAngularAcceleration - other.mAngularAcceleration) < cPrecisionValue;
140  }
141 
149  bool operator!=(const AngularAcceleration &other) const
150  {
151  return !operator==(other);
152  }
153 
163  bool operator>(const AngularAcceleration &other) const
164  {
165  ensureValid();
166  other.ensureValid();
167  return (mAngularAcceleration > other.mAngularAcceleration) && operator!=(other);
168  }
169 
179  bool operator<(const AngularAcceleration &other) const
180  {
181  ensureValid();
182  other.ensureValid();
183  return (mAngularAcceleration < other.mAngularAcceleration) && operator!=(other);
184  }
185 
195  bool operator>=(const AngularAcceleration &other) const
196  {
197  ensureValid();
198  other.ensureValid();
199  return ((mAngularAcceleration > other.mAngularAcceleration) || operator==(other));
200  }
201 
211  bool operator<=(const AngularAcceleration &other) const
212  {
213  ensureValid();
214  other.ensureValid();
215  return ((mAngularAcceleration < other.mAngularAcceleration) || operator==(other));
216  }
217 
229  {
230  ensureValid();
231  other.ensureValid();
232  AngularAcceleration const result(mAngularAcceleration + other.mAngularAcceleration);
233  result.ensureValid();
234  return result;
235  }
236 
248  {
249  ensureValid();
250  other.ensureValid();
251  mAngularAcceleration += other.mAngularAcceleration;
252  ensureValid();
253  return *this;
254  }
255 
267  {
268  ensureValid();
269  other.ensureValid();
270  AngularAcceleration const result(mAngularAcceleration - other.mAngularAcceleration);
271  result.ensureValid();
272  return result;
273  }
274 
286  {
287  ensureValid();
288  other.ensureValid();
289  mAngularAcceleration -= other.mAngularAcceleration;
290  ensureValid();
291  return *this;
292  }
293 
304  AngularAcceleration operator*(const double &scalar) const
305  {
306  ensureValid();
307  AngularAcceleration const result(mAngularAcceleration * scalar);
308  result.ensureValid();
309  return result;
310  }
311 
322  AngularAcceleration operator/(const double &scalar) const
323  {
324  AngularAcceleration const scalarAngularAcceleration(scalar);
325  AngularAcceleration const result(operator/(scalarAngularAcceleration));
326  result.ensureValid();
327  return result;
328  }
329 
341  double operator/(const AngularAcceleration &other) const
342  {
343  ensureValid();
344  other.ensureValidNonZero();
345  double const result = mAngularAcceleration / other.mAngularAcceleration;
346  return result;
347  }
348 
358  {
359  ensureValid();
360  AngularAcceleration const result(-mAngularAcceleration);
361  result.ensureValid(); // LCOV_EXCL_BR_LINE Some types do not throw an exception
362  return result;
363  }
364 
372  {
373  return mAngularAcceleration;
374  }
375 
383  bool isValid() const
384  {
385  auto const valueClass = std::fpclassify(mAngularAcceleration);
386  return ((valueClass == FP_NORMAL) || (valueClass == FP_ZERO)) && (cMinValue <= mAngularAcceleration)
387  && (mAngularAcceleration <= cMaxValue);
388  }
389 
396  void ensureValid() const
397  {
398  if (!isValid())
399  {
400  spdlog::info("ensureValid(::ad::physics::AngularAcceleration)>> {} value out of range",
401  *this); // LCOV_EXCL_BR_LINE
402 #if (AD_PHYSICS_ANGULARACCELERATION_THROWS_EXCEPTION == 1)
403  throw std::out_of_range("AngularAcceleration value out of range"); // LCOV_EXCL_BR_LINE
404 #endif
405  }
406  }
407 
414  void ensureValidNonZero() const
415  {
416  ensureValid();
417  if (operator==(AngularAcceleration(0.))) // LCOV_EXCL_BR_LINE
418  {
419  spdlog::info("ensureValid(::ad::physics::AngularAcceleration)>> {} value is zero", *this); // LCOV_EXCL_BR_LINE
420 #if (AD_PHYSICS_ANGULARACCELERATION_THROWS_EXCEPTION == 1)
421  throw std::out_of_range("AngularAcceleration value is zero"); // LCOV_EXCL_BR_LINE
422 #endif
423  }
424  }
425 
430  {
432  }
433 
438  {
440  }
441 
446  {
448  }
449 
450 private:
454  double mAngularAcceleration;
455 };
456 
457 } // namespace physics
458 } // namespace ad
470 inline ::ad::physics::AngularAcceleration operator*(const double &other,
471  ::ad::physics::AngularAcceleration const &value)
472 {
473  return value.operator*(other);
474 }
475 
479 namespace std {
480 
484 inline ::ad::physics::AngularAcceleration fabs(const ::ad::physics::AngularAcceleration other)
485 {
486  ::ad::physics::AngularAcceleration const result(std::fabs(static_cast<double>(other)));
487  return result;
488 }
489 
498 template <> class numeric_limits<::ad::physics::AngularAcceleration> : public numeric_limits<double>
499 {
500 public:
504  static inline ::ad::physics::AngularAcceleration lowest()
505  {
506  return ::ad::physics::AngularAcceleration::getMin();
507  }
511  static inline ::ad::physics::AngularAcceleration max()
512  {
513  return ::ad::physics::AngularAcceleration::getMax();
514  }
515 
519  static inline ::ad::physics::AngularAcceleration epsilon()
520  {
521  return ::ad::physics::AngularAcceleration::getPrecision();
522  }
523 };
524 
525 } // namespace std
526 
530 #ifndef GEN_GUARD_AD_PHYSICS_ANGULARACCELERATION
531 #define GEN_GUARD_AD_PHYSICS_ANGULARACCELERATION
532 
535 namespace ad {
539 namespace physics {
540 
550 inline std::ostream &operator<<(std::ostream &os, AngularAcceleration const &_value)
551 {
552  return os << double(_value);
553 }
554 
555 } // namespace physics
556 } // namespace ad
557 
558 namespace std {
562 inline std::string to_string(::ad::physics::AngularAcceleration const &value)
563 {
564  return to_string(static_cast<double>(value));
565 }
566 } // namespace std
567 #endif // GEN_GUARD_AD_PHYSICS_ANGULARACCELERATION
ad
namespace ad
Definition: Acceleration.hpp:30
ad::physics::AngularAcceleration::cMaxValue
static const double cMaxValue
constant defining the maximum valid AngularAcceleration value (used in isValid())
Definition: AngularAcceleration.hpp:70
ad::physics::AngularAcceleration::operator!=
bool operator!=(const AngularAcceleration &other) const
standard comparison operator
Definition: AngularAcceleration.hpp:149
ad::physics::AngularAcceleration::ensureValidNonZero
void ensureValidNonZero() const
ensure that the AngularAcceleration is valid and non zero
Definition: AngularAcceleration.hpp:414
ad::physics::AngularAcceleration::ensureValid
void ensureValid() const
ensure that the AngularAcceleration is valid
Definition: AngularAcceleration.hpp:396
ad::physics::AngularAcceleration::operator/
AngularAcceleration operator/(const double &scalar) const
standard arithmetic operator
Definition: AngularAcceleration.hpp:322
std::numeric_limits<::ad::physics::AngularAcceleration >::lowest
static inline ::ad::physics::AngularAcceleration lowest()
Definition: AngularAcceleration.hpp:504
ad::physics::AngularAcceleration::operator/
double operator/(const AngularAcceleration &other) const
standard arithmetic operator
Definition: AngularAcceleration.hpp:341
std::numeric_limits<::ad::physics::AngularAcceleration >::max
static inline ::ad::physics::AngularAcceleration max()
Definition: AngularAcceleration.hpp:511
ad::physics::AngularAcceleration::operator+
AngularAcceleration operator+(const AngularAcceleration &other) const
standard arithmetic operator
Definition: AngularAcceleration.hpp:228
ad::physics::AngularAcceleration::cPrecisionValue
static const double cPrecisionValue
constant defining the assumed AngularAcceleration value accuracy (used in comparison operator==(),...
Definition: AngularAcceleration.hpp:76
ad::physics::AngularAcceleration
DataType AngularAcceleration.
Definition: AngularAcceleration.hpp:59
ad::physics::AngularAcceleration::operator-=
AngularAcceleration operator-=(const AngularAcceleration &other)
standard arithmetic operator
Definition: AngularAcceleration.hpp:285
ad::physics::AngularAcceleration::operator>=
bool operator>=(const AngularAcceleration &other) const
standard comparison operator
Definition: AngularAcceleration.hpp:195
ad::physics::AngularAcceleration::getMax
static AngularAcceleration getMax()
get maximum valid AngularAcceleration (i.e. cMaxValue)
Definition: AngularAcceleration.hpp:437
ad::physics::AngularAcceleration::AngularAcceleration
AngularAcceleration()
default constructor
Definition: AngularAcceleration.hpp:84
std::numeric_limits<::ad::physics::AngularAcceleration >::epsilon
static inline ::ad::physics::AngularAcceleration epsilon()
Definition: AngularAcceleration.hpp:519
ad::physics::AngularAcceleration::getPrecision
static AngularAcceleration getPrecision()
get assumed accuracy of AngularAcceleration (i.e. cPrecisionValue)
Definition: AngularAcceleration.hpp:445
ad::physics::AngularAcceleration::operator>
bool operator>(const AngularAcceleration &other) const
standard comparison operator
Definition: AngularAcceleration.hpp:163
ad::physics::AngularAcceleration::operator+=
AngularAcceleration & operator+=(const AngularAcceleration &other)
standard arithmetic operator
Definition: AngularAcceleration.hpp:247
ad::physics::AngularAcceleration::AngularAcceleration
_AD_PHYSICS_ANGULARACCELERATION_EXPLICIT_CONVERSION_ AngularAcceleration(double const iAngularAcceleration)
standard constructor
Definition: AngularAcceleration.hpp:95
operator*
inline ::ad::physics::AngularAcceleration operator*(const double &other, ::ad::physics::AngularAcceleration const &value)
standard arithmetic operator
Definition: AngularAcceleration.hpp:470
ad::physics::AngularAcceleration::cMinValue
static const double cMinValue
constant defining the minimum valid AngularAcceleration value (used in isValid())
Definition: AngularAcceleration.hpp:65
ad::physics::AngularAcceleration::operator*
AngularAcceleration operator*(const double &scalar) const
standard arithmetic operator
Definition: AngularAcceleration.hpp:304
std::fabs
inline ::ad::physics::Weight fabs(const ::ad::physics::Weight other)
overload of the std::fabs for Weight
Definition: Weight.hpp:480
std::fabs
inline ::ad::physics::Acceleration fabs(const ::ad::physics::Acceleration other)
overload of the std::fabs for Acceleration
Definition: Acceleration.hpp:481
std::to_string
std::string to_string(::ad::physics::Acceleration const &value)
overload of the std::to_string for Acceleration
Definition: Acceleration.hpp:559
ad::physics::AngularAcceleration::operator-
AngularAcceleration operator-(const AngularAcceleration &other) const
standard arithmetic operator
Definition: AngularAcceleration.hpp:266
ad::physics::AngularAcceleration::getMin
static AngularAcceleration getMin()
get minimum valid AngularAcceleration (i.e. cMinValue)
Definition: AngularAcceleration.hpp:429
ad::physics::AngularAcceleration::operator==
bool operator==(const AngularAcceleration &other) const
standard comparison operator
Definition: AngularAcceleration.hpp:135
ad::physics::AngularAcceleration::operator<
bool operator<(const AngularAcceleration &other) const
standard comparison operator
Definition: AngularAcceleration.hpp:179
ad::physics::AngularAcceleration::operator=
AngularAcceleration & operator=(const AngularAcceleration &other)=default
standard assignment operator
ad::physics::operator<<
std::ostream & operator<<(std::ostream &os, Acceleration const &_value)
standard ostream operator
Definition: Acceleration.hpp:547
ad::physics::AngularAcceleration::operator<=
bool operator<=(const AngularAcceleration &other) const
standard comparison operator
Definition: AngularAcceleration.hpp:211
ad::physics::AngularAcceleration::isValid
bool isValid() const
Definition: AngularAcceleration.hpp:383
ad::physics::AngularAcceleration::operator-
AngularAcceleration operator-() const
standard arithmetic operator
Definition: AngularAcceleration.hpp:357
_AD_PHYSICS_ANGULARACCELERATION_EXPLICIT_CONVERSION_
#define _AD_PHYSICS_ANGULARACCELERATION_EXPLICIT_CONVERSION_
Enable/Disable explicit conversion. Currently set to "implicit conversion allowed".
Definition: AngularAcceleration.hpp:50