|
12 | 12 | //===----------------------------------------------------------------------===//
|
13 | 13 |
|
14 | 14 | #include "clang/AST/ParentMapContext.h"
|
15 |
| -#include "clang/AST/RecursiveASTVisitor.h" |
16 | 15 | #include "clang/AST/Decl.h"
|
17 | 16 | #include "clang/AST/Expr.h"
|
| 17 | +#include "clang/AST/RecursiveASTVisitor.h" |
18 | 18 | #include "clang/AST/TemplateBase.h"
|
| 19 | +#include "llvm/ADT/SmallPtrSet.h" |
19 | 20 |
|
20 | 21 | using namespace clang;
|
21 | 22 |
|
@@ -69,17 +70,21 @@ class ParentMapContext::ParentMap {
|
69 | 70 | for (; N > 0; --N)
|
70 | 71 | push_back(Value);
|
71 | 72 | }
|
72 |
| - bool contains(const DynTypedNode &Value) { |
73 |
| - return Seen.contains(Value); |
| 73 | + bool contains(const DynTypedNode &Value) const { |
| 74 | + const void *Identity = Value.getMemoizationData(); |
| 75 | + assert(Identity); |
| 76 | + return Dedup.contains(Identity); |
74 | 77 | }
|
75 | 78 | void push_back(const DynTypedNode &Value) {
|
76 |
| - if (!Value.getMemoizationData() || Seen.insert(Value).second) |
| 79 | + const void *Identity = Value.getMemoizationData(); |
| 80 | + if (!Identity || Dedup.insert(Identity).second) { |
77 | 81 | Items.push_back(Value);
|
| 82 | + } |
78 | 83 | }
|
79 | 84 | llvm::ArrayRef<DynTypedNode> view() const { return Items; }
|
80 | 85 | private:
|
81 |
| - llvm::SmallVector<DynTypedNode, 2> Items; |
82 |
| - llvm::SmallDenseSet<DynTypedNode, 2> Seen; |
| 86 | + llvm::SmallVector<DynTypedNode, 1> Items; |
| 87 | + llvm::SmallPtrSet<const void *, 2> Dedup; |
83 | 88 | };
|
84 | 89 |
|
85 | 90 | /// Maps from a node to its parents. This is used for nodes that have
|
|
0 commit comments