From 5c47b5806affd10579a02515a474463ecd151472 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Sat, 8 Mar 2014 20:11:24 +0000 Subject: 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 --- include/llvm/ADT/iterator_range.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'include/llvm/ADT') diff --git a/include/llvm/ADT/iterator_range.h b/include/llvm/ADT/iterator_range.h index 6248be9007..4474e5dbdf 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 -- cgit v1.2.3