11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
19PROMEKI_NAMESPACE_BEGIN
35struct MediaIOStatsCollectorKey {
37 MediaIOCommand::Kind kind = MediaIOCommand::Open;
43 bool operator==(
const MediaIOStatsCollectorKey &o)
const noexcept {
44 return kind == o.kind &&
id == o.id;
48 bool operator!=(
const MediaIOStatsCollectorKey &o)
const noexcept {
return !(*
this == o); }
60template <>
struct std::hash<promeki::MediaIOStatsCollectorKey> {
61 std::size_t operator()(
const promeki::MediaIOStatsCollectorKey &k)
const noexcept {
62 std::size_t h = std::hash<promeki::MediaIOStats::ID>{}(k.id);
63 h ^=
static_cast<std::size_t
>(k.kind) + 0x9e3779b97f4a7c15ULL + (h << 6) + (h >> 2);
72PROMEKI_NAMESPACE_BEGIN
116class MediaIOStatsCollector :
public ObjectBase {
117 PROMEKI_OBJECT(MediaIOStatsCollector, ObjectBase)
120 using Key = MediaIOStatsCollectorKey;
123 using WindowMap = HashMap<Key, WindowedStat>;
126 static constexpr int DefaultWindowSize = 256;
137 explicit MediaIOStatsCollector(ObjectBase *parent =
nullptr);
145 explicit MediaIOStatsCollector(MediaIO *target, ObjectBase *parent =
nullptr);
148 ~MediaIOStatsCollector()
override;
151 MediaIO *target()
const {
return const_cast<ObjectBasePtr<MediaIO> &
>(_target).data(); }
162 void setTarget(MediaIO *io);
165 int windowSize()
const {
return _windowSize; }
176 void setWindowSize(
int n);
187 const WindowMap &windows()
const {
return _windows; }
193 WindowedStat window(
const Key &key)
const;
199 void onCommandCompleted(MediaIOCommand::Ptr cmd);
201 ObjectBasePtr<MediaIO> _target;
202 int _windowSize = DefaultWindowSize;