28#include <condition_variable>
122using Value = std::variant<std::monostate, bool, std::int64_t, std::uint64_t, double, std::string>;
250 void beginDispatch();
254 std::atomic<std::size_t> listenerCount_{0};
255 std::mutex listenerMutex_;
256 std::vector<std::shared_ptr<ListenerEntry>> listeners_;
259 std::mutex dispatchMutex_;
260 std::condition_variable dispatchCv_;
261 bool dispatchInProgress_ =
false;
289 using Sink = std::function<void(
Level,
const std::string &)>;
Dispatcher & operator=(const Dispatcher &)=delete
Dispatcher(Dispatcher &&)=delete
ListenerHandle registerListener(Listener listener)
Dispatcher(const Dispatcher &)=delete
std::uint64_t ListenerHandle
void setLevel(Level level)
bool removeListener(ListenerHandle handle)
std::function< void(const Event &)> Listener
void emit(Event event) noexcept
Dispatcher & operator=(Dispatcher &&)=delete
bool enabled(Level eventLevel) const
std::function< void(Level, const std::string &)> Sink
void operator()(const Event &event) const noexcept
@ OversizedFrameDiscarded
@ IgnoredFrameWhileWaiting
const char * toString(Level level)
@ FirmwareBelowRecommended
@ QueuedCommandsDiscarded
std::string escapeFrame(const std::string &frame)
std::string formatValue(const Value &value)
std::variant< ConnectionPayload, FramePayload, StatusDecodedPayload, FieldChangesPayload, VerificationPayload, WarningPayload, ParserAnomalyPayload, ReconnectAttemptPayload, TimingPayload > Payload
Event makeEvent(Level level, EventType type, Payload payload)
std::variant< std::monostate, bool, std::int64_t, std::uint64_t, double, std::string > Value
std::uint64_t connectionGeneration
std::chrono::system_clock::time_point wallTime
std::chrono::steady_clock::time_point steadyTime
std::vector< FieldChange > changes
std::chrono::milliseconds delayBeforeAttempt
std::vector< NamedValue > fields
std::chrono::microseconds duration
TimingOperation operation
VerificationOutcome outcome
VerificationOperation operation
std::uint64_t relatedSequence