diff --git a/include/util/packed_vector.hpp b/include/util/packed_vector.hpp index 4dd202e104..338962587b 100644 --- a/include/util/packed_vector.hpp +++ b/include/util/packed_vector.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -39,67 +40,53 @@ namespace detail { template -inline T get_lower_half_value(WordT word, - WordT mask, - std::uint8_t offset, - typename std::enable_if_t::value> * = nullptr) +inline T get_lower_half_value(WordT word, WordT mask, std::uint8_t offset) + requires std::integral { return static_cast((word & mask) >> offset); } template -inline T get_lower_half_value(WordT word, - WordT mask, - std::uint8_t offset, - typename T::value_type * = nullptr) +inline T get_lower_half_value(WordT word, WordT mask, std::uint8_t offset) + requires(!std::integral) { return T{static_cast((word & mask) >> offset)}; } template -inline T get_upper_half_value(WordT word, - WordT mask, - std::uint8_t offset, - typename std::enable_if_t::value> * = nullptr) +inline T get_upper_half_value(WordT word, WordT mask, std::uint8_t offset) + requires std::integral { return static_cast((word & mask) << offset); } template -inline T get_upper_half_value(WordT word, - WordT mask, - std::uint8_t offset, - typename T::value_type * = nullptr) +inline T get_upper_half_value(WordT word, WordT mask, std::uint8_t offset) + requires(!std::integral) { static_assert(std::is_unsigned::value, "Only unsigned word types supported for now."); return T{static_cast((word & mask) << offset)}; } template -inline WordT set_lower_value(WordT word, - WordT mask, - std::uint8_t offset, - T value, - typename std::enable_if_t::value> * = nullptr) +inline WordT set_lower_value(WordT word, WordT mask, std::uint8_t offset, T value) + requires std::integral { static_assert(std::is_unsigned::value, "Only unsigned word types supported for now."); return (word & ~mask) | ((static_cast(value) << offset) & mask); } template -inline WordT set_upper_value(WordT word, - WordT mask, - std::uint8_t offset, - T value, - typename std::enable_if_t::value> * = nullptr) +inline WordT set_upper_value(WordT word, WordT mask, std::uint8_t offset, T value) + requires std::integral { static_assert(std::is_unsigned::value, "Only unsigned word types supported for now."); return (word & ~mask) | ((static_cast(value) >> offset) & mask); } template -inline WordT set_lower_value( - WordT word, WordT mask, std::uint8_t offset, T value, typename T::value_type * = nullptr) +inline WordT set_lower_value(WordT word, WordT mask, std::uint8_t offset, T value) + requires(!std::integral) { static_assert(std::is_unsigned::value, "Only unsigned word types supported for now."); return (word & ~mask) | @@ -107,8 +94,8 @@ inline WordT set_lower_value( } template -inline WordT set_upper_value( - WordT word, WordT mask, std::uint8_t offset, T value, typename T::value_type * = nullptr) +inline WordT set_upper_value(WordT word, WordT mask, std::uint8_t offset, T value) + requires(!std::integral) { static_assert(std::is_unsigned::value, "Only unsigned word types supported for now."); return (word & ~mask) | @@ -512,8 +499,8 @@ template class Pack std::size_t capacity() const { return (vec.capacity() / BLOCK_WORDS) * BLOCK_ELEMENTS; } - template - void reserve(std::enable_if::type capacity) + void reserve(std::size_t capacity) + requires(Ownership != storage::Ownership::View) { auto num_blocks = (capacity + BLOCK_ELEMENTS - 1) / BLOCK_ELEMENTS; vec.reserve(num_blocks * BLOCK_WORDS + 1);