11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
21PROMEKI_NAMESPACE_BEGIN
83 using ID = StringRegistry<
"ClockDomain">::Item;
86 using IDList = ::promeki::List<ID>;
98 static const ID Synthetic;
101 static const ID SystemMonotonic;
137 using WallClockProvider = ::promeki::Function<int64_t()>;
152 static ID registerDomain(
const String &name,
const String &description,
153 const ClockEpoch &epoch = ClockEpoch::Correlated);
163 static void setDomainMetadata(
const ID &
id,
const Metadata &metadata);
188 static void setNowProvider(
const ID &
id, WallClockProvider provider);
203 static int64_t nowUtcNs(
const ID &
id);
206 static bool hasNowProvider(
const ID &
id);
212 static IDList registeredIDs();
219 static ClockDomain lookup(
const String &name);
222 ClockDomain() =
default;
228 ClockDomain(
const ID &
id);
234 bool isValid()
const;
246 const String &name()
const;
252 const String &description()
const;
259 const ClockEpoch &epoch()
const;
268 const Metadata &metadata()
const;
276 bool isCrossStreamComparable()
const;
284 bool isCrossMachineComparable()
const;
293 int64_t nowUtcNs()
const;
296 bool hasNowProvider()
const;
306 String toString()
const;
316 const Data *data()
const {
return d; }
319 bool operator==(
const ClockDomain &other)
const {
return d == other.d; }
322 bool operator!=(
const ClockDomain &other)
const {
return d != other.d; }
325 const Data *d =
nullptr;
326 static const Data *lookupData(
const ID &
id);
331PROMEKI_FORMAT_VIA_TOSTRING(promeki::ClockDomain);