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
65 if(infinite() || t.infinite())
75 constexpr time_value& operator-=(int64_t d)
noexcept
87 if(infinite() || t.infinite())
95 constexpr time_value& operator-() noexcept
107 assert(!ossia::safe_isnan(d));
108 assert(d <
static_cast<double>(infinite_min));
111 constexpr time_value operator+(int64_t d)
const noexcept
115 constexpr time_value operator+(uint64_t d)
const noexcept
117 assert(d < infinite_min);
118 return *
this + time_value{int64_t(d)};
120 constexpr time_value operator-(int64_t d)
const noexcept
122 return *
this + time_value{-d};
124 constexpr time_value operator-(uint64_t d)
const noexcept
126 assert(d < infinite_min);
127 return *
this + time_value{-int64_t(d)};
130 static constexpr bool
133 if(lhs.infinite() || rhs.infinite())
137 else if(lhs.impl >= 0 && rhs.impl >= 0)
139 uint64_t l = lhs.impl;
140 uint64_t r = rhs.impl;
141 return l + r >= infinite_min;
143 else if(lhs.impl >= 0 && rhs.impl < 0)
147 else if(lhs.impl < 0 && rhs.impl >= 0)
151 else if(lhs.impl < 0 && rhs.impl < 0)
154 uint64_t l = -lhs.impl;
155 uint64_t r = -rhs.impl;
156 return l + r >= infinite_min;
162 static constexpr bool
165 if(lhs.infinite() || rhs.infinite())
169 else if(lhs.impl >= 0 && rhs.impl >= 0)
173 else if(lhs.impl >= 0 && rhs.impl < 0)
175 uint64_t l = lhs.impl;
176 uint64_t r = -rhs.impl;
177 return l + r >= infinite_min;
179 else if(lhs.impl < 0 && rhs.impl >= 0)
181 uint64_t l = -lhs.impl;
182 uint64_t r = rhs.impl;
183 return l + r >= infinite_min;
185 else if(lhs.impl < 0 && rhs.impl < 0)
195 if(add_is_infinite(*
this, t))
196 return time_value{infinity};
198 return time_value{impl + t.impl};
205 assert(!ossia::safe_isnan(d));
206 assert(d <
static_cast<double>(infinite_min));
212 if(sub_is_infinite(*
this, t))
215 return time_value{impl - t.impl};
224 constexpr time_value operator*(
double d)
const noexcept
229 constexpr time_value operator*(int32_t d)
const noexcept
231 return time_value{impl * d};
234 constexpr time_value operator*(int64_t d)
const noexcept
236 return time_value{impl * d};
239 constexpr time_value operator*(uint32_t d)
const noexcept
241 return time_value{impl * d};
244 constexpr time_value operator*(uint64_t d)
const noexcept
246 return time_value{int64_t(impl * d)};
249 friend constexpr double operator/(time_value lhs, time_value rhs)
noexcept
251 return double(lhs.impl) / double(rhs.impl);
256 [[nodiscard]]
constexpr bool infinite() const noexcept {
return impl >= infinite_min; }
263 return (infinite() && rhs.infinite()) || (impl == rhs.impl);
267 return (infinite() != rhs.infinite()) || (impl != rhs.impl);
271 return !(infinite() && rhs.infinite()) && (impl < rhs.impl);
275 return !(infinite() && rhs.infinite()) && (impl > rhs.impl);
279 return !(infinite() && rhs.infinite()) && (impl <= rhs.impl);
283 return !(infinite() && rhs.infinite()) && (impl >= rhs.impl);