Add make_range() & make_const_range() for creating iterator ranges.
authorLei Zhang <antiagainst@google.com>
Fri, 12 Aug 2016 14:04:23 +0000 (10:04 -0400)
committerLei Zhang <antiagainst@google.com>
Fri, 12 Aug 2016 14:34:47 +0000 (10:34 -0400)
source/opt/iterator.h
source/opt/module.h

index bb52171..4ee1e40 100644 (file)
@@ -105,6 +105,24 @@ class IteratorRange {
   IteratorType end_;
 };
 
+// Returns a (begin, end) iterator pair for the given container.
+template <typename ValueType,
+          class IteratorType = UptrVectorIterator<ValueType>>
+inline IteratorRange<IteratorType> make_range(
+    std::vector<std::unique_ptr<ValueType>>& container) {
+  return {IteratorType(&container, container.begin()),
+          IteratorType(&container, container.end())};
+}
+
+// Returns a const (begin, end) iterator pair for the given container.
+template <typename ValueType,
+          class IteratorType = UptrVectorIterator<ValueType, true>>
+inline IteratorRange<IteratorType> make_const_range(
+    const std::vector<std::unique_ptr<ValueType>>& container) {
+  return {IteratorType(&container, container.cbegin()),
+          IteratorType(&container, container.cend())};
+}
+
 template <typename VT, bool IC>
 inline UptrVectorIterator<VT, IC>& UptrVectorIterator<VT, IC>::operator++() {
   ++iterator_;
index f34c911..1aee912 100644 (file)
@@ -198,26 +198,19 @@ inline Module::inst_iterator Module::debug_end() {
 }
 
 inline IteratorRange<Module::inst_iterator> Module::debugs() {
-  return IteratorRange<inst_iterator>(inst_iterator(&debugs_, debugs_.begin()),
-                                      inst_iterator(&debugs_, debugs_.end()));
+  return make_range(debugs_);
 }
 
 inline IteratorRange<Module::const_inst_iterator> Module::debugs() const {
-  return IteratorRange<const_inst_iterator>(
-      const_inst_iterator(&debugs_, debugs_.cbegin()),
-      const_inst_iterator(&debugs_, debugs_.cend()));
+  return make_const_range(debugs_);
 }
 
 inline IteratorRange<Module::inst_iterator> Module::annotations() {
-  return IteratorRange<inst_iterator>(
-      inst_iterator(&annotations_, annotations_.begin()),
-      inst_iterator(&annotations_, annotations_.end()));
+  return make_range(annotations_);
 }
 
 inline IteratorRange<Module::const_inst_iterator> Module::annotations() const {
-  return IteratorRange<const_inst_iterator>(
-      const_inst_iterator(&annotations_, annotations_.cbegin()),
-      const_inst_iterator(&annotations_, annotations_.cend()));
+  return make_const_range(annotations_);
 }
 
 inline Module::const_iterator Module::cbegin() const {