Optimize merge_sym_transitions and merge_char_transitions
This commit is contained in:
parent
53bc633a22
commit
a42f498c59
4 changed files with 14 additions and 14 deletions
|
|
@ -10,8 +10,8 @@ describe("merging character set transitions", []() {
|
|||
typedef map<CharacterSet, int> int_map;
|
||||
|
||||
auto merge_result = [&](int_map left, int_map right) -> int_map {
|
||||
merge_char_transitions<int>(&left, right, [](const int *l, const int *r) -> int {
|
||||
return *l | *r;
|
||||
merge_char_transitions<int>(&left, right, [](int *l, const int *r) {
|
||||
*l = *l | *r;
|
||||
});
|
||||
return left;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -15,9 +15,8 @@ namespace tree_sitter {
|
|||
|
||||
namespace build_tables {
|
||||
template<typename T>
|
||||
static unordered_set<T> merge_sets(unordered_set<T> *left, const unordered_set<T> *right) {
|
||||
static void merge_sets(unordered_set<T> *left, const unordered_set<T> *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<ParseItemSet>(&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<LexItemSet>(&result, item_transitions, [](LexItemSet *l, const LexItemSet *r) -> LexItemSet {
|
||||
return merge_sets(l, r);
|
||||
merge_char_transitions<LexItemSet>(&result, item_transitions, [](LexItemSet *l, const LexItemSet *r) {
|
||||
merge_sets(l, r);
|
||||
});
|
||||
}
|
||||
return result;
|
||||
|
|
|
|||
|
|
@ -17,14 +17,14 @@ namespace tree_sitter {
|
|||
template<typename T>
|
||||
void merge_sym_transitions(std::map<rules::Symbol, T> *left,
|
||||
const std::map<rules::Symbol, T> &right,
|
||||
std::function<T(T *, const T *)> merge_fn) {
|
||||
std::function<void(T *, const T *)> 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<typename T>
|
||||
void merge_char_transitions(std::map<rules::CharacterSet, T> *left,
|
||||
const std::map<rules::CharacterSet, T> &right,
|
||||
std::function<T(T *, const T *)> merge_fn) {
|
||||
std::function<void(T *, const T *)> 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;
|
||||
|
|
|
|||
|
|
@ -26,14 +26,14 @@ namespace tree_sitter {
|
|||
template<>
|
||||
void merge_transitions(map<CharacterSet, rule_ptr> *left, const map<CharacterSet, rule_ptr> &right) {
|
||||
merge_char_transitions<rule_ptr>(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<Symbol, rule_ptr> *left, const map<Symbol, rule_ptr> &right) {
|
||||
merge_sym_transitions<rule_ptr>(left, right, [](rule_ptr *left, const rule_ptr *right) {
|
||||
return rules::Choice::Build({ *left, *right });
|
||||
*left = rules::Choice::Build({ *left, *right });
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue