1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
// 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
|