Skip to content

Commit f61c1bf

Browse files
committed
Store names in unordered_sets
Signed-off-by: Roberto Raggi <[email protected]>
1 parent dffd027 commit f61c1bf

File tree

9 files changed

+363
-64
lines changed

9 files changed

+363
-64
lines changed

src/parser/cxx/control.cc

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@ template <typename Literal>
5454
using LiteralSet =
5555
std::unordered_set<Literal, LiteralHash<Literal>, LiteralEqualTo<Literal>>;
5656

57-
template <typename Name>
58-
using NameSet = std::set<Name>;
59-
6057
} // namespace
6158

6259
struct Control::Private {
@@ -75,12 +72,12 @@ struct Control::Private {
7572
LiteralSet<Utf32StringLiteral> utf32StringLiterals;
7673
LiteralSet<CommentLiteral> commentLiterals;
7774

78-
std::set<Identifier, std::less<>> identifiers;
79-
std::set<OperatorId> operatorIds;
80-
std::set<DestructorId> destructorIds;
81-
std::set<LiteralOperatorId> literalOperatorIds;
82-
std::set<ConversionFunctionId> conversionFunctionIds;
83-
std::set<TemplateId> templateIds;
75+
std::unordered_set<Identifier> identifiers;
76+
std::unordered_set<OperatorId> operatorIds;
77+
std::unordered_set<DestructorId> destructorIds;
78+
std::unordered_set<LiteralOperatorId> literalOperatorIds;
79+
std::unordered_set<ConversionFunctionId> conversionFunctionIds;
80+
std::unordered_set<TemplateId> templateIds;
8481

8582
BuiltinVaListType builtinVaListType;
8683
VoidType voidType;

src/parser/cxx/names.cc

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,63 @@
2424
#include <cxx/ast.h>
2525
#include <cxx/control.h>
2626
#include <cxx/literals.h>
27+
#include <cxx/symbols.h>
28+
#include <cxx/util.h>
2729

2830
#include <cstring>
2931

3032
namespace cxx {
3133

3234
namespace {
3335

36+
struct ConstValueHash {
37+
auto operator()(bool value) const -> std::size_t {
38+
return std::hash<bool>{}(value);
39+
}
40+
auto operator()(std::int32_t value) const -> std::size_t {
41+
return std::hash<std::int32_t>{}(value);
42+
}
43+
auto operator()(std::uint32_t value) const -> std::size_t {
44+
return std::hash<std::uint32_t>{}(value);
45+
}
46+
auto operator()(std::int64_t value) const -> std::size_t {
47+
return std::hash<std::int64_t>{}(value);
48+
}
49+
auto operator()(std::uint64_t value) const -> std::size_t {
50+
return std::hash<std::uint64_t>{}(value);
51+
}
52+
auto operator()(float value) const -> std::size_t {
53+
return std::hash<float>{}(value);
54+
}
55+
auto operator()(double value) const -> std::size_t {
56+
return std::hash<double>{}(value);
57+
}
58+
auto operator()(long double value) const -> std::size_t {
59+
return std::hash<long double>{}(value);
60+
}
61+
auto operator()(const StringLiteral* value) const -> std::size_t {
62+
return value->hashCode();
63+
}
64+
};
65+
66+
struct TemplateArgumentHash {
67+
auto operator()(const Type* arg) const -> std::size_t {
68+
return std::hash<const void*>{}(arg);
69+
}
70+
71+
auto operator()(Symbol* arg) const -> std::size_t {
72+
return arg->name() ? arg->name()->hashValue() : 0;
73+
}
74+
75+
auto operator()(ConstValue arg) const -> std::size_t {
76+
return std::visit(ConstValueHash{}, arg);
77+
}
78+
79+
auto operator()(ExpressionAST* arg) const -> std::size_t {
80+
return std::hash<const void*>{}(arg);
81+
}
82+
};
83+
3484
struct ConvertToName {
3585
Control* control_;
3686

@@ -107,4 +157,14 @@ auto Identifier::builtinTypeTrait() const -> BuiltinTypeTraitKind {
107157
return static_cast<const TypeTraitIdentifierInfo*>(info_)->trait();
108158
}
109159

160+
auto TemplateId::hash(const Name* name,
161+
const std::vector<TemplateArgument>& args)
162+
-> std::size_t {
163+
std::size_t hash = name->hashValue();
164+
for (const auto& arg : args) {
165+
hash_combine(hash, std::visit(TemplateArgumentHash{}, arg));
166+
}
167+
return hash;
168+
}
169+
110170
} // namespace cxx

0 commit comments

Comments
 (0)