From 00dae56e1939ef14bb900cab9b472dfd001f8e37 Mon Sep 17 00:00:00 2001 From: Benny Halevy Date: Sun, 29 May 2022 13:12:33 +0300 Subject: [PATCH] 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 --- utils/dynamic_bitset.cc | 10 +++++----- utils/dynamic_bitset.hh | 25 ++++++++++++++----------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/utils/dynamic_bitset.cc b/utils/dynamic_bitset.cc index 160c060f93..6fb98fb38d 100644 --- a/utils/dynamic_bitset.cc +++ b/utils/dynamic_bitset.cc @@ -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) { diff --git a/utils/dynamic_bitset.hh b/utils/dynamic_bitset.hh index f0d0ab01fd..da8a280d26 100644 --- a/utils/dynamic_bitset.hh +++ b/utils/dynamic_bitset.hh @@ -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; }; }