#pragma once #include #include #include #include namespace beast::insight { /** * A metric for reporting event timing. * * An event is an operation that has an associated millisecond time, or * other integral value. Because events happen at a specific moment, the * metric only supports a push-style interface. * * This is a lightweight reference wrapper which is cheap to copy and assign. * When the last reference goes away, the metric is no longer collected. */ class Event final { public: using value_type = EventImpl::value_type; /** * Create a null metric. * A null metric reports no information. */ Event() = default; /** * Create the metric reference the specified implementation. * Normally this won't be called directly. Instead, call the appropriate * factory function in the Collector interface. * @see Collector. */ explicit Event(std::shared_ptr impl) : impl_(std::move(impl)) { } /** * Push an event notification. */ template void notify(std::chrono::duration const& value) const { using namespace std::chrono; if (impl_) impl_->notify(ceil(value)); } [[nodiscard]] std::shared_ptr const& impl() const { return impl_; } private: std::shared_ptr impl_; }; } // namespace beast::insight