aboutsummaryrefslogtreecommitdiff
path: root/target_pool.h
diff options
context:
space:
mode:
Diffstat (limited to 'target_pool.h')
-rw-r--r--target_pool.h77
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_