| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //===- Sequence.h - Utility for producing sequences of values ---*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- /// \file
- /// This routine provides some synthesis utilities to produce sequences of
- /// values. The names are intentionally kept very short as they tend to occur
- /// in common and widely used contexts.
- ///
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_ADT_SEQUENCE_H
- #define LLVM_ADT_SEQUENCE_H
- #include "llvm/ADT/iterator.h"
- #include "llvm/ADT/iterator_range.h"
- #include <algorithm>
- #include <iterator>
- #include <utility>
- namespace llvm {
- namespace detail {
- template <typename ValueT>
- class value_sequence_iterator
- : public iterator_facade_base<value_sequence_iterator<ValueT>,
- std::random_access_iterator_tag,
- const ValueT> {
- using BaseT = typename value_sequence_iterator::iterator_facade_base;
- ValueT Value;
- public:
- using difference_type = typename BaseT::difference_type;
- using reference = typename BaseT::reference;
- value_sequence_iterator() = default;
- value_sequence_iterator(const value_sequence_iterator &) = default;
- value_sequence_iterator(value_sequence_iterator &&Arg)
- : Value(std::move(Arg.Value)) {}
- value_sequence_iterator &operator=(const value_sequence_iterator &Arg) {
- Value = Arg.Value;
- return *this;
- }
- template <typename U, typename Enabler = decltype(ValueT(std::declval<U>()))>
- value_sequence_iterator(U &&Value) : Value(std::forward<U>(Value)) {}
- value_sequence_iterator &operator+=(difference_type N) {
- Value += N;
- return *this;
- }
- value_sequence_iterator &operator-=(difference_type N) {
- Value -= N;
- return *this;
- }
- using BaseT::operator-;
- difference_type operator-(const value_sequence_iterator &RHS) const {
- return Value - RHS.Value;
- }
- bool operator==(const value_sequence_iterator &RHS) const {
- return Value == RHS.Value;
- }
- bool operator<(const value_sequence_iterator &RHS) const {
- return Value < RHS.Value;
- }
- reference operator*() const { return Value; }
- };
- } // end namespace detail
- template <typename ValueT>
- iterator_range<detail::value_sequence_iterator<ValueT>> seq(ValueT Begin,
- ValueT End) {
- return make_range(detail::value_sequence_iterator<ValueT>(Begin),
- detail::value_sequence_iterator<ValueT>(End));
- }
- } // end namespace llvm
- #endif // LLVM_ADT_SEQUENCE_H
|