16#ifndef LLVM_ADT_EYTZINGER_H
17#define LLVM_ADT_EYTZINGER_H
31 : Data(Data), NumEntries(NumEntries) {}
33 [[nodiscard]]
const T *
data()
const {
return Data; }
34 [[nodiscard]]
bool empty()
const {
return !Data || NumEntries == 0; }
35 [[nodiscard]]
size_t size()
const {
return NumEntries; }
37 assert(Idx < NumEntries &&
"Index out of bounds");
47 template <
typename KeyT = T>
50 while (
I < NumEntries) {
59 template <
typename KeyT = T>
70 auto Left = [](
size_t I) {
return 2 *
I + 1; };
71 auto Right = [](
size_t I) {
return 2 *
I + 2; };
72 auto Parent = [](
size_t I) {
return (
I - 1) / 2; };
73 auto IsRightChild = [](
size_t I) {
return I > 0 &&
I % 2 == 0; };
74 auto HasLeft = [&](
size_t I) {
return Left(
I) < NumEntries; };
75 auto HasRight = [&](
size_t I) {
return Right(
I) < NumEntries; };
82 const T *Prev =
nullptr;
83 while (Curr < NumEntries) {
84 if (Prev && !(*Prev < Data[Curr]))
96 while (IsRightChild(Curr))
109 const T *
Data =
nullptr;
110 size_t NumEntries = 0;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
bool contains(const KeyT &Target) const
Check if this Eytzinger table contains Target.
EytzingerTableSpan(const T *Data, size_t NumEntries)
EytzingerTableSpan()=default
bool isSorted() const
Verify whether the buffer satisfies strictly ascending binary search tree order in Eytzinger layout.
std::optional< size_t > findIndex(const KeyT &Target) const
Search this Eytzinger table for Target.
const T & operator[](size_t Idx) const
Target - Wrapper for Target specific information.
This is an optimization pass for GlobalISel generic memory operations.