41void set_num_bit(
unsigned int number,
char *storage, STATUS status);
42BOOLEAN is_num_bit(
unsigned int number,
char *storage, STATUS status);
44static void set_quadrant(
RL_Node *node,
short quadrant, QUADRANT_STATUS status);
45static QUADRANT_STATUS quadrant_status(
RL_Node *node,
short quadrant);
47static void quadrant_interval(
RL_Tree *tree,
short quadrant, NUM interval,
49static NUM get_quadrant_node(
RL_Tree *tree, NUM node,
short quadrant,
51static unsigned int tree_size(
RL_Tree *tree, NUM node, NUM);
53int get_location(
RL_Tree *tree, NUM node,
short quadrant, NUM interval);
55long set_in(NUM number, NUM node, NUM node_num, NUM interval, NUM max,
57long compact_node(
RL_Tree *, NUM node, NUM next_node, NUM node_interval,
58 NUM next_node_interval, NUM next_node_num,
short quadrant,
61BOOLEAN in_tree(NUM number,
RL_Tree *tree, NUM node, NUM node_num,
63void display_tree(
RL_Tree *tree);
64void idisplay_tree(
RL_Tree *tree, NUM node, NUM node_num, NUM interval,
66static void display_leaf(
RL_Tree *tree, NUM node, NUM node_num, NUM max);
68NUM new_node(
RL_Tree *tree, NUM node_father,
short quadrant, NUM node_num,
69 NUM quad_min, NUM quad_max, STATUS);
70static void root_intervals(
RL_Tree *tree);
72NUM next_min(
RL_Tree *tree, NUM node, NUM node_num, NUM interval, NUM max,
74NUM tree_minus(
RL_Tree *r1,
RL_Tree *r2, NUM node1, NUM node2, NUM node_num,
75 NUM interval, NUM max);
78void shift_right(
RL_Tree *tree,
const NUM idx,
const long nnodes);
79void shift_left(
RL_Tree *tree,
const NUM idx,
const long nnodes);
80void intersect_leafs(
char *storage1,
char *storage2);
86unsigned int active_bits[16] = {1, 3, 7, 15, 31, 63,
87 127, 255, 511, 1023, 2047, 4095,
88 8191, 16383, 32767, 65535};
109 new->range_max = max_size;
113 new->root = (
RL_Node *)calloc(1, NODE_SIZE);
115 new->mem_alloc = NODE_SIZE;
121 buf_ptr[0].i_node.num_subnodes = 1;
124 buf_ptr->i_node.num_subnodes = 1;
125 quadrant_interval(
new, 1, max_size, &qi);
127 for (q = 2; q <= BRANCH_FACTOR; ++q) {
128 if (max_size < qi * (q - 1) + 1)
129 set_quadrant(new->root, q, R_IGNORE);
145 buf_ptr = (
RL_Node *)calloc(tree->size, NODE_SIZE);
151 if (buf_ptr == NULL) {
152 printf(
"buf_ptr==NULL---%lu", tree->size);
156 memmove(
new, tree,
sizeof(
RL_Tree));
157 memmove(buf_ptr, &tree->root[0], tree->size * NODE_SIZE);
159 new->mem_alloc = tree->size *NODE_SIZE;
169 if (range->mem_alloc != 0)
180 if (number > 0 && number <= tree->range_max)
181 set_in(number, ROOT(tree), 1, ROOT_INTERVAL(tree), tree->range_max, tree,
184 printf(
"Setting: %lu size=%lu\n", number, tree->size);
197void rl_all(
RL_Tree *tree, STATUS status) {
200 for (i = 1; i <= BRANCH_FACTOR; ++i)
201 if (quadrant_status(NODE(tree, ROOT(tree)), i) != R_IGNORE) {
203 set_quadrant(NODE(tree, ROOT(tree)), i, R_TOTALLY_IN_INTERVAL);
205 set_quadrant(NODE(tree, ROOT(tree)), i, R_NOT_IN_INTERVAL);
213BOOLEAN in_rl(
RL_Tree *tree, NUM number) {
214 if (number < 1 && number > tree->range_max)
216 return in_tree(number, tree, ROOT(tree), 1, ROOT_INTERVAL(tree));
222BOOLEAN freeze_rl(
RL_Tree *range) {
225 NUM s = range->size * NODE_SIZE;
226 if (s < range->mem_alloc) {
227 range->root = (
RL_Node *)realloc(range->root, s);
228 range->mem_alloc = s;
237 if (range1->range_max != range2->range_max)
246NUM rl_next_in_bigger(
RL_Tree *tree, NUM min) {
248 fprintf(stdout,
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%lu\n", min);
250 return next_min(tree, ROOT(tree), 1, ROOT_INTERVAL(tree), tree->range_max,
269static void quadrant_interval(
RL_Tree *tree,
short quadrant, NUM interval,
270 NUM *quad_interval) {
272 if (IS_ROOT(tree, interval)) {
273 *quad_interval = tree->root_i;
275 *quad_interval = NEXT_INTERVAL(interval);
280static void number_quadrant(NUM number,
RL_Tree *tree, NUM node_interval,
281 NUM node_num,
short *quadrant, NUM *quad_min,
283 NUM tmp = node_num - 1, quad_interval;
285 quadrant_interval(tree, 1, node_interval, &quad_interval);
286 i = (number - node_num) / quad_interval + 1;
287 tmp = node_num - 1 + quad_interval * i;
290 *quad_min = tmp - quad_interval + 1;
298static NUM get_quadrant_node(
RL_Tree *tree, NUM node,
short quadrant,
300 int d = get_location(tree, node, quadrant, interval);
310void shift_right(
RL_Tree *tree,
const NUM idx,
const long nnodes) {
311 long n = idx + nnodes;
318 s[n + 1].leaf = s[n].leaf;
325void shift_left(
RL_Tree *tree,
const NUM idx,
const long nnodes) {
334 while (n < idx + nnodes) {
335 s[n].leaf = s[n + 1].leaf;
347NUM new_node(
RL_Tree *tree, NUM node_father,
short quadrant,
348 NUM father_interval, NUM quad_min, NUM quad_max, STATUS status) {
350 NUM new_interval = +NEXT_INTERVAL(father_interval);
354 new = get_quadrant_node(tree, node_father, quadrant, father_interval);
356 if (tree->mem_alloc != 0) {
358 if (REALLOC_MEM(tree)) {
361 ptr = (
RL_Node *)realloc(tree->root, MEM_SIZE(tree));
363 fprintf(stderr,
"Fatal error:range_list: Unable to allocate memory");
367 tree->mem_alloc = MEM_SIZE(tree);
370 times = tree->size - 1 -
new;
371 shift_right(tree,
new, times);
375 set_quadrant(NODE(tree, node_father), quadrant, R_PARCIALLY_IN_INTERVAL);
378 ALL_OUT(NODE(tree,
new));
379 if (!IS_LEAF(new_interval)) {
381 RL_Node *node_ptr = NODE(tree,
new);
382 node_ptr->i_node.num_subnodes = 1;
383 for (q = 2; q <= BRANCH_FACTOR; ++q)
384 if (MIN(quad_max, tree->range_max) <
386 NEXT_INTERVAL(new_interval) * (q - 1))
387 set_quadrant(NODE(tree,
new), q, R_IGNORE);
392 tree->root[
new].leaf = ON_BITS(MIN(16, tree->range_max - quad_min + 1));
393 if (!IS_LEAF(new_interval)) {
395 RL_Node *node_ptr = NODE(tree,
new);
396 node_ptr->i_node.num_subnodes = 1;
397 node_ptr->i_node.quadrant_1 = node_ptr->i_node.quadrant_2 =
398 node_ptr->i_node.quadrant_3 = node_ptr->i_node.quadrant_4 =
399 R_TOTALLY_IN_INTERVAL;
400 for (q = 2; q <= BRANCH_FACTOR; ++q)
401 if (MIN(quad_max, tree->range_max) <
403 NEXT_INTERVAL(new_interval) * (q - 1))
404 set_quadrant(NODE(tree,
new), q, R_IGNORE);
416int get_location(
RL_Tree *tree, NUM node,
short quadrant, NUM node_interval) {
421 if (quadrant == 1 || IS_LEAF(node_interval))
425 if (LAST_LEVEL_INODE(node_interval)) {
427 for (i = 1; i < quadrant; ++i) {
428 if (quadrant_status(NODE(tree, node), i) == R_PARCIALLY_IN_INTERVAL)
436 quadrant_interval(tree, quadrant, node_interval, &next_interval);
438 next_node = node + 1;
439 while (i != quadrant && i <= BRANCH_FACTOR) {
440 if (quadrant_status(NODE(tree, node), i) == R_PARCIALLY_IN_INTERVAL) {
441 tmp = tree_size(tree, next_node, next_interval);
459long set_in(NUM number, NUM node, NUM node_num, NUM node_interval, NUM max,
460 RL_Tree *tree, STATUS status) {
462 long ret_val = tree->size, compacted;
463 NUM interval = node_interval;
464 NUM quad_min, quad_max;
468 if (IS_LEAF(interval)) {
470 set_num_bit(number - node_num, (
char *)NODE(tree, node), status);
474 number_quadrant(number, tree, node_interval, node_num, &quadrant, &quad_min,
476 interval = quad_max - quad_min + 1;
481 if (quadrant_status(NODE(tree, node), quadrant) == R_NOT_IN_INTERVAL) {
484 next_node = new_node(tree, node, quadrant, node_interval, quad_min,
486 }
else if (quadrant_status(NODE(tree, node), quadrant) ==
487 R_TOTALLY_IN_INTERVAL)
490 next_node = get_quadrant_node(tree, node, quadrant, node_interval);
493 if (quadrant_status(NODE(tree, node), quadrant) == R_TOTALLY_IN_INTERVAL) {
495 next_node = new_node(tree, node, quadrant, node_interval, quad_min,
497 }
else if (quadrant_status(NODE(tree, node), quadrant) == R_NOT_IN_INTERVAL)
500 next_node = get_quadrant_node(tree, node, quadrant, node_interval);
503 printf(
"set_in: invalid number status %d\n", status);
507 set_in(number, next_node, quad_min, interval, quad_max, tree, status);
508 ret_val = tree->size - ret_val;
512 if (compacted == -1) {
514 shift_left(tree, next_node, 1);
516 tree->size += compacted;
517 ret_val += compacted;
521 if (tree->root[node].i_node.num_subnodes == 255)
522 size = tree_size(tree, node, interval);
524 size = ret_val + tree->root[node].i_node.num_subnodes;
527 tree->root[node].i_node.num_subnodes = 255;
529 tree->root[node].i_node.num_subnodes = size;
539long compact_node(
RL_Tree *tree, NUM node, NUM next_node, NUM node_interval,
540 NUM next_node_interval, NUM next_node_num,
short quadrant,
544 RL_Node *node_ptr = NODE(tree, next_node);
547 if (IS_LEAF(next_node_interval)) {
549 fprintf(stderr,
"compact_node: interval node\n");
552 if (LEAF_ALL_IN(node_ptr->leaf)) {
553 set_quadrant(NODE(tree, node), quadrant, R_TOTALLY_IN_INTERVAL);
558 if (max - next_node_num + 1 <= LEAF_SIZE) {
559 j = ON_BITS(max - next_node_num + 1);
561 if (node_ptr->leaf == j) {
562 set_quadrant(NODE(tree, node), quadrant, R_TOTALLY_IN_INTERVAL);
567 if (LEAF_ALL_OUT(node_ptr->leaf)) {
568 set_quadrant(NODE(tree, node), quadrant, R_NOT_IN_INTERVAL);
570 printf(
">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>compacted leaf1\n");
576 fprintf(stderr,
"compact_node:range node\n");
579 if (node_ptr->i_node.num_subnodes > 1)
582 for (j = 1; j <= BRANCH_FACTOR; ++j)
583 if (quadrant_status(NODE(tree, next_node), j) != R_IGNORE &&
584 quadrant_status(NODE(tree, next_node), j) != R_TOTALLY_IN_INTERVAL)
587 if (j > BRANCH_FACTOR) {
588 set_quadrant(NODE(tree, node), quadrant, R_TOTALLY_IN_INTERVAL);
592 for (j = 1; j <= BRANCH_FACTOR; ++j)
593 if (quadrant_status(NODE(tree, next_node), j) != R_IGNORE &&
594 quadrant_status(NODE(tree, next_node), j) != R_NOT_IN_INTERVAL)
597 if (j > BRANCH_FACTOR) {
598 set_quadrant(NODE(tree, node), quadrant, R_NOT_IN_INTERVAL);
608static unsigned int tree_size(
RL_Tree *tree, NUM node, NUM interval) {
609 unsigned int c = 1, tmp;
614 RL_Node *node_ptr = NODE(tree, node);
616 if (IS_LEAF(interval))
619 if (node_ptr->i_node.num_subnodes == 255) {
621 next_interval = NEXT_INTERVAL(interval);
622 for (i = 1; i <= BRANCH_FACTOR; ++i) {
623 status = quadrant_status(NODE(tree, node), i);
625 case R_PARCIALLY_IN_INTERVAL:
626 next_node = node + c;
627 tmp = tree_size(tree, next_node, next_interval);
633 c = node_ptr->i_node.num_subnodes;
639void set_num_bit(
unsigned int number,
char *storage, STATUS status) {
645 BITMAP_insert(*storage, number);
647 BITMAP_delete(*storage, number);
651BOOLEAN is_num_bit(
unsigned int number,
char *storage, STATUS status) {
657 return BITMAP_member(*storage, number);
659 return !BITMAP_member(*storage, number);
664static void set_quadrant(
RL_Node *node,
short quadrant,
665 QUADRANT_STATUS status) {
669 node->i_node.quadrant_1 = status;
672 node->i_node.quadrant_2 = status;
675 node->i_node.quadrant_3 = status;
678 node->i_node.quadrant_4 = status;
681 fprintf(stderr,
"ERROR: set_quadrant: invalid quadrant %d(%d)\n", quadrant,
688static QUADRANT_STATUS quadrant_status(
RL_Node *node,
short quadrant) {
692 return node->i_node.quadrant_1;
694 return node->i_node.quadrant_2;
696 return node->i_node.quadrant_3;
698 return node->i_node.quadrant_4;
700 fprintf(stderr,
"ERROR: quadrant_status: invalid quadrant(%d)\n", quadrant);
708static BOOLEAN in_leaf(NUM number,
RL_Tree *tree, NUM node, NUM node_num,
711 if (is_num_bit(number - node_num, (
char *)NODE(tree, node), IN))
720BOOLEAN in_tree(NUM number,
RL_Tree *tree, NUM node, NUM node_num,
724 NUM interval = node_interval;
725 NUM max = MIN(node_num + interval, tree->range_max);
726 NUM quad_min, quad_max;
729 if (IS_LEAF(interval))
731 return in_leaf(number, tree, node, node_num, max);
733 number_quadrant(number, tree, node_interval, node_num, &quadrant, &quad_min,
735 interval = quad_max - quad_min + 1;
738 if (quadrant_status(NODE(tree, node), quadrant) == R_PARCIALLY_IN_INTERVAL) {
739 next_node = get_quadrant_node(tree, node, quadrant, node_interval);
740 return in_tree(number, tree, next_node, node_num, interval);
742 if (quadrant_status(NODE(tree, node), quadrant) == R_TOTALLY_IN_INTERVAL)
757static void display_leaf(
RL_Tree *tree, NUM node, NUM node_num, NUM max) {
761 for (i = 0; i < LEAF_SIZE; ++i)
762 if (is_num_bit(i, (
char *)NODE(tree, node), IN))
763 printf(
",%lu", node_num + i);
771void display_tree(
RL_Tree *tree) {
782 printf(
"Size:%lu -[1,%lu]\n", tree->size, tree->range_max);
783 qi = ROOT_INTERVAL(tree) / BRANCH_FACTOR;
785 for (i = 1; i <= BRANCH_FACTOR; ++i) {
790 status = quadrant_status(NODE(tree, 0), i);
792 case R_PARCIALLY_IN_INTERVAL:
793 next_node = get_quadrant_node(tree, ROOT(tree), i, qi * BRANCH_FACTOR);
794 idisplay_tree(tree, next_node, init, qi, max);
796 case R_TOTALLY_IN_INTERVAL:
797 printf(
",[%lu-%lu]", init, MIN(max, tree->range_max));
803 printf(
",]%lu-%lu[", init, MIN(max, tree->range_max));
812void idisplay_tree(
RL_Tree *tree, NUM node, NUM node_num, NUM interval,
821 if (IS_LEAF(interval))
822 return display_leaf(tree, node, node_num, MIN(max, tree->range_max));
824 interval2 = NEXT_INTERVAL(interval);
826 for (quadrant = 1; quadrant <= BRANCH_FACTOR; ++quadrant) {
827 node_num2 = node_num + (quadrant - 1) * interval2;
828 quadrant_max = QUADRANT_MAX_VALUE(node_num, quadrant, interval2, max);
829 status = quadrant_status(NODE(tree, node), quadrant);
831 case R_PARCIALLY_IN_INTERVAL:
832 next_node = get_quadrant_node(tree, node, quadrant, interval);
833 if (IS_LEAF(interval2))
834 display_leaf(tree, next_node, node_num2,
835 MIN(quadrant_max, tree->range_max));
837 idisplay_tree(tree, next_node, node_num2, interval2, quadrant_max);
839 case R_TOTALLY_IN_INTERVAL:
840 printf(
",[%lu-%lu]", node_num2, MIN(node_num2 + interval2 - 1, max));
845 printf(
",]%lu-%lu[", node_num2,
846 MIN(tree->range_max, node_num2 + interval2 - 1));
853static NUM next_in_leaf(
RL_Tree *tree, NUM node, NUM node_num, NUM max,
860 for (; number <= max; ++number)
861 if (is_num_bit(number - node_num, (
char *)NODE(tree, node), IN)) {
873NUM next_min(
RL_Tree *tree, NUM node, NUM node_num, NUM interval, NUM max,
882 if (min > tree->range_max)
884 if (IS_LEAF(interval))
885 return next_in_leaf(tree, node, node_num, MIN(max, tree->range_max), min);
887 interval2 = NEXT_INTERVAL(interval);
889 for (quadrant = 1; quadrant <= BRANCH_FACTOR; ++quadrant) {
891 node_num2 = node_num + (quadrant - 1) * interval2;
892 quadrant_max = QUADRANT_MAX_VALUE(node_num, quadrant, interval2, max);
894 status = quadrant_status(NODE(tree, node), quadrant);
896 case R_PARCIALLY_IN_INTERVAL:
897 next_node = get_quadrant_node(tree, node, quadrant, interval);
899 next_min(tree, next_node, node_num2, interval2, quadrant_max, min);
903 case R_TOTALLY_IN_INTERVAL:
904 if (min <= quadrant_max && min >= node_num2)
917void intersect_leafs(
char *storage1,
char *storage2) {
919 BITMAP_difference(*storage1, *storage1, *storage2);
922 BITMAP_difference(*storage1, *storage1, *storage2);
988static NUM norm_tree_size(NUM interval) {
990 NUM j = BRANCH_FACTOR;
993 if (interval <= LEAF_SIZE * BRANCH_FACTOR)
997 if (tmp * BRANCH_FACTOR >= interval)
1005static void root_intervals(
RL_Tree *tree) {
1008 first_i = norm_tree_size(tree->range_max);
1011 tree->root_i = first_i;
1013 if (tree->root_i * BRANCH_FACTOR < tree->range_max) {
1014 tree->root_i = tree->root_i * BRANCH_FACTOR;
RL_Tree * minus_rl(RL_Tree *range1, RL_Tree *range2)
range list core data-structures