blob: 55ff1be5edf01f4221da3396ae71b3f08af63ca6 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_GPU_VAAPI_TEST_FAKE_LIBVA_DRIVER_OBJECT_TRACKER_H_
#define MEDIA_GPU_VAAPI_TEST_FAKE_LIBVA_DRIVER_OBJECT_TRACKER_H_
#include <memory>
#include <vector>
#include "base/check_op.h"
#include "base/synchronization/lock.h"
namespace media::internal {
// Class that manages and stores the objects that FakeDriver needs to keep
// track of. All public methods are thread-safe.
template <class T>
class ObjectTracker {
static_assert(std::is_integral<typename T::IdType>::value);
public:
ObjectTracker() = default;
ObjectTracker(const ObjectTracker&) = delete;
ObjectTracker& operator=(const ObjectTracker&) = delete;
~ObjectTracker() = default;
template <class... Args>
typename T::IdType CreateObject(Args... args) {
base::AutoLock lock(lock_);
objects_.push_back(std::make_unique<T>(next_id_, args...));
do {
CHECK_LT(next_id_, std::numeric_limits<typename T::IdType>::max());
next_id_++;
} while (std::find_if(objects_.begin(), objects_.end(),
[this](const std::unique_ptr<T>& it)
EXCLUSIVE_LOCKS_REQUIRED(lock_) {
return it->GetID() == next_id_;
}) != objects_.end());
return objects_.back()->GetID();
}
bool ObjectExists(typename T::IdType id) {
base::AutoLock lock(lock_);
return std::find_if(objects_.begin(), objects_.end(),
[id](const std::unique_ptr<T>& it) {
return it->GetID() == id;
}) != objects_.end();
}
const T& GetObject(typename T::IdType id) {
base::AutoLock lock(lock_);
auto object = std::find_if(
objects_.begin(), objects_.end(),
[id](const std::unique_ptr<T>& it) { return it->GetID() == id; });
CHECK(object != objects_.end());
return **object;
}
void DestroyObject(typename T::IdType id) {
base::AutoLock lock(lock_);
auto object = std::find_if(
objects_.begin(), objects_.end(),
[id](const std::unique_ptr<T>& it) { return it->GetID() == id; });
CHECK(object != objects_.end());
objects_.erase(object);
if (id < next_id_) {
next_id_ = id;
}
}
private:
base::Lock lock_;
std::vector<std::unique_ptr<T>> GUARDED_BY(lock_) objects_;
typename T::IdType GUARDED_BY(lock_) next_id_ =
std::numeric_limits<typename T::IdType>::min();
};
} // namespace media::internal
#endif // MEDIA_GPU_VAAPI_TEST_FAKE_LIBVA_DRIVER_OBJECT_TRACKER_H_