8#include "qtty/qtty.hpp"
17 return time.template to<format::MJD>().value();
27 if constexpr (std::is_same_v<F, format::MJD>) {
35 if constexpr (std::is_same_v<F, format::MJD>) {
56 if constexpr (std::is_same_v<std::decay_t<T>,
CivilTime>) {
59 return value.template to<Target>();
63template <
typename TargetA,
typename TargetB,
typename T>
65 if constexpr (std::is_same_v<std::decay_t<T>,
CivilTime>) {
68 return value.template to<TargetA, TargetB>();
72template <
typename Target,
typename T>
74 if constexpr (std::is_same_v<std::decay_t<T>,
CivilTime>) {
77 return value.template to_with<Target>(ctx);
81template <
typename TargetA,
typename TargetB,
typename T>
83 if constexpr (std::is_same_v<std::decay_t<T>,
CivilTime>) {
86 return value.template to_with<TargetA, TargetB>(ctx);
92template <
typename T = ModifiedJulianDate<scale::TT>>
class Period {
93 tempoch_period_mjd_t m_inner;
95 explicit Period(
const tempoch_period_mjd_t &inner) : m_inner(inner) {}
108 static Period
from_c(
const tempoch_period_mjd_t &c) {
return Period(c); }
113 template <
typename Target>
auto to()
const {
116 using OutT = std::decay_t<
decltype(converted_start)>;
117 return Period<OutT>(converted_start, converted_end);
120 template <
typename TargetA,
typename TargetB>
auto to()
const {
123 using OutT = std::decay_t<
decltype(converted_start)>;
124 return Period<OutT>(converted_start, converted_end);
130 using OutT = std::decay_t<
decltype(converted_start)>;
131 return Period<OutT>(converted_start, converted_end);
137 using OutT = std::decay_t<
decltype(converted_start)>;
138 return Period<OutT>(converted_start, converted_end);
141 template <
typename TargetType = qtty::DayTag>
142 qtty::Quantity<typename qtty::ExtractTag<TargetType>::type>
duration()
const {
143 auto qty = tempoch_period_mjd_duration_qty(m_inner);
144 return qtty::Quantity<qtty::DayTag>(qty.value).template
to<TargetType>();
148 template <
typename TargetType = qtty::DayTag>
149 qtty::Quantity<typename qtty::ExtractTag<TargetType>::type>
length()
const {
154 tempoch_period_mjd_t out{};
155 check_status(tempoch_period_mjd_intersection(m_inner, other.m_inner, &out),
156 "Period::intersection");
164 std::vector<Period<T>>
union_with(
const Period<T> &other)
const {
165 tempoch_period_mjd_t buf[2];
166 std::size_t count = 0;
167 check_status(tempoch_period_mjd_union(m_inner, other.m_inner, buf, &count),
168 "Period::union_with");
169 std::vector<Period<T>> result;
170 result.reserve(count);
171 for (std::size_t i = 0; i < count; ++i)
172 result.push_back(
from_c(buf[i]));
176 std::vector<Period<T>>
complement_of(
const std::vector<Period<T>> &others)
const {
177 std::vector<tempoch_period_mjd_t> raw;
178 raw.reserve(others.size());
179 for (
const auto &p : others)
180 raw.push_back(p.c_inner());
181 tempoch_period_mjd_t *out =
nullptr;
183 check_status(tempoch_period_list_complement(m_inner, raw.data(), raw.size(), &out, &n),
184 "Period::complement_of");
185 std::vector<Period<T>> result;
187 for (std::size_t i = 0; i < n; ++i)
188 result.push_back(
from_c(out[i]));
189 tempoch_period_mjd_free(out, n);
193 const tempoch_period_mjd_t &
c_inner() const noexcept {
return m_inner; }
204inline std::vector<tempoch_period_mjd_t>
to_raw(
const std::vector<
Period<T>> &periods) {
205 std::vector<tempoch_period_mjd_t> raw;
206 raw.reserve(periods.size());
207 for (
const auto &p : periods)
208 raw.push_back(p.c_inner());
213inline std::vector<Period<T>>
from_alloc(tempoch_period_mjd_t *ptr, std::size_t count) {
214 std::vector<Period<T>> result;
215 result.reserve(count);
216 for (std::size_t i = 0; i < count; ++i)
218 tempoch_period_mjd_free(ptr, count);
226 check_status(tempoch_period_list_validate(raw.data(), raw.size()),
"validate_periods");
233 tempoch_period_mjd_t *out =
nullptr;
235 check_status(tempoch_period_list_intersect(ra.data(), ra.size(), rb.data(), rb.size(), &out, &n),
236 "intersect_periods");
244 tempoch_period_mjd_t *out =
nullptr;
246 check_status(tempoch_period_list_union(ra.data(), ra.size(), rb.data(), rb.size(), &out, &n),
254 tempoch_period_mjd_t *out =
nullptr;
256 check_status(tempoch_period_list_normalize(raw.data(), raw.size(), &out, &n),
257 "normalize_periods");
262 return os <<
'[' << period.
start() <<
", " << period.
end() <<
')';
A typed external encoding of a time instant on scale S.
double value() const noexcept
qtty::Quantity< typename qtty::ExtractTag< TargetType >::type > duration() const
const tempoch_period_mjd_t & c_inner() const noexcept
Period intersection(const Period &other) const
bool contains(const T &point) const noexcept
ModifiedJulianDate< scale::TT > start() const
auto to_with(const TimeContext &ctx) const
Period(const T &start, const T &end)
auto to_with(const TimeContext &ctx) const
std::vector< Period< T > > union_with(const Period< T > &other) const
static Period from_c(const tempoch_period_mjd_t &c)
std::vector< Period< T > > complement_of(const std::vector< Period< T > > &others) const
ModifiedJulianDate< scale::TT > end() const
qtty::Quantity< typename qtty::ExtractTag< TargetType >::type > length() const
Returns the length of the period (primary name; duration() is a backward-compat alias).
Immutable conversion context for UT1 and historical UTC routes.
A point in time on scale S, stored as a split J2000-second pair.
static Time from_civil(const CivilTime &civil)
static Time from_encoded(const EncodedTime< S, Fmt > &encoded)
Decode a scalar encoding Fmt into canonical split storage on scale S (default context).
CivilTime to_civil() const
std::vector< tempoch_period_mjd_t > to_raw(const std::vector< Period< T > > &periods)
auto convert_period_endpoint_with(const T &value, const TimeContext &ctx)
std::vector< Period< T > > from_alloc(tempoch_period_mjd_t *ptr, std::size_t count)
auto convert_period_endpoint(const T &value)
std::ostream & operator<<(std::ostream &os, const CivilTime &u)
Stream CivilTime as YYYY-MM-DD HH:MM:SS[.nnnnnnnnn].
Period(T, T) -> Period< T >
std::vector< Period< T > > intersect_periods(const std::vector< Period< T > > &a, const std::vector< Period< T > > &b)
std::vector< Period< T > > normalize_periods(const std::vector< Period< T > > &periods)
void validate_periods(const std::vector< Period< T > > &periods)
Period< ModifiedJulianDate< scale::TT > > TTMjdPeriod
EncodedTime< S, format::MJD > ModifiedJulianDate
Period< CivilTime > UTCPeriod
void check_status(tempoch_status_t status, const char *operation)
Check a tempoch_status_t and throw the appropriate exception on error.
std::vector< Period< T > > union_periods(const std::vector< Period< T > > &a, const std::vector< Period< T > > &b)
static CivilTime from_mjd_value(double mjd)
static double to_mjd_value(const CivilTime &time)
static double to_mjd_value(const EncodedTime< S, F > &time)
static EncodedTime< S, F > from_mjd_value(double mjd)
static Time< S > from_mjd_value(double mjd)
static double to_mjd_value(const Time< S > &time)
Public aliases for tempoch time encodings.