[llvm] r203354 - Adding range-based STL-like helper APIs. llvm::distance() is the range version of std::distance. llvm::copy is the range version of std::copy.

Aaron Ballman aaron at aaronballman.com
Sat Mar 8 12:11:24 PST 2014


Author: aaronballman
Date: Sat Mar  8 14:11:24 2014
New Revision: 203354

URL: http://llvm.org/viewvc/llvm-project?rev=203354&view=rev
Log:
Adding range-based STL-like helper APIs. llvm::distance() is the range version of std::distance. llvm::copy is the range version of std::copy.

Modified:
    llvm/trunk/include/llvm/ADT/iterator_range.h

Modified: llvm/trunk/include/llvm/ADT/iterator_range.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/iterator_range.h?rev=203354&r1=203353&r2=203354&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/iterator_range.h (original)
+++ llvm/trunk/include/llvm/ADT/iterator_range.h Sat Mar  8 14:11:24 2014
@@ -23,6 +23,11 @@
 
 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>
+typename range_traits<Range>::difference_type distance(Range R) {
+  return std::distance(R.begin(), R.end());
+}
+
+/// \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





More information about the llvm-commits mailing list