+
+/* Initializes 'tracker'. */
+void
+tag_tracker_init(struct tag_tracker *tracker)
+{
+ memset(tracker, 0, sizeof *tracker);
+}
+
+/* Adds 'add' to '*tags' and records the bits added in 'tracker'. */
+void
+tag_tracker_add(struct tag_tracker *tracker, tag_type *tags, tag_type add)
+{
+ *tags |= add;
+ for (; add; add = zero_rightmost_1bit(add)) {
+ tracker->counts[rightmost_1bit_idx(add)]++;
+ }
+}
+
+/* Removes 'sub' from 'tracker' and unsets any bits in '*tags' that no
+ * remaining tag includes. */
+void
+tag_tracker_subtract(struct tag_tracker *tracker, tag_type *tags, tag_type sub)
+{
+ for (; sub; sub = zero_rightmost_1bit(sub)) {
+ if (!--tracker->counts[rightmost_1bit_idx(sub)]) {
+ *tags &= ~rightmost_1bit(sub);
+ }
+ }
+}