quic/common/MonitoredObject.h (43 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <functional>
#include <utility>
namespace quic {
/**
* A wrapper for monitoring an arbitrary object.
* Whenever the object is accessed, the accessFn is triggered and the wrapped
* object is passed to it.
*/
template <typename T>
class MonitoredObject {
public:
using MonitoredObjectAccessFn = std::function<void(const T&)>;
MonitoredObject(T object, MonitoredObjectAccessFn accessFn)
: object_{std::move(object)}, accessFn_{std::move(accessFn)} {}
MonitoredObject(MonitoredObjectAccessFn accessFn)
: object_{}, accessFn_{std::move(accessFn)} {}
class Accessor {
public:
Accessor(MonitoredObject<T>* mObject) : mObject_{mObject} {}
~Accessor() {
mObject_->accessFn_(mObject_->object_);
}
T* operator->() {
return &mObject_->object_;
}
T& operator*() {
return mObject_->object_;
}
Accessor(const Accessor&) = delete;
Accessor(Accessor&&) = delete;
Accessor& operator=(const Accessor&) = delete;
Accessor& operator=(Accessor&& rhs) = delete;
private:
MonitoredObject<T>* mObject_;
};
Accessor operator->() {
return Accessor(this);
}
MonitoredObject(const MonitoredObject&) = delete;
MonitoredObject(MonitoredObject&&) = delete;
MonitoredObject& operator=(const MonitoredObject&) = delete;
MonitoredObject& operator=(MonitoredObject&& rhs) = delete;
private:
T object_;
MonitoredObjectAccessFn accessFn_;
};
} // namespace quic