LLVM 23.0.0git
Repeated.h
Go to the documentation of this file.
1//===- llvm/ADT/Repeated.h - Repeated value range ---------------*- 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//
9// Defines the Repeated<T> class, a memory-efficient range representing N
10// copies of the same value.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_ADT_REPEATED_H
15#define LLVM_ADT_REPEATED_H
16
17#include "llvm/ADT/iterator.h"
18
19#include <cassert>
20#include <cstddef>
21#include <utility>
22
23namespace llvm {
24
25/// A random-access iterator that always dereferences to the same value.
26template <typename T>
28 : public iterator_facade_base<RepeatedIterator<T>,
29 std::random_access_iterator_tag, T, ptrdiff_t,
30 const T *, const T &> {
31 const T *value = nullptr;
32 ptrdiff_t index = 0;
33
34public:
35 RepeatedIterator() = default;
36 RepeatedIterator(const T *value, ptrdiff_t index)
37 : value(value), index(index) {}
38
39 const T &operator*() const { return *value; }
40
41 bool operator==(const RepeatedIterator &rhs) const {
42 assert((!value || !rhs.value || value == rhs.value) &&
43 "comparing iterators from different Repeated ranges");
44 return index == rhs.index;
45 }
46
47 bool operator<(const RepeatedIterator &rhs) const {
48 assert((!value || !rhs.value || value == rhs.value) &&
49 "comparing iterators from different Repeated ranges");
50 return index < rhs.index;
51 }
52
54 assert((!value || !rhs.value || value == rhs.value) &&
55 "subtracting iterators from different Repeated ranges");
56 return index - rhs.index;
57 }
58
60 index += n;
61 return *this;
62 }
63
65 index -= n;
66 return *this;
67 }
68};
69
70/// A memory-efficient immutable range with a single value repeated N times.
71/// The value is owned by the range.
72///
73/// `Repeated<T>` is also a proper random-access range: `begin()`/`end()`
74/// return iterators that always dereference to the same stored value.
75template <typename T> struct [[nodiscard]] Repeated {
76 /// Wrapper for the stored value used as a PointerUnion target in range
77 /// types (e.g., TypeRange, ValueRange).
78 struct Storage {
80 };
81
83 size_t count;
84
85 /// Create a `value` repeated `count` times.
86 /// Uses the same argument order like STD container constructors.
87 template <typename U>
88 Repeated(size_t count, U &&value)
89 : storage{std::forward<U>(value)}, count(count) {}
90
93 using reverse_iterator = std::reverse_iterator<iterator>;
95 using value_type = T;
96 using size_type = size_t;
97
98 iterator begin() const { return {&storage.value, 0}; }
99 iterator end() const {
100 return {&storage.value, static_cast<ptrdiff_t>(count)};
101 }
104
105 size_t size() const { return count; }
106 bool empty() const { return count == 0; }
107
108 const T &value() const { return storage.value; }
109 const T &operator[](size_t idx) const {
110 assert(idx < size() && "Out of bounds");
111 (void)idx;
112 return storage.value;
113 }
114};
115
116template <typename U> Repeated(size_t, U &&) -> Repeated<std::decay_t<U>>;
117
118} // namespace llvm
119
120#endif // LLVM_ADT_REPEATED_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define T
A random-access iterator that always dereferences to the same value.
Definition Repeated.h:30
RepeatedIterator & operator-=(ptrdiff_t n)
Definition Repeated.h:64
RepeatedIterator & operator+=(ptrdiff_t n)
Definition Repeated.h:59
ptrdiff_t operator-(const RepeatedIterator &rhs) const
Definition Repeated.h:53
bool operator<(const RepeatedIterator &rhs) const
Definition Repeated.h:47
const T & operator*() const
Definition Repeated.h:39
bool operator==(const RepeatedIterator &rhs) const
Definition Repeated.h:41
RepeatedIterator(const T *value, ptrdiff_t index)
Definition Repeated.h:36
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterator.h:80
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
Repeated(size_t, U &&) -> Repeated< std::decay_t< U > >
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
Wrapper for the stored value used as a PointerUnion target in range types (e.g., TypeRange,...
Definition Repeated.h:78
A memory-efficient immutable range with a single value repeated N times.
Definition Repeated.h:75
iterator end() const
Definition Repeated.h:99
iterator const_iterator
Definition Repeated.h:92
bool empty() const
Definition Repeated.h:106
Storage storage
Definition Repeated.h:82
reverse_iterator const_reverse_iterator
Definition Repeated.h:94
iterator begin() const
Definition Repeated.h:98
const T & value() const
Definition Repeated.h:108
reverse_iterator rend() const
Definition Repeated.h:103
size_t size() const
Definition Repeated.h:105
RepeatedIterator< T > iterator
Definition Repeated.h:91
std::reverse_iterator< iterator > reverse_iterator
Definition Repeated.h:93
Repeated(size_t count, U &&value)
Create a value repeated count times.
Definition Repeated.h:88
size_t size_type
Definition Repeated.h:96
size_t count
Definition Repeated.h:83
const T & operator[](size_t idx) const
Definition Repeated.h:109
reverse_iterator rbegin() const
Definition Repeated.h:102