102 lines
2.6 KiB
C++
102 lines
2.6 KiB
C++
/*
|
|
* Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "test/pc/e2e/analyzer/video/names_collection.h"
|
|
|
|
#include <set>
|
|
|
|
#include "absl/strings/string_view.h"
|
|
#include "absl/types/optional.h"
|
|
|
|
namespace webrtc {
|
|
|
|
NamesCollection::NamesCollection(rtc::ArrayView<const std::string> names) {
|
|
names_ = std::vector<std::string>(names.begin(), names.end());
|
|
for (size_t i = 0; i < names_.size(); ++i) {
|
|
index_.emplace(names_[i], i);
|
|
removed_.emplace_back(false);
|
|
}
|
|
size_ = names_.size();
|
|
}
|
|
|
|
bool NamesCollection::HasName(absl::string_view name) const {
|
|
auto it = index_.find(name);
|
|
if (it == index_.end()) {
|
|
return false;
|
|
}
|
|
return !removed_[it->second];
|
|
}
|
|
|
|
size_t NamesCollection::AddIfAbsent(absl::string_view name) {
|
|
auto it = index_.find(name);
|
|
if (it != index_.end()) {
|
|
// Name was registered in the collection before: we need to restore it.
|
|
size_t index = it->second;
|
|
if (removed_[index]) {
|
|
removed_[index] = false;
|
|
size_++;
|
|
}
|
|
return index;
|
|
}
|
|
size_t out = names_.size();
|
|
size_t old_capacity = names_.capacity();
|
|
names_.emplace_back(name);
|
|
removed_.emplace_back(false);
|
|
size_++;
|
|
size_t new_capacity = names_.capacity();
|
|
|
|
if (old_capacity == new_capacity) {
|
|
index_.emplace(names_[out], out);
|
|
} else {
|
|
// Reallocation happened in the vector, so we need to rebuild `index_` to
|
|
// fix absl::string_view internal references.
|
|
index_.clear();
|
|
for (size_t i = 0; i < names_.size(); ++i) {
|
|
index_.emplace(names_[i], i);
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
absl::optional<size_t> NamesCollection::RemoveIfPresent(
|
|
absl::string_view name) {
|
|
auto it = index_.find(name);
|
|
if (it == index_.end()) {
|
|
return absl::nullopt;
|
|
}
|
|
size_t index = it->second;
|
|
if (removed_[index]) {
|
|
return absl::nullopt;
|
|
}
|
|
removed_[index] = true;
|
|
size_--;
|
|
return index;
|
|
}
|
|
|
|
std::set<size_t> NamesCollection::GetPresentIndexes() const {
|
|
std::set<size_t> out;
|
|
for (size_t i = 0; i < removed_.size(); ++i) {
|
|
if (!removed_[i]) {
|
|
out.insert(i);
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
std::set<size_t> NamesCollection::GetAllIndexes() const {
|
|
std::set<size_t> out;
|
|
for (size_t i = 0; i < names_.size(); ++i) {
|
|
out.insert(i);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
} // namespace webrtc
|