diff options
author | Aaron Ballman <aaron@aaronballman.com> | 2014-03-08 20:11:24 +0000 |
---|---|---|
committer | Aaron Ballman <aaron@aaronballman.com> | 2014-03-08 20:11:24 +0000 |
commit | 1b91204e3dafe5eb8eafa50ad1d51494ee0ef854 (patch) | |
tree | 3775b5d55c7f6ac1a5c4180ba7cb890acdfa44a2 | |
parent | 23a6dcb365f5c6a9b803e9ab08088c67e2e55780 (diff) | |
download | bcm5719-llvm-1b91204e3dafe5eb8eafa50ad1d51494ee0ef854.tar.gz bcm5719-llvm-1b91204e3dafe5eb8eafa50ad1d51494ee0ef854.zip |
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.
llvm-svn: 203354
-rw-r--r-- | llvm/include/llvm/ADT/iterator_range.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/include/llvm/ADT/iterator_range.h b/llvm/include/llvm/ADT/iterator_range.h index 6248be90075..4474e5dbdf9 100644 --- a/llvm/include/llvm/ADT/iterator_range.h +++ b/llvm/include/llvm/ADT/iterator_range.h @@ -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 |