Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1. #pragma once
  2.  
  3.  
  4.  
  5. #include <khronos/def.hpp>
  6. #include <khronos/timeofday.hpp>
  7. #include <khronos/utility.hpp>
  8. #include <khronos/calendar.hpp>
  9. #include <cmath>
  10. #include <string>
  11.  
  12.  
  13.  
  14. namespace khronos {
  15.  
  16. //class
  17. class Jd {
  18. jd_t jd_;
  19. public:
  20. Jd();
  21.  
  22. Jd(now_t now);
  23.  
  24. constexpr jd_t jd() const { return jd_; } //getter
  25.  
  26. constexpr Jd(jd_t jd) :jd_(jd) {}
  27.  
  28. std::string to_string() const;
  29. };
  30.  
  31. // //operators
  32. /** Jd relational operators. */
  33. inline bool operator == (Jd const& lhs, Jd const& rhs) { return lhs.jd() == rhs.jd(); }
  34. inline bool operator != (Jd const& lhs, Jd const& rhs) { return lhs.jd() != rhs.jd(); }
  35. inline bool operator <= (Jd const& lhs, Jd const& rhs) { return lhs.jd() <= rhs.jd(); }
  36. inline bool operator >= (Jd const& lhs, Jd const& rhs) { return lhs.jd() >= rhs.jd(); }
  37. inline bool operator < (Jd const& lhs, Jd const& rhs) { return lhs.jd() < rhs.jd(); }
  38. inline bool operator > (Jd const& lhs, Jd const& rhs) { return lhs.jd() > rhs.jd(); }
  39.  
  40. inline jd_t operator - (Jd const& lhs, Jd const& rhs) { return lhs.jd() - rhs.jd(); }
  41. inline std::ostream& operator << (std::ostream& os, Jd const& jd) {
  42. return os << jd.to_string();
  43. }
  44.  
  45. /** Day addition/subtraction. */
  46. namespace detail {
  47. struct packaged_day {
  48. day_t nDays_;
  49. packaged_day(day_t d) : nDays_(d) { };
  50. };
  51. };
  52. inline detail::packaged_day days(day_t d) { return detail::packaged_day(d); }
  53. inline Jd operator + (Jd const& jdn, detail::packaged_day days) { return Jd(jdn.jd() + days.nDays_); }
  54. inline Jd operator - (Jd const& jdn, detail::packaged_day days) { return jdn.jd() - days.nDays_; }
  55.  
  56. /** Day of the week. */
  57. inline day_t day_of_week(Jd const& jd) { return civil::day_of_week(jd.jd()); }
  58.  
  59. /** Week addition/subtraction. */
  60. namespace detail {
  61. struct packaged_week {
  62. day_t nWeeks_;
  63. packaged_week(day_t w) : nWeeks_(w) { };
  64. };
  65. };
  66. inline detail::packaged_week weeks(day_t w) { return detail::packaged_week(w); }
  67. inline Jd operator + (Jd const& jdn, detail::packaged_week weeks) { return jdn.jd() + weeks.nWeeks_ * 7.0; }
  68. inline Jd operator - (Jd const& jdn, detail::packaged_week weeks) { return jdn.jd() - weeks.nWeeks_ * 7.0; }
  69.  
  70. //** Month addition/subtraction. */
  71. namespace detail {
  72. struct packaged_month_integer {
  73. month_t nMonths_;
  74. packaged_month_integer(month_t m) : nMonths_(m) { }
  75. };
  76. struct packaged_month_real {
  77. double nMonths_;
  78. packaged_month_real(double m) : nMonths_(m) { }
  79. };
  80. };
  81. inline detail::packaged_month_real months(double m) { return detail::packaged_month_real(m); }
  82. inline detail::packaged_month_real months(float m) { return detail::packaged_month_real(m); }
  83. template <typename T> inline detail::packaged_month_integer months(T m) { return detail::packaged_month_integer(month_t(m)); }
  84.  
  85. //** Year addition/subtraction. */
  86. namespace detail {
  87. /** Year as integer number wrapper. */
  88. struct packaged_year_integer {
  89. year_t nYears_;
  90. packaged_year_integer(year_t y) : nYears_(y) { }
  91. };
  92. /** Year as real number wrapper. */
  93. struct packaged_year_real {
  94. double nYears_;
  95. packaged_year_real(double y) : nYears_(y) { }
  96. };
  97. };
  98. /** Wrap a double literal into a real year package. */
  99. inline detail::packaged_year_real years(double y) { return detail::packaged_year_real(y); }
  100.  
  101. /** Wrap a float literal into a real year package. */
  102. inline detail::packaged_year_real years(float y) { return detail::packaged_year_real(y); }
  103.  
  104. /** Wrap all other literals into an integer year package (if possible). */
  105. template<typename T> inline detail::packaged_year_integer years(T y) { return detail::packaged_year_integer(static_cast<year_t>(y)); }
  106.  
  107. /** JD + (real years) */
  108. constexpr Jd operator + (Jd const& dt, detail::packaged_year_real const& year) {
  109. return Jd(dt.jd() + year.nYears_ * EARTH_ORBITAL_PERIOD_DAYS);
  110. }
  111.  
  112. /** JD - (real years) */
  113. inline Jd operator - (Jd const& dt, detail::packaged_year_real const& year) { return dt + detail::packaged_year_real(-year.nYears_); }
  114.  
  115. /** JD + (integer year) */
  116. inline Jd operator + (Jd const& dt, detail::packaged_year_integer const& year) { return dt + detail::packaged_year_real((double)year.nYears_); }
  117.  
  118. /** JD - (integer year) */
  119. inline Jd operator - (Jd const& dt, detail::packaged_year_integer const& year) { return dt + detail::packaged_year_integer(-year.nYears_); }
  120.  
  121. } // end-of-namespace khronos
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement