int main(void) { int x; struct data d; struct tree *t,*p,*q; d.val = value[0]; t = alloc_tree(&d); //root node x=1; while(value[x]!=0){ d.val = value[x]; p = t; /* get to the leaf */ while(p!=NULL){ q = p; //Remember the last valid p if(d.val > p->d.val) p = right(p); else p = left(p); } if(d.val > q->d.val) set_right(q,&d); else set_left(q,&d); x++; } inorder_trav(t); return 0; }
void initialize_qtree( carmen_vascocore_quad_tree_t * tree, int size_x, int size_y) { int i,v,nlevel = max( (int) ceil(log10(size_x)/log10(2)), (int) ceil(log10(size_y)/log10(2)) ); carmen_svec2_t center; if (carmen_vascocore_settings.verbose) fprintf( stderr, "* INFO: num levels = %d\n", nlevel ); v = 1; for (i=0;i<nlevel;i++) v=v*2; if (carmen_vascocore_settings.verbose) { fprintf( stderr, "* INFO: size = %d/%d\n", size_x, size_y ); fprintf( stderr, "* INFO: poss. max size = %d/%d\n", v, v ); } center.x = v-1; center.y = v-1; if (carmen_vascocore_settings.verbose) { fprintf( stderr, "* INFO: tree center: %5.1f %5.1f\n", center.x/2.0, center.y/2.0 ); fprintf( stderr, "* INFO: tree step: %5.1f %5.1f\n", 0.5*(v/2), 0.5*(v/2) ); fprintf( stderr, "* INFO: allocate tree: ... " ); } alloc_tree( tree, nlevel, center, v ); if (carmen_vascocore_settings.verbose) fprintf( stderr, "done\n" ); }
static void test_empty_tree() { tree_t *tree = alloc_tree(); ASSERT(get_child_by_index(tree->shadow_root, 0)->checksum_valid == false); update_checksums(tree); ASSERT(get_child_by_index(tree->shadow_root, 0)->checksum_valid == true); }
int set_right(struct tree *t, struct data *d) { if(!t) return -1; t->right = alloc_tree(d); if(!t->right) return -1; return 0; }
int set_left(struct tree* t, struct data *d) { if(!t) return -1; t->left = alloc_tree(d); if(!t->left) return -1; return 0; }
void alloc_tree( QUAD_TREE * tree, int level, logtools_svector2_t center, short stepsize ) { int i; short nstepsize = stepsize/2; tree->center = center; tree->level = level; tree->inuse = FALSE; if (level>0) { for( i=0; i<4; i++) { tree->elem[i] = (QUAD_TREE *) malloc( sizeof(QUAD_TREE) ); alloc_tree( tree->elem[i], level-1, newcenter( center, i, nstepsize ), nstepsize ); } } }
void alloc_tree( carmen_vascocore_quad_tree_t * tree, int level, carmen_svec2_t center, short stepsize ) { int i; short nstepsize = stepsize/2; tree->center = center; tree->level = level; tree->inuse = FALSE; if (level>0) { for( i=0; i<4; i++) { tree->elem[i] = (carmen_vascocore_quad_tree_t *) malloc( sizeof(carmen_vascocore_quad_tree_t) ); carmen_test_alloc(tree->elem[i]); alloc_tree( tree->elem[i], level-1, newcenter( center, i, nstepsize ), nstepsize ); } } }
void initialize_qtree( QUAD_TREE * tree, int size_x, int size_y) { int i,v,nlevel = max( (int) ceil(log10(size_x)/log10(2)), (int) ceil(log10(size_y)/log10(2)) ); logtools_svector2_t center; fprintf( stderr, "* INFO: num levels = %d\n", nlevel ); v = 1; for (i=0;i<nlevel;i++) v=v*2; fprintf( stderr, "* INFO: size = %d/%d\n", size_x, size_y ); fprintf( stderr, "* INFO: poss. max size = %d/%d\n", v, v ); center.x = v-1; center.y = v-1; fprintf( stderr, "* INFO: tree center: %5.1f %5.1f\n", center.x/2.0, center.y/2.0 ); fprintf( stderr, "* INFO: tree step: %5.1f %5.1f\n", 0.5*(v/2), 0.5*(v/2) ); fprintf( stderr, "* INFO: allocate tree: ... " ); alloc_tree( tree, nlevel, center, v ); fprintf( stderr, "done\n" ); }
/** * Verify that when a path is added or removed, the affected paths have their * checksums invalidated. */ static void test_updates_reset_checksums() { uint8_t checksum[SHA1_BYTES]; for (int ix = 0; ix < SHA1_BYTES; ix++) { checksum[ix] = (uint8_t) ix; } tree_t *tree = alloc_tree(); char *paths_to_add[] = { "abc", "ab/def", "ab/defg/hi", "ab/defg/h/ij/kl", "ab/defg/h/ijk", "ab/defg/h/i/jkl/mn/op/qr", "ab/defg/h/i/jkl/mn/op/qrs", }; const size_t num_paths = sizeof(paths_to_add) / sizeof(*paths_to_add); for (size_t ix = 0; ix < num_paths; ix++) { add_update_path_result_t add_result = add_or_update_path(tree, STRPLUSLEN(paths_to_add[ix]), checksum, SHA1_BYTES, 0); ASSERT(add_result == ADD_UPDATE_PATH_OK); } update_checksums(tree); ASSERT(get_child_by_index(tree->shadow_root, 0)->checksum_valid == true); ASSERT(add_or_update_path(tree, STRPLUSLEN("ab/defg/h/ijk"), checksum, SHA1_BYTES, 0) == ADD_UPDATE_PATH_OK); path_checksum_t dirs_to_check_after_add[] = { {"abc", true}, {"ab/", false}, {"ab/defg/", false}, {"ab/defg/h/", false}, {"ab/defg/h/i/", true}, {"ab/defg/h/i/jkl/", true}, {"ab/defg/h/i/jkl/mn/", true}, {"ab/defg/h/i/jkl/mn/op/", true}, {"ab/defg/h/ij/", true}, }; size_t num_dirs = sizeof(dirs_to_check_after_add) / sizeof(*dirs_to_check_after_add); for (size_t ix = 0; ix < num_dirs; ix++) { get_path_unfiltered_result_t get_result = get_path_unfiltered(tree, STRPLUSLEN(dirs_to_check_after_add[ix].path)); ASSERT(get_result.code == GET_PATH_OK); ASSERT(get_result.node->checksum_valid == dirs_to_check_after_add[ix].expected_checksum_valid); } ASSERT(get_child_by_index(tree->shadow_root, 0)->checksum_valid == false); update_checksums(tree); ASSERT(get_child_by_index(tree->shadow_root, 0)->checksum_valid == true); ASSERT(remove_path(tree, STRPLUSLEN("ab/defg/h/i/jkl/mn/op/qrs")) == REMOVE_PATH_OK); path_checksum_t dirs_to_check_after_remove[] = { {"abc", true}, {"ab/", false}, {"ab/defg/", false}, {"ab/defg/h/", false}, {"ab/defg/h/i/", false}, {"ab/defg/h/i/jkl/", false}, {"ab/defg/h/i/jkl/mn/", false}, {"ab/defg/h/i/jkl/mn/op/", false}, {"ab/defg/h/ij/", true}, }; num_dirs = sizeof(dirs_to_check_after_remove) / sizeof(*dirs_to_check_after_remove); for (size_t ix = 0; ix < num_dirs; ix++) { get_path_unfiltered_result_t get_result = get_path_unfiltered(tree, STRPLUSLEN(dirs_to_check_after_remove[ix].path)); ASSERT(get_result.code == GET_PATH_OK); ASSERT(get_result.node->checksum_valid == dirs_to_check_after_remove[ix].expected_checksum_valid); } ASSERT(get_child_by_index(tree->shadow_root, 0)->checksum_valid == false); }