summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-03-03 10:28:38 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-03-03 10:28:38 +0000
commit26abef7b5a3f239204a1ad605a88b99a1ef878c3 (patch)
tree6c1bb152ddeff77e88b9e00639132ee77d9ac2b2 /include
parent0b949e0e9f01a7fafc96d1cd81113a44045d40ae (diff)
downloadllvm-26abef7b5a3f239204a1ad605a88b99a1ef878c3.tar.gz
llvm-26abef7b5a3f239204a1ad605a88b99a1ef878c3.tar.bz2
llvm-26abef7b5a3f239204a1ad605a88b99a1ef878c3.tar.xz
[C++11] Add an iterator_range class template. This is modeled on the
proposed std::iterator_pair which was in committee suggested to move toward std::iterator_range. There isn't a formal paper yet, but there seems little disagreement within the committee at this point so it seems fine to provide our own version in the llvm namespace so we can easily build range adaptors for the numerous iterators in LLVM's interfaces. Note that I'm not really comfortable advocating a crazed range-based migration just yet. The range stuff is still in a great deal of flux in C++ and the committee hasn't entirely made up its mind (afaict) about how it will work. So I'm mostly trying to provide the minimal functionality needed to make writing easy and convenient range adaptors for range based for loops easy and convenient. ;] Subsequent patches will use this across the fundamental IR types, where there are iterator views. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202686 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/ADT/iterator_range.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/include/llvm/ADT/iterator_range.h b/include/llvm/ADT/iterator_range.h
new file mode 100644
index 0000000000..6248be9007
--- /dev/null
+++ b/include/llvm/ADT/iterator_range.h
@@ -0,0 +1,46 @@
+//===- iterator_range.h - A range adaptor for iterators ---------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+/// \file
+/// This provides a very simple, boring adaptor for a begin and end iterator
+/// into a range type. This should be used to build range views that work well
+/// with range based for loops and range based constructors.
+///
+/// Note that code here follows more standards-based coding conventions as it
+/// is mirroring proposed interfaces for standardization.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ADT_ITERATOR_RANGE_H
+#define LLVM_ADT_ITERATOR_RANGE_H
+
+#include <utility>
+
+namespace llvm {
+
+/// \brief A range adaptor for a pair of iterators.
+///
+/// This just wraps two iterators into a range-compatible interface. Nothing
+/// fancy at all.
+template <typename IteratorT>
+class iterator_range {
+ IteratorT begin_iterator, end_iterator;
+
+public:
+ iterator_range() {}
+ iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
+ : begin_iterator(std::move(begin_iterator)),
+ end_iterator(std::move(end_iterator)) {}
+
+ IteratorT begin() const { return begin_iterator; }
+ IteratorT end() const { return end_iterator; }
+};
+
+}
+
+#endif