| 73 } |
73 } |
| 74 |
74 |
| 75 static void *tree_node_file_create_hl( |
75 static void *tree_node_file_create_hl( |
| 76 const void *dptr, |
76 const void *dptr, |
| 77 void *tree) { |
77 void *tree) { |
| 78 return tree_node_file_create(dptr, (void*)((CxTree*)tree)->allocator); |
78 return tree_node_file_create(dptr, (void*)((CxTree*)tree)->collection.allocator); |
| 79 } |
79 } |
| 80 |
80 |
| 81 static int tree_node_file_search(const void *l, const void *r) { |
81 static int tree_node_file_search(const void *l, const void *r) { |
| 82 const tree_node_file *left = l; |
82 const tree_node_file *left = l; |
| 83 const tree_node_file *right = r; |
83 const tree_node_file *right = r; |
| 1886 tree_node_file_search, |
1886 tree_node_file_search, |
| 1887 tree_node_file_search_data, |
1887 tree_node_file_search_data, |
| 1888 tree_node_file_layout |
1888 tree_node_file_layout |
| 1889 ); |
1889 ); |
| 1890 CX_TEST_ASSERT(tree->cl != NULL); |
1890 CX_TEST_ASSERT(tree->cl != NULL); |
| 1891 CX_TEST_ASSERT(tree->allocator == &talloc.base); |
1891 CX_TEST_ASSERT(tree->collection.allocator == &talloc.base); |
| 1892 CX_TEST_ASSERT(tree->node_create == tree_node_file_create_hl); |
1892 CX_TEST_ASSERT(tree->node_create == tree_node_file_create_hl); |
| 1893 CX_TEST_ASSERT(tree->search == tree_node_file_search); |
1893 CX_TEST_ASSERT(tree->search == tree_node_file_search); |
| 1894 CX_TEST_ASSERT(tree->search_data == tree_node_file_search_data); |
1894 CX_TEST_ASSERT(tree->search_data == tree_node_file_search_data); |
| 1895 CX_TEST_ASSERT(tree->size == 0); |
1895 CX_TEST_ASSERT(tree->collection.size == 0); |
| 1896 CX_TEST_ASSERT(tree->simple_destructor == NULL); |
1896 CX_TEST_ASSERT(tree->collection.simple_destructor == NULL); |
| 1897 CX_TEST_ASSERT(tree->advanced_destructor == (cx_destructor_func2) cxFree); |
1897 CX_TEST_ASSERT(tree->collection.advanced_destructor == (cx_destructor_func2) cxFree); |
| 1898 CX_TEST_ASSERT(tree->destructor_data == &talloc.base); |
1898 CX_TEST_ASSERT(tree->collection.destructor_data == &talloc.base); |
| |
1899 CX_TEST_ASSERT(tree->collection.store_pointer == false); |
| |
1900 CX_TEST_ASSERT(tree->collection.sorted == false); |
| 1899 CX_TEST_ASSERT(tree->root == NULL); |
1901 CX_TEST_ASSERT(tree->root == NULL); |
| 1900 CX_TEST_ASSERT(tree->loc_parent == offsetof(tree_node_file, parent)); |
1902 CX_TEST_ASSERT(tree->loc_parent == offsetof(tree_node_file, parent)); |
| 1901 CX_TEST_ASSERT(tree->loc_children == offsetof(tree_node_file, children)); |
1903 CX_TEST_ASSERT(tree->loc_children == offsetof(tree_node_file, children)); |
| 1902 CX_TEST_ASSERT(tree->loc_last_child == offsetof(tree_node_file, last_child)); |
1904 CX_TEST_ASSERT(tree->loc_last_child == offsetof(tree_node_file, last_child)); |
| 1903 CX_TEST_ASSERT(tree->loc_prev == offsetof(tree_node_file, prev)); |
1905 CX_TEST_ASSERT(tree->loc_prev == offsetof(tree_node_file, prev)); |
| 1919 tree_node_file_create_hl, |
1921 tree_node_file_create_hl, |
| 1920 tree_node_file_search, |
1922 tree_node_file_search, |
| 1921 tree_node_file_search_data |
1923 tree_node_file_search_data |
| 1922 ); |
1924 ); |
| 1923 CX_TEST_ASSERT(tree->cl != NULL); |
1925 CX_TEST_ASSERT(tree->cl != NULL); |
| 1924 CX_TEST_ASSERT(tree->allocator == cxDefaultAllocator); |
1926 CX_TEST_ASSERT(tree->collection.allocator == cxDefaultAllocator); |
| 1925 CX_TEST_ASSERT(tree->node_create == tree_node_file_create_hl); |
1927 CX_TEST_ASSERT(tree->node_create == tree_node_file_create_hl); |
| 1926 CX_TEST_ASSERT(tree->search == tree_node_file_search); |
1928 CX_TEST_ASSERT(tree->search == tree_node_file_search); |
| 1927 CX_TEST_ASSERT(tree->search_data == tree_node_file_search_data); |
1929 CX_TEST_ASSERT(tree->search_data == tree_node_file_search_data); |
| 1928 CX_TEST_ASSERT(tree->size == 0); |
1930 CX_TEST_ASSERT(tree->collection.size == 0); |
| 1929 CX_TEST_ASSERT(tree->simple_destructor == NULL); |
1931 CX_TEST_ASSERT(tree->collection.simple_destructor == NULL); |
| 1930 CX_TEST_ASSERT(tree->advanced_destructor == (cx_destructor_func2) cxFree); |
1932 CX_TEST_ASSERT(tree->collection.advanced_destructor == (cx_destructor_func2) cxFree); |
| 1931 CX_TEST_ASSERT(tree->destructor_data == cxDefaultAllocator); |
1933 CX_TEST_ASSERT(tree->collection.destructor_data == cxDefaultAllocator); |
| 1932 CX_TEST_ASSERT(tree->root == NULL); |
1934 CX_TEST_ASSERT(tree->root == NULL); |
| 1933 CX_TEST_ASSERT(tree->loc_parent == offsetof(struct cx_tree_node_base_s, parent)); |
1935 CX_TEST_ASSERT(tree->loc_parent == offsetof(struct cx_tree_node_base_s, parent)); |
| 1934 CX_TEST_ASSERT(tree->loc_children == offsetof(struct cx_tree_node_base_s, children)); |
1936 CX_TEST_ASSERT(tree->loc_children == offsetof(struct cx_tree_node_base_s, children)); |
| 1935 CX_TEST_ASSERT(tree->loc_last_child == offsetof(struct cx_tree_node_base_s, last_child)); |
1937 CX_TEST_ASSERT(tree->loc_last_child == offsetof(struct cx_tree_node_base_s, last_child)); |
| 1936 CX_TEST_ASSERT(tree->loc_prev == offsetof(struct cx_tree_node_base_s, prev)); |
1938 CX_TEST_ASSERT(tree->loc_prev == offsetof(struct cx_tree_node_base_s, prev)); |
| 1945 cx_tree_link(&root, &child2, tree_node_layout); |
1947 cx_tree_link(&root, &child2, tree_node_layout); |
| 1946 cx_tree_link(&child1, &child3, tree_node_layout); |
1948 cx_tree_link(&child1, &child3, tree_node_layout); |
| 1947 CX_TEST_DO { |
1949 CX_TEST_DO { |
| 1948 CxTree *tree = cxTreeCreateWrapped(NULL, &root, tree_node_layout); |
1950 CxTree *tree = cxTreeCreateWrapped(NULL, &root, tree_node_layout); |
| 1949 CX_TEST_ASSERT(tree->cl != NULL); |
1951 CX_TEST_ASSERT(tree->cl != NULL); |
| 1950 CX_TEST_ASSERT(tree->allocator == cxDefaultAllocator); |
1952 CX_TEST_ASSERT(tree->collection.allocator == cxDefaultAllocator); |
| 1951 CX_TEST_ASSERT(tree->node_create == NULL); |
1953 CX_TEST_ASSERT(tree->node_create == NULL); |
| 1952 CX_TEST_ASSERT(tree->search == NULL); |
1954 CX_TEST_ASSERT(tree->search == NULL); |
| 1953 CX_TEST_ASSERT(tree->search_data == NULL); |
1955 CX_TEST_ASSERT(tree->search_data == NULL); |
| 1954 CX_TEST_ASSERT(tree->root == &root); |
1956 CX_TEST_ASSERT(tree->root == &root); |
| 1955 CX_TEST_ASSERT(tree->size == 4); |
1957 CX_TEST_ASSERT(tree->collection.size == 4); |
| 1956 CX_TEST_ASSERT(tree->simple_destructor == NULL); |
1958 CX_TEST_ASSERT(tree->collection.simple_destructor == NULL); |
| 1957 CX_TEST_ASSERT(tree->advanced_destructor == NULL); |
1959 CX_TEST_ASSERT(tree->collection.advanced_destructor == NULL); |
| 1958 CX_TEST_ASSERT(tree->destructor_data == NULL); |
1960 CX_TEST_ASSERT(tree->collection.destructor_data == NULL); |
| 1959 CX_TEST_ASSERT(tree->loc_parent == offsetof(tree_node, parent)); |
1961 CX_TEST_ASSERT(tree->loc_parent == offsetof(tree_node, parent)); |
| 1960 CX_TEST_ASSERT(tree->loc_children == offsetof(tree_node, children)); |
1962 CX_TEST_ASSERT(tree->loc_children == offsetof(tree_node, children)); |
| 1961 CX_TEST_ASSERT(tree->loc_last_child == -1); |
1963 CX_TEST_ASSERT(tree->loc_last_child == -1); |
| 1962 CX_TEST_ASSERT(tree->loc_prev == offsetof(tree_node, prev)); |
1964 CX_TEST_ASSERT(tree->loc_prev == offsetof(tree_node, prev)); |
| 1963 CX_TEST_ASSERT(tree->loc_next == offsetof(tree_node, next)); |
1965 CX_TEST_ASSERT(tree->loc_next == offsetof(tree_node, next)); |
| 2183 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
2185 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
| 2184 |
2186 |
| 2185 cxFree(alloc, usr); |
2187 cxFree(alloc, usr); |
| 2186 // for the subtree, we use a little trick and wrap it in a new tree |
2188 // for the subtree, we use a little trick and wrap it in a new tree |
| 2187 CxTree *foo_tree = cxTreeCreateWrapped(alloc, foo, tree_node_file_layout); |
2189 CxTree *foo_tree = cxTreeCreateWrapped(alloc, foo, tree_node_file_layout); |
| 2188 foo_tree->allocator = alloc; |
2190 foo_tree->collection.allocator = alloc; |
| 2189 foo_tree->advanced_destructor = (cx_destructor_func2 ) cxFree; |
2191 cxDefineAdvancedDestructor(foo_tree, cxFree, alloc); |
| 2190 foo_tree->destructor_data = alloc; |
|
| 2191 cxTreeFree(foo_tree); |
2192 cxTreeFree(foo_tree); |
| 2192 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
2193 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| 2193 } |
2194 } |
| 2194 cx_testing_allocator_destroy(&talloc); |
2195 cx_testing_allocator_destroy(&talloc); |
| 2195 } |
2196 } |
| 2303 CX_TEST_ASSERT(tree->root == NULL); |
2304 CX_TEST_ASSERT(tree->root == NULL); |
| 2304 CX_TEST_ASSERT(cxTreeDepth(tree) == 0); |
2305 CX_TEST_ASSERT(cxTreeDepth(tree) == 0); |
| 2305 cxTreeFree(tree); |
2306 cxTreeFree(tree); |
| 2306 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
2307 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
| 2307 CxTree *w = cxTreeCreateWrapped(alloc, root, tree_node_file_layout); |
2308 CxTree *w = cxTreeCreateWrapped(alloc, root, tree_node_file_layout); |
| 2308 w->advanced_destructor = (cx_destructor_func2) cxFree; |
2309 cxDefineAdvancedDestructor(w, cxFree, alloc); |
| 2309 w->destructor_data = alloc; |
|
| 2310 cxTreeDestroySubtree(w, w->root); |
2310 cxTreeDestroySubtree(w, w->root); |
| 2311 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
2311 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
| 2312 cxTreeFree(w); |
2312 cxTreeFree(w); |
| 2313 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
2313 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
| 2314 } |
2314 } |
| 2324 cx_tree_link(&root, &child1, tree_node_layout); |
2324 cx_tree_link(&root, &child1, tree_node_layout); |
| 2325 cx_tree_link(&root, &child2, tree_node_layout); |
2325 cx_tree_link(&root, &child2, tree_node_layout); |
| 2326 cx_tree_link(&child1, &child3, tree_node_layout); |
2326 cx_tree_link(&child1, &child3, tree_node_layout); |
| 2327 CX_TEST_DO { |
2327 CX_TEST_DO { |
| 2328 CxTree *tree = cxTreeCreateWrapped(cxDefaultAllocator, &root, tree_node_layout); |
2328 CxTree *tree = cxTreeCreateWrapped(cxDefaultAllocator, &root, tree_node_layout); |
| 2329 tree->simple_destructor = test_tree_high_simple_destructor_func; |
2329 cxDefineDestructor(tree,test_tree_high_simple_destructor_func); |
| 2330 cxTreeDestroyNode(tree, &child1, NULL); |
2330 cxTreeDestroyNode(tree, &child1, NULL); |
| 2331 cxTreeFree(tree); |
2331 cxTreeFree(tree); |
| 2332 CX_TEST_ASSERT(root.data == 1); |
2332 CX_TEST_ASSERT(root.data == 1); |
| 2333 CX_TEST_ASSERT(child1.data == 1); |
2333 CX_TEST_ASSERT(child1.data == 1); |
| 2334 CX_TEST_ASSERT(child2.data == 1); |
2334 CX_TEST_ASSERT(child2.data == 1); |