LLVM: lib/Transforms/ObjCARC/BlotMapVector.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9#ifndef LLVM_LIB_TRANSFORMS_OBJCARC_BLOTMAPVECTOR_H
10#define LLVM_LIB_TRANSFORMS_OBJCARC_BLOTMAPVECTOR_H
11
13#include
14#include
15#include
16#include
17
18namespace llvm {
19
20
21
23
25 MapTy Map;
26
27
28 using VectorTy = std::vector<std::pair<KeyT, ValueT>>;
29 VectorTy Vector;
30
31public:
32#ifdef EXPENSIVE_CHECKS
34 assert(Vector.size() >= Map.size());
36 ++I) {
37 assert(I->second < Vector.size());
38 assert(Vector[I->second].first == I->first);
39 }
40 for (typename VectorTy::const_iterator I = Vector.begin(), E = Vector.end();
42 assert(->first || (Map.count(I->first) &&
43 Map[I->first] == size_t(I - Vector.begin())));
44 }
45#endif
46
47 using iterator = typename VectorTy::iterator;
49
54
56 std::pair<typename MapTy::iterator, bool> Pair = Map.try_emplace(Arg);
57 if (Pair.second) {
58 size_t Num = Vector.size();
59 Pair.first->second = Num;
60 Vector.push_back(std::make_pair(Arg, ValueT()));
61 return Vector[Num].second;
62 }
63 return Vector[Pair.first->second].second;
64 }
65
66 std::pair<iterator, bool> insert(const std::pair<KeyT, ValueT> &InsertPair) {
67 std::pair<typename MapTy::iterator, bool> Pair =
68 Map.insert(std::make_pair(InsertPair.first, size_t(0)));
69 if (Pair.second) {
70 size_t Num = Vector.size();
71 Pair.first->second = Num;
72 Vector.push_back(InsertPair);
73 return std::make_pair(Vector.begin() + Num, true);
74 }
75 return std::make_pair(Vector.begin() + Pair.first->second, false);
76 }
77
80 if (It == Map.end())
81 return Vector.end();
82 return Vector.begin() + It->second;
83 }
84
87 if (It == Map.end())
88 return Vector.end();
89 return Vector.begin() + It->second;
90 }
91
92
93
94
97 if (It == Map.end())
98 return;
99 Vector[It->second].first = KeyT();
100 Map.erase(It);
101 }
102
104 Map.clear();
105 Vector.clear();
106 }
107
109 assert(Map.empty() == Vector.empty());
110 return Map.empty();
111 }
112};
113
114}
115
116#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseMap class.
An associative container with fast insertion-order (deterministic) iteration over its elements.
Definition BlotMapVector.h:22
void clear()
Definition BlotMapVector.h:103
const_iterator begin() const
Definition BlotMapVector.h:52
void blot(const KeyT &Key)
This is similar to erase, but instead of removing the element from the vector, it just zeros out the ...
Definition BlotMapVector.h:95
iterator find(const KeyT &Key)
Definition BlotMapVector.h:78
iterator end()
Definition BlotMapVector.h:51
typename VectorTy::iterator iterator
Definition BlotMapVector.h:47
typename VectorTy::const_iterator const_iterator
Definition BlotMapVector.h:48
bool empty() const
Definition BlotMapVector.h:108
ValueT & operator[](const KeyT &Arg)
Definition BlotMapVector.h:55
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &InsertPair)
Definition BlotMapVector.h:66
const_iterator end() const
Definition BlotMapVector.h:53
const_iterator find(const KeyT &Key) const
Definition BlotMapVector.h:85
iterator begin()
Definition BlotMapVector.h:50
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT, true > const_iterator
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key