blob: 9c1d17a89a9825906fbac5116a9a8f4e25fe0980 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/installer/zucchini/target_pool.h"
#include <algorithm>
#include <iterator>
#include <utility>
#include "base/logging.h"
#include "chrome/installer/zucchini/algorithm.h"
namespace zucchini {
TargetPool::TargetPool() = default;
TargetPool::TargetPool(std::vector<offset_t>&& targets) {
DCHECK(targets_.empty());
DCHECK(std::is_sorted(targets.begin(), targets.end()));
targets_ = std::move(targets);
}
TargetPool::TargetPool(TargetPool&&) = default;
TargetPool::~TargetPool() = default;
void TargetPool::InsertTargets(const std::vector<Reference>& references) {
// This can be called many times, so it's better to let std::back_inserter()
// manage |targets_| resize, instead of manually reserving space.
std::transform(references.begin(), references.end(),
std::back_inserter(targets_),
[](const Reference& ref) { return ref.target; });
SortAndUniquify(&targets_);
}
void TargetPool::InsertTargets(ReferenceReader&& references) {
for (auto ref = references.GetNext(); ref.has_value();
ref = references.GetNext()) {
targets_.push_back(ref->target);
}
SortAndUniquify(&targets_);
}
offset_t TargetPool::KeyForOffset(offset_t offset) const {
auto pos = std::lower_bound(targets_.begin(), targets_.end(), offset);
DCHECK(pos != targets_.end() && *pos == offset);
return static_cast<offset_t>(pos - targets_.begin());
}
} // namespace zucchini