Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(159)

Unified Diff: courgette/consecutive_range_visitor.h

Issue 1491703003: [Courgette] Initial Implementation of LabelManager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: courgette/consecutive_range_visitor.h
diff --git a/courgette/consecutive_range_visitor.h b/courgette/consecutive_range_visitor.h
new file mode 100644
index 0000000000000000000000000000000000000000..680bf5202540d4ec842941ade61aef5995b8f1d4
--- /dev/null
+++ b/courgette/consecutive_range_visitor.h
@@ -0,0 +1,56 @@
+// Copyright 2015 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 COURGETTE_CONSECUTIVE_RANGE_VISITOR_H_
+#define COURGETTE_CONSECUTIVE_RANGE_VISITOR_H_
+
+#include <iterator>
+
+namespace courgette {
+
+// Before using this, check whether std::unique() is a better fit.
+//
+// ConsecutiveRangeVisitor is a visitor to read equal consecutive items
+// ("ranges") between two iterators. The base value of InputIterator must
+// implement the == operator.
+//
+// Example, "AAAAABZZZZOO" consists of ranges ["AAAAA", "B", "ZZZZ", "OO"]. The
+// visitor provides accessors to iterate through the ranges, and to access each
+// range's value and repeat, i.e., [('A', 5), ('B', 1), ('Z', 4), ('O', 2)].
+template<class InputIterator>
+class ConsecutiveRangeVisitor {
+ public:
+ ConsecutiveRangeVisitor(InputIterator begin, InputIterator end)
+ : head_(begin), end_(end) {
+ advance();
+ }
+
+ // Returns whether there are more ranges to traverse.
+ bool has_more() const { return tail_ != end_; }
+
+ // Returns an iterator to an element in the current range.
+ InputIterator cur() const { return tail_; }
+
+ // Returns the number of repeated elements in the current range.
+ size_t repeat() const { return std::distance(tail_, head_); }
+
+ // Advances to the next range.
+ void advance() {
+ tail_ = head_;
+ if (head_ != end_) {
+ ++head_;
+ while (head_ != end_ && *head_ == *tail_)
+ ++head_;
+ }
+ }
+
+ private:
+ InputIterator tail_;
grt (UTC plus 2) 2015/12/02 19:03:40 please add lightweight comments
huangs 2015/12/02 20:51:01 Done.
+ InputIterator head_;
+ InputIterator end_;
+};
grt (UTC plus 2) 2015/12/02 19:03:40 DISALLOW_COPY_AND_ASSIGN?
huangs 2015/12/02 20:51:02 I omitted this since I figured a visitor should be
+
+} // namespace courgette
+
+#endif // COURGETTE_CONSECUTIVE_RANGE_VISITOR_H_

Powered by Google App Engine
This is Rietveld 408576698