utils: dynamic_bitset: mark functions noexcept

dynamic_bitset allocates only when constructed.
then on it doesn't throw.

Though not that accessing bits out of range
is undefined behavior.

Signed-off-by: Benny Halevy <bhalevy@scylladb.com>
This commit is contained in:
Benny Halevy
2022-05-29 13:12:33 +03:00
parent d911d03344
commit 00dae56e19
2 changed files with 19 additions and 16 deletions

View File

@@ -16,7 +16,7 @@
namespace utils {
void dynamic_bitset::set(size_t n) {
void dynamic_bitset::set(size_t n) noexcept {
for (auto& level : _bits) {
auto idx = n / bits_per_int;
auto old = level[idx];
@@ -28,7 +28,7 @@ void dynamic_bitset::set(size_t n) {
}
}
void dynamic_bitset::clear(size_t n) {
void dynamic_bitset::clear(size_t n) noexcept {
for (auto& level : _bits) {
auto idx = n / bits_per_int;
auto old = level[idx];
@@ -40,7 +40,7 @@ void dynamic_bitset::clear(size_t n) {
}
}
size_t dynamic_bitset::find_first_set() const
size_t dynamic_bitset::find_first_set() const noexcept
{
size_t pos = 0;
for (auto& vv : _bits | boost::adaptors::reversed) {
@@ -55,7 +55,7 @@ size_t dynamic_bitset::find_first_set() const
return pos;
}
size_t dynamic_bitset::find_next_set(size_t n) const
size_t dynamic_bitset::find_next_set(size_t n) const noexcept
{
++n;
@@ -91,7 +91,7 @@ size_t dynamic_bitset::find_next_set(size_t n) const
return n;
}
size_t dynamic_bitset::find_last_set() const
size_t dynamic_bitset::find_last_set() const noexcept
{
size_t pos = 0;
for (auto& vv : _bits | boost::adaptors::reversed) {

View File

@@ -26,19 +26,19 @@ private:
size_t _bits_count = 0;
private:
// For n in range 0..(bits_per_int-1), produces a mask with all bits < n set
static int_type mask_lower_bits(size_t n) {
static int_type mask_lower_bits(size_t n) noexcept {
return (int_type(1) << n) - 1;
}
// For n in range 0..(bits_per_int-1), produces a mask with all bits >= n set
static int_type mask_higher_bits(size_t n) {
static int_type mask_higher_bits(size_t n) noexcept {
return ~mask_lower_bits(n);
}
// For bit n, produce index into _bits[level]
static size_t level_idx(unsigned level, size_t n) {
static size_t level_idx(unsigned level, size_t n) noexcept {
return n >> ((level + 1) * level_shift);
}
// For bit n, produce bit number in _bits[level][level_idx]
static unsigned level_remainder(unsigned level, size_t n) {
static unsigned level_remainder(unsigned level, size_t n) noexcept {
return (n >> (level * level_shift)) & (bits_per_int - 1);
}
public:
@@ -48,18 +48,21 @@ public:
public:
explicit dynamic_bitset(size_t nr_bits);
bool test(size_t n) const {
// undefined if n >= size
bool test(size_t n) const noexcept {
auto idx = n / bits_per_int;
return _bits[0][idx] & (int_type(1u) << (n % bits_per_int));
}
void set(size_t n);
void clear(size_t n);
// undefined if n >= size
void set(size_t n) noexcept;
// undefined if n >= size
void clear(size_t n) noexcept;
size_t size() const { return _bits_count; }
size_t size() const noexcept { return _bits_count; }
size_t find_first_set() const;
size_t find_next_set(size_t n) const;
size_t find_last_set() const;
size_t find_first_set() const noexcept;
size_t find_next_set(size_t n) const noexcept;
size_t find_last_set() const noexcept;
};
}