From 51b10c498c68afed682bb9bf82c93d77e12c7d0d Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 20 Jan 2024 21:03:17 +0000 Subject: [PATCH] Added to_ulong() and to_ullong() --- include/etl/private/bitset_new.h | 31 ++++++---- test/test_bitset_new_default_element_type.cpp | 50 ++++++++++++++++ ...itset_new_explicit_single_element_type.cpp | 50 ++++++++++++++++ ...st_bitset_new_ext_default_element_type.cpp | 56 ++++++++++++++++++ ...t_new_ext_explicit_single_element_type.cpp | 57 +++++++++++++++++++ 5 files changed, 232 insertions(+), 12 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 1220ef92..822bdd52 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -497,7 +497,7 @@ namespace etl { typedef typename etl::make_unsigned::type unsigned_t; - const unsigned_t Mask = etl::make_lsb_mask(Length); + const unsigned_t Mask = etl::make_lsb_mask(Length); const unsigned_t Shift = Position % Bits_Per_Element; unsigned_t value = static_cast(*pbuffer >> Shift) & Mask; @@ -1780,10 +1780,17 @@ namespace etl const size_t Shift = etl::integral_limits::bits; // Set the non-zero elements. - while ((value != 0) && (i != number_of_elements)) + if ETL_IF_CONSTEXPR(etl::integral_limits::bits == etl::integral_limits::bits) { - pbuffer[i++] = value & All_Set_Element; - value = value >> Shift; + pbuffer[i++] = value; + } + else + { + while ((value != 0) && (i != number_of_elements)) + { + pbuffer[i++] = value & All_Set_Element; + value = value >> Shift; + } } // Clear the remaining elements. @@ -2267,9 +2274,9 @@ namespace etl //************************************************************************* /// Get as an unsigned long. //************************************************************************* - ETL_CONSTEXPR14 unsigned long to_ulong() const ETL_NOEXCEPT + unsigned long to_ulong() const { - ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "to_ulong() : Active_Bits > unsigned long"); + ETL_ASSERT(etl::integral_limits::bits >= Active_Bits, ETL_ERROR(etl::bitset_overflow)); return implementation::template value(buffer, Number_Of_Elements); } @@ -2277,9 +2284,9 @@ namespace etl //************************************************************************* /// Get as an unsigned long long. //************************************************************************* - ETL_CONSTEXPR14 unsigned long long to_ullong() const ETL_NOEXCEPT + unsigned long long to_ullong() const { - ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "to_ullong() : Active_Bits > unsigned long long"); + ETL_ASSERT(etl::integral_limits::bits >= Active_Bits, ETL_ERROR(etl::bitset_overflow)); return implementation::template value(buffer, Number_Of_Elements); } @@ -3264,9 +3271,9 @@ namespace etl //************************************************************************* /// Get as an unsigned long. //************************************************************************* - ETL_CONSTEXPR14 unsigned long to_ulong() const ETL_NOEXCEPT + unsigned long to_ulong() const { - ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "Active_Bits > unsigned long"); + ETL_ASSERT(etl::integral_limits::bits >= Active_Bits, ETL_ERROR(etl::bitset_overflow)); return implementation::template value(pbuffer, Number_Of_Elements); } @@ -3274,9 +3281,9 @@ namespace etl //************************************************************************* /// Get as an unsigned long long. //************************************************************************* - ETL_CONSTEXPR14 unsigned long long to_ullong() const ETL_NOEXCEPT + unsigned long long to_ullong() const { - ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "Active_Bits > unsigned long long"); + ETL_ASSERT(etl::integral_limits::bits >= Active_Bits, ETL_ERROR(etl::bitset_overflow)); return implementation::template value(pbuffer, Number_Of_Elements); } diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 4ca19920..b2854161 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -1140,6 +1140,56 @@ namespace CHECK_EQUAL(std::numeric_limits::max(), value); } + //************************************************************************* + TEST(test_to_ulong_min) + { + ETL_CONSTEXPR14 etl::bitset::bits> data((unsigned long)etl::integral_limits::min); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ulong_max) + { + ETL_CONSTEXPR14 etl::bitset::bits> data((unsigned long)etl::integral_limits::max); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ulong_overflow) + { + ETL_CONSTEXPR14 etl::bitset::bits + 1> data((unsigned long)etl::integral_limits::min); + CHECK_THROW(data.to_ulong(), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_to_ullong_min) + { + ETL_CONSTEXPR14 etl::bitset::bits> data((unsigned long long)etl::integral_limits::min); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ullong_max) + { + ETL_CONSTEXPR14 etl::bitset::bits> data((unsigned long long)etl::integral_limits::max); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ullong_overflow) + { + ETL_CONSTEXPR14 etl::bitset::bits + 1> data((unsigned long long)etl::integral_limits::min); + CHECK_THROW(data.to_ullong(), etl::bitset_overflow); + } + //************************************************************************* TEST(test_position_set) { diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 91411477..6dbfb8ca 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -1136,6 +1136,56 @@ namespace CHECK_EQUAL(std::numeric_limits::max(), value); } + //************************************************************************* + TEST(test_to_ulong_min) + { + ETL_CONSTEXPR14 etl::bitset::bits, uint64_t> data((unsigned long)etl::integral_limits::min); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ulong_max) + { + ETL_CONSTEXPR14 etl::bitset::bits, uint64_t> data((unsigned long)etl::integral_limits::max); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ulong_overflow) + { + ETL_CONSTEXPR14 etl::bitset::bits + 1, uint64_t> data((unsigned long)etl::integral_limits::min); + CHECK_THROW(data.to_ulong(), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_to_ullong_min) + { + ETL_CONSTEXPR14 etl::bitset::bits, uint64_t> data((unsigned long long)etl::integral_limits::min); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ullong_max) + { + ETL_CONSTEXPR14 etl::bitset::bits, uint64_t> data((unsigned long long)etl::integral_limits::max); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ullong_overflow) + { + ETL_CONSTEXPR14 etl::bitset::bits + 1, uint64_t> data((unsigned long long)etl::integral_limits::min); + CHECK_THROW(data.to_ullong(), etl::bitset_overflow); + } + //************************************************************************* TEST(test_position_set) { diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index 6945376d..a91cc135 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -1082,6 +1082,62 @@ namespace CHECK_EQUAL(std::numeric_limits::max(), value); } + //************************************************************************* + TEST(test_to_ulong_min) + { + etl::bitset_ext::bits>::buffer_type buffer; + etl::bitset_ext::bits> data((unsigned long)etl::integral_limits::min, buffer); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ulong_max) + { + etl::bitset_ext::bits>::buffer_type buffer; + etl::bitset_ext::bits> data((unsigned long)etl::integral_limits::max, buffer); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ulong_overflow) + { + etl::bitset_ext::bits + 1>::buffer_type buffer; + etl::bitset_ext::bits + 1> data((unsigned long)etl::integral_limits::min, buffer); + CHECK_THROW(data.to_ulong(), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_to_ullong_min) + { + etl::bitset_ext::bits>::buffer_type buffer; + etl::bitset_ext::bits> data((unsigned long long)etl::integral_limits::min, buffer); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ullong_max) + { + etl::bitset_ext::bits>::buffer_type buffer; + etl::bitset_ext::bits> data((unsigned long long)etl::integral_limits::max, buffer); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ullong_overflow) + { + etl::bitset_ext::bits + 1>::buffer_type buffer; + etl::bitset_ext::bits + 1> data((unsigned long long)etl::integral_limits::min, buffer); + CHECK_THROW(data.to_ullong(), etl::bitset_overflow); + } + //************************************************************************* TEST(test_position_set) { diff --git a/test/test_bitset_new_ext_explicit_single_element_type.cpp b/test/test_bitset_new_ext_explicit_single_element_type.cpp index d98c779d..eb186deb 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -1110,6 +1110,63 @@ namespace CHECK_EQUAL(std::numeric_limits::max(), value); } + //************************************************************************* + TEST(test_to_ulong_min) + { + etl::bitset_ext::bits, uint64_t>::buffer_type buffer; + etl::bitset_ext::bits, uint64_t> data((unsigned long)etl::integral_limits::min, buffer); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ulong_max) + { + etl::bitset_ext::bits, uint64_t>::buffer_type buffer; + etl::bitset_ext::bits, uint64_t> data((unsigned long)etl::integral_limits::max, buffer); + unsigned long value = data.to_ulong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ulong_overflow) + { + etl::bitset_ext::bits + 1, uint64_t>::buffer_type buffer; + etl::bitset_ext::bits + 1, uint64_t> data((unsigned long)etl::integral_limits::min, buffer); + CHECK_THROW(data.to_ulong(), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_to_ullong_min) + { + etl::bitset_ext::bits, uint64_t>::buffer_type buffer; + etl::bitset_ext::bits, uint64_t> data((unsigned long long)etl::integral_limits::min, buffer); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_to_ullong_max) + { + etl::bitset_ext::bits, uint64_t>::buffer_type buffer; + etl::bitset_ext::bits, uint64_t> data((unsigned long long)etl::integral_limits::max, buffer); + unsigned long long value = data.to_ullong(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_to_ullong_overflow) + { + etl::bitset_ext::bits + 1, uint64_t>::buffer_type buffer; + etl::bitset_ext::bits + 1, uint64_t> data((unsigned long long)etl::integral_limits::min, buffer); + + CHECK_THROW(data.to_ullong(), etl::bitset_overflow); + } + //************************************************************************* TEST(test_position_set) {