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 <algorithm>
20#include <cassert>
21#include <cstddef>
22#include <utility>
23
24namespace llvm {
25
26/// A random-access iterator that always dereferences to the same value.
27template <typename T>
29 : public iterator_facade_base<RepeatedIterator<T>,
30 std::random_access_iterator_tag, T, ptrdiff_t,
31 const T *, const T &> {
32 const T *value = nullptr;
33 ptrdiff_t index = 0;
34
35public:
36 RepeatedIterator() = default;
37 RepeatedIterator(const T *value, ptrdiff_t index)
38 : value(value), index(index) {}
39
40 const T &operator*() const { return *value; }
41
42 bool operator==(const RepeatedIterator &rhs) const {
43 assert((!value || !rhs.value || value == rhs.value) &&
44 "comparing iterators from different Repeated ranges");
45 return index == rhs.index;
46 }
47
48 bool operator<(const RepeatedIterator &rhs) const {
49 assert((!value || !rhs.value || value == rhs.value) &&
50 "comparing iterators from different Repeated ranges");
51 return index < rhs.index;
52 }
53
55 assert((!value || !rhs.value || value == rhs.value) &&
56 "subtracting iterators from different Repeated ranges");
57 return index - rhs.index;
58 }
59
61 index += n;
62 return *this;
63 }
64
66 index -= n;
67 return *this;
68 }
69};
70
71/// A memory-efficient immutable range with a single value repeated N times.
72/// The value is owned by the range.
73///
74/// `Repeated<T>` is also a proper random-access range: `begin()`/`end()`
75/// return iterators that always dereference to the same stored value.
76// At least 16-byte aligned so that Repeated<T>* has more low bits available
77// than a plain pointer. The primary use case is pointer-like types (e.g. MLIR
78// Type, Value) where Repeated<T>* appears in a PointerUnion alongside them.
79template <typename T>
80struct [[nodiscard]] alignas(std::max(size_t{16}, alignof(T))) Repeated {
82 size_t count;
83
84 /// Create a `value` repeated `count` times.
85 /// Uses the same argument order like std container constructors.
86 template <typename U>
87 Repeated(size_t count, U &&value)
88 : storage(std::forward<U>(value)), count(count) {}
89
92 using reverse_iterator = std::reverse_iterator<iterator>;
94 using value_type = T;
95 using size_type = size_t;
96
97 iterator begin() const { return {&storage, 0}; }
98 iterator end() const { return {&storage, static_cast<ptrdiff_t>(count)}; }
101
102 size_t size() const { return count; }
103 bool empty() const { return count == 0; }
104
105 const T &value() const { return storage; }
106 const T &operator[](size_t idx) const {
107 assert(idx < size() && "Out of bounds");
108 (void)idx;
109 return storage;
110 }
111};
112
113template <typename U> Repeated(size_t, U &&) -> Repeated<std::decay_t<U>>;
114
115} // namespace llvm
116
117#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:31
RepeatedIterator & operator-=(ptrdiff_t n)
Definition Repeated.h:65
RepeatedIterator & operator+=(ptrdiff_t n)
Definition Repeated.h:60
ptrdiff_t operator-(const RepeatedIterator &rhs) const
Definition Repeated.h:54
bool operator<(const RepeatedIterator &rhs) const
Definition Repeated.h:48
const T & operator*() const
Definition Repeated.h:40
bool operator==(const RepeatedIterator &rhs) const
Definition Repeated.h:42
RepeatedIterator(const T *value, ptrdiff_t index)
Definition Repeated.h:37
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.
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
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
A memory-efficient immutable range with a single value repeated N times.
Definition Repeated.h:80
iterator end() const
Definition Repeated.h:98
iterator const_iterator
Definition Repeated.h:91
bool empty() const
Definition Repeated.h:103
reverse_iterator const_reverse_iterator
Definition Repeated.h:93
iterator begin() const
Definition Repeated.h:97
const T & value() const
Definition Repeated.h:105
reverse_iterator rend() const
Definition Repeated.h:100
size_t size() const
Definition Repeated.h:102
RepeatedIterator< T > iterator
Definition Repeated.h:90
std::reverse_iterator< iterator > reverse_iterator
Definition Repeated.h:92
Repeated(size_t count, U &&value)
Create a value repeated count times.
Definition Repeated.h:87
size_t size_type
Definition Repeated.h:95
size_t count
Definition Repeated.h:82
const T & operator[](size_t idx) const
Definition Repeated.h:106
reverse_iterator rbegin() const
Definition Repeated.h:99