Optimize merge_sym_transitions and merge_char_transitions

This commit is contained in:
Max Brunsfeld 2014-06-10 13:50:51 -07:00
parent 53bc633a22
commit a42f498c59
4 changed files with 14 additions and 14 deletions

View file

@ -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;
};

View file

@ -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;

View file

@ -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;

View file

@ -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 });
});
}