• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Sparse bit array
3  *
4  * Copyright (C) 2018, Google LLC.
5  * Copyright (C) 2018, Red Hat, Inc. (code style cleanup and fuzzing driver)
6  *
7  * This work is licensed under the terms of the GNU GPL, version 2.
8  *
9  * This library provides functions to support a memory efficient bit array,
10  * with an index size of 2^64.  A sparsebit array is allocated through
11  * the use sparsebit_alloc() and free'd via sparsebit_free(),
12  * such as in the following:
13  *
14  *   struct sparsebit *s;
15  *   s = sparsebit_alloc();
16  *   sparsebit_free(&s);
17  *
18  * The struct sparsebit type resolves down to a struct sparsebit.
19  * Note that, sparsebit_free() takes a pointer to the sparsebit
20  * structure.  This is so that sparsebit_free() is able to poison
21  * the pointer (e.g. set it to NULL) to the struct sparsebit before
22  * returning to the caller.
23  *
24  * Between the return of sparsebit_alloc() and the call of
25  * sparsebit_free(), there are multiple query and modifying operations
26  * that can be performed on the allocated sparsebit array.  All of
27  * these operations take as a parameter the value returned from
28  * sparsebit_alloc() and most also take a bit index.  Frequently
29  * used routines include:
30  *
31  *  ---- Query Operations
32  *  sparsebit_is_set(s, idx)
33  *  sparsebit_is_clear(s, idx)
34  *  sparsebit_any_set(s)
35  *  sparsebit_first_set(s)
36  *  sparsebit_next_set(s, prev_idx)
37  *
38  *  ---- Modifying Operations
39  *  sparsebit_set(s, idx)
40  *  sparsebit_clear(s, idx)
41  *  sparsebit_set_num(s, idx, num);
42  *  sparsebit_clear_num(s, idx, num);
43  *
44  * A common operation, is to itterate over all the bits set in a test
45  * sparsebit array.  This can be done via code with the following structure:
46  *
47  *   sparsebit_idx_t idx;
48  *   if (sparsebit_any_set(s)) {
49  *     idx = sparsebit_first_set(s);
50  *     do {
51  *       ...
52  *       idx = sparsebit_next_set(s, idx);
53  *     } while (idx != 0);
54  *   }
55  *
56  * The index of the first bit set needs to be obtained via
57  * sparsebit_first_set(), because sparsebit_next_set(), needs
58  * the index of the previously set.  The sparsebit_idx_t type is
59  * unsigned, so there is no previous index before 0 that is available.
60  * Also, the call to sparsebit_first_set() is not made unless there
61  * is at least 1 bit in the array set.  This is because sparsebit_first_set()
62  * aborts if sparsebit_first_set() is called with no bits set.
63  * It is the callers responsibility to assure that the
64  * sparsebit array has at least a single bit set before calling
65  * sparsebit_first_set().
66  *
67  * ==== Implementation Overview ====
68  * For the most part the internal implementation of sparsebit is
69  * opaque to the caller.  One important implementation detail that the
70  * caller may need to be aware of is the spatial complexity of the
71  * implementation.  This implementation of a sparsebit array is not
72  * only sparse, in that it uses memory proportional to the number of bits
73  * set.  It is also efficient in memory usage when most of the bits are
74  * set.
75  *
76  * At a high-level the state of the bit settings are maintained through
77  * the use of a binary-search tree, where each node contains at least
78  * the following members:
79  *
80  *   typedef uint64_t sparsebit_idx_t;
81  *   typedef uint64_t sparsebit_num_t;
82  *
83  *   sparsebit_idx_t idx;
84  *   uint32_t mask;
85  *   sparsebit_num_t num_after;
86  *
87  * The idx member contains the bit index of the first bit described by this
88  * node, while the mask member stores the setting of the first 32-bits.
89  * The setting of the bit at idx + n, where 0 <= n < 32, is located in the
90  * mask member at 1 << n.
91  *
92  * Nodes are sorted by idx and the bits described by two nodes will never
93  * overlap. The idx member is always aligned to the mask size, i.e. a
94  * multiple of 32.
95  *
96  * Beyond a typical implementation, the nodes in this implementation also
97  * contains a member named num_after.  The num_after member holds the
98  * number of bits immediately after the mask bits that are contiguously set.
99  * The use of the num_after member allows this implementation to efficiently
100  * represent cases where most bits are set.  For example, the case of all
101  * but the last two bits set, is represented by the following two nodes:
102  *
103  *   node 0 - idx: 0x0 mask: 0xffffffff num_after: 0xffffffffffffffc0
104  *   node 1 - idx: 0xffffffffffffffe0 mask: 0x3fffffff num_after: 0
105  *
106  * ==== Invariants ====
107  * This implementation usses the following invariants:
108  *
109  *   + Node are only used to represent bits that are set.
110  *     Nodes with a mask of 0 and num_after of 0 are not allowed.
111  *
112  *   + Sum of bits set in all the nodes is equal to the value of
113  *     the struct sparsebit_pvt num_set member.
114  *
115  *   + The setting of at least one bit is always described in a nodes
116  *     mask (mask >= 1).
117  *
118  *   + A node with all mask bits set only occurs when the last bit
119  *     described by the previous node is not equal to this nodes
120  *     starting index - 1.  All such occurences of this condition are
121  *     avoided by moving the setting of the nodes mask bits into
122  *     the previous nodes num_after setting.
123  *
124  *   + Node starting index is evenly divisible by the number of bits
125  *     within a nodes mask member.
126  *
127  *   + Nodes never represent a range of bits that wrap around the
128  *     highest supported index.
129  *
130  *      (idx + MASK_BITS + num_after - 1) <= ((sparsebit_idx_t) 0) - 1)
131  *
132  *     As a consequence of the above, the num_after member of a node
133  *     will always be <=:
134  *
135  *       maximum_index - nodes_starting_index - number_of_mask_bits
136  *
137  *   + Nodes within the binary search tree are sorted based on each
138  *     nodes starting index.
139  *
140  *   + The range of bits described by any two nodes do not overlap.  The
141  *     range of bits described by a single node is:
142  *
143  *       start: node->idx
144  *       end (inclusive): node->idx + MASK_BITS + node->num_after - 1;
145  *
146  * Note, at times these invariants are temporarily violated for a
147  * specific portion of the code.  For example, when setting a mask
148  * bit, there is a small delay between when the mask bit is set and the
149  * value in the struct sparsebit_pvt num_set member is updated.  Other
150  * temporary violations occur when node_split() is called with a specified
151  * index and assures that a node where its mask represents the bit
152  * at the specified index exists.  At times to do this node_split()
153  * must split an existing node into two nodes or create a node that
154  * has no bits set.  Such temporary violations must be corrected before
155  * returning to the caller.  These corrections are typically performed
156  * by the local function node_reduce().
157  */
158 
159 #include "test_util.h"
160 #include "sparsebit.h"
161 #include <limits.h>
162 #include <assert.h>
163 
164 #define DUMP_LINE_MAX 100 /* Does not include indent amount */
165 
166 typedef uint32_t mask_t;
167 #define MASK_BITS (sizeof(mask_t) * CHAR_BIT)
168 
169 struct node {
170 	struct node *parent;
171 	struct node *left;
172 	struct node *right;
173 	sparsebit_idx_t idx; /* index of least-significant bit in mask */
174 	sparsebit_num_t num_after; /* num contiguously set after mask */
175 	mask_t mask;
176 };
177 
178 struct sparsebit {
179 	/*
180 	 * Points to root node of the binary search
181 	 * tree.  Equal to NULL when no bits are set in
182 	 * the entire sparsebit array.
183 	 */
184 	struct node *root;
185 
186 	/*
187 	 * A redundant count of the total number of bits set.  Used for
188 	 * diagnostic purposes and to change the time complexity of
189 	 * sparsebit_num_set() from O(n) to O(1).
190 	 * Note: Due to overflow, a value of 0 means none or all set.
191 	 */
192 	sparsebit_num_t num_set;
193 };
194 
195 /* Returns the number of set bits described by the settings
196  * of the node pointed to by nodep.
197  */
node_num_set(struct node * nodep)198 static sparsebit_num_t node_num_set(struct node *nodep)
199 {
200 	return nodep->num_after + __builtin_popcount(nodep->mask);
201 }
202 
203 /* Returns a pointer to the node that describes the
204  * lowest bit index.
205  */
node_first(struct sparsebit * s)206 static struct node *node_first(struct sparsebit *s)
207 {
208 	struct node *nodep;
209 
210 	for (nodep = s->root; nodep && nodep->left; nodep = nodep->left)
211 		;
212 
213 	return nodep;
214 }
215 
216 /* Returns a pointer to the node that describes the
217  * lowest bit index > the index of the node pointed to by np.
218  * Returns NULL if no node with a higher index exists.
219  */
node_next(struct sparsebit * s,struct node * np)220 static struct node *node_next(struct sparsebit *s, struct node *np)
221 {
222 	struct node *nodep = np;
223 
224 	/*
225 	 * If current node has a right child, next node is the left-most
226 	 * of the right child.
227 	 */
228 	if (nodep->right) {
229 		for (nodep = nodep->right; nodep->left; nodep = nodep->left)
230 			;
231 		return nodep;
232 	}
233 
234 	/*
235 	 * No right child.  Go up until node is left child of a parent.
236 	 * That parent is then the next node.
237 	 */
238 	while (nodep->parent && nodep == nodep->parent->right)
239 		nodep = nodep->parent;
240 
241 	return nodep->parent;
242 }
243 
244 /* Searches for and returns a pointer to the node that describes the
245  * highest index < the index of the node pointed to by np.
246  * Returns NULL if no node with a lower index exists.
247  */
node_prev(struct sparsebit * s,struct node * np)248 static struct node *node_prev(struct sparsebit *s, struct node *np)
249 {
250 	struct node *nodep = np;
251 
252 	/*
253 	 * If current node has a left child, next node is the right-most
254 	 * of the left child.
255 	 */
256 	if (nodep->left) {
257 		for (nodep = nodep->left; nodep->right; nodep = nodep->right)
258 			;
259 		return (struct node *) nodep;
260 	}
261 
262 	/*
263 	 * No left child.  Go up until node is right child of a parent.
264 	 * That parent is then the next node.
265 	 */
266 	while (nodep->parent && nodep == nodep->parent->left)
267 		nodep = nodep->parent;
268 
269 	return (struct node *) nodep->parent;
270 }
271 
272 
273 /* Allocates space to hold a copy of the node sub-tree pointed to by
274  * subtree and duplicates the bit settings to the newly allocated nodes.
275  * Returns the newly allocated copy of subtree.
276  */
node_copy_subtree(struct node * subtree)277 static struct node *node_copy_subtree(struct node *subtree)
278 {
279 	struct node *root;
280 
281 	/* Duplicate the node at the root of the subtree */
282 	root = calloc(1, sizeof(*root));
283 	if (!root) {
284 		perror("calloc");
285 		abort();
286 	}
287 
288 	root->idx = subtree->idx;
289 	root->mask = subtree->mask;
290 	root->num_after = subtree->num_after;
291 
292 	/* As needed, recursively duplicate the left and right subtrees */
293 	if (subtree->left) {
294 		root->left = node_copy_subtree(subtree->left);
295 		root->left->parent = root;
296 	}
297 
298 	if (subtree->right) {
299 		root->right = node_copy_subtree(subtree->right);
300 		root->right->parent = root;
301 	}
302 
303 	return root;
304 }
305 
306 /* Searches for and returns a pointer to the node that describes the setting
307  * of the bit given by idx.  A node describes the setting of a bit if its
308  * index is within the bits described by the mask bits or the number of
309  * contiguous bits set after the mask.  Returns NULL if there is no such node.
310  */
node_find(struct sparsebit * s,sparsebit_idx_t idx)311 static struct node *node_find(struct sparsebit *s, sparsebit_idx_t idx)
312 {
313 	struct node *nodep;
314 
315 	/* Find the node that describes the setting of the bit at idx */
316 	for (nodep = s->root; nodep;
317 	     nodep = nodep->idx > idx ? nodep->left : nodep->right) {
318 		if (idx >= nodep->idx &&
319 		    idx <= nodep->idx + MASK_BITS + nodep->num_after - 1)
320 			break;
321 	}
322 
323 	return nodep;
324 }
325 
326 /* Entry Requirements:
327  *   + A node that describes the setting of idx is not already present.
328  *
329  * Adds a new node to describe the setting of the bit at the index given
330  * by idx.  Returns a pointer to the newly added node.
331  *
332  * TODO(lhuemill): Degenerate cases causes the tree to get unbalanced.
333  */
node_add(struct sparsebit * s,sparsebit_idx_t idx)334 static struct node *node_add(struct sparsebit *s, sparsebit_idx_t idx)
335 {
336 	struct node *nodep, *parentp, *prev;
337 
338 	/* Allocate and initialize the new node. */
339 	nodep = calloc(1, sizeof(*nodep));
340 	if (!nodep) {
341 		perror("calloc");
342 		abort();
343 	}
344 
345 	nodep->idx = idx & -MASK_BITS;
346 
347 	/* If no nodes, set it up as the root node. */
348 	if (!s->root) {
349 		s->root = nodep;
350 		return nodep;
351 	}
352 
353 	/*
354 	 * Find the parent where the new node should be attached
355 	 * and add the node there.
356 	 */
357 	parentp = s->root;
358 	while (true) {
359 		if (idx < parentp->idx) {
360 			if (!parentp->left) {
361 				parentp->left = nodep;
362 				nodep->parent = parentp;
363 				break;
364 			}
365 			parentp = parentp->left;
366 		} else {
367 			assert(idx > parentp->idx + MASK_BITS + parentp->num_after - 1);
368 			if (!parentp->right) {
369 				parentp->right = nodep;
370 				nodep->parent = parentp;
371 				break;
372 			}
373 			parentp = parentp->right;
374 		}
375 	}
376 
377 	/*
378 	 * Does num_after bits of previous node overlap with the mask
379 	 * of the new node?  If so set the bits in the new nodes mask
380 	 * and reduce the previous nodes num_after.
381 	 */
382 	prev = node_prev(s, nodep);
383 	while (prev && prev->idx + MASK_BITS + prev->num_after - 1 >= nodep->idx) {
384 		unsigned int n1 = (prev->idx + MASK_BITS + prev->num_after - 1)
385 			- nodep->idx;
386 		assert(prev->num_after > 0);
387 		assert(n1 < MASK_BITS);
388 		assert(!(nodep->mask & (1 << n1)));
389 		nodep->mask |= (1 << n1);
390 		prev->num_after--;
391 	}
392 
393 	return nodep;
394 }
395 
396 /* Returns whether all the bits in the sparsebit array are set.  */
sparsebit_all_set(struct sparsebit * s)397 bool sparsebit_all_set(struct sparsebit *s)
398 {
399 	/*
400 	 * If any nodes there must be at least one bit set.  Only case
401 	 * where a bit is set and total num set is 0, is when all bits
402 	 * are set.
403 	 */
404 	return s->root && s->num_set == 0;
405 }
406 
407 /* Clears all bits described by the node pointed to by nodep, then
408  * removes the node.
409  */
node_rm(struct sparsebit * s,struct node * nodep)410 static void node_rm(struct sparsebit *s, struct node *nodep)
411 {
412 	struct node *tmp;
413 	sparsebit_num_t num_set;
414 
415 	num_set = node_num_set(nodep);
416 	assert(s->num_set >= num_set || sparsebit_all_set(s));
417 	s->num_set -= node_num_set(nodep);
418 
419 	/* Have both left and right child */
420 	if (nodep->left && nodep->right) {
421 		/*
422 		 * Move left children to the leftmost leaf node
423 		 * of the right child.
424 		 */
425 		for (tmp = nodep->right; tmp->left; tmp = tmp->left)
426 			;
427 		tmp->left = nodep->left;
428 		nodep->left = NULL;
429 		tmp->left->parent = tmp;
430 	}
431 
432 	/* Left only child */
433 	if (nodep->left) {
434 		if (!nodep->parent) {
435 			s->root = nodep->left;
436 			nodep->left->parent = NULL;
437 		} else {
438 			nodep->left->parent = nodep->parent;
439 			if (nodep == nodep->parent->left)
440 				nodep->parent->left = nodep->left;
441 			else {
442 				assert(nodep == nodep->parent->right);
443 				nodep->parent->right = nodep->left;
444 			}
445 		}
446 
447 		nodep->parent = nodep->left = nodep->right = NULL;
448 		free(nodep);
449 
450 		return;
451 	}
452 
453 
454 	/* Right only child */
455 	if (nodep->right) {
456 		if (!nodep->parent) {
457 			s->root = nodep->right;
458 			nodep->right->parent = NULL;
459 		} else {
460 			nodep->right->parent = nodep->parent;
461 			if (nodep == nodep->parent->left)
462 				nodep->parent->left = nodep->right;
463 			else {
464 				assert(nodep == nodep->parent->right);
465 				nodep->parent->right = nodep->right;
466 			}
467 		}
468 
469 		nodep->parent = nodep->left = nodep->right = NULL;
470 		free(nodep);
471 
472 		return;
473 	}
474 
475 	/* Leaf Node */
476 	if (!nodep->parent) {
477 		s->root = NULL;
478 	} else {
479 		if (nodep->parent->left == nodep)
480 			nodep->parent->left = NULL;
481 		else {
482 			assert(nodep == nodep->parent->right);
483 			nodep->parent->right = NULL;
484 		}
485 	}
486 
487 	nodep->parent = nodep->left = nodep->right = NULL;
488 	free(nodep);
489 
490 	return;
491 }
492 
493 /* Splits the node containing the bit at idx so that there is a node
494  * that starts at the specified index.  If no such node exists, a new
495  * node at the specified index is created.  Returns the new node.
496  *
497  * idx must start of a mask boundary.
498  */
node_split(struct sparsebit * s,sparsebit_idx_t idx)499 static struct node *node_split(struct sparsebit *s, sparsebit_idx_t idx)
500 {
501 	struct node *nodep1, *nodep2;
502 	sparsebit_idx_t offset;
503 	sparsebit_num_t orig_num_after;
504 
505 	assert(!(idx % MASK_BITS));
506 
507 	/*
508 	 * Is there a node that describes the setting of idx?
509 	 * If not, add it.
510 	 */
511 	nodep1 = node_find(s, idx);
512 	if (!nodep1)
513 		return node_add(s, idx);
514 
515 	/*
516 	 * All done if the starting index of the node is where the
517 	 * split should occur.
518 	 */
519 	if (nodep1->idx == idx)
520 		return nodep1;
521 
522 	/*
523 	 * Split point not at start of mask, so it must be part of
524 	 * bits described by num_after.
525 	 */
526 
527 	/*
528 	 * Calculate offset within num_after for where the split is
529 	 * to occur.
530 	 */
531 	offset = idx - (nodep1->idx + MASK_BITS);
532 	orig_num_after = nodep1->num_after;
533 
534 	/*
535 	 * Add a new node to describe the bits starting at
536 	 * the split point.
537 	 */
538 	nodep1->num_after = offset;
539 	nodep2 = node_add(s, idx);
540 
541 	/* Move bits after the split point into the new node */
542 	nodep2->num_after = orig_num_after - offset;
543 	if (nodep2->num_after >= MASK_BITS) {
544 		nodep2->mask = ~(mask_t) 0;
545 		nodep2->num_after -= MASK_BITS;
546 	} else {
547 		nodep2->mask = (1 << nodep2->num_after) - 1;
548 		nodep2->num_after = 0;
549 	}
550 
551 	return nodep2;
552 }
553 
554 /* Iteratively reduces the node pointed to by nodep and its adjacent
555  * nodes into a more compact form.  For example, a node with a mask with
556  * all bits set adjacent to a previous node, will get combined into a
557  * single node with an increased num_after setting.
558  *
559  * After each reduction, a further check is made to see if additional
560  * reductions are possible with the new previous and next nodes.  Note,
561  * a search for a reduction is only done across the nodes nearest nodep
562  * and those that became part of a reduction.  Reductions beyond nodep
563  * and the adjacent nodes that are reduced are not discovered.  It is the
564  * responsibility of the caller to pass a nodep that is within one node
565  * of each possible reduction.
566  *
567  * This function does not fix the temporary violation of all invariants.
568  * For example it does not fix the case where the bit settings described
569  * by two or more nodes overlap.  Such a violation introduces the potential
570  * complication of a bit setting for a specific index having different settings
571  * in different nodes.  This would then introduce the further complication
572  * of which node has the correct setting of the bit and thus such conditions
573  * are not allowed.
574  *
575  * This function is designed to fix invariant violations that are introduced
576  * by node_split() and by changes to the nodes mask or num_after members.
577  * For example, when setting a bit within a nodes mask, the function that
578  * sets the bit doesn't have to worry about whether the setting of that
579  * bit caused the mask to have leading only or trailing only bits set.
580  * Instead, the function can call node_reduce(), with nodep equal to the
581  * node address that it set a mask bit in, and node_reduce() will notice
582  * the cases of leading or trailing only bits and that there is an
583  * adjacent node that the bit settings could be merged into.
584  *
585  * This implementation specifically detects and corrects violation of the
586  * following invariants:
587  *
588  *   + Node are only used to represent bits that are set.
589  *     Nodes with a mask of 0 and num_after of 0 are not allowed.
590  *
591  *   + The setting of at least one bit is always described in a nodes
592  *     mask (mask >= 1).
593  *
594  *   + A node with all mask bits set only occurs when the last bit
595  *     described by the previous node is not equal to this nodes
596  *     starting index - 1.  All such occurences of this condition are
597  *     avoided by moving the setting of the nodes mask bits into
598  *     the previous nodes num_after setting.
599  */
node_reduce(struct sparsebit * s,struct node * nodep)600 static void node_reduce(struct sparsebit *s, struct node *nodep)
601 {
602 	bool reduction_performed;
603 
604 	do {
605 		reduction_performed = false;
606 		struct node *prev, *next, *tmp;
607 
608 		/* 1) Potential reductions within the current node. */
609 
610 		/* Nodes with all bits cleared may be removed. */
611 		if (nodep->mask == 0 && nodep->num_after == 0) {
612 			/*
613 			 * About to remove the node pointed to by
614 			 * nodep, which normally would cause a problem
615 			 * for the next pass through the reduction loop,
616 			 * because the node at the starting point no longer
617 			 * exists.  This potential problem is handled
618 			 * by first remembering the location of the next
619 			 * or previous nodes.  Doesn't matter which, because
620 			 * once the node at nodep is removed, there will be
621 			 * no other nodes between prev and next.
622 			 *
623 			 * Note, the checks performed on nodep against both
624 			 * both prev and next both check for an adjacent
625 			 * node that can be reduced into a single node.  As
626 			 * such, after removing the node at nodep, doesn't
627 			 * matter whether the nodep for the next pass
628 			 * through the loop is equal to the previous pass
629 			 * prev or next node.  Either way, on the next pass
630 			 * the one not selected will become either the
631 			 * prev or next node.
632 			 */
633 			tmp = node_next(s, nodep);
634 			if (!tmp)
635 				tmp = node_prev(s, nodep);
636 
637 			node_rm(s, nodep);
638 			nodep = NULL;
639 
640 			nodep = tmp;
641 			reduction_performed = true;
642 			continue;
643 		}
644 
645 		/*
646 		 * When the mask is 0, can reduce the amount of num_after
647 		 * bits by moving the initial num_after bits into the mask.
648 		 */
649 		if (nodep->mask == 0) {
650 			assert(nodep->num_after != 0);
651 			assert(nodep->idx + MASK_BITS > nodep->idx);
652 
653 			nodep->idx += MASK_BITS;
654 
655 			if (nodep->num_after >= MASK_BITS) {
656 				nodep->mask = ~0;
657 				nodep->num_after -= MASK_BITS;
658 			} else {
659 				nodep->mask = (1u << nodep->num_after) - 1;
660 				nodep->num_after = 0;
661 			}
662 
663 			reduction_performed = true;
664 			continue;
665 		}
666 
667 		/*
668 		 * 2) Potential reductions between the current and
669 		 * previous nodes.
670 		 */
671 		prev = node_prev(s, nodep);
672 		if (prev) {
673 			sparsebit_idx_t prev_highest_bit;
674 
675 			/* Nodes with no bits set can be removed. */
676 			if (prev->mask == 0 && prev->num_after == 0) {
677 				node_rm(s, prev);
678 
679 				reduction_performed = true;
680 				continue;
681 			}
682 
683 			/*
684 			 * All mask bits set and previous node has
685 			 * adjacent index.
686 			 */
687 			if (nodep->mask + 1 == 0 &&
688 			    prev->idx + MASK_BITS == nodep->idx) {
689 				prev->num_after += MASK_BITS + nodep->num_after;
690 				nodep->mask = 0;
691 				nodep->num_after = 0;
692 
693 				reduction_performed = true;
694 				continue;
695 			}
696 
697 			/*
698 			 * Is node adjacent to previous node and the node
699 			 * contains a single contiguous range of bits
700 			 * starting from the beginning of the mask?
701 			 */
702 			prev_highest_bit = prev->idx + MASK_BITS - 1 + prev->num_after;
703 			if (prev_highest_bit + 1 == nodep->idx &&
704 			    (nodep->mask | (nodep->mask >> 1)) == nodep->mask) {
705 				/*
706 				 * How many contiguous bits are there?
707 				 * Is equal to the total number of set
708 				 * bits, due to an earlier check that
709 				 * there is a single contiguous range of
710 				 * set bits.
711 				 */
712 				unsigned int num_contiguous
713 					= __builtin_popcount(nodep->mask);
714 				assert((num_contiguous > 0) &&
715 				       ((1ULL << num_contiguous) - 1) == nodep->mask);
716 
717 				prev->num_after += num_contiguous;
718 				nodep->mask = 0;
719 
720 				/*
721 				 * For predictable performance, handle special
722 				 * case where all mask bits are set and there
723 				 * is a non-zero num_after setting.  This code
724 				 * is functionally correct without the following
725 				 * conditionalized statements, but without them
726 				 * the value of num_after is only reduced by
727 				 * the number of mask bits per pass.  There are
728 				 * cases where num_after can be close to 2^64.
729 				 * Without this code it could take nearly
730 				 * (2^64) / 32 passes to perform the full
731 				 * reduction.
732 				 */
733 				if (num_contiguous == MASK_BITS) {
734 					prev->num_after += nodep->num_after;
735 					nodep->num_after = 0;
736 				}
737 
738 				reduction_performed = true;
739 				continue;
740 			}
741 		}
742 
743 		/*
744 		 * 3) Potential reductions between the current and
745 		 * next nodes.
746 		 */
747 		next = node_next(s, nodep);
748 		if (next) {
749 			/* Nodes with no bits set can be removed. */
750 			if (next->mask == 0 && next->num_after == 0) {
751 				node_rm(s, next);
752 				reduction_performed = true;
753 				continue;
754 			}
755 
756 			/*
757 			 * Is next node index adjacent to current node
758 			 * and has a mask with all bits set?
759 			 */
760 			if (next->idx == nodep->idx + MASK_BITS + nodep->num_after &&
761 			    next->mask == ~(mask_t) 0) {
762 				nodep->num_after += MASK_BITS;
763 				next->mask = 0;
764 				nodep->num_after += next->num_after;
765 				next->num_after = 0;
766 
767 				node_rm(s, next);
768 				next = NULL;
769 
770 				reduction_performed = true;
771 				continue;
772 			}
773 		}
774 	} while (nodep && reduction_performed);
775 }
776 
777 /* Returns whether the bit at the index given by idx, within the
778  * sparsebit array is set or not.
779  */
sparsebit_is_set(struct sparsebit * s,sparsebit_idx_t idx)780 bool sparsebit_is_set(struct sparsebit *s, sparsebit_idx_t idx)
781 {
782 	struct node *nodep;
783 
784 	/* Find the node that describes the setting of the bit at idx */
785 	for (nodep = s->root; nodep;
786 	     nodep = nodep->idx > idx ? nodep->left : nodep->right)
787 		if (idx >= nodep->idx &&
788 		    idx <= nodep->idx + MASK_BITS + nodep->num_after - 1)
789 			goto have_node;
790 
791 	return false;
792 
793 have_node:
794 	/* Bit is set if it is any of the bits described by num_after */
795 	if (nodep->num_after && idx >= nodep->idx + MASK_BITS)
796 		return true;
797 
798 	/* Is the corresponding mask bit set */
799 	assert(idx >= nodep->idx && idx - nodep->idx < MASK_BITS);
800 	return !!(nodep->mask & (1 << (idx - nodep->idx)));
801 }
802 
803 /* Within the sparsebit array pointed to by s, sets the bit
804  * at the index given by idx.
805  */
bit_set(struct sparsebit * s,sparsebit_idx_t idx)806 static void bit_set(struct sparsebit *s, sparsebit_idx_t idx)
807 {
808 	struct node *nodep;
809 
810 	/* Skip bits that are already set */
811 	if (sparsebit_is_set(s, idx))
812 		return;
813 
814 	/*
815 	 * Get a node where the bit at idx is described by the mask.
816 	 * The node_split will also create a node, if there isn't
817 	 * already a node that describes the setting of bit.
818 	 */
819 	nodep = node_split(s, idx & -MASK_BITS);
820 
821 	/* Set the bit within the nodes mask */
822 	assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1);
823 	assert(!(nodep->mask & (1 << (idx - nodep->idx))));
824 	nodep->mask |= 1 << (idx - nodep->idx);
825 	s->num_set++;
826 
827 	node_reduce(s, nodep);
828 }
829 
830 /* Within the sparsebit array pointed to by s, clears the bit
831  * at the index given by idx.
832  */
bit_clear(struct sparsebit * s,sparsebit_idx_t idx)833 static void bit_clear(struct sparsebit *s, sparsebit_idx_t idx)
834 {
835 	struct node *nodep;
836 
837 	/* Skip bits that are already cleared */
838 	if (!sparsebit_is_set(s, idx))
839 		return;
840 
841 	/* Is there a node that describes the setting of this bit? */
842 	nodep = node_find(s, idx);
843 	if (!nodep)
844 		return;
845 
846 	/*
847 	 * If a num_after bit, split the node, so that the bit is
848 	 * part of a node mask.
849 	 */
850 	if (idx >= nodep->idx + MASK_BITS)
851 		nodep = node_split(s, idx & -MASK_BITS);
852 
853 	/*
854 	 * After node_split above, bit at idx should be within the mask.
855 	 * Clear that bit.
856 	 */
857 	assert(idx >= nodep->idx && idx <= nodep->idx + MASK_BITS - 1);
858 	assert(nodep->mask & (1 << (idx - nodep->idx)));
859 	nodep->mask &= ~(1 << (idx - nodep->idx));
860 	assert(s->num_set > 0 || sparsebit_all_set(s));
861 	s->num_set--;
862 
863 	node_reduce(s, nodep);
864 }
865 
866 /* Recursively dumps to the FILE stream given by stream the contents
867  * of the sub-tree of nodes pointed to by nodep.  Each line of output
868  * is prefixed by the number of spaces given by indent.  On each
869  * recursion, the indent amount is increased by 2.  This causes nodes
870  * at each level deeper into the binary search tree to be displayed
871  * with a greater indent.
872  */
dump_nodes(FILE * stream,struct node * nodep,unsigned int indent)873 static void dump_nodes(FILE *stream, struct node *nodep,
874 	unsigned int indent)
875 {
876 	char *node_type;
877 
878 	/* Dump contents of node */
879 	if (!nodep->parent)
880 		node_type = "root";
881 	else if (nodep == nodep->parent->left)
882 		node_type = "left";
883 	else {
884 		assert(nodep == nodep->parent->right);
885 		node_type = "right";
886 	}
887 	fprintf(stream, "%*s---- %s nodep: %p\n", indent, "", node_type, nodep);
888 	fprintf(stream, "%*s  parent: %p left: %p right: %p\n", indent, "",
889 		nodep->parent, nodep->left, nodep->right);
890 	fprintf(stream, "%*s  idx: 0x%lx mask: 0x%x num_after: 0x%lx\n",
891 		indent, "", nodep->idx, nodep->mask, nodep->num_after);
892 
893 	/* If present, dump contents of left child nodes */
894 	if (nodep->left)
895 		dump_nodes(stream, nodep->left, indent + 2);
896 
897 	/* If present, dump contents of right child nodes */
898 	if (nodep->right)
899 		dump_nodes(stream, nodep->right, indent + 2);
900 }
901 
node_first_set(struct node * nodep,int start)902 static inline sparsebit_idx_t node_first_set(struct node *nodep, int start)
903 {
904 	mask_t leading = (mask_t)1 << start;
905 	int n1 = __builtin_ctz(nodep->mask & -leading);
906 
907 	return nodep->idx + n1;
908 }
909 
node_first_clear(struct node * nodep,int start)910 static inline sparsebit_idx_t node_first_clear(struct node *nodep, int start)
911 {
912 	mask_t leading = (mask_t)1 << start;
913 	int n1 = __builtin_ctz(~nodep->mask & -leading);
914 
915 	return nodep->idx + n1;
916 }
917 
918 /* Dumps to the FILE stream specified by stream, the implementation dependent
919  * internal state of s.  Each line of output is prefixed with the number
920  * of spaces given by indent.  The output is completely implementation
921  * dependent and subject to change.  Output from this function should only
922  * be used for diagnostic purposes.  For example, this function can be
923  * used by test cases after they detect an unexpected condition, as a means
924  * to capture diagnostic information.
925  */
sparsebit_dump_internal(FILE * stream,struct sparsebit * s,unsigned int indent)926 static void sparsebit_dump_internal(FILE *stream, struct sparsebit *s,
927 	unsigned int indent)
928 {
929 	/* Dump the contents of s */
930 	fprintf(stream, "%*sroot: %p\n", indent, "", s->root);
931 	fprintf(stream, "%*snum_set: 0x%lx\n", indent, "", s->num_set);
932 
933 	if (s->root)
934 		dump_nodes(stream, s->root, indent);
935 }
936 
937 /* Allocates and returns a new sparsebit array. The initial state
938  * of the newly allocated sparsebit array has all bits cleared.
939  */
sparsebit_alloc(void)940 struct sparsebit *sparsebit_alloc(void)
941 {
942 	struct sparsebit *s;
943 
944 	/* Allocate top level structure. */
945 	s = calloc(1, sizeof(*s));
946 	if (!s) {
947 		perror("calloc");
948 		abort();
949 	}
950 
951 	return s;
952 }
953 
954 /* Frees the implementation dependent data for the sparsebit array
955  * pointed to by s and poisons the pointer to that data.
956  */
sparsebit_free(struct sparsebit ** sbitp)957 void sparsebit_free(struct sparsebit **sbitp)
958 {
959 	struct sparsebit *s = *sbitp;
960 
961 	if (!s)
962 		return;
963 
964 	sparsebit_clear_all(s);
965 	free(s);
966 	*sbitp = NULL;
967 }
968 
969 /* Makes a copy of the sparsebit array given by s, to the sparsebit
970  * array given by d.  Note, d must have already been allocated via
971  * sparsebit_alloc().  It can though already have bits set, which
972  * if different from src will be cleared.
973  */
sparsebit_copy(struct sparsebit * d,struct sparsebit * s)974 void sparsebit_copy(struct sparsebit *d, struct sparsebit *s)
975 {
976 	/* First clear any bits already set in the destination */
977 	sparsebit_clear_all(d);
978 
979 	if (s->root) {
980 		d->root = node_copy_subtree(s->root);
981 		d->num_set = s->num_set;
982 	}
983 }
984 
985 /* Returns whether num consecutive bits starting at idx are all set.  */
sparsebit_is_set_num(struct sparsebit * s,sparsebit_idx_t idx,sparsebit_num_t num)986 bool sparsebit_is_set_num(struct sparsebit *s,
987 	sparsebit_idx_t idx, sparsebit_num_t num)
988 {
989 	sparsebit_idx_t next_cleared;
990 
991 	assert(num > 0);
992 	assert(idx + num - 1 >= idx);
993 
994 	/* With num > 0, the first bit must be set. */
995 	if (!sparsebit_is_set(s, idx))
996 		return false;
997 
998 	/* Find the next cleared bit */
999 	next_cleared = sparsebit_next_clear(s, idx);
1000 
1001 	/*
1002 	 * If no cleared bits beyond idx, then there are at least num
1003 	 * set bits. idx + num doesn't wrap.  Otherwise check if
1004 	 * there are enough set bits between idx and the next cleared bit.
1005 	 */
1006 	return next_cleared == 0 || next_cleared - idx >= num;
1007 }
1008 
1009 /* Returns whether the bit at the index given by idx.  */
sparsebit_is_clear(struct sparsebit * s,sparsebit_idx_t idx)1010 bool sparsebit_is_clear(struct sparsebit *s,
1011 	sparsebit_idx_t idx)
1012 {
1013 	return !sparsebit_is_set(s, idx);
1014 }
1015 
1016 /* Returns whether num consecutive bits starting at idx are all cleared.  */
sparsebit_is_clear_num(struct sparsebit * s,sparsebit_idx_t idx,sparsebit_num_t num)1017 bool sparsebit_is_clear_num(struct sparsebit *s,
1018 	sparsebit_idx_t idx, sparsebit_num_t num)
1019 {
1020 	sparsebit_idx_t next_set;
1021 
1022 	assert(num > 0);
1023 	assert(idx + num - 1 >= idx);
1024 
1025 	/* With num > 0, the first bit must be cleared. */
1026 	if (!sparsebit_is_clear(s, idx))
1027 		return false;
1028 
1029 	/* Find the next set bit */
1030 	next_set = sparsebit_next_set(s, idx);
1031 
1032 	/*
1033 	 * If no set bits beyond idx, then there are at least num
1034 	 * cleared bits. idx + num doesn't wrap.  Otherwise check if
1035 	 * there are enough cleared bits between idx and the next set bit.
1036 	 */
1037 	return next_set == 0 || next_set - idx >= num;
1038 }
1039 
1040 /* Returns the total number of bits set.  Note: 0 is also returned for
1041  * the case of all bits set.  This is because with all bits set, there
1042  * is 1 additional bit set beyond what can be represented in the return
1043  * value.  Use sparsebit_any_set(), instead of sparsebit_num_set() > 0,
1044  * to determine if the sparsebit array has any bits set.
1045  */
sparsebit_num_set(struct sparsebit * s)1046 sparsebit_num_t sparsebit_num_set(struct sparsebit *s)
1047 {
1048 	return s->num_set;
1049 }
1050 
1051 /* Returns whether any bit is set in the sparsebit array.  */
sparsebit_any_set(struct sparsebit * s)1052 bool sparsebit_any_set(struct sparsebit *s)
1053 {
1054 	/*
1055 	 * Nodes only describe set bits.  If any nodes then there
1056 	 * is at least 1 bit set.
1057 	 */
1058 	if (!s->root)
1059 		return false;
1060 
1061 	/*
1062 	 * Every node should have a non-zero mask.  For now will
1063 	 * just assure that the root node has a non-zero mask,
1064 	 * which is a quick check that at least 1 bit is set.
1065 	 */
1066 	assert(s->root->mask != 0);
1067 	assert(s->num_set > 0 ||
1068 	       (s->root->num_after == ((sparsebit_num_t) 0) - MASK_BITS &&
1069 		s->root->mask == ~(mask_t) 0));
1070 
1071 	return true;
1072 }
1073 
1074 /* Returns whether all the bits in the sparsebit array are cleared.  */
sparsebit_all_clear(struct sparsebit * s)1075 bool sparsebit_all_clear(struct sparsebit *s)
1076 {
1077 	return !sparsebit_any_set(s);
1078 }
1079 
1080 /* Returns whether all the bits in the sparsebit array are set.  */
sparsebit_any_clear(struct sparsebit * s)1081 bool sparsebit_any_clear(struct sparsebit *s)
1082 {
1083 	return !sparsebit_all_set(s);
1084 }
1085 
1086 /* Returns the index of the first set bit.  Abort if no bits are set.
1087  */
sparsebit_first_set(struct sparsebit * s)1088 sparsebit_idx_t sparsebit_first_set(struct sparsebit *s)
1089 {
1090 	struct node *nodep;
1091 
1092 	/* Validate at least 1 bit is set */
1093 	assert(sparsebit_any_set(s));
1094 
1095 	nodep = node_first(s);
1096 	return node_first_set(nodep, 0);
1097 }
1098 
1099 /* Returns the index of the first cleared bit.  Abort if
1100  * no bits are cleared.
1101  */
sparsebit_first_clear(struct sparsebit * s)1102 sparsebit_idx_t sparsebit_first_clear(struct sparsebit *s)
1103 {
1104 	struct node *nodep1, *nodep2;
1105 
1106 	/* Validate at least 1 bit is cleared. */
1107 	assert(sparsebit_any_clear(s));
1108 
1109 	/* If no nodes or first node index > 0 then lowest cleared is 0 */
1110 	nodep1 = node_first(s);
1111 	if (!nodep1 || nodep1->idx > 0)
1112 		return 0;
1113 
1114 	/* Does the mask in the first node contain any cleared bits. */
1115 	if (nodep1->mask != ~(mask_t) 0)
1116 		return node_first_clear(nodep1, 0);
1117 
1118 	/*
1119 	 * All mask bits set in first node.  If there isn't a second node
1120 	 * then the first cleared bit is the first bit after the bits
1121 	 * described by the first node.
1122 	 */
1123 	nodep2 = node_next(s, nodep1);
1124 	if (!nodep2) {
1125 		/*
1126 		 * No second node.  First cleared bit is first bit beyond
1127 		 * bits described by first node.
1128 		 */
1129 		assert(nodep1->mask == ~(mask_t) 0);
1130 		assert(nodep1->idx + MASK_BITS + nodep1->num_after != (sparsebit_idx_t) 0);
1131 		return nodep1->idx + MASK_BITS + nodep1->num_after;
1132 	}
1133 
1134 	/*
1135 	 * There is a second node.
1136 	 * If it is not adjacent to the first node, then there is a gap
1137 	 * of cleared bits between the nodes, and the first cleared bit
1138 	 * is the first bit within the gap.
1139 	 */
1140 	if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx)
1141 		return nodep1->idx + MASK_BITS + nodep1->num_after;
1142 
1143 	/*
1144 	 * Second node is adjacent to the first node.
1145 	 * Because it is adjacent, its mask should be non-zero.  If all
1146 	 * its mask bits are set, then with it being adjacent, it should
1147 	 * have had the mask bits moved into the num_after setting of the
1148 	 * previous node.
1149 	 */
1150 	return node_first_clear(nodep2, 0);
1151 }
1152 
1153 /* Returns index of next bit set within s after the index given by prev.
1154  * Returns 0 if there are no bits after prev that are set.
1155  */
sparsebit_next_set(struct sparsebit * s,sparsebit_idx_t prev)1156 sparsebit_idx_t sparsebit_next_set(struct sparsebit *s,
1157 	sparsebit_idx_t prev)
1158 {
1159 	sparsebit_idx_t lowest_possible = prev + 1;
1160 	sparsebit_idx_t start;
1161 	struct node *nodep;
1162 
1163 	/* A bit after the highest index can't be set. */
1164 	if (lowest_possible == 0)
1165 		return 0;
1166 
1167 	/*
1168 	 * Find the leftmost 'candidate' overlapping or to the right
1169 	 * of lowest_possible.
1170 	 */
1171 	struct node *candidate = NULL;
1172 
1173 	/* True iff lowest_possible is within candidate */
1174 	bool contains = false;
1175 
1176 	/*
1177 	 * Find node that describes setting of bit at lowest_possible.
1178 	 * If such a node doesn't exist, find the node with the lowest
1179 	 * starting index that is > lowest_possible.
1180 	 */
1181 	for (nodep = s->root; nodep;) {
1182 		if ((nodep->idx + MASK_BITS + nodep->num_after - 1)
1183 			>= lowest_possible) {
1184 			candidate = nodep;
1185 			if (candidate->idx <= lowest_possible) {
1186 				contains = true;
1187 				break;
1188 			}
1189 			nodep = nodep->left;
1190 		} else {
1191 			nodep = nodep->right;
1192 		}
1193 	}
1194 	if (!candidate)
1195 		return 0;
1196 
1197 	assert(candidate->mask != 0);
1198 
1199 	/* Does the candidate node describe the setting of lowest_possible? */
1200 	if (!contains) {
1201 		/*
1202 		 * Candidate doesn't describe setting of bit at lowest_possible.
1203 		 * Candidate points to the first node with a starting index
1204 		 * > lowest_possible.
1205 		 */
1206 		assert(candidate->idx > lowest_possible);
1207 
1208 		return node_first_set(candidate, 0);
1209 	}
1210 
1211 	/*
1212 	 * Candidate describes setting of bit at lowest_possible.
1213 	 * Note: although the node describes the setting of the bit
1214 	 * at lowest_possible, its possible that its setting and the
1215 	 * setting of all latter bits described by this node are 0.
1216 	 * For now, just handle the cases where this node describes
1217 	 * a bit at or after an index of lowest_possible that is set.
1218 	 */
1219 	start = lowest_possible - candidate->idx;
1220 
1221 	if (start < MASK_BITS && candidate->mask >= (1 << start))
1222 		return node_first_set(candidate, start);
1223 
1224 	if (candidate->num_after) {
1225 		sparsebit_idx_t first_num_after_idx = candidate->idx + MASK_BITS;
1226 
1227 		return lowest_possible < first_num_after_idx
1228 			? first_num_after_idx : lowest_possible;
1229 	}
1230 
1231 	/*
1232 	 * Although candidate node describes setting of bit at
1233 	 * the index of lowest_possible, all bits at that index and
1234 	 * latter that are described by candidate are cleared.  With
1235 	 * this, the next bit is the first bit in the next node, if
1236 	 * such a node exists.  If a next node doesn't exist, then
1237 	 * there is no next set bit.
1238 	 */
1239 	candidate = node_next(s, candidate);
1240 	if (!candidate)
1241 		return 0;
1242 
1243 	return node_first_set(candidate, 0);
1244 }
1245 
1246 /* Returns index of next bit cleared within s after the index given by prev.
1247  * Returns 0 if there are no bits after prev that are cleared.
1248  */
sparsebit_next_clear(struct sparsebit * s,sparsebit_idx_t prev)1249 sparsebit_idx_t sparsebit_next_clear(struct sparsebit *s,
1250 	sparsebit_idx_t prev)
1251 {
1252 	sparsebit_idx_t lowest_possible = prev + 1;
1253 	sparsebit_idx_t idx;
1254 	struct node *nodep1, *nodep2;
1255 
1256 	/* A bit after the highest index can't be set. */
1257 	if (lowest_possible == 0)
1258 		return 0;
1259 
1260 	/*
1261 	 * Does a node describing the setting of lowest_possible exist?
1262 	 * If not, the bit at lowest_possible is cleared.
1263 	 */
1264 	nodep1 = node_find(s, lowest_possible);
1265 	if (!nodep1)
1266 		return lowest_possible;
1267 
1268 	/* Does a mask bit in node 1 describe the next cleared bit. */
1269 	for (idx = lowest_possible - nodep1->idx; idx < MASK_BITS; idx++)
1270 		if (!(nodep1->mask & (1 << idx)))
1271 			return nodep1->idx + idx;
1272 
1273 	/*
1274 	 * Next cleared bit is not described by node 1.  If there
1275 	 * isn't a next node, then next cleared bit is described
1276 	 * by bit after the bits described by the first node.
1277 	 */
1278 	nodep2 = node_next(s, nodep1);
1279 	if (!nodep2)
1280 		return nodep1->idx + MASK_BITS + nodep1->num_after;
1281 
1282 	/*
1283 	 * There is a second node.
1284 	 * If it is not adjacent to the first node, then there is a gap
1285 	 * of cleared bits between the nodes, and the next cleared bit
1286 	 * is the first bit within the gap.
1287 	 */
1288 	if (nodep1->idx + MASK_BITS + nodep1->num_after != nodep2->idx)
1289 		return nodep1->idx + MASK_BITS + nodep1->num_after;
1290 
1291 	/*
1292 	 * Second node is adjacent to the first node.
1293 	 * Because it is adjacent, its mask should be non-zero.  If all
1294 	 * its mask bits are set, then with it being adjacent, it should
1295 	 * have had the mask bits moved into the num_after setting of the
1296 	 * previous node.
1297 	 */
1298 	return node_first_clear(nodep2, 0);
1299 }
1300 
1301 /* Starting with the index 1 greater than the index given by start, finds
1302  * and returns the index of the first sequence of num consecutively set
1303  * bits.  Returns a value of 0 of no such sequence exists.
1304  */
sparsebit_next_set_num(struct sparsebit * s,sparsebit_idx_t start,sparsebit_num_t num)1305 sparsebit_idx_t sparsebit_next_set_num(struct sparsebit *s,
1306 	sparsebit_idx_t start, sparsebit_num_t num)
1307 {
1308 	sparsebit_idx_t idx;
1309 
1310 	assert(num >= 1);
1311 
1312 	for (idx = sparsebit_next_set(s, start);
1313 		idx != 0 && idx + num - 1 >= idx;
1314 		idx = sparsebit_next_set(s, idx)) {
1315 		assert(sparsebit_is_set(s, idx));
1316 
1317 		/*
1318 		 * Does the sequence of bits starting at idx consist of
1319 		 * num set bits?
1320 		 */
1321 		if (sparsebit_is_set_num(s, idx, num))
1322 			return idx;
1323 
1324 		/*
1325 		 * Sequence of set bits at idx isn't large enough.
1326 		 * Skip this entire sequence of set bits.
1327 		 */
1328 		idx = sparsebit_next_clear(s, idx);
1329 		if (idx == 0)
1330 			return 0;
1331 	}
1332 
1333 	return 0;
1334 }
1335 
1336 /* Starting with the index 1 greater than the index given by start, finds
1337  * and returns the index of the first sequence of num consecutively cleared
1338  * bits.  Returns a value of 0 of no such sequence exists.
1339  */
sparsebit_next_clear_num(struct sparsebit * s,sparsebit_idx_t start,sparsebit_num_t num)1340 sparsebit_idx_t sparsebit_next_clear_num(struct sparsebit *s,
1341 	sparsebit_idx_t start, sparsebit_num_t num)
1342 {
1343 	sparsebit_idx_t idx;
1344 
1345 	assert(num >= 1);
1346 
1347 	for (idx = sparsebit_next_clear(s, start);
1348 		idx != 0 && idx + num - 1 >= idx;
1349 		idx = sparsebit_next_clear(s, idx)) {
1350 		assert(sparsebit_is_clear(s, idx));
1351 
1352 		/*
1353 		 * Does the sequence of bits starting at idx consist of
1354 		 * num cleared bits?
1355 		 */
1356 		if (sparsebit_is_clear_num(s, idx, num))
1357 			return idx;
1358 
1359 		/*
1360 		 * Sequence of cleared bits at idx isn't large enough.
1361 		 * Skip this entire sequence of cleared bits.
1362 		 */
1363 		idx = sparsebit_next_set(s, idx);
1364 		if (idx == 0)
1365 			return 0;
1366 	}
1367 
1368 	return 0;
1369 }
1370 
1371 /* Sets the bits * in the inclusive range idx through idx + num - 1.  */
sparsebit_set_num(struct sparsebit * s,sparsebit_idx_t start,sparsebit_num_t num)1372 void sparsebit_set_num(struct sparsebit *s,
1373 	sparsebit_idx_t start, sparsebit_num_t num)
1374 {
1375 	struct node *nodep, *next;
1376 	unsigned int n1;
1377 	sparsebit_idx_t idx;
1378 	sparsebit_num_t n;
1379 	sparsebit_idx_t middle_start, middle_end;
1380 
1381 	assert(num > 0);
1382 	assert(start + num - 1 >= start);
1383 
1384 	/*
1385 	 * Leading - bits before first mask boundary.
1386 	 *
1387 	 * TODO(lhuemill): With some effort it may be possible to
1388 	 *   replace the following loop with a sequential sequence
1389 	 *   of statements.  High level sequence would be:
1390 	 *
1391 	 *     1. Use node_split() to force node that describes setting
1392 	 *        of idx to be within the mask portion of a node.
1393 	 *     2. Form mask of bits to be set.
1394 	 *     3. Determine number of mask bits already set in the node
1395 	 *        and store in a local variable named num_already_set.
1396 	 *     4. Set the appropriate mask bits within the node.
1397 	 *     5. Increment struct sparsebit_pvt num_set member
1398 	 *        by the number of bits that were actually set.
1399 	 *        Exclude from the counts bits that were already set.
1400 	 *     6. Before returning to the caller, use node_reduce() to
1401 	 *        handle the multiple corner cases that this method
1402 	 *        introduces.
1403 	 */
1404 	for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--)
1405 		bit_set(s, idx);
1406 
1407 	/* Middle - bits spanning one or more entire mask */
1408 	middle_start = idx;
1409 	middle_end = middle_start + (n & -MASK_BITS) - 1;
1410 	if (n >= MASK_BITS) {
1411 		nodep = node_split(s, middle_start);
1412 
1413 		/*
1414 		 * As needed, split just after end of middle bits.
1415 		 * No split needed if end of middle bits is at highest
1416 		 * supported bit index.
1417 		 */
1418 		if (middle_end + 1 > middle_end)
1419 			(void) node_split(s, middle_end + 1);
1420 
1421 		/* Delete nodes that only describe bits within the middle. */
1422 		for (next = node_next(s, nodep);
1423 			next && (next->idx < middle_end);
1424 			next = node_next(s, nodep)) {
1425 			assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end);
1426 			node_rm(s, next);
1427 			next = NULL;
1428 		}
1429 
1430 		/* As needed set each of the mask bits */
1431 		for (n1 = 0; n1 < MASK_BITS; n1++) {
1432 			if (!(nodep->mask & (1 << n1))) {
1433 				nodep->mask |= 1 << n1;
1434 				s->num_set++;
1435 			}
1436 		}
1437 
1438 		s->num_set -= nodep->num_after;
1439 		nodep->num_after = middle_end - middle_start + 1 - MASK_BITS;
1440 		s->num_set += nodep->num_after;
1441 
1442 		node_reduce(s, nodep);
1443 	}
1444 	idx = middle_end + 1;
1445 	n -= middle_end - middle_start + 1;
1446 
1447 	/* Trailing - bits at and beyond last mask boundary */
1448 	assert(n < MASK_BITS);
1449 	for (; n > 0; idx++, n--)
1450 		bit_set(s, idx);
1451 }
1452 
1453 /* Clears the bits * in the inclusive range idx through idx + num - 1.  */
sparsebit_clear_num(struct sparsebit * s,sparsebit_idx_t start,sparsebit_num_t num)1454 void sparsebit_clear_num(struct sparsebit *s,
1455 	sparsebit_idx_t start, sparsebit_num_t num)
1456 {
1457 	struct node *nodep, *next;
1458 	unsigned int n1;
1459 	sparsebit_idx_t idx;
1460 	sparsebit_num_t n;
1461 	sparsebit_idx_t middle_start, middle_end;
1462 
1463 	assert(num > 0);
1464 	assert(start + num - 1 >= start);
1465 
1466 	/* Leading - bits before first mask boundary */
1467 	for (idx = start, n = num; n > 0 && idx % MASK_BITS != 0; idx++, n--)
1468 		bit_clear(s, idx);
1469 
1470 	/* Middle - bits spanning one or more entire mask */
1471 	middle_start = idx;
1472 	middle_end = middle_start + (n & -MASK_BITS) - 1;
1473 	if (n >= MASK_BITS) {
1474 		nodep = node_split(s, middle_start);
1475 
1476 		/*
1477 		 * As needed, split just after end of middle bits.
1478 		 * No split needed if end of middle bits is at highest
1479 		 * supported bit index.
1480 		 */
1481 		if (middle_end + 1 > middle_end)
1482 			(void) node_split(s, middle_end + 1);
1483 
1484 		/* Delete nodes that only describe bits within the middle. */
1485 		for (next = node_next(s, nodep);
1486 			next && (next->idx < middle_end);
1487 			next = node_next(s, nodep)) {
1488 			assert(next->idx + MASK_BITS + next->num_after - 1 <= middle_end);
1489 			node_rm(s, next);
1490 			next = NULL;
1491 		}
1492 
1493 		/* As needed clear each of the mask bits */
1494 		for (n1 = 0; n1 < MASK_BITS; n1++) {
1495 			if (nodep->mask & (1 << n1)) {
1496 				nodep->mask &= ~(1 << n1);
1497 				s->num_set--;
1498 			}
1499 		}
1500 
1501 		/* Clear any bits described by num_after */
1502 		s->num_set -= nodep->num_after;
1503 		nodep->num_after = 0;
1504 
1505 		/*
1506 		 * Delete the node that describes the beginning of
1507 		 * the middle bits and perform any allowed reductions
1508 		 * with the nodes prev or next of nodep.
1509 		 */
1510 		node_reduce(s, nodep);
1511 		nodep = NULL;
1512 	}
1513 	idx = middle_end + 1;
1514 	n -= middle_end - middle_start + 1;
1515 
1516 	/* Trailing - bits at and beyond last mask boundary */
1517 	assert(n < MASK_BITS);
1518 	for (; n > 0; idx++, n--)
1519 		bit_clear(s, idx);
1520 }
1521 
1522 /* Sets the bit at the index given by idx.  */
sparsebit_set(struct sparsebit * s,sparsebit_idx_t idx)1523 void sparsebit_set(struct sparsebit *s, sparsebit_idx_t idx)
1524 {
1525 	sparsebit_set_num(s, idx, 1);
1526 }
1527 
1528 /* Clears the bit at the index given by idx.  */
sparsebit_clear(struct sparsebit * s,sparsebit_idx_t idx)1529 void sparsebit_clear(struct sparsebit *s, sparsebit_idx_t idx)
1530 {
1531 	sparsebit_clear_num(s, idx, 1);
1532 }
1533 
1534 /* Sets the bits in the entire addressable range of the sparsebit array.  */
sparsebit_set_all(struct sparsebit * s)1535 void sparsebit_set_all(struct sparsebit *s)
1536 {
1537 	sparsebit_set(s, 0);
1538 	sparsebit_set_num(s, 1, ~(sparsebit_idx_t) 0);
1539 	assert(sparsebit_all_set(s));
1540 }
1541 
1542 /* Clears the bits in the entire addressable range of the sparsebit array.  */
sparsebit_clear_all(struct sparsebit * s)1543 void sparsebit_clear_all(struct sparsebit *s)
1544 {
1545 	sparsebit_clear(s, 0);
1546 	sparsebit_clear_num(s, 1, ~(sparsebit_idx_t) 0);
1547 	assert(!sparsebit_any_set(s));
1548 }
1549 
display_range(FILE * stream,sparsebit_idx_t low,sparsebit_idx_t high,bool prepend_comma_space)1550 static size_t display_range(FILE *stream, sparsebit_idx_t low,
1551 	sparsebit_idx_t high, bool prepend_comma_space)
1552 {
1553 	char *fmt_str;
1554 	size_t sz;
1555 
1556 	/* Determine the printf format string */
1557 	if (low == high)
1558 		fmt_str = prepend_comma_space ? ", 0x%lx" : "0x%lx";
1559 	else
1560 		fmt_str = prepend_comma_space ? ", 0x%lx:0x%lx" : "0x%lx:0x%lx";
1561 
1562 	/*
1563 	 * When stream is NULL, just determine the size of what would
1564 	 * have been printed, else print the range.
1565 	 */
1566 	if (!stream)
1567 		sz = snprintf(NULL, 0, fmt_str, low, high);
1568 	else
1569 		sz = fprintf(stream, fmt_str, low, high);
1570 
1571 	return sz;
1572 }
1573 
1574 
1575 /* Dumps to the FILE stream given by stream, the bit settings
1576  * of s.  Each line of output is prefixed with the number of
1577  * spaces given by indent.  The length of each line is implementation
1578  * dependent and does not depend on the indent amount.  The following
1579  * is an example output of a sparsebit array that has bits:
1580  *
1581  *   0x5, 0x8, 0xa:0xe, 0x12
1582  *
1583  * This corresponds to a sparsebit whose bits 5, 8, 10, 11, 12, 13, 14, 18
1584  * are set.  Note that a ':', instead of a '-' is used to specify a range of
1585  * contiguous bits.  This is done because '-' is used to specify command-line
1586  * options, and sometimes ranges are specified as command-line arguments.
1587  */
sparsebit_dump(FILE * stream,struct sparsebit * s,unsigned int indent)1588 void sparsebit_dump(FILE *stream, struct sparsebit *s,
1589 	unsigned int indent)
1590 {
1591 	size_t current_line_len = 0;
1592 	size_t sz;
1593 	struct node *nodep;
1594 
1595 	if (!sparsebit_any_set(s))
1596 		return;
1597 
1598 	/* Display initial indent */
1599 	fprintf(stream, "%*s", indent, "");
1600 
1601 	/* For each node */
1602 	for (nodep = node_first(s); nodep; nodep = node_next(s, nodep)) {
1603 		unsigned int n1;
1604 		sparsebit_idx_t low, high;
1605 
1606 		/* For each group of bits in the mask */
1607 		for (n1 = 0; n1 < MASK_BITS; n1++) {
1608 			if (nodep->mask & (1 << n1)) {
1609 				low = high = nodep->idx + n1;
1610 
1611 				for (; n1 < MASK_BITS; n1++) {
1612 					if (nodep->mask & (1 << n1))
1613 						high = nodep->idx + n1;
1614 					else
1615 						break;
1616 				}
1617 
1618 				if ((n1 == MASK_BITS) && nodep->num_after)
1619 					high += nodep->num_after;
1620 
1621 				/*
1622 				 * How much room will it take to display
1623 				 * this range.
1624 				 */
1625 				sz = display_range(NULL, low, high,
1626 					current_line_len != 0);
1627 
1628 				/*
1629 				 * If there is not enough room, display
1630 				 * a newline plus the indent of the next
1631 				 * line.
1632 				 */
1633 				if (current_line_len + sz > DUMP_LINE_MAX) {
1634 					fputs("\n", stream);
1635 					fprintf(stream, "%*s", indent, "");
1636 					current_line_len = 0;
1637 				}
1638 
1639 				/* Display the range */
1640 				sz = display_range(stream, low, high,
1641 					current_line_len != 0);
1642 				current_line_len += sz;
1643 			}
1644 		}
1645 
1646 		/*
1647 		 * If num_after and most significant-bit of mask is not
1648 		 * set, then still need to display a range for the bits
1649 		 * described by num_after.
1650 		 */
1651 		if (!(nodep->mask & (1 << (MASK_BITS - 1))) && nodep->num_after) {
1652 			low = nodep->idx + MASK_BITS;
1653 			high = nodep->idx + MASK_BITS + nodep->num_after - 1;
1654 
1655 			/*
1656 			 * How much room will it take to display
1657 			 * this range.
1658 			 */
1659 			sz = display_range(NULL, low, high,
1660 				current_line_len != 0);
1661 
1662 			/*
1663 			 * If there is not enough room, display
1664 			 * a newline plus the indent of the next
1665 			 * line.
1666 			 */
1667 			if (current_line_len + sz > DUMP_LINE_MAX) {
1668 				fputs("\n", stream);
1669 				fprintf(stream, "%*s", indent, "");
1670 				current_line_len = 0;
1671 			}
1672 
1673 			/* Display the range */
1674 			sz = display_range(stream, low, high,
1675 				current_line_len != 0);
1676 			current_line_len += sz;
1677 		}
1678 	}
1679 	fputs("\n", stream);
1680 }
1681 
1682 /* Validates the internal state of the sparsebit array given by
1683  * s.  On error, diagnostic information is printed to stderr and
1684  * abort is called.
1685  */
sparsebit_validate_internal(struct sparsebit * s)1686 void sparsebit_validate_internal(struct sparsebit *s)
1687 {
1688 	bool error_detected = false;
1689 	struct node *nodep, *prev = NULL;
1690 	sparsebit_num_t total_bits_set = 0;
1691 	unsigned int n1;
1692 
1693 	/* For each node */
1694 	for (nodep = node_first(s); nodep;
1695 		prev = nodep, nodep = node_next(s, nodep)) {
1696 
1697 		/*
1698 		 * Increase total bits set by the number of bits set
1699 		 * in this node.
1700 		 */
1701 		for (n1 = 0; n1 < MASK_BITS; n1++)
1702 			if (nodep->mask & (1 << n1))
1703 				total_bits_set++;
1704 
1705 		total_bits_set += nodep->num_after;
1706 
1707 		/*
1708 		 * Arbitrary choice as to whether a mask of 0 is allowed
1709 		 * or not.  For diagnostic purposes it is beneficial to
1710 		 * have only one valid means to represent a set of bits.
1711 		 * To support this an arbitrary choice has been made
1712 		 * to not allow a mask of zero.
1713 		 */
1714 		if (nodep->mask == 0) {
1715 			fprintf(stderr, "Node mask of zero, "
1716 				"nodep: %p nodep->mask: 0x%x",
1717 				nodep, nodep->mask);
1718 			error_detected = true;
1719 			break;
1720 		}
1721 
1722 		/*
1723 		 * Validate num_after is not greater than the max index
1724 		 * - the number of mask bits.  The num_after member
1725 		 * uses 0-based indexing and thus has no value that
1726 		 * represents all bits set.  This limitation is handled
1727 		 * by requiring a non-zero mask.  With a non-zero mask,
1728 		 * MASK_BITS worth of bits are described by the mask,
1729 		 * which makes the largest needed num_after equal to:
1730 		 *
1731 		 *    (~(sparsebit_num_t) 0) - MASK_BITS + 1
1732 		 */
1733 		if (nodep->num_after
1734 			> (~(sparsebit_num_t) 0) - MASK_BITS + 1) {
1735 			fprintf(stderr, "num_after too large, "
1736 				"nodep: %p nodep->num_after: 0x%lx",
1737 				nodep, nodep->num_after);
1738 			error_detected = true;
1739 			break;
1740 		}
1741 
1742 		/* Validate node index is divisible by the mask size */
1743 		if (nodep->idx % MASK_BITS) {
1744 			fprintf(stderr, "Node index not divisible by "
1745 				"mask size,\n"
1746 				"  nodep: %p nodep->idx: 0x%lx "
1747 				"MASK_BITS: %lu\n",
1748 				nodep, nodep->idx, MASK_BITS);
1749 			error_detected = true;
1750 			break;
1751 		}
1752 
1753 		/*
1754 		 * Validate bits described by node don't wrap beyond the
1755 		 * highest supported index.
1756 		 */
1757 		if ((nodep->idx + MASK_BITS + nodep->num_after - 1) < nodep->idx) {
1758 			fprintf(stderr, "Bits described by node wrap "
1759 				"beyond highest supported index,\n"
1760 				"  nodep: %p nodep->idx: 0x%lx\n"
1761 				"  MASK_BITS: %lu nodep->num_after: 0x%lx",
1762 				nodep, nodep->idx, MASK_BITS, nodep->num_after);
1763 			error_detected = true;
1764 			break;
1765 		}
1766 
1767 		/* Check parent pointers. */
1768 		if (nodep->left) {
1769 			if (nodep->left->parent != nodep) {
1770 				fprintf(stderr, "Left child parent pointer "
1771 					"doesn't point to this node,\n"
1772 					"  nodep: %p nodep->left: %p "
1773 					"nodep->left->parent: %p",
1774 					nodep, nodep->left,
1775 					nodep->left->parent);
1776 				error_detected = true;
1777 				break;
1778 			}
1779 		}
1780 
1781 		if (nodep->right) {
1782 			if (nodep->right->parent != nodep) {
1783 				fprintf(stderr, "Right child parent pointer "
1784 					"doesn't point to this node,\n"
1785 					"  nodep: %p nodep->right: %p "
1786 					"nodep->right->parent: %p",
1787 					nodep, nodep->right,
1788 					nodep->right->parent);
1789 				error_detected = true;
1790 				break;
1791 			}
1792 		}
1793 
1794 		if (!nodep->parent) {
1795 			if (s->root != nodep) {
1796 				fprintf(stderr, "Unexpected root node, "
1797 					"s->root: %p nodep: %p",
1798 					s->root, nodep);
1799 				error_detected = true;
1800 				break;
1801 			}
1802 		}
1803 
1804 		if (prev) {
1805 			/*
1806 			 * Is index of previous node before index of
1807 			 * current node?
1808 			 */
1809 			if (prev->idx >= nodep->idx) {
1810 				fprintf(stderr, "Previous node index "
1811 					">= current node index,\n"
1812 					"  prev: %p prev->idx: 0x%lx\n"
1813 					"  nodep: %p nodep->idx: 0x%lx",
1814 					prev, prev->idx, nodep, nodep->idx);
1815 				error_detected = true;
1816 				break;
1817 			}
1818 
1819 			/*
1820 			 * Nodes occur in asscending order, based on each
1821 			 * nodes starting index.
1822 			 */
1823 			if ((prev->idx + MASK_BITS + prev->num_after - 1)
1824 				>= nodep->idx) {
1825 				fprintf(stderr, "Previous node bit range "
1826 					"overlap with current node bit range,\n"
1827 					"  prev: %p prev->idx: 0x%lx "
1828 					"prev->num_after: 0x%lx\n"
1829 					"  nodep: %p nodep->idx: 0x%lx "
1830 					"nodep->num_after: 0x%lx\n"
1831 					"  MASK_BITS: %lu",
1832 					prev, prev->idx, prev->num_after,
1833 					nodep, nodep->idx, nodep->num_after,
1834 					MASK_BITS);
1835 				error_detected = true;
1836 				break;
1837 			}
1838 
1839 			/*
1840 			 * When the node has all mask bits set, it shouldn't
1841 			 * be adjacent to the last bit described by the
1842 			 * previous node.
1843 			 */
1844 			if (nodep->mask == ~(mask_t) 0 &&
1845 			    prev->idx + MASK_BITS + prev->num_after == nodep->idx) {
1846 				fprintf(stderr, "Current node has mask with "
1847 					"all bits set and is adjacent to the "
1848 					"previous node,\n"
1849 					"  prev: %p prev->idx: 0x%lx "
1850 					"prev->num_after: 0x%lx\n"
1851 					"  nodep: %p nodep->idx: 0x%lx "
1852 					"nodep->num_after: 0x%lx\n"
1853 					"  MASK_BITS: %lu",
1854 					prev, prev->idx, prev->num_after,
1855 					nodep, nodep->idx, nodep->num_after,
1856 					MASK_BITS);
1857 
1858 				error_detected = true;
1859 				break;
1860 			}
1861 		}
1862 	}
1863 
1864 	if (!error_detected) {
1865 		/*
1866 		 * Is sum of bits set in each node equal to the count
1867 		 * of total bits set.
1868 		 */
1869 		if (s->num_set != total_bits_set) {
1870 			fprintf(stderr, "Number of bits set missmatch,\n"
1871 				"  s->num_set: 0x%lx total_bits_set: 0x%lx",
1872 				s->num_set, total_bits_set);
1873 
1874 			error_detected = true;
1875 		}
1876 	}
1877 
1878 	if (error_detected) {
1879 		fputs("  dump_internal:\n", stderr);
1880 		sparsebit_dump_internal(stderr, s, 4);
1881 		abort();
1882 	}
1883 }
1884 
1885 
1886 #ifdef FUZZ
1887 /* A simple but effective fuzzing driver.  Look for bugs with the help
1888  * of some invariants and of a trivial representation of sparsebit.
1889  * Just use 512 bytes of /dev/zero and /dev/urandom as inputs, and let
1890  * afl-fuzz do the magic. :)
1891  */
1892 
1893 #include <stdlib.h>
1894 #include <assert.h>
1895 
1896 struct range {
1897 	sparsebit_idx_t first, last;
1898 	bool set;
1899 };
1900 
1901 struct sparsebit *s;
1902 struct range ranges[1000];
1903 int num_ranges;
1904 
get_value(sparsebit_idx_t idx)1905 static bool get_value(sparsebit_idx_t idx)
1906 {
1907 	int i;
1908 
1909 	for (i = num_ranges; --i >= 0; )
1910 		if (ranges[i].first <= idx && idx <= ranges[i].last)
1911 			return ranges[i].set;
1912 
1913 	return false;
1914 }
1915 
operate(int code,sparsebit_idx_t first,sparsebit_idx_t last)1916 static void operate(int code, sparsebit_idx_t first, sparsebit_idx_t last)
1917 {
1918 	sparsebit_num_t num;
1919 	sparsebit_idx_t next;
1920 
1921 	if (first < last) {
1922 		num = last - first + 1;
1923 	} else {
1924 		num = first - last + 1;
1925 		first = last;
1926 		last = first + num - 1;
1927 	}
1928 
1929 	switch (code) {
1930 	case 0:
1931 		sparsebit_set(s, first);
1932 		assert(sparsebit_is_set(s, first));
1933 		assert(!sparsebit_is_clear(s, first));
1934 		assert(sparsebit_any_set(s));
1935 		assert(!sparsebit_all_clear(s));
1936 		if (get_value(first))
1937 			return;
1938 		if (num_ranges == 1000)
1939 			exit(0);
1940 		ranges[num_ranges++] = (struct range)
1941 			{ .first = first, .last = first, .set = true };
1942 		break;
1943 	case 1:
1944 		sparsebit_clear(s, first);
1945 		assert(!sparsebit_is_set(s, first));
1946 		assert(sparsebit_is_clear(s, first));
1947 		assert(sparsebit_any_clear(s));
1948 		assert(!sparsebit_all_set(s));
1949 		if (!get_value(first))
1950 			return;
1951 		if (num_ranges == 1000)
1952 			exit(0);
1953 		ranges[num_ranges++] = (struct range)
1954 			{ .first = first, .last = first, .set = false };
1955 		break;
1956 	case 2:
1957 		assert(sparsebit_is_set(s, first) == get_value(first));
1958 		assert(sparsebit_is_clear(s, first) == !get_value(first));
1959 		break;
1960 	case 3:
1961 		if (sparsebit_any_set(s))
1962 			assert(get_value(sparsebit_first_set(s)));
1963 		if (sparsebit_any_clear(s))
1964 			assert(!get_value(sparsebit_first_clear(s)));
1965 		sparsebit_set_all(s);
1966 		assert(!sparsebit_any_clear(s));
1967 		assert(sparsebit_all_set(s));
1968 		num_ranges = 0;
1969 		ranges[num_ranges++] = (struct range)
1970 			{ .first = 0, .last = ~(sparsebit_idx_t)0, .set = true };
1971 		break;
1972 	case 4:
1973 		if (sparsebit_any_set(s))
1974 			assert(get_value(sparsebit_first_set(s)));
1975 		if (sparsebit_any_clear(s))
1976 			assert(!get_value(sparsebit_first_clear(s)));
1977 		sparsebit_clear_all(s);
1978 		assert(!sparsebit_any_set(s));
1979 		assert(sparsebit_all_clear(s));
1980 		num_ranges = 0;
1981 		break;
1982 	case 5:
1983 		next = sparsebit_next_set(s, first);
1984 		assert(next == 0 || next > first);
1985 		assert(next == 0 || get_value(next));
1986 		break;
1987 	case 6:
1988 		next = sparsebit_next_clear(s, first);
1989 		assert(next == 0 || next > first);
1990 		assert(next == 0 || !get_value(next));
1991 		break;
1992 	case 7:
1993 		next = sparsebit_next_clear(s, first);
1994 		if (sparsebit_is_set_num(s, first, num)) {
1995 			assert(next == 0 || next > last);
1996 			if (first)
1997 				next = sparsebit_next_set(s, first - 1);
1998 			else if (sparsebit_any_set(s))
1999 				next = sparsebit_first_set(s);
2000 			else
2001 				return;
2002 			assert(next == first);
2003 		} else {
2004 			assert(sparsebit_is_clear(s, first) || next <= last);
2005 		}
2006 		break;
2007 	case 8:
2008 		next = sparsebit_next_set(s, first);
2009 		if (sparsebit_is_clear_num(s, first, num)) {
2010 			assert(next == 0 || next > last);
2011 			if (first)
2012 				next = sparsebit_next_clear(s, first - 1);
2013 			else if (sparsebit_any_clear(s))
2014 				next = sparsebit_first_clear(s);
2015 			else
2016 				return;
2017 			assert(next == first);
2018 		} else {
2019 			assert(sparsebit_is_set(s, first) || next <= last);
2020 		}
2021 		break;
2022 	case 9:
2023 		sparsebit_set_num(s, first, num);
2024 		assert(sparsebit_is_set_num(s, first, num));
2025 		assert(!sparsebit_is_clear_num(s, first, num));
2026 		assert(sparsebit_any_set(s));
2027 		assert(!sparsebit_all_clear(s));
2028 		if (num_ranges == 1000)
2029 			exit(0);
2030 		ranges[num_ranges++] = (struct range)
2031 			{ .first = first, .last = last, .set = true };
2032 		break;
2033 	case 10:
2034 		sparsebit_clear_num(s, first, num);
2035 		assert(!sparsebit_is_set_num(s, first, num));
2036 		assert(sparsebit_is_clear_num(s, first, num));
2037 		assert(sparsebit_any_clear(s));
2038 		assert(!sparsebit_all_set(s));
2039 		if (num_ranges == 1000)
2040 			exit(0);
2041 		ranges[num_ranges++] = (struct range)
2042 			{ .first = first, .last = last, .set = false };
2043 		break;
2044 	case 11:
2045 		sparsebit_validate_internal(s);
2046 		break;
2047 	default:
2048 		break;
2049 	}
2050 }
2051 
get8(void)2052 unsigned char get8(void)
2053 {
2054 	int ch;
2055 
2056 	ch = getchar();
2057 	if (ch == EOF)
2058 		exit(0);
2059 	return ch;
2060 }
2061 
get64(void)2062 uint64_t get64(void)
2063 {
2064 	uint64_t x;
2065 
2066 	x = get8();
2067 	x = (x << 8) | get8();
2068 	x = (x << 8) | get8();
2069 	x = (x << 8) | get8();
2070 	x = (x << 8) | get8();
2071 	x = (x << 8) | get8();
2072 	x = (x << 8) | get8();
2073 	return (x << 8) | get8();
2074 }
2075 
main(void)2076 int main(void)
2077 {
2078 	s = sparsebit_alloc();
2079 	for (;;) {
2080 		uint8_t op = get8() & 0xf;
2081 		uint64_t first = get64();
2082 		uint64_t last = get64();
2083 
2084 		operate(op, first, last);
2085 	}
2086 }
2087 #endif
2088