From 93813e5feb18ece7becd1eece24d0138c955fd53 Mon Sep 17 00:00:00 2001 From: River Riddle Date: Fri, 21 Feb 2020 13:19:36 -0800 Subject: [PATCH] [mlir] Add a utility iterator range that repeats a given value `n` times. This range is useful when an desired API expects a range or when comparing two different ranges for equality, but the underlying data is a splat. This range removes the need to explicitly construct a vector in those cases. Differential Revision: https://reviews.llvm.org/D74683 --- mlir/include/mlir/Support/STLExtras.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mlir/include/mlir/Support/STLExtras.h b/mlir/include/mlir/Support/STLExtras.h index 527234921d95..729e4583df46 100644 --- a/mlir/include/mlir/Support/STLExtras.h +++ b/mlir/include/mlir/Support/STLExtras.h @@ -339,6 +339,26 @@ template auto make_second_range(ContainerTy &&c) { }); } +/// A range class that repeats a specific value for a set number of times. +template +class RepeatRange + : public detail::indexed_accessor_range_base, T, const T> { +public: + using detail::indexed_accessor_range_base< + RepeatRange, T, const T>::indexed_accessor_range_base; + + /// Given that we are repeating a specific value, we can simply return that + /// value when offsetting the base or dereferencing the iterator. + static T offset_base(const T &val, ptrdiff_t) { return val; } + static const T &dereference_iterator(const T &val, ptrdiff_t) { return val; } +}; + +/// Make a range that repeats the given value 'n' times. +template +RepeatRange make_repeated_range(const ValueTy &value, size_t n) { + return RepeatRange(value, n); +} + /// Returns true of the given range only contains a single element. template bool has_single_element(ContainerTy &&c) { auto it = std::begin(c), e = std::end(c);