From a63624f2aa8f291bc260da4da61fcbd2e622fb0e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Sat, 15 Feb 2014 16:12:16 -0800 Subject: [PATCH] Simplify hashing of rules --- src/compiler/build_tables/item.h | 4 ++-- src/compiler/rules/blank.cpp | 2 +- src/compiler/rules/character_set.cpp | 7 ++++++- src/compiler/rules/character_set.h | 6 +++++- src/compiler/rules/choice.cpp | 2 +- src/compiler/rules/pattern.cpp | 2 +- src/compiler/rules/repeat.cpp | 2 +- src/compiler/rules/rule.h | 6 +++--- src/compiler/rules/seq.cpp | 2 +- src/compiler/rules/string.cpp | 2 +- src/compiler/rules/symbol.cpp | 2 +- src/compiler/rules/symbol.h | 7 ++++++- 12 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/compiler/build_tables/item.h b/src/compiler/build_tables/item.h index c46ebf37..79d7ab5c 100644 --- a/src/compiler/build_tables/item.h +++ b/src/compiler/build_tables/item.h @@ -51,7 +51,7 @@ namespace std { size_t operator()(const tree_sitter::build_tables::Item &item) const { return hash()(item.lhs) ^ - hash()(*item.rule); + hash()(item.rule); } }; @@ -60,7 +60,7 @@ namespace std { size_t operator()(const tree_sitter::build_tables::ParseItem &item) const { return hash()(item.lhs.name) ^ - hash()(*item.rule) ^ + hash()(item.rule) ^ hash()(item.consumed_symbols.size()) ^ hash()(item.lookahead_sym.name); } diff --git a/src/compiler/rules/blank.cpp b/src/compiler/rules/blank.cpp index 0d07858a..dbd68ffe 100644 --- a/src/compiler/rules/blank.cpp +++ b/src/compiler/rules/blank.cpp @@ -9,7 +9,7 @@ namespace tree_sitter { } size_t Blank::hash_code() const { - return typeid(this).hash_code(); + return 0; } rule_ptr Blank::copy() const { diff --git a/src/compiler/rules/character_set.cpp b/src/compiler/rules/character_set.cpp index cfd9548d..b12f367a 100644 --- a/src/compiler/rules/character_set.cpp +++ b/src/compiler/rules/character_set.cpp @@ -69,7 +69,12 @@ namespace tree_sitter { } size_t CharacterSet::hash_code() const { - return typeid(this).hash_code() ^ hash()(to_string()); + size_t result = std::hash()(ranges.size()); + for (auto &range : ranges) { + result ^= std::hash()(range.min); + result ^= std::hash()(range.max); + } + return result; } rule_ptr CharacterSet::copy() const { diff --git a/src/compiler/rules/character_set.h b/src/compiler/rules/character_set.h index 5ee64470..021c41b0 100644 --- a/src/compiler/rules/character_set.h +++ b/src/compiler/rules/character_set.h @@ -57,7 +57,11 @@ namespace tree_sitter { namespace std { template<> - struct hash : hash {}; + struct hash { + size_t operator()(const tree_sitter::rules::CharacterSet &rule) const { + return rule.hash_code(); + } + }; } #endif diff --git a/src/compiler/rules/choice.cpp b/src/compiler/rules/choice.cpp index 8638c085..f654fed7 100644 --- a/src/compiler/rules/choice.cpp +++ b/src/compiler/rules/choice.cpp @@ -12,7 +12,7 @@ namespace tree_sitter { } size_t Choice::hash_code() const { - return typeid(this).hash_code() ^ left->hash_code() ^ right->hash_code(); + return left->hash_code() ^ right->hash_code(); } rule_ptr Choice::copy() const { diff --git a/src/compiler/rules/pattern.cpp b/src/compiler/rules/pattern.cpp index ba7ad9e8..88666799 100644 --- a/src/compiler/rules/pattern.cpp +++ b/src/compiler/rules/pattern.cpp @@ -146,7 +146,7 @@ namespace tree_sitter { } size_t Pattern::hash_code() const { - return typeid(this).hash_code() ^ hash()(value); + return hash()(value); } rule_ptr Pattern::copy() const { diff --git a/src/compiler/rules/repeat.cpp b/src/compiler/rules/repeat.cpp index c686cd84..d3c929ef 100644 --- a/src/compiler/rules/repeat.cpp +++ b/src/compiler/rules/repeat.cpp @@ -12,7 +12,7 @@ namespace tree_sitter { } size_t Repeat::hash_code() const { - return typeid(this).hash_code() ^ content->hash_code(); + return content->hash_code(); } rule_ptr Repeat::copy() const { diff --git a/src/compiler/rules/rule.h b/src/compiler/rules/rule.h index 7f583f74..43521074 100644 --- a/src/compiler/rules/rule.h +++ b/src/compiler/rules/rule.h @@ -27,9 +27,9 @@ namespace tree_sitter { namespace std { template<> - struct hash { - size_t operator()(const tree_sitter::rules::Rule &rule) const { - return rule.hash_code(); + struct hash { + size_t operator()(const tree_sitter::rules::rule_ptr &rule) const { + return typeid(*rule).hash_code() ^ rule->hash_code(); } }; } diff --git a/src/compiler/rules/seq.cpp b/src/compiler/rules/seq.cpp index 5f771f35..aa4583c8 100644 --- a/src/compiler/rules/seq.cpp +++ b/src/compiler/rules/seq.cpp @@ -12,7 +12,7 @@ namespace tree_sitter { } size_t Seq::hash_code() const { - return typeid(this).hash_code() ^ left->hash_code() ^ right->hash_code(); + return left->hash_code() ^ right->hash_code(); } rule_ptr Seq::copy() const { diff --git a/src/compiler/rules/string.cpp b/src/compiler/rules/string.cpp index b558696f..1af0769f 100644 --- a/src/compiler/rules/string.cpp +++ b/src/compiler/rules/string.cpp @@ -13,7 +13,7 @@ namespace tree_sitter { } size_t String::hash_code() const { - return typeid(this).hash_code() ^ hash()(value); + return hash()(value); } rule_ptr String::copy() const { diff --git a/src/compiler/rules/symbol.cpp b/src/compiler/rules/symbol.cpp index 217dfa79..7521ead5 100644 --- a/src/compiler/rules/symbol.cpp +++ b/src/compiler/rules/symbol.cpp @@ -18,7 +18,7 @@ namespace tree_sitter { } size_t Symbol::hash_code() const { - return typeid(this).hash_code() ^ hash()(name) ^ hash()(is_auxiliary); + return hash()(name) ^ hash()(is_auxiliary); } rule_ptr Symbol::copy() const { diff --git a/src/compiler/rules/symbol.h b/src/compiler/rules/symbol.h index 6488cadb..cde0dd68 100644 --- a/src/compiler/rules/symbol.h +++ b/src/compiler/rules/symbol.h @@ -2,6 +2,7 @@ #define __tree_sitter__sym__ #include "rule.h" +#include namespace tree_sitter { namespace rules { @@ -27,7 +28,11 @@ namespace tree_sitter { namespace std { template<> - struct hash : hash {}; + struct hash { + size_t operator()(const tree_sitter::rules::Symbol &rule) const { + return rule.hash_code(); + } + }; }