From: Aaron Ballman Date: Sat, 8 Mar 2014 20:11:24 +0000 (+0000) Subject: Adding range-based STL-like helper APIs. llvm::distance() is the range version of... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=5c47b5806affd10579a02515a474463ecd151472;p=oota-llvm.git 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203354 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/iterator_range.h b/include/llvm/ADT/iterator_range.h index 6248be90075..4474e5dbdf9 100644 --- a/include/llvm/ADT/iterator_range.h +++ b/include/llvm/ADT/iterator_range.h @@ -23,6 +23,11 @@ namespace llvm { +template +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 +typename range_traits::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 +OutputIterator copy(Range In, OutputIterator Result) { + return std::copy(In.begin(), In.end(), Result); +} } #endif