Sequence.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //===- Sequence.h - Utility for producing sequences of values ---*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. /// \file
  9. /// This routine provides some synthesis utilities to produce sequences of
  10. /// values. The names are intentionally kept very short as they tend to occur
  11. /// in common and widely used contexts.
  12. ///
  13. //===----------------------------------------------------------------------===//
  14. #ifndef LLVM_ADT_SEQUENCE_H
  15. #define LLVM_ADT_SEQUENCE_H
  16. #include "llvm/ADT/iterator.h"
  17. #include "llvm/ADT/iterator_range.h"
  18. #include <algorithm>
  19. #include <iterator>
  20. #include <utility>
  21. namespace llvm {
  22. namespace detail {
  23. template <typename ValueT>
  24. class value_sequence_iterator
  25. : public iterator_facade_base<value_sequence_iterator<ValueT>,
  26. std::random_access_iterator_tag,
  27. const ValueT> {
  28. using BaseT = typename value_sequence_iterator::iterator_facade_base;
  29. ValueT Value;
  30. public:
  31. using difference_type = typename BaseT::difference_type;
  32. using reference = typename BaseT::reference;
  33. value_sequence_iterator() = default;
  34. value_sequence_iterator(const value_sequence_iterator &) = default;
  35. value_sequence_iterator(value_sequence_iterator &&Arg)
  36. : Value(std::move(Arg.Value)) {}
  37. value_sequence_iterator &operator=(const value_sequence_iterator &Arg) {
  38. Value = Arg.Value;
  39. return *this;
  40. }
  41. template <typename U, typename Enabler = decltype(ValueT(std::declval<U>()))>
  42. value_sequence_iterator(U &&Value) : Value(std::forward<U>(Value)) {}
  43. value_sequence_iterator &operator+=(difference_type N) {
  44. Value += N;
  45. return *this;
  46. }
  47. value_sequence_iterator &operator-=(difference_type N) {
  48. Value -= N;
  49. return *this;
  50. }
  51. using BaseT::operator-;
  52. difference_type operator-(const value_sequence_iterator &RHS) const {
  53. return Value - RHS.Value;
  54. }
  55. bool operator==(const value_sequence_iterator &RHS) const {
  56. return Value == RHS.Value;
  57. }
  58. bool operator<(const value_sequence_iterator &RHS) const {
  59. return Value < RHS.Value;
  60. }
  61. reference operator*() const { return Value; }
  62. };
  63. } // end namespace detail
  64. template <typename ValueT>
  65. iterator_range<detail::value_sequence_iterator<ValueT>> seq(ValueT Begin,
  66. ValueT End) {
  67. return make_range(detail::value_sequence_iterator<ValueT>(Begin),
  68. detail::value_sequence_iterator<ValueT>(End));
  69. }
  70. } // end namespace llvm
  71. #endif // LLVM_ADT_SEQUENCE_H