11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
23PROMEKI_NAMESPACE_BEGIN
74class TimecodeUserbits {
76 PROMEKI_DATATYPE(TimecodeUserbits, DataTypeTimecodeUserbits, 1)
79 static constexpr
size_t NibbleCount = 8;
84 using Nibbles = ::promeki::Array<uint8_t, NibbleCount>;
96 EightBitChars = 0b001,
101 DateTimeZoneClock = 0b110,
102 PageLineClock = 0b111,
106 TimecodeUserbits() =
default;
112 static TimecodeUserbits fromRawBits(uint32_t bits, Mode m = Unspecified);
117 static TimecodeUserbits fromNibbles(
const Nibbles &n, Mode m = Unspecified);
129 static TimecodeUserbits fromAsciiChars(
const String &s);
142 static Result<TimecodeUserbits> fromDateTimeZone(
const DateTime &dt);
145 const Nibbles &nibbles()
const {
return _nibbles; }
148 uint32_t toUint32()
const;
151 Mode mode()
const {
return _mode; }
158 TimecodeUserbits reinterpret(Mode m)
const {
159 TimecodeUserbits out = *
this;
170 Result<String> asAsciiChars()
const;
182 Result<DateTime> asDateTimeZone()
const;
187 bool hasClockTimeReference()
const {
188 return _mode == ClockTime || _mode == DateTimeZoneClock || _mode == PageLineClock;
192 bool operator==(
const TimecodeUserbits &other)
const {
193 return _mode == other._mode && _nibbles == other._nibbles;
197 bool operator!=(
const TimecodeUserbits &other)
const {
return !(*
this == other); }
200 String toString()
const;
203 JsonObject toJson()
const;
206 Error writeToStream(DataStream &s)
const;
209 template <u
int32_t V>
static Result<TimecodeUserbits> readFromStream(DataStream &s);
213 Mode _mode = Unspecified;
226template <>
struct std::formatter<promeki::TimecodeUserbits> {
227 std::formatter<std::string_view> _base;
229 constexpr auto parse(std::format_parse_context &ctx) {
230 return _base.parse(ctx);
233 template <
typename FormatContext>
234 auto format(
const promeki::TimecodeUserbits &ub, FormatContext &ctx)
const {
235 promeki::String s = ub.toString();
236 return _base.format(std::string_view(s.cstr(), s.byteCount()), ctx);