Replace stack_merge_new function with two simpler functions
- merge(version1, version2) - split(version)
This commit is contained in:
parent
e686478ad2
commit
6535704870
4 changed files with 42 additions and 42 deletions
|
|
@ -458,6 +458,28 @@ StackVersion ts_stack_duplicate_version(Stack *self, StackVersion version) {
|
|||
return self->heads.size - 1;
|
||||
}
|
||||
|
||||
StackVersion ts_stack_split(Stack *self, StackVersion version) {
|
||||
if (!array_push(&self->heads, self->heads.contents[version]))
|
||||
return STACK_VERSION_NONE;
|
||||
stack_node_retain(self->heads.contents[version].node);
|
||||
return self->heads.size - 1;
|
||||
}
|
||||
|
||||
bool ts_stack_merge(Stack *self, StackVersion version, StackVersion new_version) {
|
||||
StackNode *node = self->heads.contents[version].node;
|
||||
StackNode *new_node = self->heads.contents[new_version].node;
|
||||
|
||||
if (new_node->state == node->state &&
|
||||
new_node->position.chars == node->position.chars) {
|
||||
for (size_t j = 0; j < new_node->link_count; j++)
|
||||
stack_node_add_link(node, new_node->links[j]);
|
||||
ts_stack_remove_version(self, new_version);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void ts_stack_merge_from(Stack *self, StackVersion start_version) {
|
||||
for (size_t i = start_version; i < self->heads.size; i++) {
|
||||
if (self->heads.contents[i].is_halted) {
|
||||
|
|
@ -487,21 +509,6 @@ void ts_stack_merge_from(Stack *self, StackVersion start_version) {
|
|||
}
|
||||
}
|
||||
|
||||
void ts_stack_merge_new(Stack *self, StackVersion reference_version,
|
||||
StackVersion first_new_version) {
|
||||
StackNode *reference_node = self->heads.contents[reference_version].node;
|
||||
for (size_t i = first_new_version; i < self->heads.size; i++) {
|
||||
StackNode *node = self->heads.contents[i].node;
|
||||
if (reference_node->state == node->state &&
|
||||
reference_node->position.chars == node->position.chars) {
|
||||
for (size_t j = 0; j < node->link_count; j++)
|
||||
stack_node_add_link(reference_node, node->links[j]);
|
||||
ts_stack_remove_version(self, i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ts_stack_merge_all(Stack *self) {
|
||||
ts_stack_merge_from(self, 0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue