13#ifndef LLVM_EXECUTIONENGINE_ORC_SYMBOLLOOKUPSET_H
14#define LLVM_EXECUTIONENGINE_ORC_SYMBOLLOOKUPSET_H
22#include <initializer_list>
48 using value_type = std::pair<SymbolStringPtr, SymbolLookupFlags>;
57 Symbols.push_back(std::move(
E));
63 add(std::move(Name), Flags);
68 std::initializer_list<SymbolStringPtr> Names,
70 Symbols.reserve(Names.size());
71 for (
const auto &Name : Names)
72 add(std::move(Name), Flags);
80 Symbols.reserve(Names.
size());
81 for (
const auto &Name : Names)
92 Symbols.reserve(Names.
size());
93 for (
const auto &Name : Names)
98 template <
typename ValT>
103 Result.Symbols.reserve(M.size());
104 for (
const auto &[Name, Val] : M)
114 Symbols.push_back(std::make_pair(std::move(Name), Flags));
120 Symbols.reserve(Symbols.size() +
Other.size());
121 for (
auto &KV :
Other)
122 Symbols.push_back(std::move(KV));
126 bool empty()
const {
return Symbols.empty(); }
127 UnderlyingVector::size_type
size()
const {
return Symbols.size(); }
145 template <
typename PredFn>
void remove_if(PredFn &&Pred) {
146 UnderlyingVector::size_type
I = 0;
147 while (
I != Symbols.size()) {
148 const auto &Name = Symbols[
I].first;
149 auto Flags = Symbols[
I].second;
150 if (Pred(Name, Flags))
162 template <
typename BodyFn>
164 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
165 std::declval<SymbolLookupFlags>())),
167 UnderlyingVector::size_type
I = 0;
168 while (
I != Symbols.size()) {
169 const auto &Name = Symbols[
I].first;
170 auto Flags = Symbols[
I].second;
171 if (Body(Name, Flags))
184 template <
typename BodyFn>
186 std::is_same<decltype(Body(std::declval<const SymbolStringPtr &>(),
187 std::declval<SymbolLookupFlags>())),
190 UnderlyingVector::size_type
I = 0;
191 while (
I != Symbols.size()) {
192 const auto &Name = Symbols[
I].first;
193 auto Flags = Symbols[
I].second;
194 auto Remove = Body(Name, Flags);
196 return Remove.takeError();
209 Names.reserve(Symbols.size());
210 for (
const auto &KV : Symbols)
211 Names.push_back(KV.first);
224 return *
LHS.first < *
RHS.first;
233 Symbols.erase(LastI, Symbols.end());
240 if (Symbols.size() < 2)
243 for (UnderlyingVector::size_type
I = 1;
I != Symbols.size(); ++
I)
244 if (Symbols[
I].first == Symbols[
I - 1].first)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseMap class.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
A set of symbols to look up, each associated with a SymbolLookupFlags value.
std::pair< SymbolStringPtr, SymbolLookupFlags > value_type
const_iterator begin() const
void removeDuplicates()
Remove any duplicate elements.
UnderlyingVector::const_iterator const_iterator
void sortByAddress()
Sort the lookup set by pointer value.
SymbolLookupSet(std::initializer_list< SymbolStringPtr > Names, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from an initializer list of SymbolStringPtrs.
UnderlyingVector::size_type size() const
SymbolLookupSet & add(SymbolStringPtr Name, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Add an element to the set.
static SymbolLookupSet fromMapKeys(const DenseMap< SymbolStringPtr, ValT > &M, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from DenseMap keys.
SymbolLookupSet & append(SymbolLookupSet Other)
Quickly append one lookup set to another.
SymbolLookupSet(ArrayRef< SymbolStringPtr > Names, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from a vector of symbols with the given Flags used for each value.
SymbolLookupSet(std::initializer_list< value_type > Elems)
void sortByName()
Sort the lookup set lexicographically.
void remove(iterator I)
Removes the element pointed to by the given iterator.
auto forEachWithRemoval(BodyFn &&Body) -> std::enable_if_t< std::is_same< decltype(Body(std::declval< const SymbolStringPtr & >(), std::declval< SymbolLookupFlags >())), bool >::value >
Loop over the elements of this SymbolLookupSet, applying the Body function to each one.
bool containsDuplicates()
Returns true if this set contains any duplicates.
UnderlyingVector::iterator iterator
void remove_if(PredFn &&Pred)
Removes all elements matching the given predicate, which must be callable as bool(const SymbolStringP...
SymbolLookupSet(const SymbolNameSet &Names, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
Construct a SymbolLookupSet from a SymbolNameSet with the given Flags used for each value.
SymbolLookupSet(SymbolStringPtr Name, SymbolLookupFlags Flags=SymbolLookupFlags::RequiredSymbol)
SymbolNameVector getSymbolNames() const
Construct a SymbolNameVector from this instance by dropping the Flags values.
const_iterator end() const
SymbolLookupSet()=default
auto forEachWithRemoval(BodyFn &&Body) -> std::enable_if_t< std::is_same< decltype(Body(std::declval< const SymbolStringPtr & >(), std::declval< SymbolLookupFlags >())), Expected< bool > >::value, Error >
Loop over the elements of this SymbolLookupSet, applying the Body function to each one.
void remove(UnderlyingVector::size_type I)
Removes the Ith element of the vector, replacing it with the last element.
std::vector< value_type > UnderlyingVector
Pointer to a pooled string representing a symbol name.
SymbolLookupFlags
Lookup flags that apply to each symbol in a lookup.
std::vector< SymbolStringPtr > SymbolNameVector
A vector of symbol names.
DenseSet< SymbolStringPtr > SymbolNameSet
A set of symbol names (represented by SymbolStringPtrs for.
auto unique(Range &&R, Predicate P)
void sort(IteratorTy Start, IteratorTy End)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Function object to check whether the first component of a container supported by std::get (like std::...