| | 590 | /******************************************** |
|---|
| | 591 | * Balance an array. |
|---|
| | 592 | */ |
|---|
| | 593 | |
|---|
| | 594 | void _aaBalance(AA* paa) |
|---|
| | 595 | { |
|---|
| | 596 | //printf("_aaBalance()\n"); |
|---|
| | 597 | if (paa.a) |
|---|
| | 598 | { |
|---|
| | 599 | aaA*[16] tmp; |
|---|
| | 600 | aaA*[] array = tmp; |
|---|
| | 601 | |
|---|
| | 602 | auto aa = paa.a; |
|---|
| | 603 | foreach (j, e; aa.b) |
|---|
| | 604 | { |
|---|
| | 605 | /* Temporarily store contents of bucket in array[] |
|---|
| | 606 | */ |
|---|
| | 607 | size_t k = 0; |
|---|
| | 608 | |
|---|
| | 609 | void addToArray(aaA* e) |
|---|
| | 610 | { |
|---|
| | 611 | while (e) |
|---|
| | 612 | { addToArray(e.left); |
|---|
| | 613 | if (k == array.length) |
|---|
| | 614 | array.length = array.length * 2; |
|---|
| | 615 | array[k++] = e; |
|---|
| | 616 | e = e.right; |
|---|
| | 617 | } |
|---|
| | 618 | } |
|---|
| | 619 | |
|---|
| | 620 | addToArray(e); |
|---|
| | 621 | |
|---|
| | 622 | /* The contents of the bucket are now sorted into array[]. |
|---|
| | 623 | * Rebuild the tree. |
|---|
| | 624 | */ |
|---|
| | 625 | |
|---|
| | 626 | void buildTree(aaA** p, size_t x1, size_t x2) |
|---|
| | 627 | { |
|---|
| | 628 | if (x1 >= x2) |
|---|
| | 629 | *p = null; |
|---|
| | 630 | else |
|---|
| | 631 | { auto mid = (x1 + x2) >> 1; |
|---|
| | 632 | *p = array[mid]; |
|---|
| | 633 | buildTree(&(*p).left, x1, mid); |
|---|
| | 634 | buildTree(&(*p).right, mid + 1, x2); |
|---|
| | 635 | } |
|---|
| | 636 | } |
|---|
| | 637 | |
|---|
| | 638 | auto p = &aa.b[j]; |
|---|
| | 639 | buildTree(p, 0, k); |
|---|
| | 640 | } |
|---|
| | 641 | } |
|---|
| | 642 | } |
|---|