From a42f498c5970f215a68e94c83cd248ce31291b0e Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Tue, 10 Jun 2014 13:50:51 -0700 Subject: [PATCH] Optimize merge_sym_transitions and merge_char_transitions --- spec/compiler/build_tables/merge_transitions_spec.cc | 4 ++-- src/compiler/build_tables/item_set_transitions.cc | 11 +++++------ src/compiler/build_tables/merge_transitions.h | 9 +++++---- src/compiler/build_tables/rule_transitions.cc | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/spec/compiler/build_tables/merge_transitions_spec.cc b/spec/compiler/build_tables/merge_transitions_spec.cc index 43e1d744..a5af3857 100644 --- a/spec/compiler/build_tables/merge_transitions_spec.cc +++ b/spec/compiler/build_tables/merge_transitions_spec.cc @@ -10,8 +10,8 @@ describe("merging character set transitions", []() { typedef map int_map; auto merge_result = [&](int_map left, int_map right) -> int_map { - merge_char_transitions(&left, right, [](const int *l, const int *r) -> int { - return *l | *r; + merge_char_transitions(&left, right, [](int *l, const int *r) { + *l = *l | *r; }); return left; }; diff --git a/src/compiler/build_tables/item_set_transitions.cc b/src/compiler/build_tables/item_set_transitions.cc index a275c0e2..215ee9d7 100644 --- a/src/compiler/build_tables/item_set_transitions.cc +++ b/src/compiler/build_tables/item_set_transitions.cc @@ -15,9 +15,8 @@ namespace tree_sitter { namespace build_tables { template - static unordered_set merge_sets(unordered_set *left, const unordered_set *right) { + static void merge_sets(unordered_set *left, const unordered_set *right) { left->insert(right->begin(), right->end()); - return *left; } const Symbol placeholder_lookahead = Symbol(-100); @@ -76,8 +75,8 @@ namespace tree_sitter { for (const ParseItem &item : item_set) merge_sym_transitions(&result, sym_transitions_for_item(this, item, grammar), - [&](ParseItemSet *l, const ParseItemSet *r) { - return merge_sets(l, r); + [](ParseItemSet *l, const ParseItemSet *r) { + merge_sets(l, r); }); return result; } @@ -94,8 +93,8 @@ namespace tree_sitter { LexItemSet({ next_item }) }); } - merge_char_transitions(&result, item_transitions, [](LexItemSet *l, const LexItemSet *r) -> LexItemSet { - return merge_sets(l, r); + merge_char_transitions(&result, item_transitions, [](LexItemSet *l, const LexItemSet *r) { + merge_sets(l, r); }); } return result; diff --git a/src/compiler/build_tables/merge_transitions.h b/src/compiler/build_tables/merge_transitions.h index 0bbe82bc..3a5ffbca 100644 --- a/src/compiler/build_tables/merge_transitions.h +++ b/src/compiler/build_tables/merge_transitions.h @@ -17,14 +17,14 @@ namespace tree_sitter { template void merge_sym_transitions(std::map *left, const std::map &right, - std::function merge_fn) { + std::function merge_fn) { for (auto &pair : right) { auto rule = pair.first; bool merged = false; for (auto &existing_pair : *left) { auto existing_rule = existing_pair.first; if (existing_rule == rule) { - existing_pair.second = merge_fn(&existing_pair.second, &pair.second); + merge_fn(&existing_pair.second, &pair.second); merged = true; break; } else if (rule < existing_rule) { @@ -45,7 +45,7 @@ namespace tree_sitter { template void merge_char_transitions(std::map *left, const std::map &right, - std::function merge_fn) { + std::function merge_fn) { for (auto &new_pair : right) { rules::CharacterSet new_char_set = new_pair.first; T new_value = new_pair.second; @@ -62,7 +62,8 @@ namespace tree_sitter { new_char_set.remove_set(intersection); if (!char_set.is_empty()) pairs_to_insert.insert({ char_set, value }); - pairs_to_insert.insert({ intersection, merge_fn(&value, &new_value) }); + merge_fn(&value, &new_value); + pairs_to_insert.insert({ intersection, value }); left->erase(iter++); } else { ++iter; diff --git a/src/compiler/build_tables/rule_transitions.cc b/src/compiler/build_tables/rule_transitions.cc index d29da169..33d532ca 100644 --- a/src/compiler/build_tables/rule_transitions.cc +++ b/src/compiler/build_tables/rule_transitions.cc @@ -26,14 +26,14 @@ namespace tree_sitter { template<> void merge_transitions(map *left, const map &right) { merge_char_transitions(left, right, [](rule_ptr *left, const rule_ptr *right) { - return rules::Choice::Build({ *left, *right }); + *left = rules::Choice::Build({ *left, *right }); }); } template<> void merge_transitions(map *left, const map &right) { merge_sym_transitions(left, right, [](rule_ptr *left, const rule_ptr *right) { - return rules::Choice::Build({ *left, *right }); + *left = rules::Choice::Build({ *left, *right }); }); }