- if (num_lines < reservoir->reservoir_sz) {
- randomness = rand_upto_inclusive_(num_lines);
- NOTIFY_DEBUG("moving index %zu to end (%zu)", randomness, num_lines);
- reservoir->reservoir[num_lines] = reservoir->reservoir[randomness];
- old_buf = NULL;
+ unsigned long randomness;
+
+ if (reservoir->reservoir_insertions < reservoir->reservoir_sz) {
+ /* there are still unused slots, fill them up without discarding anything */
+ /* do this by moving our random victim slot contents to the end of the list, before inserting the new item in its old place */
+ randomness = rand_upto_inclusive_(reservoir->reservoir_insertions);
+
+ assert(reservoir->reservoir[reservoir->reservoir_insertions] == NULL); /* yet-unused slots will be null-initialized */
+
+ NOTIFY_DEBUG("preserving existing index %zu to end index (%zu)", randomness, reservoir->reservoir_insertions);
+ reservoir->reservoir[reservoir->reservoir_insertions] = reservoir->reservoir[randomness];
+ old_buf = NULL; /* no old entry to discard */