ad_map_access
ECEFCoordinate.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 map {
40 namespace point {
41 
45 #define AD_MAP_POINT_ECEFCOORDINATE_THROWS_EXCEPTION 1
46 
47 #if SAFE_DATATYPES_EXPLICIT_CONVERSION
48 
51 #define _AD_MAP_POINT_ECEFCOORDINATE_EXPLICIT_CONVERSION_ explicit
52 #else
53 
56 #define _AD_MAP_POINT_ECEFCOORDINATE_EXPLICIT_CONVERSION_
57 #endif
58 
69 {
70 public:
74  static const double cMinValue;
75 
79  static const double cMaxValue;
80 
85  static const double cPrecisionValue;
86 
94  : mECEFCoordinate(std::numeric_limits<double>::quiet_NaN())
95  {
96  }
97 
104  : mECEFCoordinate(iECEFCoordinate)
105  {
106  }
107 
111  ECEFCoordinate(const ECEFCoordinate &other) = default;
112 
116  ECEFCoordinate(ECEFCoordinate &&other) = default;
117 
125  ECEFCoordinate &operator=(const ECEFCoordinate &other) = default;
126 
134  ECEFCoordinate &operator=(ECEFCoordinate &&other) = default;
135 
143  bool operator==(const ECEFCoordinate &other) const
144  {
145  ensureValid();
146  other.ensureValid();
147  return std::fabs(mECEFCoordinate - other.mECEFCoordinate) < cPrecisionValue;
148  }
149 
157  bool operator!=(const ECEFCoordinate &other) const
158  {
159  return !operator==(other);
160  }
161 
171  bool operator>(const ECEFCoordinate &other) const
172  {
173  ensureValid();
174  other.ensureValid();
175  return (mECEFCoordinate > other.mECEFCoordinate) && operator!=(other);
176  }
177 
187  bool operator<(const ECEFCoordinate &other) const
188  {
189  ensureValid();
190  other.ensureValid();
191  return (mECEFCoordinate < other.mECEFCoordinate) && operator!=(other);
192  }
193 
203  bool operator>=(const ECEFCoordinate &other) const
204  {
205  ensureValid();
206  other.ensureValid();
207  return ((mECEFCoordinate > other.mECEFCoordinate) || operator==(other));
208  }
209 
219  bool operator<=(const ECEFCoordinate &other) const
220  {
221  ensureValid();
222  other.ensureValid();
223  return ((mECEFCoordinate < other.mECEFCoordinate) || operator==(other));
224  }
225 
237  {
238  ensureValid();
239  other.ensureValid();
240  ECEFCoordinate const result(mECEFCoordinate + other.mECEFCoordinate);
241  result.ensureValid();
242  return result;
243  }
244 
256  {
257  ensureValid();
258  other.ensureValid();
259  mECEFCoordinate += other.mECEFCoordinate;
260  ensureValid();
261  return *this;
262  }
263 
275  {
276  ensureValid();
277  other.ensureValid();
278  ECEFCoordinate const result(mECEFCoordinate - other.mECEFCoordinate);
279  result.ensureValid();
280  return result;
281  }
282 
294  {
295  ensureValid();
296  other.ensureValid();
297  mECEFCoordinate -= other.mECEFCoordinate;
298  ensureValid();
299  return *this;
300  }
301 
312  ECEFCoordinate operator*(const double &scalar) const
313  {
314  ensureValid();
315  ECEFCoordinate const result(mECEFCoordinate * scalar);
316  result.ensureValid();
317  return result;
318  }
319 
330  ECEFCoordinate operator/(const double &scalar) const
331  {
332  ECEFCoordinate const scalarECEFCoordinate(scalar);
333  ECEFCoordinate const result(operator/(scalarECEFCoordinate));
334  result.ensureValid();
335  return result;
336  }
337 
349  double operator/(const ECEFCoordinate &other) const
350  {
351  ensureValid();
352  other.ensureValidNonZero();
353  double const result = mECEFCoordinate / other.mECEFCoordinate;
354  return result;
355  }
356 
366  {
367  ensureValid();
368  ECEFCoordinate const result(-mECEFCoordinate);
369  result.ensureValid(); // LCOV_EXCL_BR_LINE Some types do not throw an exception
370  return result;
371  }
372 
380  {
381  return mECEFCoordinate;
382  }
383 
391  bool isValid() const
392  {
393  auto const valueClass = std::fpclassify(mECEFCoordinate);
394  return ((valueClass == FP_NORMAL) || (valueClass == FP_ZERO)) && (cMinValue <= mECEFCoordinate)
395  && (mECEFCoordinate <= cMaxValue);
396  }
397 
404  void ensureValid() const
405  {
406  if (!isValid())
407  {
408  spdlog::info("ensureValid(::ad::map::point::ECEFCoordinate)>> {} value out of range", *this); // LCOV_EXCL_BR_LINE
409 #if (AD_MAP_POINT_ECEFCOORDINATE_THROWS_EXCEPTION == 1)
410  throw std::out_of_range("ECEFCoordinate value out of range"); // LCOV_EXCL_BR_LINE
411 #endif
412  }
413  }
414 
421  void ensureValidNonZero() const
422  {
423  ensureValid();
424  if (operator==(ECEFCoordinate(0.))) // LCOV_EXCL_BR_LINE
425  {
426  spdlog::info("ensureValid(::ad::map::point::ECEFCoordinate)>> {} value is zero", *this); // LCOV_EXCL_BR_LINE
427 #if (AD_MAP_POINT_ECEFCOORDINATE_THROWS_EXCEPTION == 1)
428  throw std::out_of_range("ECEFCoordinate value is zero"); // LCOV_EXCL_BR_LINE
429 #endif
430  }
431  }
432 
437  {
438  return ECEFCoordinate(cMinValue);
439  }
440 
445  {
446  return ECEFCoordinate(cMaxValue);
447  }
448 
453  {
455  }
456 
457 private:
461  double mECEFCoordinate;
462 };
463 
464 } // namespace point
465 } // namespace map
466 } // namespace ad
478 inline ::ad::map::point::ECEFCoordinate operator*(const double &other, ::ad::map::point::ECEFCoordinate const &value)
479 {
480  return value.operator*(other);
481 }
482 
486 namespace std {
487 
491 inline ::ad::map::point::ECEFCoordinate fabs(const ::ad::map::point::ECEFCoordinate other)
492 {
493  ::ad::map::point::ECEFCoordinate const result(std::fabs(static_cast<double>(other)));
494  return result;
495 }
496 
505 template <> class numeric_limits<::ad::map::point::ECEFCoordinate> : public numeric_limits<double>
506 {
507 public:
511  static inline ::ad::map::point::ECEFCoordinate lowest()
512  {
513  return ::ad::map::point::ECEFCoordinate::getMin();
514  }
518  static inline ::ad::map::point::ECEFCoordinate max()
519  {
520  return ::ad::map::point::ECEFCoordinate::getMax();
521  }
522 
526  static inline ::ad::map::point::ECEFCoordinate epsilon()
527  {
528  return ::ad::map::point::ECEFCoordinate::getPrecision();
529  }
530 };
531 
532 } // namespace std
533 
537 #ifndef GEN_GUARD_AD_MAP_POINT_ECEFCOORDINATE
538 #define GEN_GUARD_AD_MAP_POINT_ECEFCOORDINATE
539 
542 namespace ad {
546 namespace map {
552 namespace point {
553 
563 inline std::ostream &operator<<(std::ostream &os, ECEFCoordinate const &_value)
564 {
565  return os << double(_value);
566 }
567 
568 } // namespace point
569 } // namespace map
570 } // namespace ad
571 
572 namespace std {
576 inline std::string to_string(::ad::map::point::ECEFCoordinate const &value)
577 {
578  return to_string(static_cast<double>(value));
579 }
580 } // namespace std
581 #endif // GEN_GUARD_AD_MAP_POINT_ECEFCOORDINATE
ad
namespace ad
Definition: GeometryStoreItem.hpp:28
ad::map::point::ECEFCoordinate::operator>
bool operator>(const ECEFCoordinate &other) const
standard comparison operator
Definition: ECEFCoordinate.hpp:171
ad::map::point::ECEFCoordinate::operator-=
ECEFCoordinate operator-=(const ECEFCoordinate &other)
standard arithmetic operator
Definition: ECEFCoordinate.hpp:293
ad::map::point::operator<<
std::ostream & operator<<(std::ostream &os, Altitude const &_value)
standard ostream operator
Definition: Altitude.hpp:562
ad::map::point::ECEFCoordinate::operator=
ECEFCoordinate & operator=(const ECEFCoordinate &other)=default
standard assignment operator
ad::map::point::ECEFCoordinate::getMax
static ECEFCoordinate getMax()
get maximum valid ECEFCoordinate (i.e. cMaxValue)
Definition: ECEFCoordinate.hpp:444
std::numeric_limits<::ad::map::point::ECEFCoordinate >::max
static inline ::ad::map::point::ECEFCoordinate max()
Definition: ECEFCoordinate.hpp:518
ad::map::point::ECEFCoordinate::operator==
bool operator==(const ECEFCoordinate &other) const
standard comparison operator
Definition: ECEFCoordinate.hpp:143
ad::map::point::ECEFCoordinate::operator+
ECEFCoordinate operator+(const ECEFCoordinate &other) const
standard arithmetic operator
Definition: ECEFCoordinate.hpp:236
ad::map::point::ECEFCoordinate::operator-
ECEFCoordinate operator-() const
standard arithmetic operator
Definition: ECEFCoordinate.hpp:365
ad::map::point::ECEFCoordinate::operator/
double operator/(const ECEFCoordinate &other) const
standard arithmetic operator
Definition: ECEFCoordinate.hpp:349
ad::map::point::ECEFCoordinate::cPrecisionValue
static const double cPrecisionValue
constant defining the assumed ECEFCoordinate value accuracy (used in comparison operator==(),...
Definition: ECEFCoordinate.hpp:85
ad::map::point::ECEFCoordinate::operator>=
bool operator>=(const ECEFCoordinate &other) const
standard comparison operator
Definition: ECEFCoordinate.hpp:203
std::fabs
inline ::ad::map::point::Longitude fabs(const ::ad::map::point::Longitude other)
overload of the std::fabs for Longitude
Definition: Longitude.hpp:488
std::to_string
std::string to_string(::ad::map::access::GeometryStoreItem const &value)
overload of the std::to_string for GeometryStoreItem
Definition: GeometryStoreItem.hpp:183
ad::map::point::ECEFCoordinate::operator/
ECEFCoordinate operator/(const double &scalar) const
standard arithmetic operator
Definition: ECEFCoordinate.hpp:330
ad::map::point::ECEFCoordinate
DataType ECEFCoordinate.
Definition: ECEFCoordinate.hpp:68
std::numeric_limits<::ad::map::point::ECEFCoordinate >::lowest
static inline ::ad::map::point::ECEFCoordinate lowest()
Definition: ECEFCoordinate.hpp:511
ad::map::point::ECEFCoordinate::operator!=
bool operator!=(const ECEFCoordinate &other) const
standard comparison operator
Definition: ECEFCoordinate.hpp:157
_AD_MAP_POINT_ECEFCOORDINATE_EXPLICIT_CONVERSION_
#define _AD_MAP_POINT_ECEFCOORDINATE_EXPLICIT_CONVERSION_
Enable/Disable explicit conversion. Currently set to "implicit conversion allowed".
Definition: ECEFCoordinate.hpp:56
ad::map::point::ECEFCoordinate::operator<
bool operator<(const ECEFCoordinate &other) const
standard comparison operator
Definition: ECEFCoordinate.hpp:187
ad::map::point::ECEFCoordinate::isValid
bool isValid() const
Definition: ECEFCoordinate.hpp:391
ad::map::point::ECEFCoordinate::operator-
ECEFCoordinate operator-(const ECEFCoordinate &other) const
standard arithmetic operator
Definition: ECEFCoordinate.hpp:274
ad::map::point::ECEFCoordinate::ECEFCoordinate
ECEFCoordinate()
default constructor
Definition: ECEFCoordinate.hpp:93
std::numeric_limits<::ad::map::point::ECEFCoordinate >::epsilon
static inline ::ad::map::point::ECEFCoordinate epsilon()
Definition: ECEFCoordinate.hpp:526
ad::map::point::ECEFCoordinate::cMaxValue
static const double cMaxValue
constant defining the maximum valid ECEFCoordinate value (used in isValid())
Definition: ECEFCoordinate.hpp:79
ad::map::point::ECEFCoordinate::getPrecision
static ECEFCoordinate getPrecision()
get assumed accuracy of ECEFCoordinate (i.e. cPrecisionValue)
Definition: ECEFCoordinate.hpp:452
ad::map::point::ECEFCoordinate::ensureValidNonZero
void ensureValidNonZero() const
ensure that the ECEFCoordinate is valid and non zero
Definition: ECEFCoordinate.hpp:421
ad::map::point::ECEFCoordinate::cMinValue
static const double cMinValue
constant defining the minimum valid ECEFCoordinate value (used in isValid())
Definition: ECEFCoordinate.hpp:74
ad::map::point::ECEFCoordinate::ensureValid
void ensureValid() const
ensure that the ECEFCoordinate is valid
Definition: ECEFCoordinate.hpp:404
ad::map::point::ECEFCoordinate::ECEFCoordinate
_AD_MAP_POINT_ECEFCOORDINATE_EXPLICIT_CONVERSION_ ECEFCoordinate(double const iECEFCoordinate)
standard constructor
Definition: ECEFCoordinate.hpp:103
ad::map::point::ECEFCoordinate::operator+=
ECEFCoordinate & operator+=(const ECEFCoordinate &other)
standard arithmetic operator
Definition: ECEFCoordinate.hpp:255
ad::map::point::ECEFCoordinate::operator*
ECEFCoordinate operator*(const double &scalar) const
standard arithmetic operator
Definition: ECEFCoordinate.hpp:312
ad::map::point::ECEFCoordinate::operator<=
bool operator<=(const ECEFCoordinate &other) const
standard comparison operator
Definition: ECEFCoordinate.hpp:219
operator*
inline ::ad::map::point::ECEFCoordinate operator*(const double &other, ::ad::map::point::ECEFCoordinate const &value)
standard arithmetic operator
Definition: ECEFCoordinate.hpp:478
std::fabs
inline ::ad::map::point::Altitude fabs(const ::ad::map::point::Altitude other)
overload of the std::fabs for Altitude
Definition: Altitude.hpp:490
ad::map::point::ECEFCoordinate::getMin
static ECEFCoordinate getMin()
get minimum valid ECEFCoordinate (i.e. cMinValue)
Definition: ECEFCoordinate.hpp:436