Return a TreeArray from ts_stack_pop

Since the capacity is now included in the return value, the buffer
can be reused in the ts_parser__accept function. Also, it's just
cleaner to use Array consistently, rather than a separate buffer
and size.
This commit is contained in:
Max Brunsfeld 2016-02-21 22:31:04 -08:00
parent f92b35e77e
commit b113dc8b0f
5 changed files with 142 additions and 129 deletions

View file

@ -39,21 +39,21 @@ int tree_selection_spy_callback(void *data, TSTree *left, TSTree *right) {
void free_pop_results(StackPopResultArray *pop_results) {
for (size_t i = 0; i < pop_results->size; i++) {
StackPopResult *pop_result = &pop_results->contents[i];
StackPopResult pop_result = pop_results->contents[i];
bool matches_prior_trees = false;
for (size_t j = 0; j < i; j++) {
StackPopResult *prior_result = &pop_results->contents[j];
if (pop_result->trees == prior_result->trees) {
StackPopResult prior_result = pop_results->contents[j];
if (pop_result.trees.contents == prior_result.trees.contents) {
matches_prior_trees = true;
break;
}
}
if (!matches_prior_trees) {
for (size_t j = 0; j < pop_result->tree_count; j++)
ts_tree_release(pop_result->trees[j]);
ts_free(pop_result->trees);
for (size_t j = 0; j < pop_result.trees.size; j++)
ts_tree_release(pop_result.trees.contents[j]);
array_delete(&pop_result.trees);
}
}
}
@ -145,9 +145,9 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(1));
StackPopResult result = results.contents[0];
AssertThat(result.tree_count, Equals<size_t>(2));
AssertThat(result.trees[0], Equals(trees[1]));
AssertThat(result.trees[1], Equals(trees[2]));
AssertThat(result.trees.size, Equals<size_t>(2));
AssertThat(result.trees.contents[0], Equals(trees[1]));
AssertThat(result.trees.contents[1], Equals(trees[2]));
AssertThat(*ts_stack_head(stack, 0), Equals<StackEntry>({trees[0], stateA, tree_len}));
free_pop_results(&results);
@ -158,8 +158,8 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(1));
result = results.contents[0];
AssertThat(result.tree_count, Equals<size_t>(1));
AssertThat(result.trees[0], Equals(trees[0]));
AssertThat(result.trees.size, Equals<size_t>(1));
AssertThat(result.trees.contents[0], Equals(trees[0]));
AssertThat(ts_stack_head(stack, 0), Equals<const StackEntry *>(nullptr));
free_pop_results(&results);
@ -172,10 +172,10 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(1));
StackPopResult result = results.contents[0];
AssertThat(result.tree_count, Equals<size_t>(3));
AssertThat(result.trees[0], Equals(trees[0]));
AssertThat(result.trees[1], Equals(trees[1]));
AssertThat(result.trees[2], Equals(trees[2]));
AssertThat(result.trees.size, Equals<size_t>(3));
AssertThat(result.trees.contents[0], Equals(trees[0]));
AssertThat(result.trees.contents[1], Equals(trees[1]));
AssertThat(result.trees.contents[2], Equals(trees[2]));
AssertThat(ts_stack_head(stack, 0), Equals<const StackEntry *>(nullptr));
free_pop_results(&results);
@ -186,10 +186,10 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(1));
StackPopResult result = results.contents[0];
AssertThat(result.tree_count, Equals<size_t>(3));
AssertThat(result.trees[0], Equals(trees[0]));
AssertThat(result.trees[1], Equals(trees[1]));
AssertThat(result.trees[2], Equals(trees[2]));
AssertThat(result.trees.size, Equals<size_t>(3));
AssertThat(result.trees.contents[0], Equals(trees[0]));
AssertThat(result.trees.contents[1], Equals(trees[1]));
AssertThat(result.trees.contents[2], Equals(trees[2]));
free_pop_results(&results);
});
@ -220,7 +220,7 @@ describe("Stack", [&]() {
AssertThat(*ts_stack_head(stack, 1), Equals<StackEntry>({trees[1], stateB, tree_len * 2}));
AssertThat(pop_results.size, Equals<size_t>(1));
StackPopResult pop_result = pop_results.contents[0];
AssertThat(pop_result.tree_count, Equals<size_t>(1));
AssertThat(pop_result.trees.size, Equals<size_t>(1));
free_pop_results(&pop_results);
/*
@ -386,15 +386,15 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(2));
StackPopResult pop1 = results.contents[0];
AssertThat(pop1.head_index, Equals(0));
AssertThat(pop1.tree_count, Equals<size_t>(2));
AssertThat(pop1.trees[0], Equals(trees[3]));
AssertThat(pop1.trees[1], Equals(trees[6]));
AssertThat(pop1.trees.size, Equals<size_t>(2));
AssertThat(pop1.trees.contents[0], Equals(trees[3]));
AssertThat(pop1.trees.contents[1], Equals(trees[6]));
StackPopResult pop2 = results.contents[1];
AssertThat(pop2.head_index, Equals(1));
AssertThat(pop2.tree_count, Equals<size_t>(2));
AssertThat(pop2.trees[0], Equals(trees[5]));
AssertThat(pop2.trees[1], Equals(trees[6]));
AssertThat(pop2.trees.size, Equals<size_t>(2));
AssertThat(pop2.trees.contents[0], Equals(trees[5]));
AssertThat(pop2.trees.contents[1], Equals(trees[6]));
AssertThat(ts_stack_head_count(stack), Equals(2));
AssertThat(*ts_stack_head(stack, 0), Equals<StackEntry>({trees[2], stateC, tree_len * 3}));
@ -445,15 +445,15 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(2));
StackPopResult pop1 = results.contents[0];
AssertThat(pop1.head_index, Equals(0));
AssertThat(pop1.tree_count, Equals<size_t>(2));
AssertThat(pop1.trees[0], Equals(trees[6]));
AssertThat(pop1.trees[1], Equals(trees[7]));
AssertThat(pop1.trees.size, Equals<size_t>(2));
AssertThat(pop1.trees.contents[0], Equals(trees[6]));
AssertThat(pop1.trees.contents[1], Equals(trees[7]));
StackPopResult pop2 = results.contents[1];
AssertThat(pop2.head_index, Equals(1));
AssertThat(pop2.tree_count, Equals<size_t>(2));
AssertThat(pop2.trees[0], Equals(trees[6]));
AssertThat(pop2.trees[1], Equals(trees[7]));
AssertThat(pop2.trees.size, Equals<size_t>(2));
AssertThat(pop2.trees.contents[0], Equals(trees[6]));
AssertThat(pop2.trees.contents[1], Equals(trees[7]));
free_pop_results(&results);
});
@ -473,9 +473,9 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(1));
StackPopResult pop1 = results.contents[0];
AssertThat(pop1.tree_count, Equals<size_t>(3));
AssertThat(pop1.trees.size, Equals<size_t>(3));
AssertThat(pop1.head_index, Equals(0));
AssertThat(pop1.trees[0], Equals(trees[2]));
AssertThat(pop1.trees.contents[0], Equals(trees[2]));
free_pop_results(&results);
});
@ -494,9 +494,9 @@ describe("Stack", [&]() {
AssertThat(results.size, Equals<size_t>(1));
StackPopResult pop1 = results.contents[0];
AssertThat(pop1.tree_count, Equals<size_t>(3));
AssertThat(pop1.trees.size, Equals<size_t>(3));
AssertThat(pop1.head_index, Equals(0));
AssertThat(pop1.trees[0], Equals(trees[4]));
AssertThat(pop1.trees.contents[0], Equals(trees[4]));
free_pop_results(&results);
});
@ -548,21 +548,21 @@ describe("Stack", [&]() {
StackPopResult pop1 = results.contents[0];
AssertThat(ts_stack_top_tree(stack, 0), Equals(trees[3]));
AssertThat(pop1.head_index, Equals(0));
AssertThat(pop1.tree_count, Equals<size_t>(2));
AssertThat(pop1.trees[0], Equals(trees[8]));
AssertThat(pop1.trees[1], Equals(trees[9]));
AssertThat(pop1.trees.size, Equals<size_t>(2));
AssertThat(pop1.trees.contents[0], Equals(trees[8]));
AssertThat(pop1.trees.contents[1], Equals(trees[9]));
StackPopResult pop2 = results.contents[1];
AssertThat(ts_stack_top_tree(stack, 1), Equals(trees[5]));
AssertThat(pop2.head_index, Equals(1));
AssertThat(pop2.tree_count, Equals<size_t>(2));
AssertThat(pop2.trees, Equals(pop1.trees));
AssertThat(pop2.trees.size, Equals<size_t>(2));
AssertThat(pop2.trees.contents, Equals(pop1.trees.contents));
StackPopResult pop3 = results.contents[2];
AssertThat(ts_stack_top_tree(stack, 2), Equals(trees[7]));
AssertThat(pop3.head_index, Equals(2));
AssertThat(pop3.tree_count, Equals<size_t>(2));
AssertThat(pop3.trees, Equals(pop1.trees));
AssertThat(pop3.trees.size, Equals<size_t>(2));
AssertThat(pop3.trees.contents, Equals(pop1.trees.contents));
free_pop_results(&results);
});
@ -583,26 +583,26 @@ describe("Stack", [&]() {
StackPopResult pop1 = results.contents[0];
AssertThat(ts_stack_top_tree(stack, 0), Equals(trees[2]));
AssertThat(pop1.head_index, Equals(0));
AssertThat(pop1.tree_count, Equals<size_t>(3));
AssertThat(pop1.trees[0], Equals(trees[3]));
AssertThat(pop1.trees[1], Equals(trees[8]));
AssertThat(pop1.trees[2], Equals(trees[9]));
AssertThat(pop1.trees.size, Equals<size_t>(3));
AssertThat(pop1.trees.contents[0], Equals(trees[3]));
AssertThat(pop1.trees.contents[1], Equals(trees[8]));
AssertThat(pop1.trees.contents[2], Equals(trees[9]));
StackPopResult pop2 = results.contents[1];
AssertThat(ts_stack_top_tree(stack, 1), Equals(trees[4]));
AssertThat(pop2.head_index, Equals(1));
AssertThat(pop2.tree_count, Equals<size_t>(3));
AssertThat(pop2.trees[0], Equals(trees[5]));
AssertThat(pop2.trees[1], Equals(trees[8]));
AssertThat(pop2.trees[2], Equals(trees[9]));
AssertThat(pop2.trees.size, Equals<size_t>(3));
AssertThat(pop2.trees.contents[0], Equals(trees[5]));
AssertThat(pop2.trees.contents[1], Equals(trees[8]));
AssertThat(pop2.trees.contents[2], Equals(trees[9]));
StackPopResult pop3 = results.contents[2];
AssertThat(ts_stack_top_tree(stack, 2), Equals(trees[6]));
AssertThat(pop3.head_index, Equals(2));
AssertThat(pop3.tree_count, Equals<size_t>(3));
AssertThat(pop3.trees[0], Equals(trees[7]));
AssertThat(pop3.trees[1], Equals(trees[8]));
AssertThat(pop3.trees[2], Equals(trees[9]));
AssertThat(pop3.trees.size, Equals<size_t>(3));
AssertThat(pop3.trees.contents[0], Equals(trees[7]));
AssertThat(pop3.trees.contents[1], Equals(trees[8]));
AssertThat(pop3.trees.contents[2], Equals(trees[9]));
free_pop_results(&results);
});