diff options
Diffstat (limited to 'target_pool.h')
-rw-r--r-- | target_pool.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/target_pool.h b/target_pool.h new file mode 100644 index 0000000..b881b1e --- /dev/null +++ b/target_pool.h @@ -0,0 +1,77 @@ +// 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. + +#ifndef COMPONENTS_ZUCCHINI_TARGET_POOL_H_ +#define COMPONENTS_ZUCCHINI_TARGET_POOL_H_ + +#include <stddef.h> + +#include <vector> + +#include "components/zucchini/image_utils.h" +#include "components/zucchini/patch_reader.h" + +namespace zucchini { + +class OffsetMapper; +class TargetSource; + +// Ordered container of distinct targets that have the same semantics, along +// with a list of associated reference types, only used during patch generation. +class TargetPool { + public: + using const_iterator = std::vector<offset_t>::const_iterator; + + TargetPool(); + // Initializes the object with given sorted and unique |targets|. + explicit TargetPool(std::vector<offset_t>&& targets); + TargetPool(TargetPool&&); + TargetPool(const TargetPool&); + ~TargetPool(); + + // Insert new targets from various sources. These invalidate all previous key + // lookups. + // - From a list of targets, useful for adding extra targets in Zucchini-gen: + void InsertTargets(const std::vector<offset_t>& targets); + // - From TargetSource, useful for adding extra targets in Zucchini-apply: + void InsertTargets(TargetSource* targets); + // - From list of References, useful for listing targets in Zucchini-gen: + void InsertTargets(const std::vector<Reference>& references); + // - From ReferenceReader, useful for listing targets in Zucchini-apply: + void InsertTargets(ReferenceReader&& references); + + // Adds |type| as a reference type associated with the pool of targets. + void AddType(TypeTag type) { types_.push_back(type); } + + // Returns a canonical key associated with a valid target at |offset|. + key_t KeyForOffset(offset_t offset) const; + + // Returns a canonical key associated with the target nearest to |offset|. + key_t KeyForNearestOffset(offset_t offset) const; + + // Returns the target for a |key|, which is assumed to be valid and held by + // this class. + offset_t OffsetForKey(key_t key) const { return targets_[key]; } + + // Uses |offset_mapper| to transform "old" |targets_| to "new" |targets_|, + // resulting in sorted and unique targets. + void FilterAndProject(const OffsetMapper& offset_mapper); + + // Accessors for testing. + const std::vector<offset_t>& targets() const { return targets_; } + const std::vector<TypeTag>& types() const { return types_; } + + // Returns the number of targets. + size_t size() const { return targets_.size(); } + const_iterator begin() const { return targets_.cbegin(); } + const_iterator end() const { return targets_.cend(); } + + private: + std::vector<TypeTag> types_; // Enumerates type_tag for this pool. + std::vector<offset_t> targets_; // Targets for pool in ascending order. +}; + +} // namespace zucchini + +#endif // COMPONENTS_ZUCCHINI_TARGET_POOL_H_ |