0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158 #include "test_util.h"
0159 #include "sparsebit.h"
0160 #include <limits.h>
0161 #include <assert.h>
0162
0163 #define DUMP_LINE_MAX 100
0164
0165 typedef uint32_t mask_t;
0166 #define MASK_BITS (sizeof(mask_t) * CHAR_BIT)
0167
0168 struct node {
0169 struct node *parent;
0170 struct node *left;
0171 struct node *right;
0172 sparsebit_idx_t idx;
0173 sparsebit_num_t num_after;
0174 mask_t mask;
0175 };
0176
0177 struct sparsebit {
0178
0179
0180
0181
0182
0183 struct node *root;
0184
0185
0186
0187
0188
0189
0190
0191 sparsebit_num_t num_set;
0192 };
0193
0194
0195
0196
0197 static sparsebit_num_t node_num_set(struct node *nodep)
0198 {
0199 return nodep->num_after + __builtin_popcount(nodep->mask);
0200 }
0201
0202
0203
0204
0205 static struct node *node_first(struct sparsebit *s)
0206 {
0207 struct node *nodep;
0208
0209 for (nodep = s->root; nodep && nodep->left; nodep = nodep->left)
0210 ;
0211
0212 return nodep;
0213 }
0214
0215
0216
0217
0218
0219 static struct node *node_next(struct sparsebit *s, struct node *np)
0220 {
0221 struct node *nodep = np;
0222
0223
0224
0225
0226
0227 if (nodep->right) {
0228 for (nodep = nodep->right; nodep->left; nodep = nodep->left)
0229 ;
0230 return nodep;
0231 }
0232
0233
0234
0235
0236
0237 while (nodep->parent && nodep == nodep->parent->right)
0238 nodep = nodep->parent;
0239
0240 return nodep->parent;
0241 }
0242
0243
0244
0245
0246
0247 static struct node *node_prev(struct sparsebit *s, struct node *np)
0248 {
0249 struct node *nodep = np;
0250
0251
0252
0253
0254
0255 if (nodep->left) {
0256 for (nodep = nodep->left; nodep->right; nodep = nodep->right)
0257 ;
0258 return (struct node *) nodep;
0259 }
0260
0261
0262
0263
0264
0265 while (nodep->parent && nodep == nodep->parent->left)
0266 nodep = nodep->parent;
0267
0268 return (struct node *) nodep->parent;
0269 }
0270
0271
0272
0273
0274
0275
0276 static struct node *node_copy_subtree(struct node *subtree)
0277 {
0278 struct node *root;
0279
0280
0281 root = calloc(1, sizeof(*root));
0282 if (!root) {
0283 perror("calloc");
0284 abort();
0285 }
0286
0287 root->idx = subtree->idx;
0288 root->mask = subtree->mask;
0289 root->num_after = subtree->num_after;
0290
0291
0292 if (subtree->left) {
0293 root->left = node_copy_subtree(subtree->left);
0294 root->left->parent = root;
0295 }
0296
0297 if (subtree->right) {
0298 root->right = node_copy_subtree(subtree->right);
0299 root->right->parent = root;
0300 }
0301
0302 return root;
0303 }
0304
0305
0306
0307
0308
0309
0310 static struct node *node_find(struct sparsebit *s, sparsebit_idx_t idx)
0311 {
0312 struct node *nodep;
0313
0314
0315 for (nodep = s->root; nodep;
0316 nodep = nodep->idx > idx ? nodep->left : nodep->right) {
0317 if (idx >= nodep->idx &&
0318 idx <= nodep->idx + MASK_BITS + nodep->num_after - 1)
0319 break;
0320 }
0321
0322 return nodep;
0323 }
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333 static struct node *node_add(struct sparsebit *s, sparsebit_idx_t idx)
0334 {
0335 struct node *nodep, *parentp, *prev;
0336
0337
0338 nodep = calloc(1, sizeof(*nodep));
0339 if (!nodep) {
0340 perror("calloc");
0341 abort();
0342 }
0343
0344 nodep->idx = idx & -MASK_BITS;
0345
0346
0347 if (!s->root) {
0348 s->root = nodep;
0349 return nodep;
0350 }
0351
0352
0353
0354
0355
0356 parentp = s->root;
0357 while (true) {
0358 if (idx < parentp->idx) {
0359 if (!parentp->left) {
0360 parentp->left = nodep;
0361 nodep->parent = parentp;
0362 break;
0363 }
0364 parentp = parentp->left;
0365 } else {
0366 assert(idx > parentp->idx + MASK_BITS + parentp->num_after - 1);
0367 if (!parentp->right) {
0368 parentp->right = nodep;
0369 nodep->parent = parentp;
0370 break;
0371 }
0372 parentp = parentp->right;
0373 }
0374 }
0375
0376
0377
0378
0379
0380
0381 prev = node_prev(s, nodep);
0382 while (prev && prev->idx + MASK_BITS + prev->num_after - 1 >= nodep->idx) {
0383 unsigned int n1 = (prev->idx + MASK_BITS + prev->num_after - 1)
0384 - nodep->idx;
0385 assert(prev->num_after > 0);
0386 assert(n1 < MASK_BITS);
0387 assert(!(nodep->mask & (1 << n1)));
0388 nodep->mask |= (1 << n1);
0389 prev->num_after--;
0390 }
0391
0392 return nodep;
0393 }
0394
0395
0396 bool sparsebit_all_set(struct sparsebit *s)
0397 {
0398
0399
0400
0401
0402
0403 return s->root && s->num_set == 0;
0404 }
0405
0406
0407
0408
0409 static void node_rm(struct sparsebit *s, struct node *nodep)
0410 {
0411 struct node *tmp;
0412 sparsebit_num_t num_set;
0413
0414 num_set = node_num_set(nodep);
0415 assert(s->num_set >= num_set || sparsebit_all_set(s));
0416 s->num_set -= node_num_set(nodep);
0417
0418
0419 if (nodep->left && nodep->right) {
0420
0421
0422
0423
0424 for (tmp = nodep->right; tmp->left; tmp = tmp->left)
0425 ;
0426 tmp->left = nodep->left;
0427 nodep->left = NULL;
0428 tmp->left->parent = tmp;
0429 }
0430
0431
0432 if (nodep->left) {
0433 if (!nodep->parent) {
0434 s->root = nodep->left;
0435 nodep->left->parent = NULL;
0436 } else {
0437 nodep->left->parent = nodep->parent;
0438 if (nodep == nodep->parent->left)
0439 nodep->parent->left = nodep->left;
0440 else {
0441 assert(nodep == nodep->parent->right);
0442 nodep->parent->right = nodep->left;
0443 }
0444 }
0445
0446 nodep->parent = nodep->left = nodep->right = NULL;
0447 free(nodep);
0448
0449 return;
0450 }
0451
0452
0453
0454 if (nodep->right) {
0455 if (!nodep->parent) {
0456 s->root = nodep->right;
0457 nodep->right->parent = NULL;
0458 } else {
0459 nodep->right->parent = nodep->parent;
0460 if (nodep == nodep->parent->left)
0461 nodep->parent->left = nodep->right;
0462 else {
0463 assert(nodep == nodep->parent->right);
0464 nodep->parent->right = nodep->right;
0465 }
0466 }
0467
0468 nodep->parent = nodep->left = nodep->right = NULL;
0469 free(nodep);
0470
0471 return;
0472 }
0473
0474
0475 if (!nodep->parent) {
0476 s->root = NULL;
0477 } else {
0478 if (nodep->parent->left == nodep)
0479 nodep->parent->left = NULL;
0480 else {
0481 assert(nodep == nodep->parent->right);
0482 nodep->parent->right = NULL;
0483 }
0484 }
0485
0486 nodep->parent = nodep->left = nodep->right = NULL;
0487 free(nodep);
0488
0489 return;
0490 }
0491
0492
0493
0494
0495
0496
0497
0498 static struct node *node_split(struct sparsebit *s, sparsebit_idx_t idx)
0499 {
0500 struct node *nodep1, *nodep2;
0501 sparsebit_idx_t offset;
0502 sparsebit_num_t orig_num_after;
0503
0504 assert(!(idx % MASK_BITS));
0505
0506
0507
0508
0509
0510 nodep1 = node_find(s, idx);
0511 if (!nodep1)
0512 return node_add(s, idx);
0513
0514
0515
0516
0517
0518 if (nodep1->idx == idx)
0519 return nodep1;
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530 offset = idx - (nodep1->idx + MASK_BITS);
0531 orig_num_after = nodep1->num_after;
0532
0533
0534
0535
0536
0537 nodep1->num_after = offset;
0538 nodep2 = node_add(s, idx);
0539
0540
0541 nodep2->num_after = orig_num_after - offset;
0542 if (nodep2->num_after >= MASK_BITS) {
0543 nodep2->mask = ~(mask_t) 0;
0544 nodep2->num_after -= MASK_BITS;
0545 } else {
0546 nodep2->mask = (1 << nodep2->num_after) - 1;
0547 nodep2->num_after = 0;
0548 }
0549
0550 return nodep2;
0551 }
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599 static void node_reduce(struct sparsebit *s, struct node *nodep)
0600 {
0601 bool reduction_performed;
0602
0603 do {
0604 reduction_performed = false;
0605 struct node *prev, *next, *tmp;
0606
0607
0608
0609
0610 if (nodep->mask == 0 && nodep->num_after == 0) {
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632 tmp = node_next(s, nodep);
0633 if (!tmp)
0634 tmp = node_prev(s, nodep);
0635
0636 node_rm(s, nodep);
0637 nodep = NULL;
0638
0639 nodep = tmp;
0640 reduction_performed = true;
0641 continue;
0642 }
0643
0644
0645
0646
0647
0648 if (nodep->mask == 0) {
0649 assert(nodep->num_after != 0);
0650 assert(nodep->idx + MASK_BITS > nodep->idx);
0651
0652 nodep->idx += MASK_BITS;
0653
0654 if (nodep->num_after >= MASK_BITS) {
0655 nodep->mask = ~0;
0656 nodep->num_after -= MASK_BITS;
0657 } else {
0658 nodep->mask = (1u << nodep->num_after) - 1;
0659 nodep->num_after = 0;
0660 }
0661
0662 reduction_performed = true;
0663 continue;
0664 }
0665
0666
0667
0668
0669
0670 prev = node_prev(s, nodep);
0671 if (prev) {
0672 sparsebit_idx_t prev_highest_bit;
0673
0674
0675 if (prev->mask == 0 && prev->num_after == 0) {
0676 node_rm(s, prev);
0677
0678 reduction_performed = true;
0679 continue;
0680 }
0681
0682
0683
0684
0685
0686 if (nodep->mask + 1 == 0 &&
0687 prev->idx + MASK_BITS == nodep->idx) {
0688 prev->num_after += MASK_BITS + nodep->num_after;
0689 nodep->mask = 0;
0690 nodep->num_after = 0;
0691
0692 reduction_performed = true;
0693 continue;
0694 }
0695
0696
0697
0698
0699
0700
0701 prev_highest_bit = prev->idx + MASK_BITS - 1 + prev->num_after;
0702 if (prev_highest_bit + 1 == nodep->idx &&
0703 (nodep->mask | (nodep->mask >> 1)) == nodep->mask) {
0704
0705
0706
0707
0708
0709
0710
0711 unsigned int num_contiguous
0712 = __builtin_popcount(nodep->mask);
0713 assert((num_contiguous > 0) &&
0714 ((1ULL << num_contiguous) - 1) == nodep->mask);
0715
0716 prev->num_after += num_contiguous;
0717 nodep->mask = 0;
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732 if (num_contiguous == MASK_BITS) {
0733 prev->num_after += nodep->num_after;
0734 nodep->num_after = 0;
0735 }
0736
0737 reduction_performed = true;
0738 continue;
0739 }
0740 }
0741
0742
0743
0744
0745
0746 next = node_next(s, nodep);
0747 if (next) {
0748
0749 if (next->mask == 0 && next->num_after == 0) {
0750 node_rm(s, next);
0751 reduction_performed = true;
0752 continue;
0753 }
0754
0755
0756
0757
0758
0759 if (next->idx == nodep->idx + MASK_BITS + nodep->num_after &&
0760 next->mask == ~(mask_t) 0) {
0761 nodep->num_after += MASK_BITS;
0762 next->mask = 0;
0763 nodep->num_after += next->num_after;
0764 next->num_after = 0;
0765
0766 node_rm(s, next);
0767 next = NULL;
0768
0769 reduction_performed = true;
0770 continue;
0771 }
0772 }
0773 } while (nodep && reduction_performed);
0774 }
0775
0776
0777
0778
0779 bool sparsebit_is_set(struct sparsebit *s, sparsebit_idx_t idx)
0780 {
0781 struct node *nodep;
0782
0783
0784 for (nodep = s->root; nodep;
0785 nodep = nodep->idx > idx ? nodep->left : nodep->right)
0786 if (idx >= nodep->idx &&
0787 idx <= nodep->idx + MASK_BITS + nodep->num_after - 1)
0788 goto have_node;
0789
0790 return false;
0791
0792 have_node:
0793
0794 if (nodep->num_after && idx >= nodep->idx + MASK_BITS)
0795 return true;
0796
0797
0798 assert(idx >= nodep->idx && idx - nodep->idx < MASK_BITS);
0799 return !!(nodep->mask & (1 << (idx - nodep->idx)));
0800 }
0801
0802
0803
0804
0805 static void bit_set(struct sparsebit *s, sparsebit_idx_t idx)
0806 {
0807 struct node *nodep;
0808
0809
0810 if (sparsebit_is_set(s, idx))
0811 return;
0812
0813
0814
0815
0816
0817
0818 nodep = node_split(s, idx & -MASK_BITS);
0819
0820
0821 assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1);
0822 assert(!(nodep->mask & (1 << (idx - nodep->idx))));
0823 nodep->mask |= 1 << (idx - nodep->idx);
0824 s->num_set++;
0825
0826 node_reduce(s, nodep);
0827 }
0828
0829
0830
0831
0832 static void bit_clear(struct sparsebit *s, sparsebit_idx_t idx)
0833 {
0834 struct node *nodep;
0835
0836
0837 if (!sparsebit_is_set(s, idx))
0838 return;
0839
0840
0841 nodep = node_find(s, idx);
0842 if (!nodep)
0843 return;
0844
0845
0846
0847
0848
0849 if (idx >= nodep->idx + MASK_BITS)
0850 nodep = node_split(s, idx & -MASK_BITS);
0851
0852
0853
0854
0855
0856 assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1);
0857 assert(nodep->mask & (1 << (idx - nodep->idx)));
0858 nodep->mask &= ~(1 << (idx - nodep->idx));
0859 assert(s->num_set > 0 || sparsebit_all_set(s));
0860 s->num_set--;
0861
0862 node_reduce(s, nodep);
0863 }
0864
0865
0866
0867
0868
0869
0870
0871
0872 static void dump_nodes(FILE *stream, struct node *nodep,
0873 unsigned int indent)
0874 {
0875 char *node_type;
0876
0877
0878 if (!nodep->parent)
0879 node_type = "root";
0880 else if (nodep == nodep->parent->left)
0881 node_type = "left";
0882 else {
0883 assert(nodep == nodep->parent->right);
0884 node_type = "right";
0885 }
0886 fprintf(stream, "%*s---- %s nodep: %p\n", indent, "", node_type, nodep);
0887 fprintf(stream, "%*s parent: %p left: %p right: %p\n", indent, "",
0888 nodep->parent, nodep->left, nodep->right);
0889 fprintf(stream, "%*s idx: 0x%lx mask: 0x%x num_after: 0x%lx\n",
0890 indent, "", nodep->idx, nodep->mask, nodep->num_after);
0891
0892
0893 if (nodep->left)
0894 dump_nodes(stream, nodep->left, indent + 2);
0895
0896
0897 if (nodep->right)
0898 dump_nodes(stream, nodep->right, indent + 2);
0899 }
0900
0901 static inline sparsebit_idx_t node_first_set(struct node *nodep, int start)
0902 {
0903 mask_t leading = (mask_t)1 << start;
0904 int n1 = __builtin_ctz(nodep->mask & -leading);
0905
0906 return nodep->idx + n1;
0907 }
0908
0909 static inline sparsebit_idx_t node_first_clear(struct node *nodep, int start)
0910 {
0911 mask_t leading = (mask_t)1 << start;
0912 int n1 = __builtin_ctz(~nodep->mask & -leading);
0913
0914 return nodep->idx + n1;
0915 }
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925 static void sparsebit_dump_internal(FILE *stream, struct sparsebit *s,
0926 unsigned int indent)
0927 {
0928
0929 fprintf(stream, "%*sroot: %p\n", indent, "", s->root);
0930 fprintf(stream, "%*snum_set: 0x%lx\n", indent, "", s->num_set);
0931
0932 if (s->root)
0933 dump_nodes(stream, s->root, indent);
0934 }
0935
0936
0937
0938
0939 struct sparsebit *sparsebit_alloc(void)
0940 {
0941 struct sparsebit *s;
0942
0943
0944 s = calloc(1, sizeof(*s));
0945 if (!s) {
0946 perror("calloc");
0947 abort();
0948 }
0949
0950 return s;
0951 }
0952
0953
0954
0955
0956 void sparsebit_free(struct sparsebit **sbitp)
0957 {
0958 struct sparsebit *s = *sbitp;
0959
0960 if (!s)
0961 return;
0962
0963 sparsebit_clear_all(s);
0964 free(s);
0965 *sbitp = NULL;
0966 }
0967
0968
0969
0970
0971
0972
0973 void sparsebit_copy(struct sparsebit *d, struct sparsebit *s)
0974 {
0975
0976 sparsebit_clear_all(d);
0977
0978 if (s->root) {
0979 d->root = node_copy_subtree(s->root);
0980 d->num_set = s->num_set;
0981 }
0982 }
0983
0984
0985 bool sparsebit_is_set_num(struct sparsebit *s,
0986 sparsebit_idx_t idx, sparsebit_num_t num)
0987 {
0988 sparsebit_idx_t next_cleared;
0989
0990 assert(num > 0);
0991 assert(idx + num - 1 >= idx);
0992
0993
0994 if (!sparsebit_is_set(s, idx))
0995 return false;
0996
0997
0998 next_cleared = sparsebit_next_clear(s, idx);
0999
1000
1001
1002
1003
1004
1005 return next_cleared == 0 || next_cleared - idx >= num;
1006 }
1007
1008
1009 bool sparsebit_is_clear(struct sparsebit *s,
1010 sparsebit_idx_t idx)
1011 {
1012 return !sparsebit_is_set(s, idx);
1013 }
1014
1015
1016 bool sparsebit_is_clear_num(struct sparsebit *s,
1017 sparsebit_idx_t idx, sparsebit_num_t num)
1018 {
1019 sparsebit_idx_t next_set;
1020
1021 assert(num > 0);
1022 assert(idx + num - 1 >= idx);
1023
1024
1025 if (!sparsebit_is_clear(s, idx))
1026 return false;
1027
1028
1029 next_set = sparsebit_next_set(s, idx);
1030
1031
1032
1033
1034
1035
1036 return next_set == 0 || next_set - idx >= num;
1037 }
1038
1039
1040
1041
1042
1043
1044
1045 sparsebit_num_t sparsebit_num_set(struct sparsebit *s)
1046 {
1047 return s->num_set;
1048 }
1049
1050
1051 bool sparsebit_any_set(struct sparsebit *s)
1052 {
1053
1054
1055
1056
1057 if (!s->root)
1058 return false;
1059
1060
1061
1062
1063
1064
1065 assert(s->root->mask != 0);
1066 assert(s->num_set > 0 ||
1067 (s->root->num_after == ((sparsebit_num_t) 0) - MASK_BITS &&
1068 s->root->mask == ~(mask_t) 0));
1069
1070 return true;
1071 }
1072
1073
1074 bool sparsebit_all_clear(struct sparsebit *s)
1075 {
1076 return !sparsebit_any_set(s);
1077 }
1078
1079
1080 bool sparsebit_any_clear(struct sparsebit *s)
1081 {
1082 return !sparsebit_all_set(s);
1083 }
1084
1085
1086
1087 sparsebit_idx_t sparsebit_first_set(struct sparsebit *s)
1088 {
1089 struct node *nodep;
1090
1091
1092 assert(sparsebit_any_set(s));
1093
1094 nodep = node_first(s);
1095 return node_first_set(nodep, 0);
1096 }
1097
1098
1099
1100
1101 sparsebit_idx_t sparsebit_first_clear(struct sparsebit *s)
1102 {
1103 struct node *nodep1, *nodep2;
1104
1105
1106 assert(sparsebit_any_clear(s));
1107
1108
1109 nodep1 = node_first(s);
1110 if (!nodep1 || nodep1->idx > 0)
1111 return 0;
1112
1113
1114 if (nodep1->mask != ~(mask_t) 0)
1115 return node_first_clear(nodep1, 0);
1116
1117
1118
1119
1120
1121
1122 nodep2 = node_next(s, nodep1);
1123 if (!nodep2) {
1124
1125
1126
1127
1128 assert(nodep1->mask == ~(mask_t) 0);
1129 assert(nodep1->idx + MASK_BITS + nodep1->num_after != (sparsebit_idx_t) 0);
1130 return nodep1->idx + MASK_BITS + nodep1->num_after;
1131 }
1132
1133
1134
1135
1136
1137
1138
1139 if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx)
1140 return nodep1->idx + MASK_BITS + nodep1->num_after;
1141
1142
1143
1144
1145
1146
1147
1148
1149 return node_first_clear(nodep2, 0);
1150 }
1151
1152
1153
1154
1155 sparsebit_idx_t sparsebit_next_set(struct sparsebit *s,
1156 sparsebit_idx_t prev)
1157 {
1158 sparsebit_idx_t lowest_possible = prev + 1;
1159 sparsebit_idx_t start;
1160 struct node *nodep;
1161
1162
1163 if (lowest_possible == 0)
1164 return 0;
1165
1166
1167
1168
1169
1170 struct node *candidate = NULL;
1171
1172
1173 bool contains = false;
1174
1175
1176
1177
1178
1179
1180 for (nodep = s->root; nodep;) {
1181 if ((nodep->idx + MASK_BITS + nodep->num_after - 1)
1182 >= lowest_possible) {
1183 candidate = nodep;
1184 if (candidate->idx <= lowest_possible) {
1185 contains = true;
1186 break;
1187 }
1188 nodep = nodep->left;
1189 } else {
1190 nodep = nodep->right;
1191 }
1192 }
1193 if (!candidate)
1194 return 0;
1195
1196 assert(candidate->mask != 0);
1197
1198
1199 if (!contains) {
1200
1201
1202
1203
1204
1205 assert(candidate->idx > lowest_possible);
1206
1207 return node_first_set(candidate, 0);
1208 }
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218 start = lowest_possible - candidate->idx;
1219
1220 if (start < MASK_BITS && candidate->mask >= (1 << start))
1221 return node_first_set(candidate, start);
1222
1223 if (candidate->num_after) {
1224 sparsebit_idx_t first_num_after_idx = candidate->idx + MASK_BITS;
1225
1226 return lowest_possible < first_num_after_idx
1227 ? first_num_after_idx : lowest_possible;
1228 }
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238 candidate = node_next(s, candidate);
1239 if (!candidate)
1240 return 0;
1241
1242 return node_first_set(candidate, 0);
1243 }
1244
1245
1246
1247
1248 sparsebit_idx_t sparsebit_next_clear(struct sparsebit *s,
1249 sparsebit_idx_t prev)
1250 {
1251 sparsebit_idx_t lowest_possible = prev + 1;
1252 sparsebit_idx_t idx;
1253 struct node *nodep1, *nodep2;
1254
1255
1256 if (lowest_possible == 0)
1257 return 0;
1258
1259
1260
1261
1262
1263 nodep1 = node_find(s, lowest_possible);
1264 if (!nodep1)
1265 return lowest_possible;
1266
1267
1268 for (idx = lowest_possible - nodep1->idx; idx < MASK_BITS; idx++)
1269 if (!(nodep1->mask & (1 << idx)))
1270 return nodep1->idx + idx;
1271
1272
1273
1274
1275
1276
1277 nodep2 = node_next(s, nodep1);
1278 if (!nodep2)
1279 return nodep1->idx + MASK_BITS + nodep1->num_after;
1280
1281
1282
1283
1284
1285
1286
1287 if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx)
1288 return nodep1->idx + MASK_BITS + nodep1->num_after;
1289
1290
1291
1292
1293
1294
1295
1296
1297 return node_first_clear(nodep2, 0);
1298 }
1299
1300
1301
1302
1303
1304 sparsebit_idx_t sparsebit_next_set_num(struct sparsebit *s,
1305 sparsebit_idx_t start, sparsebit_num_t num)
1306 {
1307 sparsebit_idx_t idx;
1308
1309 assert(num >= 1);
1310
1311 for (idx = sparsebit_next_set(s, start);
1312 idx != 0 && idx + num - 1 >= idx;
1313 idx = sparsebit_next_set(s, idx)) {
1314 assert(sparsebit_is_set(s, idx));
1315
1316
1317
1318
1319
1320 if (sparsebit_is_set_num(s, idx, num))
1321 return idx;
1322
1323
1324
1325
1326
1327 idx = sparsebit_next_clear(s, idx);
1328 if (idx == 0)
1329 return 0;
1330 }
1331
1332 return 0;
1333 }
1334
1335
1336
1337
1338
1339 sparsebit_idx_t sparsebit_next_clear_num(struct sparsebit *s,
1340 sparsebit_idx_t start, sparsebit_num_t num)
1341 {
1342 sparsebit_idx_t idx;
1343
1344 assert(num >= 1);
1345
1346 for (idx = sparsebit_next_clear(s, start);
1347 idx != 0 && idx + num - 1 >= idx;
1348 idx = sparsebit_next_clear(s, idx)) {
1349 assert(sparsebit_is_clear(s, idx));
1350
1351
1352
1353
1354
1355 if (sparsebit_is_clear_num(s, idx, num))
1356 return idx;
1357
1358
1359
1360
1361
1362 idx = sparsebit_next_set(s, idx);
1363 if (idx == 0)
1364 return 0;
1365 }
1366
1367 return 0;
1368 }
1369
1370
1371 void sparsebit_set_num(struct sparsebit *s,
1372 sparsebit_idx_t start, sparsebit_num_t num)
1373 {
1374 struct node *nodep, *next;
1375 unsigned int n1;
1376 sparsebit_idx_t idx;
1377 sparsebit_num_t n;
1378 sparsebit_idx_t middle_start, middle_end;
1379
1380 assert(num > 0);
1381 assert(start + num - 1 >= start);
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403 for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--)
1404 bit_set(s, idx);
1405
1406
1407 middle_start = idx;
1408 middle_end = middle_start + (n & -MASK_BITS) - 1;
1409 if (n >= MASK_BITS) {
1410 nodep = node_split(s, middle_start);
1411
1412
1413
1414
1415
1416
1417 if (middle_end + 1 > middle_end)
1418 (void) node_split(s, middle_end + 1);
1419
1420
1421 for (next = node_next(s, nodep);
1422 next && (next->idx < middle_end);
1423 next = node_next(s, nodep)) {
1424 assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end);
1425 node_rm(s, next);
1426 next = NULL;
1427 }
1428
1429
1430 for (n1 = 0; n1 < MASK_BITS; n1++) {
1431 if (!(nodep->mask & (1 << n1))) {
1432 nodep->mask |= 1 << n1;
1433 s->num_set++;
1434 }
1435 }
1436
1437 s->num_set -= nodep->num_after;
1438 nodep->num_after = middle_end - middle_start + 1 - MASK_BITS;
1439 s->num_set += nodep->num_after;
1440
1441 node_reduce(s, nodep);
1442 }
1443 idx = middle_end + 1;
1444 n -= middle_end - middle_start + 1;
1445
1446
1447 assert(n < MASK_BITS);
1448 for (; n > 0; idx++, n--)
1449 bit_set(s, idx);
1450 }
1451
1452
1453 void sparsebit_clear_num(struct sparsebit *s,
1454 sparsebit_idx_t start, sparsebit_num_t num)
1455 {
1456 struct node *nodep, *next;
1457 unsigned int n1;
1458 sparsebit_idx_t idx;
1459 sparsebit_num_t n;
1460 sparsebit_idx_t middle_start, middle_end;
1461
1462 assert(num > 0);
1463 assert(start + num - 1 >= start);
1464
1465
1466 for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--)
1467 bit_clear(s, idx);
1468
1469
1470 middle_start = idx;
1471 middle_end = middle_start + (n & -MASK_BITS) - 1;
1472 if (n >= MASK_BITS) {
1473 nodep = node_split(s, middle_start);
1474
1475
1476
1477
1478
1479
1480 if (middle_end + 1 > middle_end)
1481 (void) node_split(s, middle_end + 1);
1482
1483
1484 for (next = node_next(s, nodep);
1485 next && (next->idx < middle_end);
1486 next = node_next(s, nodep)) {
1487 assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end);
1488 node_rm(s, next);
1489 next = NULL;
1490 }
1491
1492
1493 for (n1 = 0; n1 < MASK_BITS; n1++) {
1494 if (nodep->mask & (1 << n1)) {
1495 nodep->mask &= ~(1 << n1);
1496 s->num_set--;
1497 }
1498 }
1499
1500
1501 s->num_set -= nodep->num_after;
1502 nodep->num_after = 0;
1503
1504
1505
1506
1507
1508
1509 node_reduce(s, nodep);
1510 nodep = NULL;
1511 }
1512 idx = middle_end + 1;
1513 n -= middle_end - middle_start + 1;
1514
1515
1516 assert(n < MASK_BITS);
1517 for (; n > 0; idx++, n--)
1518 bit_clear(s, idx);
1519 }
1520
1521
1522 void sparsebit_set(struct sparsebit *s, sparsebit_idx_t idx)
1523 {
1524 sparsebit_set_num(s, idx, 1);
1525 }
1526
1527
1528 void sparsebit_clear(struct sparsebit *s, sparsebit_idx_t idx)
1529 {
1530 sparsebit_clear_num(s, idx, 1);
1531 }
1532
1533
1534 void sparsebit_set_all(struct sparsebit *s)
1535 {
1536 sparsebit_set(s, 0);
1537 sparsebit_set_num(s, 1, ~(sparsebit_idx_t) 0);
1538 assert(sparsebit_all_set(s));
1539 }
1540
1541
1542 void sparsebit_clear_all(struct sparsebit *s)
1543 {
1544 sparsebit_clear(s, 0);
1545 sparsebit_clear_num(s, 1, ~(sparsebit_idx_t) 0);
1546 assert(!sparsebit_any_set(s));
1547 }
1548
1549 static size_t display_range(FILE *stream, sparsebit_idx_t low,
1550 sparsebit_idx_t high, bool prepend_comma_space)
1551 {
1552 char *fmt_str;
1553 size_t sz;
1554
1555
1556 if (low == high)
1557 fmt_str = prepend_comma_space ? ", 0x%lx" : "0x%lx";
1558 else
1559 fmt_str = prepend_comma_space ? ", 0x%lx:0x%lx" : "0x%lx:0x%lx";
1560
1561
1562
1563
1564
1565 if (!stream)
1566 sz = snprintf(NULL, 0, fmt_str, low, high);
1567 else
1568 sz = fprintf(stream, fmt_str, low, high);
1569
1570 return sz;
1571 }
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587 void sparsebit_dump(FILE *stream, struct sparsebit *s,
1588 unsigned int indent)
1589 {
1590 size_t current_line_len = 0;
1591 size_t sz;
1592 struct node *nodep;
1593
1594 if (!sparsebit_any_set(s))
1595 return;
1596
1597
1598 fprintf(stream, "%*s", indent, "");
1599
1600
1601 for (nodep = node_first(s); nodep; nodep = node_next(s, nodep)) {
1602 unsigned int n1;
1603 sparsebit_idx_t low, high;
1604
1605
1606 for (n1 = 0; n1 < MASK_BITS; n1++) {
1607 if (nodep->mask & (1 << n1)) {
1608 low = high = nodep->idx + n1;
1609
1610 for (; n1 < MASK_BITS; n1++) {
1611 if (nodep->mask & (1 << n1))
1612 high = nodep->idx + n1;
1613 else
1614 break;
1615 }
1616
1617 if ((n1 == MASK_BITS) && nodep->num_after)
1618 high += nodep->num_after;
1619
1620
1621
1622
1623
1624 sz = display_range(NULL, low, high,
1625 current_line_len != 0);
1626
1627
1628
1629
1630
1631
1632 if (current_line_len + sz > DUMP_LINE_MAX) {
1633 fputs("\n", stream);
1634 fprintf(stream, "%*s", indent, "");
1635 current_line_len = 0;
1636 }
1637
1638
1639 sz = display_range(stream, low, high,
1640 current_line_len != 0);
1641 current_line_len += sz;
1642 }
1643 }
1644
1645
1646
1647
1648
1649
1650 if (!(nodep->mask & (1 << (MASK_BITS - 1))) && nodep->num_after) {
1651 low = nodep->idx + MASK_BITS;
1652 high = nodep->idx + MASK_BITS + nodep->num_after - 1;
1653
1654
1655
1656
1657
1658 sz = display_range(NULL, low, high,
1659 current_line_len != 0);
1660
1661
1662
1663
1664
1665
1666 if (current_line_len + sz > DUMP_LINE_MAX) {
1667 fputs("\n", stream);
1668 fprintf(stream, "%*s", indent, "");
1669 current_line_len = 0;
1670 }
1671
1672
1673 sz = display_range(stream, low, high,
1674 current_line_len != 0);
1675 current_line_len += sz;
1676 }
1677 }
1678 fputs("\n", stream);
1679 }
1680
1681
1682
1683
1684
1685 void sparsebit_validate_internal(struct sparsebit *s)
1686 {
1687 bool error_detected = false;
1688 struct node *nodep, *prev = NULL;
1689 sparsebit_num_t total_bits_set = 0;
1690 unsigned int n1;
1691
1692
1693 for (nodep = node_first(s); nodep;
1694 prev = nodep, nodep = node_next(s, nodep)) {
1695
1696
1697
1698
1699
1700 for (n1 = 0; n1 < MASK_BITS; n1++)
1701 if (nodep->mask & (1 << n1))
1702 total_bits_set++;
1703
1704 total_bits_set += nodep->num_after;
1705
1706
1707
1708
1709
1710
1711
1712
1713 if (nodep->mask == 0) {
1714 fprintf(stderr, "Node mask of zero, "
1715 "nodep: %p nodep->mask: 0x%x",
1716 nodep, nodep->mask);
1717 error_detected = true;
1718 break;
1719 }
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732 if (nodep->num_after
1733 > (~(sparsebit_num_t) 0) - MASK_BITS + 1) {
1734 fprintf(stderr, "num_after too large, "
1735 "nodep: %p nodep->num_after: 0x%lx",
1736 nodep, nodep->num_after);
1737 error_detected = true;
1738 break;
1739 }
1740
1741
1742 if (nodep->idx % MASK_BITS) {
1743 fprintf(stderr, "Node index not divisible by "
1744 "mask size,\n"
1745 " nodep: %p nodep->idx: 0x%lx "
1746 "MASK_BITS: %lu\n",
1747 nodep, nodep->idx, MASK_BITS);
1748 error_detected = true;
1749 break;
1750 }
1751
1752
1753
1754
1755
1756 if ((nodep->idx + MASK_BITS + nodep->num_after - 1) < nodep->idx) {
1757 fprintf(stderr, "Bits described by node wrap "
1758 "beyond highest supported index,\n"
1759 " nodep: %p nodep->idx: 0x%lx\n"
1760 " MASK_BITS: %lu nodep->num_after: 0x%lx",
1761 nodep, nodep->idx, MASK_BITS, nodep->num_after);
1762 error_detected = true;
1763 break;
1764 }
1765
1766
1767 if (nodep->left) {
1768 if (nodep->left->parent != nodep) {
1769 fprintf(stderr, "Left child parent pointer "
1770 "doesn't point to this node,\n"
1771 " nodep: %p nodep->left: %p "
1772 "nodep->left->parent: %p",
1773 nodep, nodep->left,
1774 nodep->left->parent);
1775 error_detected = true;
1776 break;
1777 }
1778 }
1779
1780 if (nodep->right) {
1781 if (nodep->right->parent != nodep) {
1782 fprintf(stderr, "Right child parent pointer "
1783 "doesn't point to this node,\n"
1784 " nodep: %p nodep->right: %p "
1785 "nodep->right->parent: %p",
1786 nodep, nodep->right,
1787 nodep->right->parent);
1788 error_detected = true;
1789 break;
1790 }
1791 }
1792
1793 if (!nodep->parent) {
1794 if (s->root != nodep) {
1795 fprintf(stderr, "Unexpected root node, "
1796 "s->root: %p nodep: %p",
1797 s->root, nodep);
1798 error_detected = true;
1799 break;
1800 }
1801 }
1802
1803 if (prev) {
1804
1805
1806
1807
1808 if (prev->idx >= nodep->idx) {
1809 fprintf(stderr, "Previous node index "
1810 ">= current node index,\n"
1811 " prev: %p prev->idx: 0x%lx\n"
1812 " nodep: %p nodep->idx: 0x%lx",
1813 prev, prev->idx, nodep, nodep->idx);
1814 error_detected = true;
1815 break;
1816 }
1817
1818
1819
1820
1821
1822 if ((prev->idx + MASK_BITS + prev->num_after - 1)
1823 >= nodep->idx) {
1824 fprintf(stderr, "Previous node bit range "
1825 "overlap with current node bit range,\n"
1826 " prev: %p prev->idx: 0x%lx "
1827 "prev->num_after: 0x%lx\n"
1828 " nodep: %p nodep->idx: 0x%lx "
1829 "nodep->num_after: 0x%lx\n"
1830 " MASK_BITS: %lu",
1831 prev, prev->idx, prev->num_after,
1832 nodep, nodep->idx, nodep->num_after,
1833 MASK_BITS);
1834 error_detected = true;
1835 break;
1836 }
1837
1838
1839
1840
1841
1842
1843 if (nodep->mask == ~(mask_t) 0 &&
1844 prev->idx + MASK_BITS + prev->num_after == nodep->idx) {
1845 fprintf(stderr, "Current node has mask with "
1846 "all bits set and is adjacent to the "
1847 "previous node,\n"
1848 " prev: %p prev->idx: 0x%lx "
1849 "prev->num_after: 0x%lx\n"
1850 " nodep: %p nodep->idx: 0x%lx "
1851 "nodep->num_after: 0x%lx\n"
1852 " MASK_BITS: %lu",
1853 prev, prev->idx, prev->num_after,
1854 nodep, nodep->idx, nodep->num_after,
1855 MASK_BITS);
1856
1857 error_detected = true;
1858 break;
1859 }
1860 }
1861 }
1862
1863 if (!error_detected) {
1864
1865
1866
1867
1868 if (s->num_set != total_bits_set) {
1869 fprintf(stderr, "Number of bits set mismatch,\n"
1870 " s->num_set: 0x%lx total_bits_set: 0x%lx",
1871 s->num_set, total_bits_set);
1872
1873 error_detected = true;
1874 }
1875 }
1876
1877 if (error_detected) {
1878 fputs(" dump_internal:\n", stderr);
1879 sparsebit_dump_internal(stderr, s, 4);
1880 abort();
1881 }
1882 }
1883
1884
1885 #ifdef FUZZ
1886
1887
1888
1889
1890
1891
1892 #include <stdlib.h>
1893
1894 struct range {
1895 sparsebit_idx_t first, last;
1896 bool set;
1897 };
1898
1899 struct sparsebit *s;
1900 struct range ranges[1000];
1901 int num_ranges;
1902
1903 static bool get_value(sparsebit_idx_t idx)
1904 {
1905 int i;
1906
1907 for (i = num_ranges; --i >= 0; )
1908 if (ranges[i].first <= idx && idx <= ranges[i].last)
1909 return ranges[i].set;
1910
1911 return false;
1912 }
1913
1914 static void operate(int code, sparsebit_idx_t first, sparsebit_idx_t last)
1915 {
1916 sparsebit_num_t num;
1917 sparsebit_idx_t next;
1918
1919 if (first < last) {
1920 num = last - first + 1;
1921 } else {
1922 num = first - last + 1;
1923 first = last;
1924 last = first + num - 1;
1925 }
1926
1927 switch (code) {
1928 case 0:
1929 sparsebit_set(s, first);
1930 assert(sparsebit_is_set(s, first));
1931 assert(!sparsebit_is_clear(s, first));
1932 assert(sparsebit_any_set(s));
1933 assert(!sparsebit_all_clear(s));
1934 if (get_value(first))
1935 return;
1936 if (num_ranges == 1000)
1937 exit(0);
1938 ranges[num_ranges++] = (struct range)
1939 { .first = first, .last = first, .set = true };
1940 break;
1941 case 1:
1942 sparsebit_clear(s, first);
1943 assert(!sparsebit_is_set(s, first));
1944 assert(sparsebit_is_clear(s, first));
1945 assert(sparsebit_any_clear(s));
1946 assert(!sparsebit_all_set(s));
1947 if (!get_value(first))
1948 return;
1949 if (num_ranges == 1000)
1950 exit(0);
1951 ranges[num_ranges++] = (struct range)
1952 { .first = first, .last = first, .set = false };
1953 break;
1954 case 2:
1955 assert(sparsebit_is_set(s, first) == get_value(first));
1956 assert(sparsebit_is_clear(s, first) == !get_value(first));
1957 break;
1958 case 3:
1959 if (sparsebit_any_set(s))
1960 assert(get_value(sparsebit_first_set(s)));
1961 if (sparsebit_any_clear(s))
1962 assert(!get_value(sparsebit_first_clear(s)));
1963 sparsebit_set_all(s);
1964 assert(!sparsebit_any_clear(s));
1965 assert(sparsebit_all_set(s));
1966 num_ranges = 0;
1967 ranges[num_ranges++] = (struct range)
1968 { .first = 0, .last = ~(sparsebit_idx_t)0, .set = true };
1969 break;
1970 case 4:
1971 if (sparsebit_any_set(s))
1972 assert(get_value(sparsebit_first_set(s)));
1973 if (sparsebit_any_clear(s))
1974 assert(!get_value(sparsebit_first_clear(s)));
1975 sparsebit_clear_all(s);
1976 assert(!sparsebit_any_set(s));
1977 assert(sparsebit_all_clear(s));
1978 num_ranges = 0;
1979 break;
1980 case 5:
1981 next = sparsebit_next_set(s, first);
1982 assert(next == 0 || next > first);
1983 assert(next == 0 || get_value(next));
1984 break;
1985 case 6:
1986 next = sparsebit_next_clear(s, first);
1987 assert(next == 0 || next > first);
1988 assert(next == 0 || !get_value(next));
1989 break;
1990 case 7:
1991 next = sparsebit_next_clear(s, first);
1992 if (sparsebit_is_set_num(s, first, num)) {
1993 assert(next == 0 || next > last);
1994 if (first)
1995 next = sparsebit_next_set(s, first - 1);
1996 else if (sparsebit_any_set(s))
1997 next = sparsebit_first_set(s);
1998 else
1999 return;
2000 assert(next == first);
2001 } else {
2002 assert(sparsebit_is_clear(s, first) || next <= last);
2003 }
2004 break;
2005 case 8:
2006 next = sparsebit_next_set(s, first);
2007 if (sparsebit_is_clear_num(s, first, num)) {
2008 assert(next == 0 || next > last);
2009 if (first)
2010 next = sparsebit_next_clear(s, first - 1);
2011 else if (sparsebit_any_clear(s))
2012 next = sparsebit_first_clear(s);
2013 else
2014 return;
2015 assert(next == first);
2016 } else {
2017 assert(sparsebit_is_set(s, first) || next <= last);
2018 }
2019 break;
2020 case 9:
2021 sparsebit_set_num(s, first, num);
2022 assert(sparsebit_is_set_num(s, first, num));
2023 assert(!sparsebit_is_clear_num(s, first, num));
2024 assert(sparsebit_any_set(s));
2025 assert(!sparsebit_all_clear(s));
2026 if (num_ranges == 1000)
2027 exit(0);
2028 ranges[num_ranges++] = (struct range)
2029 { .first = first, .last = last, .set = true };
2030 break;
2031 case 10:
2032 sparsebit_clear_num(s, first, num);
2033 assert(!sparsebit_is_set_num(s, first, num));
2034 assert(sparsebit_is_clear_num(s, first, num));
2035 assert(sparsebit_any_clear(s));
2036 assert(!sparsebit_all_set(s));
2037 if (num_ranges == 1000)
2038 exit(0);
2039 ranges[num_ranges++] = (struct range)
2040 { .first = first, .last = last, .set = false };
2041 break;
2042 case 11:
2043 sparsebit_validate_internal(s);
2044 break;
2045 default:
2046 break;
2047 }
2048 }
2049
2050 unsigned char get8(void)
2051 {
2052 int ch;
2053
2054 ch = getchar();
2055 if (ch == EOF)
2056 exit(0);
2057 return ch;
2058 }
2059
2060 uint64_t get64(void)
2061 {
2062 uint64_t x;
2063
2064 x = get8();
2065 x = (x << 8) | get8();
2066 x = (x << 8) | get8();
2067 x = (x << 8) | get8();
2068 x = (x << 8) | get8();
2069 x = (x << 8) | get8();
2070 x = (x << 8) | get8();
2071 return (x << 8) | get8();
2072 }
2073
2074 int main(void)
2075 {
2076 s = sparsebit_alloc();
2077 for (;;) {
2078 uint8_t op = get8() & 0xf;
2079 uint64_t first = get64();
2080 uint64_t last = get64();
2081
2082 operate(op, first, last);
2083 }
2084 }
2085 #endif