A couple of parts of the function always searched for `true` instead of
the `value` argument.
This may have gone unnoticed because the `contains` function is only
ever used to search for `true`.
The `values` array has a fixed size of `MaxChunkSize`. When `size` is
smaller than `MaxChunkSize`, only the first `size` elements of `values`
will have been initialized by `varray.materialize_compressed`, but
`std::find` was searching through the entirety of `values` every time.
This could cause false positive results due to the uninitialized values
having a chance to match the value being searched for.
Consider an IndexRange of 8 elements starting at 0:
`range.start()` will be `0` and `range.last()` will be `7`.
The size of the range is not `range.last() - range.start()` because that
will be 7, but rather `range.one_after_last() - range.start()`.
The code was using `last()` when it should have been using
`one_after_last()`, which would cause the very last element of each
2048-element section (as per the grain size) of `varray` to be skipped.