blob: f3aab88e31bccfdd9aec03bfa811f4461aa3d0d6 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/segmentation_platform/internal/database/signal_sample_view.h"
#include "base/containers/contains.h"
namespace segmentation_platform {
bool SignalSampleView::Query::IsFeatureMatching(
const SignalDatabase::DbEntry& sample) const {
return sample.type == type && sample.name_hash == metric_hash &&
start <= sample.time && end >= sample.time &&
(enum_ids.empty() || base::Contains(enum_ids, sample.value));
}
SignalSampleView::Query::Query(proto::SignalType type,
uint64_t metric_hash,
base::Time start,
base::Time end,
const std::vector<int>& enum_ids)
: type(type),
metric_hash(metric_hash),
start(start),
end(end),
enum_ids(enum_ids) {
DCHECK(enum_ids.empty() || type == proto::SignalType::HISTOGRAM_ENUM);
}
SignalSampleView::Query::~Query() = default;
SignalSampleView::Query::Query(const Query& query) = default;
SignalSampleView::Iterator::Iterator(const SignalSampleView* view,
size_t current)
: view_(view), samples_(view_->samples_), current_(current) {}
SignalSampleView::Iterator::~Iterator() = default;
SignalSampleView::Iterator::Iterator(Iterator& other) = default;
SignalSampleView::SignalSampleView(
const std::vector<SignalDatabase::DbEntry>& samples,
const std::optional<Query>& query)
: samples_(samples), query_(query) {}
SignalSampleView::~SignalSampleView() = default;
size_t SignalSampleView::FindNext(int index) const {
while (true) {
++index;
if (static_cast<unsigned>(index) >= samples_.size()) {
return EndIndex();
}
if (!query_ || query_->IsFeatureMatching(samples_[index])) {
return index;
}
}
}
size_t SignalSampleView::FindPrev(int index) const {
if (static_cast<unsigned>(index) > samples_.size()) {
index = samples_.size();
}
while (true) {
--index;
if (index < 0) {
return EndIndex();
}
if (!query_ || query_->IsFeatureMatching(samples_[index])) {
return index;
}
}
}
size_t SignalSampleView::size() const {
if (!query_) {
return samples_.size();
}
size_t i = 0;
for (auto it = begin(); it != end(); ++it, ++i) {
}
return i;
}
} // namespace segmentation_platform