11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
22PROMEKI_NAMESPACE_BEGIN
70 PROMEKI_DATATYPE(FrameNumber, DataTypeFrameNumber, 1)
73 Error writeToStream(DataStream &s) const;
75 template <uint32_t V> static Result<FrameNumber> readFromStream(DataStream &s);
78 static constexpr int64_t UnknownValue = -1;
84 static constexpr FrameNumber unknown() {
return FrameNumber(); }
101 static Result<FrameNumber> fromString(
const String &str);
104 constexpr FrameNumber() =
default;
116 constexpr FrameNumber(int64_t v) : _value(v < 0 ? UnknownValue : v) {}
119 constexpr bool isValid()
const {
return _value >= 0; }
122 constexpr bool isUnknown()
const {
return _value < 0; }
125 constexpr int64_t value()
const {
return _value; }
133 double toDouble()
const {
134 return isValid() ?
static_cast<double>(_value)
135 : std::numeric_limits<double>::quiet_NaN();
146 static Result<FrameNumber> fromDouble(
double v) {
147 if (std::isnan(v))
return makeResult(FrameNumber());
148 if (!std::isfinite(v) || v < 0.0)
return makeResult(FrameNumber());
149 return makeResult(FrameNumber(
static_cast<int64_t
>(v)));
153 FrameNumber &operator++() {
154 if (isValid()) ++_value;
159 FrameNumber operator++(
int) {
160 FrameNumber old = *
this;
166 FrameNumber &operator--() {
169 _value = UnknownValue;
177 FrameNumber operator--(
int) {
178 FrameNumber old = *
this;
184 FrameNumber &operator+=(int64_t n) {
186 int64_t nv = _value + n;
187 _value = nv < 0 ? UnknownValue : nv;
193 FrameNumber &operator-=(int64_t n) {
195 int64_t nv = _value - n;
196 _value = nv < 0 ? UnknownValue : nv;
202 FrameNumber &operator+=(
const FrameCount &c);
205 FrameNumber &operator-=(
const FrameCount &c);
208 constexpr bool operator==(
const FrameNumber &other)
const {
return _value == other._value; }
211 constexpr bool operator!=(
const FrameNumber &other)
const {
return _value != other._value; }
214 constexpr bool operator<(
const FrameNumber &other)
const {
return _value < other._value; }
215 constexpr bool operator<=(
const FrameNumber &other)
const {
return _value <= other._value; }
216 constexpr bool operator>(
const FrameNumber &other)
const {
return _value > other._value; }
217 constexpr bool operator>=(
const FrameNumber &other)
const {
return _value >= other._value; }
224 String toString()
const;
227 operator String()
const {
return toString(); }
230 int64_t _value = UnknownValue;
234inline FrameNumber operator+(FrameNumber a, int64_t n) {
239inline FrameNumber operator-(FrameNumber a, int64_t n) {
244inline FrameNumber operator+(int64_t n, FrameNumber a) {
251PROMEKI_FORMAT_VIA_TOSTRING(promeki::FrameNumber);
261template <>
struct std::hash<promeki::FrameNumber> {
262 size_t operator()(
const promeki::FrameNumber &v)
const noexcept {
263 return std::hash<int64_t>()(v.value());