35 static const constexpr int64_t infinite_min = std::numeric_limits<int64_t>::max() / 8;
36 static const constexpr int64_t infinity = std::numeric_limits<int64_t>::max() / 2;
38 constexpr time_value& operator=(
bool d)
noexcept =
delete;
39 constexpr time_value& operator=(
double d)
noexcept =
delete;
40 constexpr time_value& operator=(
float d)
noexcept =
delete;
41 constexpr time_value& operator=(uint64_t d)
noexcept =
delete;
43 constexpr time_value& operator=(int64_t d)
noexcept
51 constexpr time_value& operator+=(
float d)
noexcept =
delete;
53 constexpr time_value& operator+=(int64_t d)
noexcept
61 if(infinite() || t.infinite())
71 constexpr time_value& operator-=(int64_t d)
noexcept
83 if(infinite() || t.infinite())
91 [[nodiscard]]
constexpr time_value operator-() const noexcept
93 return infinite() ? time_value{impl} : time_value{-impl};
100 assert(!ossia::safe_isnan(d));
101 assert(d <
static_cast<double>(infinite_min));
104 constexpr time_value operator+(int64_t d)
const noexcept
108 constexpr time_value operator+(uint64_t d)
const noexcept
110 assert(d < infinite_min);
111 return *
this + time_value{int64_t(d)};
113 constexpr time_value operator-(int64_t d)
const noexcept
115 return *
this + time_value{-d};
117 constexpr time_value operator-(uint64_t d)
const noexcept
119 assert(d < infinite_min);
120 return *
this + time_value{-int64_t(d)};
123 static constexpr bool
126 if(lhs.infinite() || rhs.infinite())
130 else if(lhs.impl >= 0 && rhs.impl >= 0)
132 uint64_t l = lhs.impl;
133 uint64_t r = rhs.impl;
134 return l + r >= infinite_min;
136 else if(lhs.impl >= 0 && rhs.impl < 0)
140 else if(lhs.impl < 0 && rhs.impl >= 0)
144 else if(lhs.impl < 0 && rhs.impl < 0)
147 uint64_t l = -lhs.impl;
148 uint64_t r = -rhs.impl;
149 return l + r >= infinite_min;
155 static constexpr bool
158 if(lhs.infinite() || rhs.infinite())
162 else if(lhs.impl >= 0 && rhs.impl >= 0)
166 else if(lhs.impl >= 0 && rhs.impl < 0)
168 uint64_t l = lhs.impl;
169 uint64_t r = -rhs.impl;
170 return l + r >= infinite_min;
172 else if(lhs.impl < 0 && rhs.impl >= 0)
174 uint64_t l = -lhs.impl;
175 uint64_t r = rhs.impl;
176 return l + r >= infinite_min;
178 else if(lhs.impl < 0 && rhs.impl < 0)
188 if(add_is_infinite(*
this, t))
189 return time_value{infinity};
191 return time_value{impl + t.impl};
198 assert(!ossia::safe_isnan(d));
199 assert(d <
static_cast<double>(infinite_min));
205 if(sub_is_infinite(*
this, t))
208 return time_value{impl - t.impl};
218 constexpr time_value operator*(
double d)
const noexcept
220 return infinite() ?
time_value{impl} : time_value{int64_t(impl * d)};
223 constexpr time_value operator*(int32_t d)
const noexcept
225 return infinite() ? time_value{impl} : time_value{impl * d};
228 constexpr time_value operator*(int64_t d)
const noexcept
230 return infinite() ? time_value{impl} : time_value{impl * d};
233 constexpr time_value operator*(uint32_t d)
const noexcept
235 return infinite() ? time_value{impl} : time_value{impl * d};
238 constexpr time_value operator*(uint64_t d)
const noexcept
240 return infinite() ? time_value{impl} : time_value{int64_t(impl * d)};
243 friend constexpr double operator/(time_value lhs, time_value rhs)
noexcept
245 return double(lhs.impl) / double(rhs.impl);
250 [[nodiscard]]
constexpr bool infinite() const noexcept {
return impl >= infinite_min; }
257 return (infinite() && rhs.infinite()) || (impl == rhs.impl);
261 return (infinite() != rhs.infinite()) || (impl != rhs.impl);
265 return !(infinite() && rhs.infinite()) && (impl < rhs.impl);
269 return !(infinite() && rhs.infinite()) && (impl > rhs.impl);
275 return (infinite() && rhs.infinite()) || (impl <= rhs.impl);
279 return (infinite() && rhs.infinite()) || (impl >= rhs.impl);