Rework tree generation mode and API
Store tree nodes in congruent, compact arena array. Define handle types to refer to tree nodes rather than pointers to structure instances. Free tree with context.
This commit is contained in:
1 parent
dddb1b5089
commit
5fc712c6ee
39 files changed
+1349
-811
No files matched your search
+31
-34
@@ -9,55 +9,52 @@ int main()
|
||||
p_context_t * context;
|
||||
context = p_context_new((uint8_t const *)input, strlen(input));
|
||||
assert_eq(P_SUCCESS, p_parse(context));
|
||||
Start * start = p_result(context);
|
||||
assert(start->pItems1 != NULL);
|
||||
assert(start->pItems != NULL);
|
||||
Items * items = start->pItems;
|
||||
assert(items->pItem != NULL);
|
||||
assert(items->pItem->pToken1 != NULL);
|
||||
assert_eq(TOKEN_a, items->pItem->pToken1->token);
|
||||
assert_eq(11, items->pItem->pToken1->pvalue);
|
||||
assert(items->pItemsMore != NULL);
|
||||
ItemsMore * itemsmore = items->pItemsMore;
|
||||
assert(itemsmore->pItem != NULL);
|
||||
assert(itemsmore->pItem->pItem != NULL);
|
||||
assert(itemsmore->pItem->pItem->pItem != NULL);
|
||||
assert(itemsmore->pItem->pItem->pItem->pToken1 != NULL);
|
||||
assert_eq(TOKEN_b, itemsmore->pItem->pItem->pItem->pToken1->token);
|
||||
assert_eq(22, itemsmore->pItem->pItem->pItem->pToken1->pvalue);
|
||||
assert(itemsmore->pItemsMore != NULL);
|
||||
itemsmore = itemsmore->pItemsMore;
|
||||
assert(itemsmore->pItem != NULL);
|
||||
assert(itemsmore->pItem->pToken1 != NULL);
|
||||
assert_eq(TOKEN_b, itemsmore->pItem->pToken1->token);
|
||||
assert_eq(22, itemsmore->pItem->pToken1->pvalue);
|
||||
assert(itemsmore->pItemsMore == NULL);
|
||||
Start start = p_result(context);
|
||||
assert(p_node_valid(p_Start_pItems1(start)));
|
||||
assert(p_node_valid(p_Start_pItems(start)));
|
||||
Items items = p_Start_pItems(start);
|
||||
assert(p_node_valid(p_Items_pItem(items)));
|
||||
assert(p_node_valid(p_tree_walk_Items(items, pItem, pToken1)));
|
||||
assert_eq(TOKEN_a, p_tree_walk_Items(items, pItem, pToken1, token));
|
||||
assert_eq(11, p_tree_walk_Items(items, pItem, pToken1, pvalue));
|
||||
assert(p_node_valid(p_Items_pItemsMore(items)));
|
||||
ItemsMore itemsmore = p_Items_pItemsMore(items);
|
||||
assert(p_node_valid(p_ItemsMore_pItem(itemsmore)));
|
||||
assert(p_node_valid(p_tree_walk_ItemsMore(itemsmore, pItem, pItem)));
|
||||
assert(p_node_valid(p_tree_walk_ItemsMore(itemsmore, pItem, pItem, pItem)));
|
||||
assert(p_node_valid(p_tree_walk_ItemsMore(itemsmore, pItem, pItem, pItem, pToken1)));
|
||||
assert_eq(TOKEN_b, p_tree_walk_ItemsMore(itemsmore, pItem, pItem, pItem, pToken1, token));
|
||||
assert_eq(22, p_tree_walk_ItemsMore(itemsmore, pItem, pItem, pItem, pToken1, pvalue));
|
||||
assert(p_node_valid(p_ItemsMore_pItemsMore(itemsmore)));
|
||||
itemsmore = p_ItemsMore_pItemsMore(itemsmore);
|
||||
assert(p_node_valid(p_ItemsMore_pItem(itemsmore)));
|
||||
assert(p_node_valid(p_tree_walk_ItemsMore(itemsmore, pItem, pToken1)));
|
||||
assert_eq(TOKEN_b, p_tree_walk_ItemsMore(itemsmore, pItem, pToken1, token));
|
||||
assert_eq(22, p_tree_walk_ItemsMore(itemsmore, pItem, pToken1, pvalue));
|
||||
assert(!p_node_valid(p_ItemsMore_pItemsMore(itemsmore)));
|
||||
|
||||
p_tree_delete(start);
|
||||
p_context_delete(context);
|
||||
|
||||
input = "";
|
||||
context = p_context_new((uint8_t const *)input, strlen(input));
|
||||
assert_eq(P_SUCCESS, p_parse(context));
|
||||
start = p_result(context);
|
||||
assert(start->pItems == NULL);
|
||||
assert(!p_node_valid(p_Start_pItems(start)));
|
||||
|
||||
p_tree_delete(start);
|
||||
p_context_delete(context);
|
||||
|
||||
input = "2 1";
|
||||
context = p_context_new((uint8_t const *)input, strlen(input));
|
||||
assert_eq(P_SUCCESS, p_parse(context));
|
||||
start = p_result(context);
|
||||
assert(start->pItems != NULL);
|
||||
assert(start->pItems->pItem != NULL);
|
||||
assert(start->pItems->pItem->pDual != NULL);
|
||||
assert(start->pItems->pItem->pDual->pTwo1 != NULL);
|
||||
assert(start->pItems->pItem->pDual->pOne2 != NULL);
|
||||
assert(start->pItems->pItem->pDual->pTwo2 == NULL);
|
||||
assert(start->pItems->pItem->pDual->pOne1 == NULL);
|
||||
assert(p_node_valid(p_Start_pItems(start)));
|
||||
assert(p_node_valid(p_tree_walk_Start(start, pItems, pItem)));
|
||||
assert(p_node_valid(p_tree_walk_Start(start, pItems, pItem, pDual)));
|
||||
assert(p_node_valid(p_tree_walk_Start(start, pItems, pItem, pDual, pTwo1)));
|
||||
assert(p_node_valid(p_tree_walk_Start(start, pItems, pItem, pDual, pOne2)));
|
||||
assert(!p_node_valid(p_tree_walk_Start(start, pItems, pItem, pDual, pTwo2)));
|
||||
assert(!p_node_valid(p_tree_walk_Start(start, pItems, pItem, pDual, pOne1)));
|
||||
|
||||
p_tree_delete(start);
|
||||
p_context_delete(context);
|
||||
|
||||
return 0;
|
||||
|
||||
Reference in new issue
Block a user