A better std::bitset that supports scanning for bits optimally
std::bitset has been neglected as of late. A common use case of a bitset in the game development world is to track slots in a server, claiming the
lowest slot. The current API of std::bitset does not provide a good way to bitscan for zeros (empty slots) in contexts above 64-bits (for 64 slots
and below, you can conveniently use std::bitset::to_ullong and std::countr_ones). In my case, I needed 256-bit sets, and chaining together bitsets
is hacky at best.
better_bitset is actually smaller than std::bitset for sizes 16 bits and below, so if you have a bunch of small bitsets, this can save a few bytes.
The biggest change is the addition of first_zero and first_one in the bitset. It uses std::countr_ones and std::countr_zeros underneath, which
is optimized for x86 targets to extensions of the BSF instruction such as TZCNT, resulting in improvements averaging 60x versus the iterative
std::bitset approach as tested in the benchmarks folder.
better_bitset is not quite a drop-in replacement. I only implemented stuff that I needed and generally thought others may need. The usual suspects
like all, any, none, count, size, set, reset, flip, and to_string are there, but stuff such as bitwise operators and references are
missing. If you need them, they can be trivially implemented