示例#1
0
文件: main.c 项目: jackalexcasey/doc
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" );
}
示例#3
0
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);
}
示例#4
0
文件: main.c 项目: jackalexcasey/doc
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;
}
示例#5
0
文件: main.c 项目: jackalexcasey/doc
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;
}
示例#6
0
文件: map.c 项目: lixiao89/MBot
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 );
    }
  }
}
示例#8
0
文件: map.c 项目: lixiao89/MBot
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" );
}
示例#9
0
/**
 * 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);
}