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:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user