Adding range-based STL-like helper APIs. llvm::distance() is the range version of...
authorAaron Ballman <aaron@aaronballman.com>
Sat, 8 Mar 2014 20:11:24 +0000 (20:11 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Sat, 8 Mar 2014 20:11:24 +0000 (20:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203354 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/iterator_range.h

index 6248be90075225dbf0402ef3df1f9b63f77152e7..4474e5dbdf902157942f8200136a59bcbc238590 100644 (file)
 
 namespace llvm {
 
+template <typename Range>
+struct range_traits {
+  typedef typename Range::difference_type difference_type;
+};
+
 /// \brief A range adaptor for a pair of iterators.
 ///
 /// This just wraps two iterators into a range-compatible interface. Nothing
@@ -32,6 +37,10 @@ class iterator_range {
   IteratorT begin_iterator, end_iterator;
 
 public:
+  // FIXME: We should be using iterator_traits to determine the
+  // difference_type, but most of our iterators do not expose anything like it.
+  typedef int difference_type;
+
   iterator_range() {}
   iterator_range(IteratorT begin_iterator, IteratorT end_iterator)
       : begin_iterator(std::move(begin_iterator)),
@@ -41,6 +50,19 @@ public:
   IteratorT end() const { return end_iterator; }
 };
 
+/// \brief Determine the distance between the end() and begin() iterators of
+/// a range. Analogous to std::distance().
+template <class Range>\r
+typename range_traits<Range>::difference_type distance(Range R) {\r
+  return std::distance(R.begin(), R.end());\r
+}
+
+/// \brief Copies members of a range into the output iterator provided.
+/// Analogous to std::copy.
+template <class Range, class OutputIterator>
+OutputIterator copy(Range In, OutputIterator Result) {
+  return std::copy(In.begin(), In.end(), Result);
+}
 }
 
 #endif