From c3603c4d7e29a275be81c3918fcc05a83d528e4c Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 29 Nov 2023 18:21:47 +0000 Subject: [PATCH 001/131] Improved display of CHECK_EQUAL_HEX in unittest++ --- test/UnitTest++/Checks.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/UnitTest++/Checks.h b/test/UnitTest++/Checks.h index a2571e02..88f1a1c3 100644 --- a/test/UnitTest++/Checks.h +++ b/test/UnitTest++/Checks.h @@ -190,7 +190,9 @@ namespace UnitTest if (!(expected == actual)) { UnitTest::MemoryOutStream stream; - stream << std::hex << std::uppercase << std::setfill('0') << "Expected 0x" << std::setw(2 * sizeof(Expected)) << expected << " but was 0x" << std::setw(2 * sizeof(Actual)) << actual; + stream << std::hex << std::uppercase << std::setfill('0') + << "Expected 0x" << std::setw(2 * sizeof(Expected)) << (expected & ~(typename std::make_unsigned::type(0))) + << " but was 0x" << std::setw(2 * sizeof(Actual)) << (actual & ~(typename std::make_unsigned::type(0))); results.OnTestFailure(details, stream.GetText()); } @@ -214,7 +216,8 @@ namespace UnitTest if (expected == actual) { UnitTest::MemoryOutStream stream; - stream << std::hex << std::uppercase << std::setfill('0') << std::setw(2 * sizeof(Actual)) << "Expected not equal, but both values are " << actual; + stream << std::hex << std::uppercase << std::setfill('0') << std::setw(2 * sizeof(Actual)) + << "Expected not equal, but both values are " << (actual & ~(typename std::make_unsigned::type(0))); results.OnTestFailure(details, stream.GetText()); } From 863dd24cc4713225d45f3ede0bc03103c684f18a Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 29 Nov 2023 18:22:34 +0000 Subject: [PATCH 002/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 309 +++++++++++++++++- test/test_bitset_new_default_element_type.cpp | 70 ++++ ...itset_new_explicit_single_element_type.cpp | 69 ++++ ...st_bitset_new_ext_default_element_type.cpp | 74 +++++ ...t_new_ext_explicit_single_element_type.cpp | 74 +++++ test/vs2022/etl.vcxproj | 22 +- test/vs2022/etl.vcxproj.filters | 14 +- 7 files changed, 597 insertions(+), 35 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 63462f21..058d8f45 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -192,7 +192,7 @@ namespace etl size_t index = 0; element_type bit = 0; - if (number_of_elements == 0) + if (number_of_elements == 0) ETL_UNLIKELY { return; } @@ -229,12 +229,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -259,12 +259,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -289,12 +289,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -319,12 +319,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -395,6 +395,141 @@ namespace etl return v; } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_single_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + const unsigned_t value_mask = etl::integral_limits::max; + const int element_index = (position + length - 1) >> etl::log2::value; + const unsigned_t Shift = position % Bits_Per_Element; + + value = static_cast(pbuffer[element_index] >> Shift) & value_mask; + + return static_cast(value); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_multi_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + // The mask for the value type. + const unsigned_t value_mask = etl::integral_limits::max; + + // Find the index of the element containing the msb. + int element_index = (position + length - 1) >> etl::log2::value; + + // The value is spread over multiple elements. + element_type bit_mask = element_type(1) << ((position + length - 1) % Bits_Per_Element); + + while (length != 0) + { + // TODO Optimise this to read whole element values. + + value <<= 1; + + const bool is_set = (pbuffer[element_index] & bit_mask) != 0; + + if (is_set) + { + value |= unsigned_t(1); + } + + bit_mask >>= 1; + + if (bit_mask == 0) + { + bit_mask = element_type(1) << (Bits_Per_Element - 1); + --element_index; + } + + --length; + } + + return static_cast(value); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_single_element(const_pointer pbuffer) const + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + const unsigned_t value_mask = etl::integral_limits::max; + const int element_index = (Position + Length - 1) >> etl::log2::value; + const unsigned_t Shift = Position % Bits_Per_Element; + + value = static_cast(pbuffer[element_index] >> Shift) & value_mask; + + return static_cast(value); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_multi_element(const_pointer pbuffer) const + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + // The mask for the value type. + const unsigned_t value_mask = etl::integral_limits::max; + + // Find the index of the element containing the msb. + int element_index = (Position + Length - 1) >> etl::log2::value; + + // The value is spread over multiple elements. + size_t length = Length; + element_type bit_mask = element_type(1) << ((Position + Length - 1) % Bits_Per_Element); + + while (length != 0) + { + // TODO Optimise this to read whole element values. + + value <<= 1; + + const bool is_set = (pbuffer[element_index] & bit_mask) != 0; + + if (is_set) + { + value |= unsigned_t(1); + } + + bit_mask >>= 1; + + if (bit_mask == 0) + { + bit_mask = element_type(1) << (Bits_Per_Element - 1); + --element_index; + } + + --length; + } + + return static_cast(value); + } + //************************************************************************* /// Reset the bit at the position. //************************************************************************* @@ -403,7 +538,7 @@ namespace etl size_t index = 0U; element_type bit = element_type(0); - if (number_of_elements == 0) + if (number_of_elements == 0) ETL_UNLIKELY { return; } @@ -440,7 +575,7 @@ namespace etl size_t index = 0U; element_type bit = element_type(0); - if (number_of_elements == 0) + if (number_of_elements == 0) ETL_UNLIKELY { return; } @@ -1251,7 +1386,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -1269,6 +1404,40 @@ namespace etl return v; } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + element_type mask = (~(~0u << length) << position); + T value((buffer & mask) >> position); + + return value; + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + element_type mask = (~(~0u << Length) << Position); + T value((buffer & mask) >> Position); + + return value; + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* @@ -2027,6 +2196,42 @@ namespace etl return ibitset.template value(buffer, Number_Of_Elements); } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + return ibitset.extract_from_multi_element(buffer, position, length); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); + + // Is the value contained within one element? + if (active_bits_in_element == Length) + { + return ibitset.extract_from_single_element(buffer); + } + else + { + return ibitset.extract_from_multi_element(buffer); + } + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* @@ -2963,7 +3168,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -2981,6 +3186,38 @@ namespace etl return v; } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + element_type mask = (~(~0u << length) << position); + T v((*pbuffer & mask) >> position); + + return v; + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + element_type mask = (~(~0u << Length) << Position); + T v((*pbuffer & mask) >> Position); + + return v; + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* @@ -3733,7 +3970,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -3742,6 +3979,42 @@ namespace etl return ibitset.template value(pbuffer, Number_Of_Elements); } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + return ibitset.extract_from_multi_element(pbuffer, position, length); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); + + // Is the value contained within one element? + if (active_bits_in_element == Length) + { + return ibitset.extract_from_single_element(pbuffer); + } + else + { + return ibitset.extract_from_multi_element(pbuffer); + } + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 67f703a3..f41ac262 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2096,5 +2096,75 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + + // The lines below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index b9c0c84b..0f25e6da 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -1585,5 +1585,74 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL(0x78, b.extract(0, 8)); + CHECK_EQUAL(0x3C, b.extract(1, 8)); + CHECK_EQUAL(0x9E, b.extract(2, 8)); + CHECK_EQUAL(0xCF, b.extract(3, 8)); + CHECK_EQUAL(0x67, b.extract(4, 8)); + CHECK_EQUAL(0xB3, b.extract(5, 8)); + CHECK_EQUAL(0x59, b.extract(6, 8)); + CHECK_EQUAL(0xAC, b.extract(7, 8)); + CHECK_EQUAL(0x56, b.extract(8, 8)); + CHECK_EQUAL(0x2B, b.extract(9, 8)); + CHECK_EQUAL(0x15, b.extract(10, 8)); + CHECK_EQUAL(0x8A, b.extract(11, 8)); + CHECK_EQUAL(0x45, b.extract(12, 8)); + CHECK_EQUAL(0xA2, b.extract(13, 8)); + CHECK_EQUAL(0xD1, b.extract(14, 8)); + CHECK_EQUAL(0x68, b.extract(15, 8)); + CHECK_EQUAL(0x34, b.extract(16, 8)); + CHECK_EQUAL(0x1A, b.extract(17, 8)); + CHECK_EQUAL(0x8D, b.extract(18, 8)); + CHECK_EQUAL(0x46, b.extract(19, 8)); + CHECK_EQUAL(0x23, b.extract(20, 8)); + CHECK_EQUAL(0x91, b.extract(21, 8)); + CHECK_EQUAL(0x48, b.extract(22, 8)); + CHECK_EQUAL(0x24, b.extract(23, 8)); + CHECK_EQUAL(0x12, b.extract(24, 8)); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL(0x78, (b.extract())); + CHECK_EQUAL(0x3C, (b.extract())); + CHECK_EQUAL(0x9E, (b.extract())); + CHECK_EQUAL(0xCF, (b.extract())); + CHECK_EQUAL(0x67, (b.extract())); + CHECK_EQUAL(0xB3, (b.extract())); + CHECK_EQUAL(0x59, (b.extract())); + CHECK_EQUAL(0xAC, (b.extract())); + CHECK_EQUAL(0x56, (b.extract())); + CHECK_EQUAL(0x2B, (b.extract())); + CHECK_EQUAL(0x15, (b.extract())); + CHECK_EQUAL(0x8A, (b.extract())); + CHECK_EQUAL(0x45, (b.extract())); + CHECK_EQUAL(0xA2, (b.extract())); + CHECK_EQUAL(0xD1, (b.extract())); + CHECK_EQUAL(0x68, (b.extract())); + CHECK_EQUAL(0x34, (b.extract())); + CHECK_EQUAL(0x1A, (b.extract())); + CHECK_EQUAL(0x8D, (b.extract())); + CHECK_EQUAL(0x46, (b.extract())); + CHECK_EQUAL(0x23, (b.extract())); + CHECK_EQUAL(0x91, (b.extract())); + CHECK_EQUAL(0x48, (b.extract())); + CHECK_EQUAL(0x24, (b.extract())); + CHECK_EQUAL(0x12, (b.extract())); + + // The lines below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index aeeea766..c5e12541 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -1957,5 +1957,79 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + + // The line below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } 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 b7bc74ef..308259a4 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -1309,5 +1309,79 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, int32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, int32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + + // The line below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } diff --git a/test/vs2022/etl.vcxproj b/test/vs2022/etl.vcxproj index 50d71f98..346223ed 100644 --- a/test/vs2022/etl.vcxproj +++ b/test/vs2022/etl.vcxproj @@ -839,17 +839,17 @@ $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ @@ -859,37 +859,37 @@ $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ @@ -935,7 +935,7 @@ $(Configuration)\ - false + true true $(Configuration)\ diff --git a/test/vs2022/etl.vcxproj.filters b/test/vs2022/etl.vcxproj.filters index d4dfc25b..cea19458 100644 --- a/test/vs2022/etl.vcxproj.filters +++ b/test/vs2022/etl.vcxproj.filters @@ -3334,12 +3334,6 @@ Resource Files\CI\Appveyor - - Resource Files\CI\Github - - - Resource Files\CI\Github - Resource Files @@ -3406,6 +3400,14 @@ Tests\Scripts + + + + + + + + From 3d3f87564dc964ea8f55d01175f75a1d9583d663 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 1 Dec 2023 17:21:48 +0000 Subject: [PATCH 003/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 186 +++++----- test/test_bitset_new_default_element_type.cpp | 326 +++++++++++++++++- ...itset_new_explicit_single_element_type.cpp | 4 +- ...st_bitset_new_ext_default_element_type.cpp | 4 +- ...t_new_ext_explicit_single_element_type.cpp | 4 +- 5 files changed, 412 insertions(+), 112 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 058d8f45..4dbfbef8 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -145,6 +145,12 @@ namespace etl static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + template + struct value_is_in_one_element + { + static ETL_CONSTANT bool value = ((Position + Length - 1) >> etl::log2::value) == (Position >> etl::log2::value); + }; + //************************************************************************* /// Count the number of bits set. //************************************************************************* @@ -400,63 +406,56 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_single_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + T extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT { typedef typename etl::make_unsigned::type unsigned_t; unsigned_t value(0); - const unsigned_t value_mask = etl::integral_limits::max; - const int element_index = (position + length - 1) >> etl::log2::value; - const unsigned_t Shift = position % Bits_Per_Element; + const int Msb_Element_Index = (position + length - 1) >> etl::log2::value; + const int Lsb_Element_Index = position >> etl::log2::value; - value = static_cast(pbuffer[element_index] >> Shift) & value_mask; - - return static_cast(value); - } - - //************************************************************************* - /// Extract an integral value from an arbitary position and length. - //************************************************************************* - template - ETL_CONSTEXPR14 - T extract_from_multi_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT - { - typedef typename etl::make_unsigned::type unsigned_t; - - unsigned_t value(0); - - // The mask for the value type. - const unsigned_t value_mask = etl::integral_limits::max; - - // Find the index of the element containing the msb. - int element_index = (position + length - 1) >> etl::log2::value; - - // The value is spread over multiple elements. - element_type bit_mask = element_type(1) << ((position + length - 1) % Bits_Per_Element); - - while (length != 0) + // Is the value contained within one element? + if (Msb_Element_Index == Lsb_Element_Index) { - // TODO Optimise this to read whole element values. + const unsigned_t Mask = ~(~0 << length); + const unsigned_t Shift = position % Bits_Per_Element; - value <<= 1; + value = static_cast(pbuffer[Msb_Element_Index] >> Shift) & Mask; + } + else + { + // Get the number of active bits in the msb element + size_t active_bits_in_msb = (position + length) - (Msb_Element_Index * Bits_Per_Element); - const bool is_set = (pbuffer[element_index] & bit_mask) != 0; + // Extract the first element if partially filled. + // Start with index of the element containing the msb. + int element_index = Msb_Element_Index; - if (is_set) + if (active_bits_in_msb < Bits_Per_Element) { - value |= unsigned_t(1); - } - - bit_mask >>= 1; - - if (bit_mask == 0) - { - bit_mask = element_type(1) << (Bits_Per_Element - 1); + element_type mask = ~(~element_type(0) << active_bits_in_msb); + value |= pbuffer[element_index] & mask; + length -= active_bits_in_msb; --element_index; } - --length; + // Loop through the fully filled elements + while (length >= Bits_Per_Element) + { + value <<= Bits_Per_Element; + value |= pbuffer[element_index]; + length -= Bits_Per_Element; + --element_index; + } + + // Check if the last element is partially filled and extract. + if (length != 0) + { + value <<= length; + element_type mask = ~(~element_type(0) << length); + value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; + } } return static_cast(value); @@ -467,17 +466,16 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_single_element(const_pointer pbuffer) const + typename etl::enable_if::value, T>::type + extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; - unsigned_t value(0); - - const unsigned_t value_mask = etl::integral_limits::max; - const int element_index = (Position + Length - 1) >> etl::log2::value; + const int Element_Index = (Position + Length - 1) >> etl::log2::value; + const unsigned_t Mask = ~(~0 << Length); const unsigned_t Shift = Position % Bits_Per_Element; - - value = static_cast(pbuffer[element_index] >> Shift) & value_mask; + + unsigned_t value = static_cast(pbuffer[Element_Index] >> Shift) & Mask; return static_cast(value); } @@ -487,44 +485,48 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_multi_element(const_pointer pbuffer) const + typename etl::enable_if::value, T>::type + extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; unsigned_t value(0); - // The mask for the value type. - const unsigned_t value_mask = etl::integral_limits::max; + const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; - // Find the index of the element containing the msb. - int element_index = (Position + Length - 1) >> etl::log2::value; + // Start with index of the element containing the msb. + int element_index = Msb_Element_Index; // The value is spread over multiple elements. - size_t length = Length; - element_type bit_mask = element_type(1) << ((Position + Length - 1) % Bits_Per_Element); + size_t length = Length; - while (length != 0) + // Get the number of active bits in the first element + size_t active_bits_in_element = ((Position + Length - 1) % Bits_Per_Element) + 1; + + // Extract the first element if partially filled. + if (active_bits_in_element < Bits_Per_Element) { - // TODO Optimise this to read whole element values. + element_type mask = ~(~element_type(0) << active_bits_in_element); + value |= pbuffer[element_index] & mask; + length -= active_bits_in_element; + --element_index; + } - value <<= 1; + // Loop through the fully filled elements + while (length >= Bits_Per_Element) + { + value <<= Bits_Per_Element; + value |= pbuffer[element_index]; + length -= Bits_Per_Element; + --element_index; + } - const bool is_set = (pbuffer[element_index] & bit_mask) != 0; - - if (is_set) - { - value |= unsigned_t(1); - } - - bit_mask >>= 1; - - if (bit_mask == 0) - { - bit_mask = element_type(1) << (Bits_Per_Element - 1); - --element_index; - } - - --length; + // Check if the last element is partially filled and extract. + if (length != 0) + { + value <<= length; + element_type mask = ~(~element_type(0) << length); + value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; } return static_cast(value); @@ -2187,7 +2189,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -2206,7 +2208,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_multi_element(buffer, position, length); + return ibitset.extract_from_buffer(buffer, position, length); } //************************************************************************* @@ -2214,22 +2216,12 @@ namespace etl //************************************************************************* template ::bits> ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type extract() const ETL_NOEXCEPT { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); - - // Is the value contained within one element? - if (active_bits_in_element == Length) - { - return ibitset.extract_from_single_element(buffer); - } - else - { - return ibitset.extract_from_multi_element(buffer); - } + return ibitset.extract_from_buffer(buffer); } //************************************************************************* @@ -3989,7 +3981,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_multi_element(pbuffer, position, length); + return ibitset.extract_from_buffer(pbuffer, position, length); } //************************************************************************* @@ -4002,17 +3994,7 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); - - // Is the value contained within one element? - if (active_bits_in_element == Length) - { - return ibitset.extract_from_single_element(pbuffer); - } - else - { - return ibitset.extract_from_multi_element(pbuffer); - } + return ibitset.extract_from_buffer(pbuffer); } //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index f41ac262..199e18a0 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2098,7 +2098,82 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); @@ -2128,11 +2203,12 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); @@ -2163,8 +2239,250 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); // The lines below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract(0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract(1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract(2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract(3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract(4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract(5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract(6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract(7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract(8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract(9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 0f25e6da..8e161389 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -1587,7 +1587,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); @@ -1620,7 +1620,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index c5e12541..7e377a95 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -1959,7 +1959,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_uint8_t_with_run_time_parameters) { using bs32 = etl::bitset_ext<32>; @@ -1994,7 +1994,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { using bs32 = etl::bitset_ext<32>; 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 308259a4..d0b489be 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -1311,7 +1311,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_uint8_t_with_run_time_parameters) { using bs32 = etl::bitset_ext<32, int32_t>; @@ -1346,7 +1346,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { using bs32 = etl::bitset_ext<32, int32_t>; From 9064eecee2b11e2faab861856dd6d3497f1d9405 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 2 Dec 2023 17:46:38 +0000 Subject: [PATCH 004/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 148 ++++++++++-------- test/test_bitset_new_default_element_type.cpp | 77 +++++++++ test/vs2022/etl.vcxproj.filters | 32 +++- 3 files changed, 182 insertions(+), 75 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 4dbfbef8..65128c75 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -401,12 +401,62 @@ namespace etl return v; } + //************************************************************************* + /// Extract an value from multiple elements. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::make_unsigned::type extract_from_multiple_elements(const element_type* pbuffer, + int element_index, + size_t active_bits_in_msb, + size_t length) const ETL_NOEXCEPT + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + // Extract the first element, if partially filled. + if (active_bits_in_msb < Bits_Per_Element) + { + element_type mask = ~(~element_type(0) << active_bits_in_msb); + value = pbuffer[element_index] & mask; + length -= active_bits_in_msb; + if (length >= Bits_Per_Element) + { + value = value << Bits_Per_Element; + } + --element_index; + } + + // Loop through the fully filled elements + while (length >= Bits_Per_Element) + { + value |= pbuffer[element_index]; + length -= Bits_Per_Element; + if (length >= Bits_Per_Element) + { + value = value << Bits_Per_Element; + } + --element_index; + } + + // Extract the last element, if partially filled. + if (length != 0) + { + value = value << length; + element_type mask = ~(~element_type(0) << length); + value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; + } + + return value; + } + //************************************************************************* /// Extract an integral value from an arbitary position and length. //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + typename etl::make_unsigned::type extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT { typedef typename etl::make_unsigned::type unsigned_t; @@ -428,37 +478,13 @@ namespace etl // Get the number of active bits in the msb element size_t active_bits_in_msb = (position + length) - (Msb_Element_Index * Bits_Per_Element); - // Extract the first element if partially filled. // Start with index of the element containing the msb. int element_index = Msb_Element_Index; - if (active_bits_in_msb < Bits_Per_Element) - { - element_type mask = ~(~element_type(0) << active_bits_in_msb); - value |= pbuffer[element_index] & mask; - length -= active_bits_in_msb; - --element_index; - } - - // Loop through the fully filled elements - while (length >= Bits_Per_Element) - { - value <<= Bits_Per_Element; - value |= pbuffer[element_index]; - length -= Bits_Per_Element; - --element_index; - } - - // Check if the last element is partially filled and extract. - if (length != 0) - { - value <<= length; - element_type mask = ~(~element_type(0) << length); - value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; - } + value = extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); } - return static_cast(value); + return value; } //************************************************************************* @@ -466,7 +492,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; @@ -475,9 +501,7 @@ namespace etl const unsigned_t Mask = ~(~0 << Length); const unsigned_t Shift = Position % Bits_Per_Element; - unsigned_t value = static_cast(pbuffer[Element_Index] >> Shift) & Mask; - - return static_cast(value); + return static_cast(pbuffer[Element_Index] >> Shift) & Mask; } //************************************************************************* @@ -485,13 +509,11 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; - - unsigned_t value(0); - + const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; // Start with index of the element containing the msb. @@ -501,35 +523,9 @@ namespace etl size_t length = Length; // Get the number of active bits in the first element - size_t active_bits_in_element = ((Position + Length - 1) % Bits_Per_Element) + 1; + size_t active_bits_in_msb = ((Position + Length - 1) % Bits_Per_Element) + 1; - // Extract the first element if partially filled. - if (active_bits_in_element < Bits_Per_Element) - { - element_type mask = ~(~element_type(0) << active_bits_in_element); - value |= pbuffer[element_index] & mask; - length -= active_bits_in_element; - --element_index; - } - - // Loop through the fully filled elements - while (length >= Bits_Per_Element) - { - value <<= Bits_Per_Element; - value |= pbuffer[element_index]; - length -= Bits_Per_Element; - --element_index; - } - - // Check if the last element is partially filled and extract. - if (length != 0) - { - value <<= length; - element_type mask = ~(~element_type(0) << length); - value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; - } - - return static_cast(value); + return extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); } //************************************************************************* @@ -2208,7 +2204,16 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_buffer(buffer, position, length); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(buffer, position, length);; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return value; } //************************************************************************* @@ -2221,7 +2226,16 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.extract_from_buffer(buffer); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(buffer); + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return value; } //************************************************************************* @@ -3981,7 +3995,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_buffer(pbuffer, position, length); + return ibitset.template extract_from_buffer(pbuffer, position, length); } //************************************************************************* @@ -3994,7 +4008,7 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.extract_from_buffer(pbuffer); + return ibitset.template extract_from_buffer(pbuffer); } //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 199e18a0..a0980425 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2172,6 +2172,83 @@ namespace //uint8_t v1 = b.extract(); } + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + auto v = b.extract(1, 6); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { diff --git a/test/vs2022/etl.vcxproj.filters b/test/vs2022/etl.vcxproj.filters index cea19458..5430cd00 100644 --- a/test/vs2022/etl.vcxproj.filters +++ b/test/vs2022/etl.vcxproj.filters @@ -3400,14 +3400,30 @@ Tests\Scripts - - - - - - - - + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + From 18a1c76ec67531e170e0e218db1f5bdc8d0a473e Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 2 Dec 2023 17:46:38 +0000 Subject: [PATCH 005/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 148 ++++++++++-------- test/run-tests.sh | 2 +- test/test_bitset_new_default_element_type.cpp | 77 +++++++++ test/vs2022/etl.vcxproj.filters | 32 +++- 4 files changed, 183 insertions(+), 76 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 4dbfbef8..65128c75 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -401,12 +401,62 @@ namespace etl return v; } + //************************************************************************* + /// Extract an value from multiple elements. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::make_unsigned::type extract_from_multiple_elements(const element_type* pbuffer, + int element_index, + size_t active_bits_in_msb, + size_t length) const ETL_NOEXCEPT + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + // Extract the first element, if partially filled. + if (active_bits_in_msb < Bits_Per_Element) + { + element_type mask = ~(~element_type(0) << active_bits_in_msb); + value = pbuffer[element_index] & mask; + length -= active_bits_in_msb; + if (length >= Bits_Per_Element) + { + value = value << Bits_Per_Element; + } + --element_index; + } + + // Loop through the fully filled elements + while (length >= Bits_Per_Element) + { + value |= pbuffer[element_index]; + length -= Bits_Per_Element; + if (length >= Bits_Per_Element) + { + value = value << Bits_Per_Element; + } + --element_index; + } + + // Extract the last element, if partially filled. + if (length != 0) + { + value = value << length; + element_type mask = ~(~element_type(0) << length); + value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; + } + + return value; + } + //************************************************************************* /// Extract an integral value from an arbitary position and length. //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + typename etl::make_unsigned::type extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT { typedef typename etl::make_unsigned::type unsigned_t; @@ -428,37 +478,13 @@ namespace etl // Get the number of active bits in the msb element size_t active_bits_in_msb = (position + length) - (Msb_Element_Index * Bits_Per_Element); - // Extract the first element if partially filled. // Start with index of the element containing the msb. int element_index = Msb_Element_Index; - if (active_bits_in_msb < Bits_Per_Element) - { - element_type mask = ~(~element_type(0) << active_bits_in_msb); - value |= pbuffer[element_index] & mask; - length -= active_bits_in_msb; - --element_index; - } - - // Loop through the fully filled elements - while (length >= Bits_Per_Element) - { - value <<= Bits_Per_Element; - value |= pbuffer[element_index]; - length -= Bits_Per_Element; - --element_index; - } - - // Check if the last element is partially filled and extract. - if (length != 0) - { - value <<= length; - element_type mask = ~(~element_type(0) << length); - value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; - } + value = extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); } - return static_cast(value); + return value; } //************************************************************************* @@ -466,7 +492,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; @@ -475,9 +501,7 @@ namespace etl const unsigned_t Mask = ~(~0 << Length); const unsigned_t Shift = Position % Bits_Per_Element; - unsigned_t value = static_cast(pbuffer[Element_Index] >> Shift) & Mask; - - return static_cast(value); + return static_cast(pbuffer[Element_Index] >> Shift) & Mask; } //************************************************************************* @@ -485,13 +509,11 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; - - unsigned_t value(0); - + const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; // Start with index of the element containing the msb. @@ -501,35 +523,9 @@ namespace etl size_t length = Length; // Get the number of active bits in the first element - size_t active_bits_in_element = ((Position + Length - 1) % Bits_Per_Element) + 1; + size_t active_bits_in_msb = ((Position + Length - 1) % Bits_Per_Element) + 1; - // Extract the first element if partially filled. - if (active_bits_in_element < Bits_Per_Element) - { - element_type mask = ~(~element_type(0) << active_bits_in_element); - value |= pbuffer[element_index] & mask; - length -= active_bits_in_element; - --element_index; - } - - // Loop through the fully filled elements - while (length >= Bits_Per_Element) - { - value <<= Bits_Per_Element; - value |= pbuffer[element_index]; - length -= Bits_Per_Element; - --element_index; - } - - // Check if the last element is partially filled and extract. - if (length != 0) - { - value <<= length; - element_type mask = ~(~element_type(0) << length); - value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; - } - - return static_cast(value); + return extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); } //************************************************************************* @@ -2208,7 +2204,16 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_buffer(buffer, position, length); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(buffer, position, length);; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return value; } //************************************************************************* @@ -2221,7 +2226,16 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.extract_from_buffer(buffer); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(buffer); + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return value; } //************************************************************************* @@ -3981,7 +3995,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_buffer(pbuffer, position, length); + return ibitset.template extract_from_buffer(pbuffer, position, length); } //************************************************************************* @@ -3994,7 +4008,7 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.extract_from_buffer(pbuffer); + return ibitset.template extract_from_buffer(pbuffer); } //************************************************************************* diff --git a/test/run-tests.sh b/test/run-tests.sh index 90433c4e..0fa5d720 100644 --- a/test/run-tests.sh +++ b/test/run-tests.sh @@ -165,7 +165,7 @@ etl_version=$(echo $etl_version_raw | sed -e 's/\r//g') # Remove trailing \r # Get the compiler versions #****************************************************************************** gcc_compiler=$(g++ --version | grep g++) -clang_compiler=$(clang++ --version | grep clang++) +clang_compiler=$(clang++ --version | grep clang) #****************************************************************************** # GCC diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 199e18a0..a0980425 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2172,6 +2172,83 @@ namespace //uint8_t v1 = b.extract(); } + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + auto v = b.extract(1, 6); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { diff --git a/test/vs2022/etl.vcxproj.filters b/test/vs2022/etl.vcxproj.filters index cea19458..5430cd00 100644 --- a/test/vs2022/etl.vcxproj.filters +++ b/test/vs2022/etl.vcxproj.filters @@ -3400,14 +3400,30 @@ Tests\Scripts - - - - - - - - + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + From 5b4e991ee8f978bff79fb93825d92c4ad872695b Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 4 Dec 2023 08:37:10 +0000 Subject: [PATCH 006/131] Added additional etl::make_lsb_mask and etl::make_msb_mask binary functions --- include/etl/binary.h | 35 ++++++- test/test_binary.cpp | 218 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 207 insertions(+), 46 deletions(-) diff --git a/include/etl/binary.h b/include/etl/binary.h index 1efd5f15..f6388562 100644 --- a/include/etl/binary.h +++ b/include/etl/binary.h @@ -2216,20 +2216,31 @@ namespace etl { public: + ETL_STATIC_ASSERT(NBits <= etl::integral_limits::bits, "Mask exceeds type size"); + static ETL_CONSTANT T value = static_cast(etl::max_value_for_nbits::value); }; template ETL_CONSTANT T lsb_mask::value; + //*********************************** + template + ETL_CONSTEXPR T make_lsb_mask() + { + ETL_STATIC_ASSERT(NBits <= etl::integral_limits::bits, "Mask exceeds type size"); + + return lsb_mask::value; + } + //*********************************** template - ETL_CONSTEXPR14 T make_lsb_mask(size_t nbits) + ETL_CONSTEXPR T make_lsb_mask(size_t nbits) { typedef typename etl::make_unsigned::type type; - return (nbits == etl::integral_limits::bits) ? static_cast(etl::integral_limits::max) - : static_cast((static_cast(1U) << nbits) - 1U); + return (nbits == 0U) ? static_cast(0) + : static_cast(static_cast(~0) >> (etl::integral_limits::bits - nbits)); } //*********************************** @@ -2238,6 +2249,8 @@ namespace etl { public: + ETL_STATIC_ASSERT(NBits <= etl::integral_limits::bits, "Mask exceeds type size"); + static ETL_CONSTANT T value = static_cast(etl::reverse_bits_const::value>::value); }; @@ -2246,9 +2259,21 @@ namespace etl //*********************************** template - ETL_CONSTEXPR14 T make_msb_mask(size_t nbits) + ETL_CONSTEXPR T make_msb_mask(size_t nbits) { - return static_cast(etl::reverse_bits(make_lsb_mask(nbits))); + typedef typename etl::make_unsigned::type type; + + return (nbits == 0U) ? static_cast(0) + : static_cast(static_cast(~0) << (etl::integral_limits::bits - nbits)); + } + + //*********************************** + template + ETL_CONSTEXPR T make_msb_mask() + { + ETL_STATIC_ASSERT(NBits <= etl::integral_limits::bits, "Mask exceeds type size"); + + return msb_mask::value; } //*************************************************************************** diff --git a/test/test_binary.cpp b/test/test_binary.cpp index 468758cd..56e5157d 100644 --- a/test/test_binary.cpp +++ b/test/test_binary.cpp @@ -2584,8 +2584,8 @@ namespace //************************************************************************* TEST(test_lsb_mask_64_bit) { - CHECK(int64_t(0x0000000000000000) == (etl::lsb_mask::value)); - CHECK(int64_t(0x00000000000000FF) == (etl::lsb_mask::value)); + CHECK(int64_t(0x0000000000000000) == (etl::lsb_mask::value)); + CHECK(int64_t(0x00000000000000FF) == (etl::lsb_mask::value)); CHECK(int64_t(0x000000000000FFFF) == (etl::lsb_mask::value)); CHECK(int64_t(0x0000000000FFFFFF) == (etl::lsb_mask::value)); CHECK(int64_t(0x00000000FFFFFFFF) == (etl::lsb_mask::value)); @@ -2598,15 +2598,15 @@ namespace //************************************************************************* TEST(test_make_lsb_mask_8_bit) { - ETL_CONSTEXPR14 int8_t mask0 = etl::make_lsb_mask(0); - ETL_CONSTEXPR14 int8_t mask1 = etl::make_lsb_mask(1); - ETL_CONSTEXPR14 int8_t mask2 = etl::make_lsb_mask(2); - ETL_CONSTEXPR14 int8_t mask3 = etl::make_lsb_mask(3); - ETL_CONSTEXPR14 int8_t mask4 = etl::make_lsb_mask(4); - ETL_CONSTEXPR14 int8_t mask5 = etl::make_lsb_mask(5); - ETL_CONSTEXPR14 int8_t mask6 = etl::make_lsb_mask(6); - ETL_CONSTEXPR14 int8_t mask7 = etl::make_lsb_mask(7); - ETL_CONSTEXPR14 int8_t mask8 = etl::make_lsb_mask(8); + ETL_CONSTEXPR int8_t mask0 = etl::make_lsb_mask(0); + ETL_CONSTEXPR int8_t mask1 = etl::make_lsb_mask(1); + ETL_CONSTEXPR int8_t mask2 = etl::make_lsb_mask(2); + ETL_CONSTEXPR int8_t mask3 = etl::make_lsb_mask(3); + ETL_CONSTEXPR int8_t mask4 = etl::make_lsb_mask(4); + ETL_CONSTEXPR int8_t mask5 = etl::make_lsb_mask(5); + ETL_CONSTEXPR int8_t mask6 = etl::make_lsb_mask(6); + ETL_CONSTEXPR int8_t mask7 = etl::make_lsb_mask(7); + ETL_CONSTEXPR int8_t mask8 = etl::make_lsb_mask(8); CHECK(int8_t(etl::b00000000) == mask0); CHECK(int8_t(etl::b00000001) == mask1); @@ -2629,18 +2629,52 @@ namespace CHECK(int8_t(etl::b11111111) == etl::make_lsb_mask(8)); } + //************************************************************************* + TEST(test_make_lsb_mask_template_nbits_8_bit) + { + ETL_CONSTEXPR int8_t mask0 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask1 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask2 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask3 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask4 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask5 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask6 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask7 = etl::make_lsb_mask(); + ETL_CONSTEXPR int8_t mask8 = etl::make_lsb_mask(); + + CHECK(int8_t(etl::b00000000) == mask0); + CHECK(int8_t(etl::b00000001) == mask1); + CHECK(int8_t(etl::b00000011) == mask2); + CHECK(int8_t(etl::b00000111) == mask3); + CHECK(int8_t(etl::b00001111) == mask4); + CHECK(int8_t(etl::b00011111) == mask5); + CHECK(int8_t(etl::b00111111) == mask6); + CHECK(int8_t(etl::b01111111) == mask7); + CHECK(int8_t(etl::b11111111) == mask8); + + CHECK(int8_t(etl::b00000000) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b00000001) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b00000011) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b00000111) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b00001111) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b00011111) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b00111111) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b01111111) == (etl::make_lsb_mask())); + CHECK(int8_t(etl::b11111111) == (etl::make_lsb_mask())); + } + //************************************************************************* TEST(test_make_lsb_mask_64_bit) { - ETL_CONSTEXPR14 int64_t mask0 = etl::make_lsb_mask(0); - ETL_CONSTEXPR14 int64_t mask1 = etl::make_lsb_mask(8); - ETL_CONSTEXPR14 int64_t mask2 = etl::make_lsb_mask(16); - ETL_CONSTEXPR14 int64_t mask3 = etl::make_lsb_mask(24); - ETL_CONSTEXPR14 int64_t mask4 = etl::make_lsb_mask(32); - ETL_CONSTEXPR14 int64_t mask5 = etl::make_lsb_mask(40); - ETL_CONSTEXPR14 int64_t mask6 = etl::make_lsb_mask(48); - ETL_CONSTEXPR14 int64_t mask7 = etl::make_lsb_mask(56); - ETL_CONSTEXPR14 int64_t mask8 = etl::make_lsb_mask(64); + ETL_CONSTEXPR int64_t mask0 = etl::make_lsb_mask(0); + ETL_CONSTEXPR int64_t mask1 = etl::make_lsb_mask(8); + ETL_CONSTEXPR int64_t mask2 = etl::make_lsb_mask(16); + ETL_CONSTEXPR int64_t mask3 = etl::make_lsb_mask(24); + ETL_CONSTEXPR int64_t mask4 = etl::make_lsb_mask(32); + ETL_CONSTEXPR int64_t mask5 = etl::make_lsb_mask(40); + ETL_CONSTEXPR int64_t mask6 = etl::make_lsb_mask(48); + ETL_CONSTEXPR int64_t mask7 = etl::make_lsb_mask(56); + ETL_CONSTEXPR int64_t mask8 = etl::make_lsb_mask(64); CHECK_EQUAL(int64_t(0x0000000000000000), mask0); CHECK_EQUAL(int64_t(0x00000000000000FF), mask1); @@ -2664,7 +2698,41 @@ namespace } //************************************************************************* - TEST(test_msb_mask_8_bit_8_bit) + TEST(test_make_lsb_mask_template_nbits_64_bit) + { + ETL_CONSTEXPR int64_t mask0 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask1 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask2 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask3 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask4 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask5 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask6 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask7 = etl::make_lsb_mask(); + ETL_CONSTEXPR int64_t mask8 = etl::make_lsb_mask(); + + CHECK_EQUAL(int64_t(0x0000000000000000), mask0); + CHECK_EQUAL(int64_t(0x00000000000000FF), mask1); + CHECK_EQUAL(int64_t(0x000000000000FFFF), mask2); + CHECK_EQUAL(int64_t(0x0000000000FFFFFF), mask3); + CHECK_EQUAL(int64_t(0x00000000FFFFFFFF), mask4); + CHECK_EQUAL(int64_t(0x000000FFFFFFFFFF), mask5); + CHECK_EQUAL(int64_t(0x0000FFFFFFFFFFFF), mask6); + CHECK_EQUAL(int64_t(0x00FFFFFFFFFFFFFF), mask7); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFFFF), mask8); + + CHECK_EQUAL(int64_t(0x0000000000000000), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0x00000000000000FF), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0x000000000000FFFF), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0x0000000000FFFFFF), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0x00000000FFFFFFFF), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0x000000FFFFFFFFFF), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0x0000FFFFFFFFFFFF), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0x00FFFFFFFFFFFFFF), (etl::make_lsb_mask())); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFFFF), (etl::make_lsb_mask())); + } + + //************************************************************************* + TEST(test_msb_mask_8_bit) { CHECK(int8_t(etl::b00000000) == (etl::msb_mask::value)); CHECK(int8_t(etl::b10000000) == (etl::msb_mask::value)); @@ -2680,8 +2748,8 @@ namespace //************************************************************************* TEST(test_msb_mask_64_bit) { - CHECK(int64_t(0x0000000000000000) == (etl::msb_mask::value)); - CHECK(int64_t(0xFF00000000000000) == (etl::msb_mask::value)); + CHECK(int64_t(0x0000000000000000) == (etl::msb_mask::value)); + CHECK(int64_t(0xFF00000000000000) == (etl::msb_mask::value)); CHECK(int64_t(0xFFFF000000000000) == (etl::msb_mask::value)); CHECK(int64_t(0xFFFFFF0000000000) == (etl::msb_mask::value)); CHECK(int64_t(0xFFFFFFFF00000000) == (etl::msb_mask::value)); @@ -2694,15 +2762,15 @@ namespace //************************************************************************* TEST(test_make_msb_mask_8_bit) { - ETL_CONSTEXPR14 int8_t mask0 = etl::make_msb_mask(0); - ETL_CONSTEXPR14 int8_t mask1 = etl::make_msb_mask(1); - ETL_CONSTEXPR14 int8_t mask2 = etl::make_msb_mask(2); - ETL_CONSTEXPR14 int8_t mask3 = etl::make_msb_mask(3); - ETL_CONSTEXPR14 int8_t mask4 = etl::make_msb_mask(4); - ETL_CONSTEXPR14 int8_t mask5 = etl::make_msb_mask(5); - ETL_CONSTEXPR14 int8_t mask6 = etl::make_msb_mask(6); - ETL_CONSTEXPR14 int8_t mask7 = etl::make_msb_mask(7); - ETL_CONSTEXPR14 int8_t mask8 = etl::make_msb_mask(8); + ETL_CONSTEXPR int8_t mask0 = etl::make_msb_mask(0); + ETL_CONSTEXPR int8_t mask1 = etl::make_msb_mask(1); + ETL_CONSTEXPR int8_t mask2 = etl::make_msb_mask(2); + ETL_CONSTEXPR int8_t mask3 = etl::make_msb_mask(3); + ETL_CONSTEXPR int8_t mask4 = etl::make_msb_mask(4); + ETL_CONSTEXPR int8_t mask5 = etl::make_msb_mask(5); + ETL_CONSTEXPR int8_t mask6 = etl::make_msb_mask(6); + ETL_CONSTEXPR int8_t mask7 = etl::make_msb_mask(7); + ETL_CONSTEXPR int8_t mask8 = etl::make_msb_mask(8); CHECK(int8_t(etl::b00000000) == mask0); CHECK(int8_t(etl::b10000000) == mask1); @@ -2725,18 +2793,52 @@ namespace CHECK(int8_t(etl::b11111111) == etl::make_msb_mask(8)); } + //************************************************************************* + TEST(test_make_msb_mask_template_nbits_8_bit) + { + ETL_CONSTEXPR int8_t mask0 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask1 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask2 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask3 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask4 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask5 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask6 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask7 = etl::make_msb_mask(); + ETL_CONSTEXPR int8_t mask8 = etl::make_msb_mask(); + + CHECK(int8_t(etl::b00000000) == mask0); + CHECK(int8_t(etl::b10000000) == mask1); + CHECK(int8_t(etl::b11000000) == mask2); + CHECK(int8_t(etl::b11100000) == mask3); + CHECK(int8_t(etl::b11110000) == mask4); + CHECK(int8_t(etl::b11111000) == mask5); + CHECK(int8_t(etl::b11111100) == mask6); + CHECK(int8_t(etl::b11111110) == mask7); + CHECK(int8_t(etl::b11111111) == mask8); + + CHECK(int8_t(etl::b00000000) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b10000000) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b11000000) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b11100000) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b11110000) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b11111000) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b11111100) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b11111110) == (etl::make_msb_mask())); + CHECK(int8_t(etl::b11111111) == (etl::make_msb_mask())); + } + //************************************************************************* TEST(test_make_msb_mask_64_bit) { - ETL_CONSTEXPR14 int64_t mask0 = etl::make_msb_mask(0); - ETL_CONSTEXPR14 int64_t mask1 = etl::make_msb_mask(8); - ETL_CONSTEXPR14 int64_t mask2 = etl::make_msb_mask(16); - ETL_CONSTEXPR14 int64_t mask3 = etl::make_msb_mask(24); - ETL_CONSTEXPR14 int64_t mask4 = etl::make_msb_mask(32); - ETL_CONSTEXPR14 int64_t mask5 = etl::make_msb_mask(40); - ETL_CONSTEXPR14 int64_t mask6 = etl::make_msb_mask(48); - ETL_CONSTEXPR14 int64_t mask7 = etl::make_msb_mask(56); - ETL_CONSTEXPR14 int64_t mask8 = etl::make_msb_mask(64); + ETL_CONSTEXPR int64_t mask0 = etl::make_msb_mask(0); + ETL_CONSTEXPR int64_t mask1 = etl::make_msb_mask(8); + ETL_CONSTEXPR int64_t mask2 = etl::make_msb_mask(16); + ETL_CONSTEXPR int64_t mask3 = etl::make_msb_mask(24); + ETL_CONSTEXPR int64_t mask4 = etl::make_msb_mask(32); + ETL_CONSTEXPR int64_t mask5 = etl::make_msb_mask(40); + ETL_CONSTEXPR int64_t mask6 = etl::make_msb_mask(48); + ETL_CONSTEXPR int64_t mask7 = etl::make_msb_mask(56); + ETL_CONSTEXPR int64_t mask8 = etl::make_msb_mask(64); CHECK_EQUAL(int64_t(0x0000000000000000), mask0); CHECK_EQUAL(int64_t(0xFF00000000000000), mask1); @@ -2758,6 +2860,40 @@ namespace CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFF00), etl::make_msb_mask(56)); CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFFFF), etl::make_msb_mask(64)); } + + //************************************************************************* + TEST(test_make_msb_mask_template_nbits_64_bit) + { + ETL_CONSTEXPR int64_t mask0 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask1 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask2 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask3 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask4 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask5 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask6 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask7 = etl::make_msb_mask(); + ETL_CONSTEXPR int64_t mask8 = etl::make_msb_mask(); + + CHECK_EQUAL(int64_t(0x0000000000000000), mask0); + CHECK_EQUAL(int64_t(0xFF00000000000000), mask1); + CHECK_EQUAL(int64_t(0xFFFF000000000000), mask2); + CHECK_EQUAL(int64_t(0xFFFFFF0000000000), mask3); + CHECK_EQUAL(int64_t(0xFFFFFFFF00000000), mask4); + CHECK_EQUAL(int64_t(0xFFFFFFFFFF000000), mask5); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFF0000), mask6); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFF00), mask7); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFFFF), mask8); + + CHECK_EQUAL(int64_t(0x0000000000000000), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFF00000000000000), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFFFF000000000000), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFFFFFF0000000000), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFFFFFFFF00000000), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFFFFFFFFFF000000), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFF0000), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFF00), (etl::make_msb_mask())); + CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFFFF), (etl::make_msb_mask())); + } }; } From 11491333844ef7a7b39e1e047a9793a94040881a Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 4 Dec 2023 08:37:42 +0000 Subject: [PATCH 007/131] Updated script text --- test/run-syntax-checks.sh | 2 +- test/run-tests.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/run-syntax-checks.sh b/test/run-syntax-checks.sh index 76b5a7eb..2e62336e 100644 --- a/test/run-syntax-checks.sh +++ b/test/run-syntax-checks.sh @@ -32,7 +32,7 @@ PrintHeader() echo " Configuration : $configuration_name " | tee -a log.txt echo " Compiler : $compiler " | tee -a log.txt echo " Language standard : C++$cxx_standard " | tee -a log.txt - echo " ETL Version : $etl_version " | tee -a log.txt + echo " ETL version : $etl_version " | tee -a log.txt echo " Git branch : $(ParseGitBranch) " | tee -a log.txt echo " Processes : ${CMAKE_BUILD_PARALLEL_LEVEL} " | tee -a log.txt echo "============================================================================" | tee -a log.txt diff --git a/test/run-tests.sh b/test/run-tests.sh index 0fa5d720..956d9838 100644 --- a/test/run-tests.sh +++ b/test/run-tests.sh @@ -43,7 +43,7 @@ PrintHeader() echo " Language standard : C++$cxx_standard " | tee -a log.txt echo " Optimisation : $opt " | tee -a log.txt echo " Sanitizer : $sanitize " | tee -a log.txt - echo " ETL Version : $etl_version " | tee -a log.txt + echo " ETL version : $etl_version " | tee -a log.txt echo " Git branch : $(ParseGitBranch) " | tee -a log.txt echo " Processes : ${CMAKE_BUILD_PARALLEL_LEVEL} " | tee -a log.txt echo "============================================================================" | tee -a log.txt From 305f34fbede50ffa2927c198ca27da6b230a66ba Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 4 Dec 2023 08:37:59 +0000 Subject: [PATCH 008/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 100 +++- test/test_bitset_new_default_element_type.cpp | 82 ++- ...itset_new_explicit_single_element_type.cpp | 498 ++++++++++++++++-- ...st_bitset_new_ext_default_element_type.cpp | 437 ++++++++++++++- ...t_new_ext_explicit_single_element_type.cpp | 441 +++++++++++++++- 5 files changed, 1432 insertions(+), 126 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 65128c75..6894feb9 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -418,7 +418,7 @@ namespace etl // Extract the first element, if partially filled. if (active_bits_in_msb < Bits_Per_Element) { - element_type mask = ~(~element_type(0) << active_bits_in_msb); + element_type mask = etl::make_lsb_mask< element_type>(active_bits_in_msb); value = pbuffer[element_index] & mask; length -= active_bits_in_msb; if (length >= Bits_Per_Element) @@ -444,7 +444,7 @@ namespace etl if (length != 0) { value = value << length; - element_type mask = ~(~element_type(0) << length); + element_type mask = etl::make_lsb_mask< element_type>(length); value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; } @@ -468,7 +468,7 @@ namespace etl // Is the value contained within one element? if (Msb_Element_Index == Lsb_Element_Index) { - const unsigned_t Mask = ~(~0 << length); + const unsigned_t Mask = etl::make_lsb_mask< unsigned_t>(length); const unsigned_t Shift = position % Bits_Per_Element; value = static_cast(pbuffer[Msb_Element_Index] >> Shift) & Mask; @@ -498,7 +498,7 @@ namespace etl typedef typename etl::make_unsigned::type unsigned_t; const int Element_Index = (Position + Length - 1) >> etl::log2::value; - const unsigned_t Mask = ~(~0 << Length); + const unsigned_t Mask = etl::lsb_mask::value; const unsigned_t Shift = Position % Bits_Per_Element; return static_cast(pbuffer[Element_Index] >> Shift) & Mask; @@ -511,9 +511,7 @@ namespace etl ETL_CONSTEXPR14 typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const - { - typedef typename etl::make_unsigned::type unsigned_t; - + { const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; // Start with index of the element containing the msb. @@ -978,7 +976,7 @@ namespace etl /// Specialisation that uses a single element if the element type is the /// same size as the number of active bits. //*************************************************************************** - template + template class bitset : public bitset_constants<> { public: @@ -1413,10 +1411,19 @@ namespace etl ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - element_type mask = (~(~0u << length) << position); - T value((buffer & mask) >> position); + typedef typename etl::make_unsigned::type unsigned_t; - return value; + const unsigned_t Mask = etl::make_lsb_mask< unsigned_t>(length); + const unsigned_t Shift = position % Bits_Per_Element; + + unsigned_t value = static_cast(buffer >> Shift) & Mask; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); } //************************************************************************* @@ -1430,10 +1437,19 @@ namespace etl ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - element_type mask = (~(~0u << Length) << Position); - T value((buffer & mask) >> Position); + typedef typename etl::make_unsigned::type unsigned_t; - return value; + const unsigned_t Mask = etl::make_lsb_mask(); + const unsigned_t Shift = Position % Bits_Per_Element; + + unsigned_t value = static_cast(buffer >> Shift) & Mask; + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return static_cast(value); } //************************************************************************* @@ -2213,7 +2229,7 @@ namespace etl value = etl::sign_extend(value, length); } - return value; + return static_cast(value); } //************************************************************************* @@ -2235,7 +2251,7 @@ namespace etl value = etl::sign_extend(value); } - return value; + return static_cast(value); } //************************************************************************* @@ -3202,10 +3218,19 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - element_type mask = (~(~0u << length) << position); - T v((*pbuffer & mask) >> position); + typedef typename etl::make_unsigned::type unsigned_t; - return v; + 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; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); } //************************************************************************* @@ -3218,10 +3243,19 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - element_type mask = (~(~0u << Length) << Position); - T v((*pbuffer & mask) >> Position); + typedef typename etl::make_unsigned::type unsigned_t; - return v; + const unsigned_t Mask = etl::make_lsb_mask(); + const unsigned_t Shift = Position % Bits_Per_Element; + + unsigned_t value = static_cast(*pbuffer >> Shift) & Mask; + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return static_cast(value); } //************************************************************************* @@ -3995,7 +4029,16 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.template extract_from_buffer(pbuffer, position, length); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(pbuffer, position, length); + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); } //************************************************************************* @@ -4008,7 +4051,16 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.template extract_from_buffer(pbuffer); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(pbuffer); + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return static_cast(value); } //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index a0980425..266243f7 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2177,18 +2177,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - auto v = b.extract(1, 6); - - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); @@ -2216,16 +2214,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); @@ -2512,16 +2510,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int16_t(0x5678), b.extract(0, 16)); - CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract(1, 16)); - CHECK_EQUAL_HEX(int16_t(0x159E), b.extract(2, 16)); - CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract(3, 16)); - CHECK_EQUAL_HEX(int16_t(0x4567), b.extract(4, 16)); - CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract(5, 16)); - CHECK_EQUAL_HEX(int16_t(0xD159), b.extract(6, 16)); - CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract(7, 16)); - CHECK_EQUAL_HEX(int16_t(0x3456), b.extract(8, 16)); - CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract(9, 16)); + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); @@ -2539,16 +2537,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 8e161389..ad8f8fe1 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -1586,36 +1586,188 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); - CHECK_EQUAL(0x78, b.extract(0, 8)); - CHECK_EQUAL(0x3C, b.extract(1, 8)); - CHECK_EQUAL(0x9E, b.extract(2, 8)); - CHECK_EQUAL(0xCF, b.extract(3, 8)); - CHECK_EQUAL(0x67, b.extract(4, 8)); - CHECK_EQUAL(0xB3, b.extract(5, 8)); - CHECK_EQUAL(0x59, b.extract(6, 8)); - CHECK_EQUAL(0xAC, b.extract(7, 8)); - CHECK_EQUAL(0x56, b.extract(8, 8)); - CHECK_EQUAL(0x2B, b.extract(9, 8)); - CHECK_EQUAL(0x15, b.extract(10, 8)); - CHECK_EQUAL(0x8A, b.extract(11, 8)); - CHECK_EQUAL(0x45, b.extract(12, 8)); - CHECK_EQUAL(0xA2, b.extract(13, 8)); - CHECK_EQUAL(0xD1, b.extract(14, 8)); - CHECK_EQUAL(0x68, b.extract(15, 8)); - CHECK_EQUAL(0x34, b.extract(16, 8)); - CHECK_EQUAL(0x1A, b.extract(17, 8)); - CHECK_EQUAL(0x8D, b.extract(18, 8)); - CHECK_EQUAL(0x46, b.extract(19, 8)); - CHECK_EQUAL(0x23, b.extract(20, 8)); - CHECK_EQUAL(0x91, b.extract(21, 8)); - CHECK_EQUAL(0x48, b.extract(22, 8)); - CHECK_EQUAL(0x24, b.extract(23, 8)); - CHECK_EQUAL(0x12, b.extract(24, 8)); + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } @@ -1624,35 +1776,277 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); - CHECK_EQUAL(0x78, (b.extract())); - CHECK_EQUAL(0x3C, (b.extract())); - CHECK_EQUAL(0x9E, (b.extract())); - CHECK_EQUAL(0xCF, (b.extract())); - CHECK_EQUAL(0x67, (b.extract())); - CHECK_EQUAL(0xB3, (b.extract())); - CHECK_EQUAL(0x59, (b.extract())); - CHECK_EQUAL(0xAC, (b.extract())); - CHECK_EQUAL(0x56, (b.extract())); - CHECK_EQUAL(0x2B, (b.extract())); - CHECK_EQUAL(0x15, (b.extract())); - CHECK_EQUAL(0x8A, (b.extract())); - CHECK_EQUAL(0x45, (b.extract())); - CHECK_EQUAL(0xA2, (b.extract())); - CHECK_EQUAL(0xD1, (b.extract())); - CHECK_EQUAL(0x68, (b.extract())); - CHECK_EQUAL(0x34, (b.extract())); - CHECK_EQUAL(0x1A, (b.extract())); - CHECK_EQUAL(0x8D, (b.extract())); - CHECK_EQUAL(0x46, (b.extract())); - CHECK_EQUAL(0x23, (b.extract())); - CHECK_EQUAL(0x91, (b.extract())); - CHECK_EQUAL(0x48, (b.extract())); - CHECK_EQUAL(0x24, (b.extract())); - CHECK_EQUAL(0x12, (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); // The lines below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index 7e377a95..201e98e6 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -1958,6 +1958,168 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { @@ -1991,6 +2153,9 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* @@ -2027,9 +2192,275 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); - // The line below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } 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 d0b489be..163d1865 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -1310,10 +1310,172 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); @@ -1343,12 +1505,15 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* TEST(test_extract_uint8_t_with_template_parameters) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); @@ -1379,9 +1544,275 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); - // The line below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } From 489429bd7c113ea9b410aca28a75e29ca423d566 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 13 Dec 2023 09:58:44 +0000 Subject: [PATCH 009/131] Fixed operator == implementations --- include/etl/unordered_map.h | 34 +++++++++++++++++++++----- include/etl/unordered_multimap.h | 41 +++++++++++++++++++++++++++----- include/etl/unordered_multiset.h | 40 ++++++++++++++++++++++++++----- include/etl/unordered_set.h | 33 ++++++++++++++++++++----- test/test_unordered_map.cpp | 14 +++++++++++ test/test_unordered_multimap.cpp | 15 ++++++++++++ test/test_unordered_multiset.cpp | 14 +++++++++++ test/test_unordered_set.cpp | 14 +++++++++++ 8 files changed, 181 insertions(+), 24 deletions(-) diff --git a/include/etl/unordered_map.h b/include/etl/unordered_map.h index 0e5b9e35..507ae872 100644 --- a/include/etl/unordered_map.h +++ b/include/etl/unordered_map.h @@ -1569,20 +1569,41 @@ namespace etl ///\return true if the arrays are equal, otherwise false ///\ingroup unordered_map //*************************************************************************** - template - bool operator ==(const etl::iunordered_map& lhs, const etl::iunordered_map& rhs) + template + bool operator ==(const etl::iunordered_map& lhs, + const etl::iunordered_map& rhs) { const bool sizes_match = (lhs.size() == rhs.size()); bool elements_match = true; + typedef typename etl::iunordered_map::const_iterator itr_t; + if (sizes_match) { - for (size_t i = 0; (i < lhs.bucket_count()) && elements_match; ++i) + itr_t l_begin = lhs.begin(); + itr_t l_end = lhs.end(); + + while ((l_begin != l_end) && elements_match) { - if (!etl::is_permutation(lhs.begin(i), lhs.end(i), rhs.begin(i))) + const TKey key = l_begin->first; + const T l_value = l_begin->second; + + // See if the lhs key exists in the rhs. + ETL_OR_STD::pair range = rhs.equal_range(key); + + if (range.first != rhs.end()) + { + // See if the values match + const T r_value = range.first->second; + + elements_match = (r_value == l_value); + } + else { elements_match = false; } + + ++l_begin; } } @@ -1596,8 +1617,9 @@ namespace etl ///\return true if the arrays are not equal, otherwise false ///\ingroup unordered_map //*************************************************************************** - template - bool operator !=(const etl::iunordered_map& lhs, const etl::iunordered_map& rhs) + template + bool operator !=(const etl::iunordered_map& lhs, + const etl::iunordered_map& rhs) { return !(lhs == rhs); } diff --git a/include/etl/unordered_multimap.h b/include/etl/unordered_multimap.h index 174b5978..b698374c 100644 --- a/include/etl/unordered_multimap.h +++ b/include/etl/unordered_multimap.h @@ -1423,20 +1423,48 @@ namespace etl ///\return true if the arrays are equal, otherwise false ///\ingroup unordered_multimap //*************************************************************************** - template - bool operator ==(const etl::iunordered_multimap& lhs, const etl::iunordered_multimap& rhs) + template + bool operator ==(const etl::iunordered_multimap& lhs, + const etl::iunordered_multimap& rhs) { const bool sizes_match = (lhs.size() == rhs.size()); bool elements_match = true; + typedef typename etl::iunordered_multimap::const_iterator itr_t; + if (sizes_match) { - for (size_t i = 0; (i < lhs.bucket_count()) && elements_match; ++i) + itr_t l_begin = lhs.begin(); + itr_t l_end = lhs.end(); + + while ((l_begin != l_end) && elements_match) { - if (!etl::is_permutation(lhs.begin(i), lhs.end(i), rhs.begin(i))) + const TKey key = l_begin->first; + const T l_value = l_begin->second; + + // See if the lhs keys exist in the rhs. + ETL_OR_STD::pair l_range = lhs.equal_range(key); + ETL_OR_STD::pair r_range = rhs.equal_range(key); + + if (r_range.first != rhs.end()) + { + bool distance_match = (etl::distance(l_range.first, l_range.second) == etl::distance(r_range.first, r_range.second)); + + if (distance_match) + { + elements_match = etl::is_permutation(l_range.first, l_range.second, r_range.first, r_range.second); + } + else + { + elements_match = false; + } + } + else { elements_match = false; } + + ++l_begin; } } @@ -1450,8 +1478,9 @@ namespace etl ///\return true if the arrays are not equal, otherwise false ///\ingroup unordered_multimap //*************************************************************************** - template - bool operator !=(const etl::iunordered_multimap& lhs, const etl::iunordered_multimap& rhs) + template + bool operator !=(const etl::iunordered_multimap& lhs, + const etl::iunordered_multimap& rhs) { return !(lhs == rhs); } diff --git a/include/etl/unordered_multiset.h b/include/etl/unordered_multiset.h index be1acee7..21ff6dcb 100644 --- a/include/etl/unordered_multiset.h +++ b/include/etl/unordered_multiset.h @@ -1401,20 +1401,47 @@ namespace etl ///\return true if the arrays are equal, otherwise false ///\ingroup unordered_multiset //*************************************************************************** - template - bool operator ==(const etl::iunordered_multiset& lhs, const etl::iunordered_multiset& rhs) + template , typename TKeyEqual> + bool operator ==(const etl::iunordered_multiset& lhs, + const etl::iunordered_multiset& rhs) { const bool sizes_match = (lhs.size() == rhs.size()); bool elements_match = true; + typedef typename etl::iunordered_multiset::const_iterator itr_t; + if (sizes_match) { - for (size_t i = 0; (i < lhs.bucket_count()) && elements_match; ++i) + itr_t l_begin = lhs.begin(); + itr_t l_end = lhs.end(); + + while ((l_begin != l_end) && elements_match) { - if (!etl::is_permutation(lhs.begin(i), lhs.end(i), rhs.begin(i))) + const TKey l_value = *l_begin; + + // See if the lhs keys exist in the rhs. + ETL_OR_STD::pair l_range = lhs.equal_range(l_value); + ETL_OR_STD::pair r_range = rhs.equal_range(l_value); + + if (r_range.first != rhs.end()) + { + bool distance_match = (etl::distance(l_range.first, l_range.second) == etl::distance(r_range.first, r_range.second)); + + if (distance_match) + { + elements_match = etl::is_permutation(l_range.first, l_range.second, r_range.first, r_range.second); + } + else + { + elements_match = false; + } + } + else { elements_match = false; } + + ++l_begin; } } @@ -1428,8 +1455,9 @@ namespace etl ///\return true if the arrays are not equal, otherwise false ///\ingroup unordered_multiset //*************************************************************************** - template - bool operator !=(const etl::iunordered_multiset& lhs, const etl::iunordered_multiset& rhs) + template , typename TKeyEqual> + bool operator !=(const etl::iunordered_multiset& lhs, + const etl::iunordered_multiset& rhs) { return !(lhs == rhs); } diff --git a/include/etl/unordered_set.h b/include/etl/unordered_set.h index 35dce097..24f929b8 100644 --- a/include/etl/unordered_set.h +++ b/include/etl/unordered_set.h @@ -1427,20 +1427,40 @@ namespace etl ///\return true if the sets are equal, otherwise false ///\ingroup unordered_set //*************************************************************************** - template - bool operator ==(const etl::iunordered_set& lhs, const etl::iunordered_set& rhs) + template + bool operator ==(const etl::iunordered_set& lhs, + const etl::iunordered_set& rhs) { const bool sizes_match = (lhs.size() == rhs.size()); bool elements_match = true; + typedef typename etl::iunordered_set::const_iterator itr_t; + if (sizes_match) { - for (size_t i = 0; (i < lhs.bucket_count()) && elements_match; ++i) + itr_t l_begin = lhs.begin(); + itr_t l_end = lhs.end(); + + while ((l_begin != l_end) && elements_match) { - if (!etl::is_permutation(lhs.begin(i), lhs.end(i), rhs.begin(i))) + const TKey l_value = *l_begin; + + // See if the lhs key exists in the rhs. + ETL_OR_STD::pair range = rhs.equal_range(l_value); + + if (range.first != rhs.end()) + { + // See if the values match + const TKey r_value = *(range.first); + + elements_match = (r_value == l_value); + } + else { elements_match = false; } + + ++l_begin; } } @@ -1454,8 +1474,9 @@ namespace etl ///\return true if the sets are not equal, otherwise false ///\ingroup unordered_set //*************************************************************************** - template - bool operator !=(const etl::iunordered_set& lhs, const etl::iunordered_set& rhs) + template + bool operator !=(const etl::iunordered_set& lhs, + const etl::iunordered_set& rhs) { return !(lhs == rhs); } diff --git a/test/test_unordered_map.cpp b/test/test_unordered_map.cpp index 45a28397..93f66457 100644 --- a/test/test_unordered_map.cpp +++ b/test/test_unordered_map.cpp @@ -1193,5 +1193,19 @@ namespace using Map = etl::unordered_map; CHECK((!std::is_same::value)); } + + //************************************************************************* + TEST(test_iterator_value_types_bug_803) + { + using Map1 = etl::unordered_map; + using Map2 = etl::unordered_map; + + Map1 map1(initial_data.begin(), initial_data.end()); + Map2 map2a(initial_data.begin(), initial_data.end()); + Map2 map2b(different_data.begin(), different_data.end()); + + CHECK_TRUE(map1 == map2a); + CHECK_FALSE(map1 == map2b); + } }; } diff --git a/test/test_unordered_multimap.cpp b/test/test_unordered_multimap.cpp index 8bd86523..38d198bf 100644 --- a/test/test_unordered_multimap.cpp +++ b/test/test_unordered_multimap.cpp @@ -1030,6 +1030,7 @@ namespace CHECK((!std::is_same::value)); } + //************************************************************************* TEST(test_parameterized_eq) { constexpr std::size_t MODULO = 4; @@ -1053,5 +1054,19 @@ namespace CHECK_EQUAL(std::distance(range.first, range.second), 3); } } + + //************************************************************************* + TEST(test_iterator_value_types_bug_803) + { + using Map1 = etl::unordered_multimap; + using Map2 = etl::unordered_multimap; + + Map1 map1(initial_data.begin(), initial_data.end()); + Map2 map2a(initial_data.begin(), initial_data.end()); + Map2 map2b(different_data.begin(), different_data.end()); + + CHECK_TRUE(map1 == map2a); + CHECK_FALSE(map1 == map2b); + } }; } diff --git a/test/test_unordered_multiset.cpp b/test/test_unordered_multiset.cpp index c891730a..8337a015 100644 --- a/test/test_unordered_multiset.cpp +++ b/test/test_unordered_multiset.cpp @@ -929,5 +929,19 @@ namespace CHECK_EQUAL(std::distance(range.first, range.second), 3); } } + + //************************************************************************* + TEST(test_iterator_value_types_bug_803) + { + using Set1 = etl::unordered_multiset; + using Set2 = etl::unordered_multiset; + + Set1 set1(initial_data.begin(), initial_data.end()); + Set2 set2a(initial_data.begin(), initial_data.end()); + Set2 set2b(different_data.begin(), different_data.end()); + + CHECK_TRUE(set1 == set2a); + CHECK_FALSE(set1 == set2b); + } }; } diff --git a/test/test_unordered_set.cpp b/test/test_unordered_set.cpp index 8ef20ad3..7a4210cc 100644 --- a/test/test_unordered_set.cpp +++ b/test/test_unordered_set.cpp @@ -895,5 +895,19 @@ namespace using Set = etl::unordered_set; CHECK((!std::is_same::value)); } + + //************************************************************************* + TEST(test_iterator_value_types_bug_803) + { + using Set1 = etl::unordered_set; + using Set2 = etl::unordered_set; + + Set1 set1(initial_data.begin(), initial_data.end()); + Set2 set2a(initial_data.begin(), initial_data.end()); + Set2 set2b(different_data.begin(), different_data.end()); + + CHECK_TRUE(set1 == set2a); + CHECK_FALSE(set1 == set2b); + } }; } From 8f88aa0141ad95ba40fc6627e1ba8dc01aa7f9d6 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 15 Dec 2023 10:06:21 +0000 Subject: [PATCH 010/131] Fixed etl::optional operator =() for invalid values with non-pod types --- include/etl/optional.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/etl/optional.h b/include/etl/optional.h index d85763d2..8eefd588 100644 --- a/include/etl/optional.h +++ b/include/etl/optional.h @@ -783,7 +783,11 @@ namespace etl { if (this != &other) { - storage.value = etl::move(other.storage.value); + if (other.has_value()) + { + storage.value = etl::move(other.storage.value); + } + valid = other.valid; } From 59cd9e66d765262e7f96d0e5e3ac8faefb1d1acb Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 16 Dec 2023 12:57:36 +0000 Subject: [PATCH 011/131] #807 Change in legacy etl::bitset with nullptr construction + error handling Harmonised operation of legacy and new etl::bitset Added ETL_ASSERT checks for nullptr buffer pointers for etl::bitset_ext --- include/etl/private/bitset_legacy.h | 42 +++- include/etl/private/bitset_new.h | 63 ++++-- test/test_bit_stream_reader_big_endian.cpp | 2 +- test/test_bit_stream_reader_little_endian.cpp | 2 +- test/test_bit_stream_writer_big_endian.cpp | 2 +- test/test_bit_stream_writer_little_endian.cpp | 2 +- test/test_bitset_legacy.cpp | 154 ++++++++++++++- test/test_bitset_new_default_element_type.cpp | 155 ++++++++++++++- ...itset_new_explicit_single_element_type.cpp | 154 ++++++++++++++- ...st_bitset_new_ext_default_element_type.cpp | 187 +++++++++++++++++- ...t_new_ext_explicit_single_element_type.cpp | 185 ++++++++++++++++- 11 files changed, 882 insertions(+), 66 deletions(-) diff --git a/include/etl/private/bitset_legacy.h b/include/etl/private/bitset_legacy.h index 24052e41..30c152ae 100644 --- a/include/etl/private/bitset_legacy.h +++ b/include/etl/private/bitset_legacy.h @@ -429,7 +429,14 @@ namespace etl //************************************************************************* ibitset& set(const char* text) { - from_string(text); + if (text == ETL_NULLPTR) + { + reset(); + } + else + { + from_string(text); + } return *this; } @@ -439,7 +446,14 @@ namespace etl //************************************************************************* ibitset& set(const wchar_t* text) { - from_string(text); + if (text == ETL_NULLPTR) + { + reset(); + } + else + { + from_string(text); + } return *this; } @@ -449,7 +463,14 @@ namespace etl //************************************************************************* ibitset& set(const char16_t* text) { - from_string(text); + if (text == ETL_NULLPTR) + { + reset(); + } + else + { + from_string(text); + } return *this; } @@ -459,7 +480,14 @@ namespace etl //************************************************************************* ibitset& set(const char32_t* text) { - from_string(text); + if (text == ETL_NULLPTR) + { + reset(); + } + else + { + from_string(text); + } return *this; } @@ -512,7 +540,7 @@ namespace etl //************************************************************************* ibitset& reset() { - ::memset(pdata, 0x00, Number_Of_Elements); + ::memset(pdata, 0, Number_Of_Elements * sizeof(element_type)); return *this; } @@ -1194,7 +1222,6 @@ namespace etl //************************************************************************* bitset& set(const char* text) { - ETL_ASSERT_OR_RETURN_VALUE(text != 0, ETL_ERROR(bitset_nullptr), *this); etl::ibitset::set(text); return *this; @@ -1205,7 +1232,6 @@ namespace etl //************************************************************************* bitset& set(const wchar_t* text) { - ETL_ASSERT_OR_RETURN_VALUE(text != 0, ETL_ERROR(bitset_nullptr), *this); etl::ibitset::set(text); return *this; @@ -1216,7 +1242,6 @@ namespace etl //************************************************************************* bitset& set(const char16_t* text) { - ETL_ASSERT_OR_RETURN_VALUE(text != 0, ETL_ERROR(bitset_nullptr), *this); etl::ibitset::set(text); return *this; @@ -1227,7 +1252,6 @@ namespace etl //************************************************************************* bitset& set(const char32_t* text) { - ETL_ASSERT_OR_RETURN_VALUE(text != 0, ETL_ERROR(bitset_nullptr), *this); etl::ibitset::set(text); return *this; diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 63462f21..28497238 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -127,6 +127,20 @@ namespace etl } }; + //*************************************************************************** + /// Bitset nullptr buffer exception. + ///\ingroup bitset + //*************************************************************************** + class bitset_invalid_buffer : public bitset_exception + { + public: + + bitset_invalid_buffer(string_type file_name_, numeric_type line_number_) + : bitset_exception(ETL_ERROR_TEXT("bitset:invalid buffer", ETL_BITSET_FILE_ID"D"), file_name_, line_number_) + { + } + }; + //************************************************************************* /// The implementation class for multi-element etl::bitset ///\ingroup bitset @@ -2598,16 +2612,17 @@ namespace etl //************************************************************************* /// Default constructor. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 explicit bitset_ext(element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); *pbuffer = All_Clear_Element; } //************************************************************************* /// Default constructor. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(buffer_type& buffer) ETL_NOEXCEPT + ETL_CONSTEXPR14 explicit bitset_ext(buffer_type& buffer) ETL_NOEXCEPT : pbuffer(&buffer) { *pbuffer = All_Clear_Element; @@ -2616,9 +2631,10 @@ namespace etl //************************************************************************* /// Construct copy. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); *pbuffer = *other.pbuffer; } @@ -2639,9 +2655,10 @@ namespace etl //************************************************************************* /// Construct from a value. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(unsigned long long value, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(unsigned long long value, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); *pbuffer = element_type(value); } @@ -2657,9 +2674,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const char* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); *pbuffer = All_Clear_Element; set(text); } @@ -2677,9 +2695,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); *pbuffer = All_Clear_Element; set(text); } @@ -2697,9 +2716,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char16_t* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const char16_t* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); *pbuffer = All_Clear_Element; set(text); } @@ -2717,9 +2737,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char32_t* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const char32_t* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); *pbuffer = All_Clear_Element; set(text); } @@ -2963,7 +2984,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -3476,27 +3497,30 @@ namespace etl //************************************************************************* /// Default constructor. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 explicit bitset_ext(element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); reset(); } //************************************************************************* /// Default constructor. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(buffer_type& buffer) ETL_NOEXCEPT + ETL_CONSTEXPR14 explicit bitset_ext(buffer_type& buffer) : pbuffer(buffer.data()) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); reset(); } //************************************************************************* /// Construct copy. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); etl::copy_n(other.pbuffer, Number_Of_Elements, pbuffer); } @@ -3517,9 +3541,10 @@ namespace etl //************************************************************************* /// Construct from a value. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(unsigned long long value, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(unsigned long long value, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); ibitset.initialise(pbuffer, Number_Of_Elements, value); clear_unused_bits_in_msb(); } @@ -3537,9 +3562,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const char* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); clear_unused_bits_in_msb(); } @@ -3557,9 +3583,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); clear_unused_bits_in_msb(); } @@ -3577,9 +3604,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char16_t* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const char16_t* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); clear_unused_bits_in_msb(); } @@ -3597,9 +3625,10 @@ namespace etl //************************************************************************* /// Construct from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char32_t* text, element_type* pbuffer_) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const char32_t* text, element_type* pbuffer_) : pbuffer(pbuffer_) { + ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); clear_unused_bits_in_msb(); } diff --git a/test/test_bit_stream_reader_big_endian.cpp b/test/test_bit_stream_reader_big_endian.cpp index c71977b1..4cdf3d29 100644 --- a/test/test_bit_stream_reader_big_endian.cpp +++ b/test/test_bit_stream_reader_big_endian.cpp @@ -94,7 +94,7 @@ namespace etl namespace { - SUITE(test_bit_stream_reader) + SUITE(test_bit_stream_reader_big_endian) { //************************************************************************* TEST(test_read_bool) diff --git a/test/test_bit_stream_reader_little_endian.cpp b/test/test_bit_stream_reader_little_endian.cpp index 776d2023..22c724ff 100644 --- a/test/test_bit_stream_reader_little_endian.cpp +++ b/test/test_bit_stream_reader_little_endian.cpp @@ -95,7 +95,7 @@ namespace etl namespace { - SUITE(test_bit_stream_reader) + SUITE(test_bit_stream_reader_little_endian) { //************************************************************************* TEST(test_read_bool) diff --git a/test/test_bit_stream_writer_big_endian.cpp b/test/test_bit_stream_writer_big_endian.cpp index be7ff681..675edbbb 100644 --- a/test/test_bit_stream_writer_big_endian.cpp +++ b/test/test_bit_stream_writer_big_endian.cpp @@ -114,7 +114,7 @@ namespace std::vector data; }; - SUITE(test_bit_stream_big_endian) + SUITE(test_bit_stream_writer_big_endian) { //************************************************************************* TEST(test_bit_stream_writer_construction) diff --git a/test/test_bit_stream_writer_little_endian.cpp b/test/test_bit_stream_writer_little_endian.cpp index e66c46c2..3051bc7f 100644 --- a/test/test_bit_stream_writer_little_endian.cpp +++ b/test/test_bit_stream_writer_little_endian.cpp @@ -114,7 +114,7 @@ namespace std::vector data; }; - SUITE(test_bit_stream_little_endian) + SUITE(test_bit_stream_writer_little_endian) { //************************************************************************* TEST(test_bit_stream_writer_construction) diff --git a/test/test_bitset_legacy.cpp b/test/test_bitset_legacy.cpp index ce664c4c..a64722ba 100644 --- a/test/test_bitset_legacy.cpp +++ b/test/test_bitset_legacy.cpp @@ -143,6 +143,50 @@ namespace } } + //************************************************************************* + TEST(test_construct_from_nullptr_char_string) + { + const char* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_wchar_t_string) + { + const wchar_t* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char16_t_string) + { + const char16_t* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char32_t_string) + { + const char32_t* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_construct_from_excess_string) { @@ -206,7 +250,7 @@ namespace } //************************************************************************* - TEST(test_char_string_set) + TEST(test_set_with_char_string) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -226,7 +270,7 @@ namespace } //************************************************************************* - TEST(test_wchar_t_string_set) + TEST(test_set_with_wchar_t_string) { std::bitset<60> compare(L"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -246,7 +290,7 @@ namespace } //************************************************************************* - TEST(test_char16_t_string_set) + TEST(test_set_with_char16_t_string) { std::bitset<60> compare(u"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -266,7 +310,7 @@ namespace } //************************************************************************* - TEST(test_char32_t_string_set) + TEST(test_set_with_char32_t_string) { std::bitset<60> compare(U"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -286,7 +330,55 @@ namespace } //************************************************************************* - TEST(test_from_char_string) + TEST(test_set_from_char_nullptr) + { + const char* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -306,7 +398,7 @@ namespace } //************************************************************************* - TEST(test_from_wchar_t_string) + TEST(test_from_string_with_wchar_t) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -346,7 +438,7 @@ namespace } //************************************************************************* - TEST(test_from_char32_t_string) + TEST(test_from_string_with_char32_t) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -365,6 +457,54 @@ namespace } } + //************************************************************************* + TEST(test_from_string_with_char_nullptr) + { + const char* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_value_u8_min) { diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 67f703a3..95da4aad 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -925,6 +925,51 @@ namespace } } + //************************************************************************* + TEST(test_construct_from_nullptr_char_string) + { + const char* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_wchar_t_string) + { + const wchar_t* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + + //************************************************************************* + TEST(test_construct_from_nullptr_char16_t_string) + { + const char16_t* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char32_t_string) + { + const char32_t* s = nullptr; + + etl::bitset<60> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_construct_from_excess_string) { @@ -965,7 +1010,7 @@ namespace } //************************************************************************* - TEST(test_char_string_set) + TEST(test_set_with_char_string) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -985,7 +1030,7 @@ namespace } //************************************************************************* - TEST(test_wchar_t_string_set) + TEST(test_set_with_wchar_t_string) { std::bitset<60> compare(L"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -1005,7 +1050,7 @@ namespace } //************************************************************************* - TEST(test_char16_t_string_set) + TEST(test_set_with_char16_t_string) { std::bitset<60> compare(u"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -1025,7 +1070,7 @@ namespace } //************************************************************************* - TEST(test_char32_t_string_set) + TEST(test_set_with_char32_t_string) { std::bitset<60> compare(U"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -1045,7 +1090,55 @@ namespace } //************************************************************************* - TEST(test_from_char_string) + TEST(test_set_from_char_nullptr) + { + const char* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset<60> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -1065,7 +1158,7 @@ namespace } //************************************************************************* - TEST(test_from_wchar_t_string) + TEST(test_from_string_with_wchar_t) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -1105,7 +1198,7 @@ namespace } //************************************************************************* - TEST(test_from_char32_t_string) + TEST(test_from_string_with_char32_t) { std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<60> data; @@ -1124,6 +1217,54 @@ namespace } } + //************************************************************************* + TEST(test_from_string_with_char_nullptr) + { + const char* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset<60> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_value_u16_min) { diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index b9c0c84b..78de4ef3 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -255,6 +255,50 @@ namespace } } + //************************************************************************* + TEST(test_construct_from_nullptr_char_string) + { + const char* s = nullptr; + + etl::bitset<60, int64_t> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_wchar_t_string) + { + const wchar_t* s = nullptr; + + etl::bitset<60, int64_t> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char16_t_string) + { + const char16_t* s = nullptr; + + etl::bitset<60, int64_t> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char32_t_string) + { + const char32_t* s = nullptr; + + etl::bitset<60, int64_t> data(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_construct_from_excess_string) { @@ -310,7 +354,7 @@ namespace } //************************************************************************* - TEST(test_char_string_set) + TEST(test_set_with_char_string) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, int64_t> data; @@ -330,7 +374,7 @@ namespace } //************************************************************************* - TEST(test_wchar_t_string_set) + TEST(test_set_with_wchar_t_string) { std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, int64_t> data; @@ -350,7 +394,7 @@ namespace } //************************************************************************* - TEST(test_char16_t_string_set) + TEST(test_set_with_char16_t_string) { std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, int64_t> data; @@ -370,7 +414,7 @@ namespace } //************************************************************************* - TEST(test_char32_t_string_set) + TEST(test_set_with_char32_t_string) { std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, int64_t> data; @@ -390,7 +434,55 @@ namespace } //************************************************************************* - TEST(test_from_char_string) + TEST(test_set_from_char_nullptr) + { + const char* s = nullptr; + + etl::bitset<60, int64_t> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset<60, int64_t> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset<60, int64_t> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset<60, int64_t> data; + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, int64_t> data; @@ -410,7 +502,7 @@ namespace } //************************************************************************* - TEST(test_from_wchar_t_string) + TEST(test_from_string_with_wchar_t) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, int64_t> data; @@ -450,7 +542,7 @@ namespace } //************************************************************************* - TEST(test_from_char32_t_string) + TEST(test_from_string_with_char32_t) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, int64_t> data; @@ -469,6 +561,54 @@ namespace } } + //************************************************************************* + TEST(test_from_string_with_char_nullptr) + { + const char* s = nullptr; + + etl::bitset<60, int64_t> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset<60, int64_t> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset<60, int64_t> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset<60, int64_t> data; + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_value_u8_min) { diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index aeeea766..8eb3cbb6 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -767,6 +767,23 @@ namespace CHECK_EQUAL(1U, (etl::bitset_ext<64, int64_t>::Number_Of_Elements)); } + //************************************************************************* + TEST(test_construct_from_nullptr_buffer) + { + using BsExt = etl::bitset_ext<64>; + + BsExt::buffer_type buffer; + BsExt bs2a(buffer); + + CHECK_THROW(BsExt bs1(nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs2b(bs2a, nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs3(0ULL, nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs4("0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs5(L"0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs6(u"0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs7(U"0", nullptr), etl::bitset_invalid_buffer); + } + //************************************************************************* TEST(test_construct_from_value) { @@ -888,6 +905,58 @@ namespace } } + //************************************************************************* + TEST(test_construct_from_nullptr_char_string) + { + etl::bitset_ext<60>::buffer_type buffer; + + const char* s = nullptr; + + etl::bitset_ext<60> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_wchar_t_string) + { + etl::bitset_ext<60>::buffer_type buffer; + + const wchar_t* s = nullptr; + + etl::bitset_ext<60> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char16_t_string) + { + etl::bitset_ext<60>::buffer_type buffer; + + const char16_t* s = nullptr; + + etl::bitset_ext<60> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char32_t_string) + { + etl::bitset_ext<60>::buffer_type buffer; + + const char32_t* s = nullptr; + + etl::bitset_ext<60> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_construct_from_excess_string) { @@ -932,7 +1001,7 @@ namespace } //************************************************************************* - TEST(test_char_string_set) + TEST(test_set_with_char_string) { etl::bitset_ext<60>::buffer_type buffer; @@ -954,7 +1023,7 @@ namespace } //************************************************************************* - TEST(test_wchar_t_string_set) + TEST(test_set_with_wchar_t_string) { etl::bitset_ext<60>::buffer_type buffer; @@ -976,7 +1045,7 @@ namespace } //************************************************************************* - TEST(test_char16_t_string_set) + TEST(test_set_with_char16_t_string) { etl::bitset_ext<60>::buffer_type buffer; @@ -998,7 +1067,7 @@ namespace } //************************************************************************* - TEST(test_char32_t_string_set) + TEST(test_set_with_char32_t_string) { etl::bitset_ext<60>::buffer_type buffer; @@ -1020,7 +1089,59 @@ namespace } //************************************************************************* - TEST(test_from_char_string) + TEST(test_set_from_char_nullptr) + { + const char* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.set(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char) { etl::bitset_ext<60>::buffer_type buffer; @@ -1042,7 +1163,7 @@ namespace } //************************************************************************* - TEST(test_from_wchar_t_string) + TEST(test_from_string_with_wchar_t) { etl::bitset_ext<60>::buffer_type buffer; @@ -1086,7 +1207,7 @@ namespace } //************************************************************************* - TEST(test_from_char32_t_string) + TEST(test_from_string_with_char32_t) { etl::bitset_ext<60>::buffer_type buffer; @@ -1107,6 +1228,58 @@ namespace } } + //************************************************************************* + TEST(test_from_string_with_char_nullptr) + { + const char* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char32_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<60> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_value_u16_min) { 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 b7bc74ef..0eaf1d19 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -44,6 +44,23 @@ namespace SUITE(test_bitset_new_ext_explicit_element_type) { + //************************************************************************* + TEST(test_construct_from_nullptr_buffer) + { + using BsExt = etl::bitset_ext<64, int64_t>; + + BsExt::buffer_type buffer; + BsExt bs2a(buffer); + + CHECK_THROW(BsExt bs1(nullptr) , etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs2b(bs2a, nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs3(0ULL, nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs4("0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs5(L"0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs6(u"0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs7(U"0", nullptr), etl::bitset_invalid_buffer); + } + //************************************************************************* TEST(test_default_constructor_from_array) { @@ -210,6 +227,54 @@ namespace } } + //************************************************************************* + TEST(test_construct_from_nullptr_char_string) + { + const char* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_wchar_t_string) + { + const wchar_t* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char16_t_string) + { + const char16_t* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_construct_from_nullptr_char32_t_string) + { + const char32_t* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(s, buffer); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_construct_from_excess_string) { @@ -260,7 +325,7 @@ namespace } //************************************************************************* - TEST(test_char_string_set) + TEST(test_set_with_char_string) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); @@ -281,7 +346,7 @@ namespace } //************************************************************************* - TEST(test_wchar_t_string_set) + TEST(test_set_with_wchar_t_string) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); @@ -302,7 +367,7 @@ namespace } //************************************************************************* - TEST(test_char16_t_string_set) + TEST(test_set_with_char16_t_string) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); @@ -323,7 +388,7 @@ namespace } //************************************************************************* - TEST(test_char32_t_string_set) + TEST(test_set_with_char32_t_string) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); @@ -344,7 +409,59 @@ namespace } //************************************************************************* - TEST(test_from_char_string) + TEST(test_set_from_char_nullptr) + { + const char* s = nullptr; + + etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, int64_t> data(buffer); + data.set(s); + + CHECK_EQUAL(64, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, int64_t> data(buffer); + data.set(s); + + CHECK_EQUAL(64, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, int64_t> data(buffer); + data.set(s); + + CHECK_EQUAL(64, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_set_from_char32_t_nullptr) + { + const char32_t* s = nullptr; + + etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, int64_t> data(buffer); + data.set(s); + + CHECK_EQUAL(64, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); @@ -365,7 +482,7 @@ namespace } //************************************************************************* - TEST(test_from_wchar_t_string) + TEST(test_from_string_with_wchar_t) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); @@ -386,7 +503,7 @@ namespace } //************************************************************************* - TEST(test_from_char16_t_6string) + TEST(test_from_string_with_char16_t) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); @@ -407,7 +524,7 @@ namespace } //************************************************************************* - TEST(test_from_char32_t_string) + TEST(test_from_string_with_char32_t) { etl::bitset_ext<64, int64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); @@ -427,6 +544,58 @@ namespace } } + //************************************************************************* + TEST(test_from_string_with_char_nullptr) + { + const char* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_wchar_t_nullptr) + { + const wchar_t* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char16_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + + //************************************************************************* + TEST(test_from_string_with_char32_t_nullptr) + { + const char16_t* s = nullptr; + + etl::bitset_ext<60, int64_t>::buffer_type buffer; + etl::bitset_ext<60, int64_t> data(buffer); + data.from_string(s); + + CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(0, data.count()); + } + //************************************************************************* TEST(test_value_u8_min) { From 7bb125a360cee571a9502e1c5ec54d1f20741dec Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sun, 17 Dec 2023 12:54:01 +0000 Subject: [PATCH 012/131] Added etl::generate algorithm --- include/etl/algorithm.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index cc989d15..dd01415a 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -169,6 +169,18 @@ namespace etl return first2; } + //*************************************************************************** + // generate + template + ETL_CONSTEXPR14 + void generate(TIterator db, TIterator de, TFunction funct) + { + while (db != de) + { + *db++ = funct(); + } + } + //*************************************************************************** // copy #if ETL_USING_STL && ETL_USING_CPP20 From 480363a4e77ffc13258ddbb7686e357937c75cb2 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 18 Dec 2023 10:52:40 +0000 Subject: [PATCH 013/131] Added etl::generate algorithm --- test/test_algorithm.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/test_algorithm.cpp b/test/test_algorithm.cpp index a49e0011..aef1fcfd 100644 --- a/test/test_algorithm.cpp +++ b/test/test_algorithm.cpp @@ -2198,5 +2198,31 @@ namespace bool is_same = std::equal(expected.begin(), expected.end(), data.begin()); CHECK(is_same); } + + //************************************************************************* + struct generator + { + generator(int value_) + : value(value_) + { + } + + int operator()() + { + return value++; + } + + int value; + }; + + TEST(generate) + { + std::array expected = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + std::array actual; + + etl::generate(actual.begin(), actual.end(), generator(2)); + + CHECK_ARRAY_EQUAL(expected.data(), actual.data(), expected.size()); + } }; } From d17f422dac2a46600702d1eeb232df945dbe2c31 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 18 Dec 2023 11:02:54 +0000 Subject: [PATCH 014/131] Added binary functors for ~ & | ^ --- include/etl/binary.h | 105 ++++++++++++++++++++++++++++++++++++++++++ test/test_binary.cpp | 106 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 211 insertions(+) diff --git a/include/etl/binary.h b/include/etl/binary.h index f6388562..df1569d7 100644 --- a/include/etl/binary.h +++ b/include/etl/binary.h @@ -2276,6 +2276,111 @@ namespace etl return msb_mask::value; } + //*************************************************************************** + /// Bit 'not' a value + ///\ingroup binary + //*************************************************************************** + template + struct binary_not : public etl::unary_function + { + //*********************************** + ETL_CONSTEXPR + ETL_NODISCARD + T operator ()(T value) ETL_NOEXCEPT + { + ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); + + return ~value; + } + }; + + //*************************************************************************** + /// Bit 'and' a value with another + ///\ingroup binary + //*************************************************************************** + template + struct binary_and : public etl::unary_function + { + //*********************************** + ETL_CONSTEXPR + explicit binary_and(T parameter_) ETL_NOEXCEPT + : parameter(parameter_) + { + } + + //*********************************** + ETL_CONSTEXPR + ETL_NODISCARD + T operator ()(T value) ETL_NOEXCEPT + { + ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); + + return value & parameter; + } + + private: + + T parameter; + }; + + //*************************************************************************** + /// Bit 'or' a value with another + ///\ingroup binary + //*************************************************************************** + template + struct binary_or : public etl::unary_function + { + //*********************************** + ETL_CONSTEXPR + explicit binary_or(T parameter_) ETL_NOEXCEPT + : parameter(parameter_) + { + } + + //*********************************** + ETL_CONSTEXPR + ETL_NODISCARD + T operator ()(T value) ETL_NOEXCEPT + { + ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); + + return value | parameter; + } + + private: + + T parameter; + }; + + //*************************************************************************** + /// Bit 'exclusive-or' a value with another + ///\ingroup binary + //*************************************************************************** + template + struct binary_xor : public etl::unary_function + { + //*********************************** + ETL_CONSTEXPR + explicit binary_xor(T parameter_) ETL_NOEXCEPT + : parameter(parameter_) + { + } + + //*********************************** + ETL_CONSTEXPR + ETL_NODISCARD + T operator ()(T value) ETL_NOEXCEPT + { + ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); + + return value ^ parameter; + } + + private: + + T parameter; + }; + //*************************************************************************** /// 8 bit binary byte constants. ///\ingroup binary diff --git a/test/test_binary.cpp b/test/test_binary.cpp index 56e5157d..3e93bbb7 100644 --- a/test/test_binary.cpp +++ b/test/test_binary.cpp @@ -31,6 +31,8 @@ SOFTWARE. #include #include #include +#include +#include #include "etl/binary.h" #include "etl/bitset.h" @@ -42,6 +44,15 @@ SOFTWARE. namespace { + template + void generate_input(TIterator first, TIterator last, T value) + { + while (first != last) + { + *first++ = value++; + } + } + //*********************************** // Count bits the easy way. template @@ -2894,6 +2905,101 @@ namespace CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFF00), (etl::make_msb_mask())); CHECK_EQUAL(int64_t(0xFFFFFFFFFFFFFFFF), (etl::make_msb_mask())); } + + //************************************************************************* + TEST(test_binary_not) + { + std::array input; + generate_input(input.begin(), input.end(), 0); + + std::array expected; + for (size_t i = 0; i < input.size(); ++i) + { + expected[i] = ~input[i]; + } + + std::array output; + + std::transform(input.begin(), + input.end(), + output.begin(), + etl::binary_not()); + + CHECK_ARRAY_EQUAL(expected.data(), output.data(), expected.size()); + } + + //************************************************************************* + TEST(test_binary_and) + { + std::array input; + generate_input(input.begin(), input.end(), 0); + + const uint8_t value = etl::b01101001; + + std::array expected; + for (size_t i = 0; i < input.size(); ++i) + { + expected[i] = input[i] & value; + } + + std::array output; + + std::transform(input.begin(), + input.end(), + output.begin(), + etl::binary_and(value)); + + CHECK_ARRAY_EQUAL(expected.data(), output.data(), expected.size()); + } + + //************************************************************************* + TEST(test_binary_or) + { + std::array input; + generate_input(input.begin(), input.end(), 0); + + const uint8_t value = etl::b01101001; + + std::array expected; + for (size_t i = 0; i < input.size(); ++i) + { + expected[i] = input[i] | value; + } + + std::array output; + + std::transform(input.begin(), + input.end(), + output.begin(), + etl::binary_or(value)); + + CHECK_ARRAY_EQUAL(expected.data(), output.data(), expected.size()); + } + + //************************************************************************* + TEST(test_binary_xor) + { + std::array input; + generate_input(input.begin(), input.end(), 0); + + const uint8_t value = etl::b01101001; + + std::array expected; + + for (size_t i = 0; i < input.size(); ++i) + { + expected[i] = input[i] ^ value; + } + + std::array output; + + std::transform(input.begin(), + input.end(), + output.begin(), + etl::binary_xor(value)); + + CHECK_ARRAY_EQUAL(expected.data(), output.data(), expected.size()); + } }; } From c75617c2b62e7c235ec8cee760c5904925b22525 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 18 Dec 2023 11:07:42 +0000 Subject: [PATCH 015/131] #805 legacy etl::bitset set/reset does not work if the element type is greater than 8 bit --- include/etl/private/bitset_legacy.h | 18 ++++++++--------- include/etl/private/bitset_new.h | 8 ++++---- test/vs2022/etl.vcxproj.filters | 30 +++++++++++++++++++++++------ 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/include/etl/private/bitset_legacy.h b/include/etl/private/bitset_legacy.h index 30c152ae..2a37a6a3 100644 --- a/include/etl/private/bitset_legacy.h +++ b/include/etl/private/bitset_legacy.h @@ -151,10 +151,10 @@ namespace etl typedef typename etl::make_unsigned::type element_type; typedef element_type element_t; // Backward compatibility - static ETL_CONSTANT element_type ALL_SET = etl::integral_limits::max; + static ETL_CONSTANT element_type ALL_SET = etl::integral_limits::max; static ETL_CONSTANT element_type ALL_CLEAR = 0; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; + static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; #if ETL_USING_CPP11 typedef etl::span span_type; @@ -311,7 +311,7 @@ namespace etl //************************************************************************* ibitset& set() { - ::memset(pdata, 0xFF, Number_Of_Elements); + etl::fill_n(pdata, Number_Of_Elements - 1U, ALL_SET); pdata[Number_Of_Elements - 1U] = Top_Mask; return *this; @@ -519,7 +519,7 @@ namespace etl return v; } - //************************************************************************* + //************************************************************************* /// Put to a unsigned long. //************************************************************************* unsigned long to_ulong() const @@ -540,7 +540,7 @@ namespace etl //************************************************************************* ibitset& reset() { - ::memset(pdata, 0, Number_Of_Elements * sizeof(element_type)); + etl::fill_n(pdata, Number_Of_Elements, ALL_CLEAR); return *this; } @@ -582,10 +582,10 @@ namespace etl //************************************************************************* ibitset& flip() { - for (size_t i = 0UL; i < Number_Of_Elements; ++i) - { - pdata[i] = ~pdata[i]; - } + etl::transform_n(pdata, + Number_Of_Elements, + pdata, + etl::binary_not()); clear_unused_bits_in_msb(); diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 28497238..2887c97d 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -440,10 +440,10 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 void flip(pointer pbuffer, size_t number_of_elements) ETL_NOEXCEPT { - for (size_t i = 0UL; i < number_of_elements; ++i) - { - pbuffer[i] = ~pbuffer[i]; - } + etl::transform_n(pbuffer, + number_of_elements, + pbuffer, + etl::binary_not()); } //************************************************************************* diff --git a/test/vs2022/etl.vcxproj.filters b/test/vs2022/etl.vcxproj.filters index 2adfa862..5c457a21 100644 --- a/test/vs2022/etl.vcxproj.filters +++ b/test/vs2022/etl.vcxproj.filters @@ -3340,12 +3340,6 @@ Resource Files\CI\Appveyor - - Resource Files\CI\Github - - - Resource Files\CI\Github - Resource Files @@ -3412,6 +3406,30 @@ Tests\Scripts + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + From d3b3fdbd40ac3ce849357a045ba39c16aca0f829 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 18 Dec 2023 11:28:12 +0000 Subject: [PATCH 016/131] Fixed 'nodiscard' keyword errors --- include/etl/binary.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/etl/binary.h b/include/etl/binary.h index df1569d7..37e6b00f 100644 --- a/include/etl/binary.h +++ b/include/etl/binary.h @@ -2284,8 +2284,8 @@ namespace etl struct binary_not : public etl::unary_function { //*********************************** - ETL_CONSTEXPR ETL_NODISCARD + ETL_CONSTEXPR T operator ()(T value) ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); @@ -2309,8 +2309,8 @@ namespace etl } //*********************************** - ETL_CONSTEXPR ETL_NODISCARD + ETL_CONSTEXPR T operator ()(T value) ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); @@ -2338,8 +2338,8 @@ namespace etl } //*********************************** - ETL_CONSTEXPR ETL_NODISCARD + ETL_CONSTEXPR T operator ()(T value) ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); @@ -2367,8 +2367,8 @@ namespace etl } //*********************************** - ETL_CONSTEXPR ETL_NODISCARD + ETL_CONSTEXPR T operator ()(T value) ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); From 6d941298ea5a412aff43a85e76f152979db6aa1f Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 29 Nov 2023 18:21:47 +0000 Subject: [PATCH 017/131] Improved display of CHECK_EQUAL_HEX in unittest++ --- test/UnitTest++/Checks.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/UnitTest++/Checks.h b/test/UnitTest++/Checks.h index a2571e02..88f1a1c3 100644 --- a/test/UnitTest++/Checks.h +++ b/test/UnitTest++/Checks.h @@ -190,7 +190,9 @@ namespace UnitTest if (!(expected == actual)) { UnitTest::MemoryOutStream stream; - stream << std::hex << std::uppercase << std::setfill('0') << "Expected 0x" << std::setw(2 * sizeof(Expected)) << expected << " but was 0x" << std::setw(2 * sizeof(Actual)) << actual; + stream << std::hex << std::uppercase << std::setfill('0') + << "Expected 0x" << std::setw(2 * sizeof(Expected)) << (expected & ~(typename std::make_unsigned::type(0))) + << " but was 0x" << std::setw(2 * sizeof(Actual)) << (actual & ~(typename std::make_unsigned::type(0))); results.OnTestFailure(details, stream.GetText()); } @@ -214,7 +216,8 @@ namespace UnitTest if (expected == actual) { UnitTest::MemoryOutStream stream; - stream << std::hex << std::uppercase << std::setfill('0') << std::setw(2 * sizeof(Actual)) << "Expected not equal, but both values are " << actual; + stream << std::hex << std::uppercase << std::setfill('0') << std::setw(2 * sizeof(Actual)) + << "Expected not equal, but both values are " << (actual & ~(typename std::make_unsigned::type(0))); results.OnTestFailure(details, stream.GetText()); } From a5b425f03e310c98905dc500eaaf1d43ada15d47 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 29 Nov 2023 18:22:34 +0000 Subject: [PATCH 018/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 307 +++++++++++++++++- test/test_bitset_new_default_element_type.cpp | 70 ++++ ...itset_new_explicit_single_element_type.cpp | 69 ++++ ...st_bitset_new_ext_default_element_type.cpp | 74 +++++ ...t_new_ext_explicit_single_element_type.cpp | 74 +++++ test/vs2022/etl.vcxproj | 22 +- 6 files changed, 588 insertions(+), 28 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 2887c97d..530f5c6a 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -206,7 +206,7 @@ namespace etl size_t index = 0; element_type bit = 0; - if (number_of_elements == 0) + if (number_of_elements == 0) ETL_UNLIKELY { return; } @@ -243,12 +243,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -273,12 +273,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -303,12 +303,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -333,12 +333,12 @@ namespace etl else { size_t string_length = etl::strlen(text); - size_t element_index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); + size_t index = etl::min(number_of_elements - 1U, (string_length / Bits_Per_Element)); // Only reset elements we need to. - while (element_index != number_of_elements) + while (index != number_of_elements) { - pbuffer[element_index++] = All_Clear_Element; + pbuffer[index++] = All_Clear_Element; } // Build from the string. @@ -409,6 +409,141 @@ namespace etl return v; } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_single_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + const unsigned_t value_mask = etl::integral_limits::max; + const int element_index = (position + length - 1) >> etl::log2::value; + const unsigned_t Shift = position % Bits_Per_Element; + + value = static_cast(pbuffer[element_index] >> Shift) & value_mask; + + return static_cast(value); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_multi_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + // The mask for the value type. + const unsigned_t value_mask = etl::integral_limits::max; + + // Find the index of the element containing the msb. + int element_index = (position + length - 1) >> etl::log2::value; + + // The value is spread over multiple elements. + element_type bit_mask = element_type(1) << ((position + length - 1) % Bits_Per_Element); + + while (length != 0) + { + // TODO Optimise this to read whole element values. + + value <<= 1; + + const bool is_set = (pbuffer[element_index] & bit_mask) != 0; + + if (is_set) + { + value |= unsigned_t(1); + } + + bit_mask >>= 1; + + if (bit_mask == 0) + { + bit_mask = element_type(1) << (Bits_Per_Element - 1); + --element_index; + } + + --length; + } + + return static_cast(value); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_single_element(const_pointer pbuffer) const + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + const unsigned_t value_mask = etl::integral_limits::max; + const int element_index = (Position + Length - 1) >> etl::log2::value; + const unsigned_t Shift = Position % Bits_Per_Element; + + value = static_cast(pbuffer[element_index] >> Shift) & value_mask; + + return static_cast(value); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + T extract_from_multi_element(const_pointer pbuffer) const + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + // The mask for the value type. + const unsigned_t value_mask = etl::integral_limits::max; + + // Find the index of the element containing the msb. + int element_index = (Position + Length - 1) >> etl::log2::value; + + // The value is spread over multiple elements. + size_t length = Length; + element_type bit_mask = element_type(1) << ((Position + Length - 1) % Bits_Per_Element); + + while (length != 0) + { + // TODO Optimise this to read whole element values. + + value <<= 1; + + const bool is_set = (pbuffer[element_index] & bit_mask) != 0; + + if (is_set) + { + value |= unsigned_t(1); + } + + bit_mask >>= 1; + + if (bit_mask == 0) + { + bit_mask = element_type(1) << (Bits_Per_Element - 1); + --element_index; + } + + --length; + } + + return static_cast(value); + } + //************************************************************************* /// Reset the bit at the position. //************************************************************************* @@ -417,7 +552,7 @@ namespace etl size_t index = 0U; element_type bit = element_type(0); - if (number_of_elements == 0) + if (number_of_elements == 0) ETL_UNLIKELY { return; } @@ -454,7 +589,7 @@ namespace etl size_t index = 0U; element_type bit = element_type(0); - if (number_of_elements == 0) + if (number_of_elements == 0) ETL_UNLIKELY { return; } @@ -1265,7 +1400,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -1283,6 +1418,40 @@ namespace etl return v; } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + element_type mask = (~(~0u << length) << position); + T value((buffer & mask) >> position); + + return value; + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + element_type mask = (~(~0u << Length) << Position); + T value((buffer & mask) >> Position); + + return value; + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* @@ -2041,6 +2210,42 @@ namespace etl return ibitset.template value(buffer, Number_Of_Elements); } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + return ibitset.extract_from_multi_element(buffer, position, length); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); + + // Is the value contained within one element? + if (active_bits_in_element == Length) + { + return ibitset.extract_from_single_element(buffer); + } + else + { + return ibitset.extract_from_multi_element(buffer); + } + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* @@ -3002,6 +3207,38 @@ namespace etl return v; } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + element_type mask = (~(~0u << length) << position); + T v((*pbuffer & mask) >> position); + + return v; + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + element_type mask = (~(~0u << Length) << Position); + T v((*pbuffer & mask) >> Position); + + return v; + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* @@ -3762,7 +3999,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -3771,6 +4008,42 @@ namespace etl return ibitset.template value(pbuffer, Number_Of_Elements); } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract(size_t position, size_t length = etl::integral_limits::bits) const + { + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + + return ibitset.extract_from_multi_element(pbuffer, position, length); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + typename etl::enable_if::value, T>::type + extract() const ETL_NOEXCEPT + { + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + + const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); + + // Is the value contained within one element? + if (active_bits_in_element == Length) + { + return ibitset.extract_from_single_element(pbuffer); + } + else + { + return ibitset.extract_from_multi_element(pbuffer); + } + } + //************************************************************************* /// Get as an unsigned long. //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 95da4aad..af437e94 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2237,5 +2237,75 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + + // The lines below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 78de4ef3..3b4c91dd 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -1725,5 +1725,74 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL(0x78, b.extract(0, 8)); + CHECK_EQUAL(0x3C, b.extract(1, 8)); + CHECK_EQUAL(0x9E, b.extract(2, 8)); + CHECK_EQUAL(0xCF, b.extract(3, 8)); + CHECK_EQUAL(0x67, b.extract(4, 8)); + CHECK_EQUAL(0xB3, b.extract(5, 8)); + CHECK_EQUAL(0x59, b.extract(6, 8)); + CHECK_EQUAL(0xAC, b.extract(7, 8)); + CHECK_EQUAL(0x56, b.extract(8, 8)); + CHECK_EQUAL(0x2B, b.extract(9, 8)); + CHECK_EQUAL(0x15, b.extract(10, 8)); + CHECK_EQUAL(0x8A, b.extract(11, 8)); + CHECK_EQUAL(0x45, b.extract(12, 8)); + CHECK_EQUAL(0xA2, b.extract(13, 8)); + CHECK_EQUAL(0xD1, b.extract(14, 8)); + CHECK_EQUAL(0x68, b.extract(15, 8)); + CHECK_EQUAL(0x34, b.extract(16, 8)); + CHECK_EQUAL(0x1A, b.extract(17, 8)); + CHECK_EQUAL(0x8D, b.extract(18, 8)); + CHECK_EQUAL(0x46, b.extract(19, 8)); + CHECK_EQUAL(0x23, b.extract(20, 8)); + CHECK_EQUAL(0x91, b.extract(21, 8)); + CHECK_EQUAL(0x48, b.extract(22, 8)); + CHECK_EQUAL(0x24, b.extract(23, 8)); + CHECK_EQUAL(0x12, b.extract(24, 8)); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL(0x78, (b.extract())); + CHECK_EQUAL(0x3C, (b.extract())); + CHECK_EQUAL(0x9E, (b.extract())); + CHECK_EQUAL(0xCF, (b.extract())); + CHECK_EQUAL(0x67, (b.extract())); + CHECK_EQUAL(0xB3, (b.extract())); + CHECK_EQUAL(0x59, (b.extract())); + CHECK_EQUAL(0xAC, (b.extract())); + CHECK_EQUAL(0x56, (b.extract())); + CHECK_EQUAL(0x2B, (b.extract())); + CHECK_EQUAL(0x15, (b.extract())); + CHECK_EQUAL(0x8A, (b.extract())); + CHECK_EQUAL(0x45, (b.extract())); + CHECK_EQUAL(0xA2, (b.extract())); + CHECK_EQUAL(0xD1, (b.extract())); + CHECK_EQUAL(0x68, (b.extract())); + CHECK_EQUAL(0x34, (b.extract())); + CHECK_EQUAL(0x1A, (b.extract())); + CHECK_EQUAL(0x8D, (b.extract())); + CHECK_EQUAL(0x46, (b.extract())); + CHECK_EQUAL(0x23, (b.extract())); + CHECK_EQUAL(0x91, (b.extract())); + CHECK_EQUAL(0x48, (b.extract())); + CHECK_EQUAL(0x24, (b.extract())); + CHECK_EQUAL(0x12, (b.extract())); + + // The lines below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index 8eb3cbb6..8bd56537 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -2130,5 +2130,79 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + + // The line below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } 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 0eaf1d19..07889e64 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -1478,5 +1478,79 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(text.c_str())); CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + + //************************************************************************* + TEST(test_extract_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, int32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + } + + //************************************************************************* + TEST(test_extract_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, int32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + + // The line below should static assert. + //uint8_t v = b.extract(); + //uint8_t v = b.extract(); + } }; } diff --git a/test/vs2022/etl.vcxproj b/test/vs2022/etl.vcxproj index 4c18142c..473d635c 100644 --- a/test/vs2022/etl.vcxproj +++ b/test/vs2022/etl.vcxproj @@ -839,17 +839,17 @@ $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ @@ -859,37 +859,37 @@ $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ - false + true true $(Configuration)\ @@ -935,7 +935,7 @@ $(Configuration)\ - false + true true $(Configuration)\ From 2c8aafedcdbfa0c85e3fbd98a86f506df6fdcb1d Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 1 Dec 2023 17:21:48 +0000 Subject: [PATCH 019/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 186 +++++----- test/test_bitset_new_default_element_type.cpp | 326 +++++++++++++++++- ...itset_new_explicit_single_element_type.cpp | 4 +- ...st_bitset_new_ext_default_element_type.cpp | 4 +- ...t_new_ext_explicit_single_element_type.cpp | 4 +- 5 files changed, 412 insertions(+), 112 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 530f5c6a..ce1688cd 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -159,6 +159,12 @@ namespace etl static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + template + struct value_is_in_one_element + { + static ETL_CONSTANT bool value = ((Position + Length - 1) >> etl::log2::value) == (Position >> etl::log2::value); + }; + //************************************************************************* /// Count the number of bits set. //************************************************************************* @@ -414,63 +420,56 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_single_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + T extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT { typedef typename etl::make_unsigned::type unsigned_t; unsigned_t value(0); - const unsigned_t value_mask = etl::integral_limits::max; - const int element_index = (position + length - 1) >> etl::log2::value; - const unsigned_t Shift = position % Bits_Per_Element; + const int Msb_Element_Index = (position + length - 1) >> etl::log2::value; + const int Lsb_Element_Index = position >> etl::log2::value; - value = static_cast(pbuffer[element_index] >> Shift) & value_mask; - - return static_cast(value); - } - - //************************************************************************* - /// Extract an integral value from an arbitary position and length. - //************************************************************************* - template - ETL_CONSTEXPR14 - T extract_from_multi_element(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT - { - typedef typename etl::make_unsigned::type unsigned_t; - - unsigned_t value(0); - - // The mask for the value type. - const unsigned_t value_mask = etl::integral_limits::max; - - // Find the index of the element containing the msb. - int element_index = (position + length - 1) >> etl::log2::value; - - // The value is spread over multiple elements. - element_type bit_mask = element_type(1) << ((position + length - 1) % Bits_Per_Element); - - while (length != 0) + // Is the value contained within one element? + if (Msb_Element_Index == Lsb_Element_Index) { - // TODO Optimise this to read whole element values. + const unsigned_t Mask = ~(~0 << length); + const unsigned_t Shift = position % Bits_Per_Element; - value <<= 1; + value = static_cast(pbuffer[Msb_Element_Index] >> Shift) & Mask; + } + else + { + // Get the number of active bits in the msb element + size_t active_bits_in_msb = (position + length) - (Msb_Element_Index * Bits_Per_Element); - const bool is_set = (pbuffer[element_index] & bit_mask) != 0; + // Extract the first element if partially filled. + // Start with index of the element containing the msb. + int element_index = Msb_Element_Index; - if (is_set) + if (active_bits_in_msb < Bits_Per_Element) { - value |= unsigned_t(1); - } - - bit_mask >>= 1; - - if (bit_mask == 0) - { - bit_mask = element_type(1) << (Bits_Per_Element - 1); + element_type mask = ~(~element_type(0) << active_bits_in_msb); + value |= pbuffer[element_index] & mask; + length -= active_bits_in_msb; --element_index; } - --length; + // Loop through the fully filled elements + while (length >= Bits_Per_Element) + { + value <<= Bits_Per_Element; + value |= pbuffer[element_index]; + length -= Bits_Per_Element; + --element_index; + } + + // Check if the last element is partially filled and extract. + if (length != 0) + { + value <<= length; + element_type mask = ~(~element_type(0) << length); + value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; + } } return static_cast(value); @@ -481,17 +480,16 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_single_element(const_pointer pbuffer) const + typename etl::enable_if::value, T>::type + extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; - unsigned_t value(0); - - const unsigned_t value_mask = etl::integral_limits::max; - const int element_index = (Position + Length - 1) >> etl::log2::value; + const int Element_Index = (Position + Length - 1) >> etl::log2::value; + const unsigned_t Mask = ~(~0 << Length); const unsigned_t Shift = Position % Bits_Per_Element; - - value = static_cast(pbuffer[element_index] >> Shift) & value_mask; + + unsigned_t value = static_cast(pbuffer[Element_Index] >> Shift) & Mask; return static_cast(value); } @@ -501,44 +499,48 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_multi_element(const_pointer pbuffer) const + typename etl::enable_if::value, T>::type + extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; unsigned_t value(0); - // The mask for the value type. - const unsigned_t value_mask = etl::integral_limits::max; + const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; - // Find the index of the element containing the msb. - int element_index = (Position + Length - 1) >> etl::log2::value; + // Start with index of the element containing the msb. + int element_index = Msb_Element_Index; // The value is spread over multiple elements. - size_t length = Length; - element_type bit_mask = element_type(1) << ((Position + Length - 1) % Bits_Per_Element); + size_t length = Length; - while (length != 0) + // Get the number of active bits in the first element + size_t active_bits_in_element = ((Position + Length - 1) % Bits_Per_Element) + 1; + + // Extract the first element if partially filled. + if (active_bits_in_element < Bits_Per_Element) { - // TODO Optimise this to read whole element values. + element_type mask = ~(~element_type(0) << active_bits_in_element); + value |= pbuffer[element_index] & mask; + length -= active_bits_in_element; + --element_index; + } - value <<= 1; + // Loop through the fully filled elements + while (length >= Bits_Per_Element) + { + value <<= Bits_Per_Element; + value |= pbuffer[element_index]; + length -= Bits_Per_Element; + --element_index; + } - const bool is_set = (pbuffer[element_index] & bit_mask) != 0; - - if (is_set) - { - value |= unsigned_t(1); - } - - bit_mask >>= 1; - - if (bit_mask == 0) - { - bit_mask = element_type(1) << (Bits_Per_Element - 1); - --element_index; - } - - --length; + // Check if the last element is partially filled and extract. + if (length != 0) + { + value <<= length; + element_type mask = ~(~element_type(0) << length); + value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; } return static_cast(value); @@ -2201,7 +2203,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); @@ -2220,7 +2222,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_multi_element(buffer, position, length); + return ibitset.extract_from_buffer(buffer, position, length); } //************************************************************************* @@ -2228,22 +2230,12 @@ namespace etl //************************************************************************* template ::bits> ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, T>::type extract() const ETL_NOEXCEPT { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); - - // Is the value contained within one element? - if (active_bits_in_element == Length) - { - return ibitset.extract_from_single_element(buffer); - } - else - { - return ibitset.extract_from_multi_element(buffer); - } + return ibitset.extract_from_buffer(buffer); } //************************************************************************* @@ -4018,7 +4010,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_multi_element(pbuffer, position, length); + return ibitset.extract_from_buffer(pbuffer, position, length); } //************************************************************************* @@ -4031,17 +4023,7 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - const int active_bits_in_element = ((Position + Length) % Bits_Per_Element); - - // Is the value contained within one element? - if (active_bits_in_element == Length) - { - return ibitset.extract_from_single_element(pbuffer); - } - else - { - return ibitset.extract_from_multi_element(pbuffer); - } + return ibitset.extract_from_buffer(pbuffer); } //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index af437e94..b49f5c9a 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2239,7 +2239,82 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); @@ -2269,11 +2344,12 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); @@ -2304,8 +2380,250 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); // The lines below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract(0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract(1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract(2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract(3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract(4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract(5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract(6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract(7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract(8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract(9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 3b4c91dd..4ea4992e 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -1727,7 +1727,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); @@ -1760,7 +1760,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index 8bd56537..07025ff3 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -2132,7 +2132,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_uint8_t_with_run_time_parameters) { using bs32 = etl::bitset_ext<32>; @@ -2167,7 +2167,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { using bs32 = etl::bitset_ext<32>; 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 07889e64..af31e5b7 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -1480,7 +1480,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_run_time_parameters) + TEST(test_extract_uint8_t_with_run_time_parameters) { using bs32 = etl::bitset_ext<32, int32_t>; @@ -1515,7 +1515,7 @@ namespace } //************************************************************************* - TEST(test_extract_with_template_parameters) + TEST(test_extract_uint8_t_with_template_parameters) { using bs32 = etl::bitset_ext<32, int32_t>; From 236af6190a3060ed7aeb4c498a9a1124a2018ea8 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 2 Dec 2023 17:46:38 +0000 Subject: [PATCH 020/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 148 ++++++++++-------- test/test_bitset_new_default_element_type.cpp | 77 +++++++++ 2 files changed, 158 insertions(+), 67 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index ce1688cd..c3480ec7 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -415,12 +415,62 @@ namespace etl return v; } + //************************************************************************* + /// Extract an value from multiple elements. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::make_unsigned::type extract_from_multiple_elements(const element_type* pbuffer, + int element_index, + size_t active_bits_in_msb, + size_t length) const ETL_NOEXCEPT + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value(0); + + // Extract the first element, if partially filled. + if (active_bits_in_msb < Bits_Per_Element) + { + element_type mask = ~(~element_type(0) << active_bits_in_msb); + value = pbuffer[element_index] & mask; + length -= active_bits_in_msb; + if (length >= Bits_Per_Element) + { + value = value << Bits_Per_Element; + } + --element_index; + } + + // Loop through the fully filled elements + while (length >= Bits_Per_Element) + { + value |= pbuffer[element_index]; + length -= Bits_Per_Element; + if (length >= Bits_Per_Element) + { + value = value << Bits_Per_Element; + } + --element_index; + } + + // Extract the last element, if partially filled. + if (length != 0) + { + value = value << length; + element_type mask = ~(~element_type(0) << length); + value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; + } + + return value; + } + //************************************************************************* /// Extract an integral value from an arbitary position and length. //************************************************************************* template ETL_CONSTEXPR14 - T extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + typename etl::make_unsigned::type extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT { typedef typename etl::make_unsigned::type unsigned_t; @@ -442,37 +492,13 @@ namespace etl // Get the number of active bits in the msb element size_t active_bits_in_msb = (position + length) - (Msb_Element_Index * Bits_Per_Element); - // Extract the first element if partially filled. // Start with index of the element containing the msb. int element_index = Msb_Element_Index; - if (active_bits_in_msb < Bits_Per_Element) - { - element_type mask = ~(~element_type(0) << active_bits_in_msb); - value |= pbuffer[element_index] & mask; - length -= active_bits_in_msb; - --element_index; - } - - // Loop through the fully filled elements - while (length >= Bits_Per_Element) - { - value <<= Bits_Per_Element; - value |= pbuffer[element_index]; - length -= Bits_Per_Element; - --element_index; - } - - // Check if the last element is partially filled and extract. - if (length != 0) - { - value <<= length; - element_type mask = ~(~element_type(0) << length); - value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; - } + value = extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); } - return static_cast(value); + return value; } //************************************************************************* @@ -480,7 +506,7 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; @@ -489,9 +515,7 @@ namespace etl const unsigned_t Mask = ~(~0 << Length); const unsigned_t Shift = Position % Bits_Per_Element; - unsigned_t value = static_cast(pbuffer[Element_Index] >> Shift) & Mask; - - return static_cast(value); + return static_cast(pbuffer[Element_Index] >> Shift) & Mask; } //************************************************************************* @@ -499,13 +523,11 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type + typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const { typedef typename etl::make_unsigned::type unsigned_t; - - unsigned_t value(0); - + const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; // Start with index of the element containing the msb. @@ -515,35 +537,9 @@ namespace etl size_t length = Length; // Get the number of active bits in the first element - size_t active_bits_in_element = ((Position + Length - 1) % Bits_Per_Element) + 1; + size_t active_bits_in_msb = ((Position + Length - 1) % Bits_Per_Element) + 1; - // Extract the first element if partially filled. - if (active_bits_in_element < Bits_Per_Element) - { - element_type mask = ~(~element_type(0) << active_bits_in_element); - value |= pbuffer[element_index] & mask; - length -= active_bits_in_element; - --element_index; - } - - // Loop through the fully filled elements - while (length >= Bits_Per_Element) - { - value <<= Bits_Per_Element; - value |= pbuffer[element_index]; - length -= Bits_Per_Element; - --element_index; - } - - // Check if the last element is partially filled and extract. - if (length != 0) - { - value <<= length; - element_type mask = ~(~element_type(0) << length); - value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; - } - - return static_cast(value); + return extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); } //************************************************************************* @@ -2222,7 +2218,16 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_buffer(buffer, position, length); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(buffer, position, length);; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return value; } //************************************************************************* @@ -2235,7 +2240,16 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.extract_from_buffer(buffer); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(buffer); + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return value; } //************************************************************************* @@ -4010,7 +4024,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.extract_from_buffer(pbuffer, position, length); + return ibitset.template extract_from_buffer(pbuffer, position, length); } //************************************************************************* @@ -4023,7 +4037,7 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.extract_from_buffer(pbuffer); + return ibitset.template extract_from_buffer(pbuffer); } //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index b49f5c9a..19aede7b 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2313,6 +2313,83 @@ namespace //uint8_t v1 = b.extract(); } + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + auto v = b.extract(1, 6); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { From aa4b27b6e6dbc82a39873da14441dece610904d2 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Mon, 4 Dec 2023 08:37:59 +0000 Subject: [PATCH 021/131] Work in progress for etl::bitset::extract --- include/etl/private/bitset_new.h | 100 +++- test/test_bitset_new_default_element_type.cpp | 82 ++- ...itset_new_explicit_single_element_type.cpp | 498 ++++++++++++++++-- ...st_bitset_new_ext_default_element_type.cpp | 437 ++++++++++++++- ...t_new_ext_explicit_single_element_type.cpp | 441 +++++++++++++++- 5 files changed, 1432 insertions(+), 126 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index c3480ec7..2257b838 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -432,7 +432,7 @@ namespace etl // Extract the first element, if partially filled. if (active_bits_in_msb < Bits_Per_Element) { - element_type mask = ~(~element_type(0) << active_bits_in_msb); + element_type mask = etl::make_lsb_mask< element_type>(active_bits_in_msb); value = pbuffer[element_index] & mask; length -= active_bits_in_msb; if (length >= Bits_Per_Element) @@ -458,7 +458,7 @@ namespace etl if (length != 0) { value = value << length; - element_type mask = ~(~element_type(0) << length); + element_type mask = etl::make_lsb_mask< element_type>(length); value |= (pbuffer[element_index] >> (Bits_Per_Element - length)) & mask; } @@ -482,7 +482,7 @@ namespace etl // Is the value contained within one element? if (Msb_Element_Index == Lsb_Element_Index) { - const unsigned_t Mask = ~(~0 << length); + const unsigned_t Mask = etl::make_lsb_mask< unsigned_t>(length); const unsigned_t Shift = position % Bits_Per_Element; value = static_cast(pbuffer[Msb_Element_Index] >> Shift) & Mask; @@ -512,7 +512,7 @@ namespace etl typedef typename etl::make_unsigned::type unsigned_t; const int Element_Index = (Position + Length - 1) >> etl::log2::value; - const unsigned_t Mask = ~(~0 << Length); + const unsigned_t Mask = etl::lsb_mask::value; const unsigned_t Shift = Position % Bits_Per_Element; return static_cast(pbuffer[Element_Index] >> Shift) & Mask; @@ -525,9 +525,7 @@ namespace etl ETL_CONSTEXPR14 typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) const - { - typedef typename etl::make_unsigned::type unsigned_t; - + { const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; // Start with index of the element containing the msb. @@ -992,7 +990,7 @@ namespace etl /// Specialisation that uses a single element if the element type is the /// same size as the number of active bits. //*************************************************************************** - template + template class bitset : public bitset_constants<> { public: @@ -1427,10 +1425,19 @@ namespace etl ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - element_type mask = (~(~0u << length) << position); - T value((buffer & mask) >> position); + typedef typename etl::make_unsigned::type unsigned_t; - return value; + const unsigned_t Mask = etl::make_lsb_mask< unsigned_t>(length); + const unsigned_t Shift = position % Bits_Per_Element; + + unsigned_t value = static_cast(buffer >> Shift) & Mask; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); } //************************************************************************* @@ -1444,10 +1451,19 @@ namespace etl ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - element_type mask = (~(~0u << Length) << Position); - T value((buffer & mask) >> Position); + typedef typename etl::make_unsigned::type unsigned_t; - return value; + const unsigned_t Mask = etl::make_lsb_mask(); + const unsigned_t Shift = Position % Bits_Per_Element; + + unsigned_t value = static_cast(buffer >> Shift) & Mask; + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return static_cast(value); } //************************************************************************* @@ -2227,7 +2243,7 @@ namespace etl value = etl::sign_extend(value, length); } - return value; + return static_cast(value); } //************************************************************************* @@ -2249,7 +2265,7 @@ namespace etl value = etl::sign_extend(value); } - return value; + return static_cast(value); } //************************************************************************* @@ -3223,10 +3239,19 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - element_type mask = (~(~0u << length) << position); - T v((*pbuffer & mask) >> position); + typedef typename etl::make_unsigned::type unsigned_t; - return v; + 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; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); } //************************************************************************* @@ -3239,10 +3264,19 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - element_type mask = (~(~0u << Length) << Position); - T v((*pbuffer & mask) >> Position); + typedef typename etl::make_unsigned::type unsigned_t; - return v; + const unsigned_t Mask = etl::make_lsb_mask(); + const unsigned_t Shift = Position % Bits_Per_Element; + + unsigned_t value = static_cast(*pbuffer >> Shift) & Mask; + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return static_cast(value); } //************************************************************************* @@ -4024,7 +4058,16 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return ibitset.template extract_from_buffer(pbuffer, position, length); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(pbuffer, position, length); + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); } //************************************************************************* @@ -4037,7 +4080,16 @@ namespace etl { ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return ibitset.template extract_from_buffer(pbuffer); + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = ibitset.template extract_from_buffer(pbuffer); + + if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value); + } + + return static_cast(value); } //************************************************************************* diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 19aede7b..b22f5a44 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -2318,18 +2318,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - auto v = b.extract(1, 6); - - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); @@ -2357,16 +2355,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); @@ -2653,16 +2651,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int16_t(0x5678), b.extract(0, 16)); - CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract(1, 16)); - CHECK_EQUAL_HEX(int16_t(0x159E), b.extract(2, 16)); - CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract(3, 16)); - CHECK_EQUAL_HEX(int16_t(0x4567), b.extract(4, 16)); - CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract(5, 16)); - CHECK_EQUAL_HEX(int16_t(0xD159), b.extract(6, 16)); - CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract(7, 16)); - CHECK_EQUAL_HEX(int16_t(0x3456), b.extract(8, 16)); - CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract(9, 16)); + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); @@ -2680,16 +2678,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 4ea4992e..05ed79a9 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -1726,36 +1726,188 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); - CHECK_EQUAL(0x78, b.extract(0, 8)); - CHECK_EQUAL(0x3C, b.extract(1, 8)); - CHECK_EQUAL(0x9E, b.extract(2, 8)); - CHECK_EQUAL(0xCF, b.extract(3, 8)); - CHECK_EQUAL(0x67, b.extract(4, 8)); - CHECK_EQUAL(0xB3, b.extract(5, 8)); - CHECK_EQUAL(0x59, b.extract(6, 8)); - CHECK_EQUAL(0xAC, b.extract(7, 8)); - CHECK_EQUAL(0x56, b.extract(8, 8)); - CHECK_EQUAL(0x2B, b.extract(9, 8)); - CHECK_EQUAL(0x15, b.extract(10, 8)); - CHECK_EQUAL(0x8A, b.extract(11, 8)); - CHECK_EQUAL(0x45, b.extract(12, 8)); - CHECK_EQUAL(0xA2, b.extract(13, 8)); - CHECK_EQUAL(0xD1, b.extract(14, 8)); - CHECK_EQUAL(0x68, b.extract(15, 8)); - CHECK_EQUAL(0x34, b.extract(16, 8)); - CHECK_EQUAL(0x1A, b.extract(17, 8)); - CHECK_EQUAL(0x8D, b.extract(18, 8)); - CHECK_EQUAL(0x46, b.extract(19, 8)); - CHECK_EQUAL(0x23, b.extract(20, 8)); - CHECK_EQUAL(0x91, b.extract(21, 8)); - CHECK_EQUAL(0x48, b.extract(22, 8)); - CHECK_EQUAL(0x24, b.extract(23, 8)); - CHECK_EQUAL(0x12, b.extract(24, 8)); + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } @@ -1764,35 +1916,277 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); - CHECK_EQUAL(0x78, (b.extract())); - CHECK_EQUAL(0x3C, (b.extract())); - CHECK_EQUAL(0x9E, (b.extract())); - CHECK_EQUAL(0xCF, (b.extract())); - CHECK_EQUAL(0x67, (b.extract())); - CHECK_EQUAL(0xB3, (b.extract())); - CHECK_EQUAL(0x59, (b.extract())); - CHECK_EQUAL(0xAC, (b.extract())); - CHECK_EQUAL(0x56, (b.extract())); - CHECK_EQUAL(0x2B, (b.extract())); - CHECK_EQUAL(0x15, (b.extract())); - CHECK_EQUAL(0x8A, (b.extract())); - CHECK_EQUAL(0x45, (b.extract())); - CHECK_EQUAL(0xA2, (b.extract())); - CHECK_EQUAL(0xD1, (b.extract())); - CHECK_EQUAL(0x68, (b.extract())); - CHECK_EQUAL(0x34, (b.extract())); - CHECK_EQUAL(0x1A, (b.extract())); - CHECK_EQUAL(0x8D, (b.extract())); - CHECK_EQUAL(0x46, (b.extract())); - CHECK_EQUAL(0x23, (b.extract())); - CHECK_EQUAL(0x91, (b.extract())); - CHECK_EQUAL(0x48, (b.extract())); - CHECK_EQUAL(0x24, (b.extract())); - CHECK_EQUAL(0x12, (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); // The lines below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index 07025ff3..7cd47788 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -2131,6 +2131,168 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { @@ -2164,6 +2326,9 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* @@ -2200,9 +2365,275 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); - // The line below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } 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 af31e5b7..4b3d3948 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -1479,10 +1479,172 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract(13, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract(15, 6))); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract(16, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract(20, 6))); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract(23, 6))); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_uint8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x22), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x28), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x04), (b.extract())); + + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract(13, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(14, 6))); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract(15, 6))); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract(16, 6))); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract(17, 6))); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract(18, 6))); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract(19, 6))); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract(20, 6))); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract(21, 6))); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract(22, 6))); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract(23, 6))); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract(24, 6))); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); + + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_6_bit_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x06), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x11), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x08), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE4), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x09), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v1 = b.extract(); + } + //************************************************************************* TEST(test_extract_uint8_t_with_run_time_parameters) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); @@ -1512,12 +1674,15 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* TEST(test_extract_uint8_t_with_template_parameters) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); @@ -1548,9 +1713,275 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); - // The line below should static assert. - //uint8_t v = b.extract(); - //uint8_t v = b.extract(); + // The lines below should static assert. + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int8_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + + // The lines below should static assert. + //int8_t v1 = b.extract(); + //int8_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); + CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); + CHECK_EQUAL_HEX(uint16_t(0x11A2), b.extract(13, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08D1), b.extract(14, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0468), b.extract(15, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 13)); + CHECK_EQUAL_HEX(uint16_t(0x091A), b.extract(17, 13)); + CHECK_EQUAL_HEX(uint16_t(0x048D), b.extract(18, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0246), b.extract(19, 13)); + + CHECK_THROW(b.extract(19, 14), etl::bitset_overflow); + CHECK_THROW(b.extract(20, 13), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_13_bits_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_uint16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //uint16_t v1 = b.extract(); + //uint16_t v2 = b.extract(); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_run_time_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + } + + //************************************************************************* + TEST(test_extract_int16_t_with_template_parameters) + { + using bs32 = etl::bitset_ext<32, uint32_t>; + + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); + + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + + // The lines below should static assert. + //int16_t v1 = b.extract()); + //int16_t v2 = b.extract()); } }; } From c5c88ae010e059cf9596645f7b970008c0f9c492 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 13 Dec 2023 09:59:59 +0000 Subject: [PATCH 022/131] Work in progress --- include/etl/private/bitset_new.h | 48 ++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 2257b838..71fd8ea1 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -966,7 +966,7 @@ namespace etl //*************************************************************************** template ::bits == Active_Bits> + bool FitsInSingleElement = etl::integral_limits::bits >= Active_Bits> class bitset; //*************************************************************************** @@ -976,6 +976,20 @@ namespace etl template <> class bitset<0U, char, true> : public bitset_constants<> { + public: + + typedef char element_type; + + typedef element_type* pointer; + typedef const element_type* const_pointer; + + static ETL_CONSTANT size_t Bits_Per_Element = 0U; + static ETL_CONSTANT size_t Number_Of_Elements = 0U; + static ETL_CONSTANT size_t Allocated_Bits = 0U; + static ETL_CONSTANT element_type All_Set_Element = 0U; + static ETL_CONSTANT element_type All_Clear_Element = 0U; + static ETL_CONSTANT size_t Top_Mask_Shift = 0U; + static ETL_CONSTANT element_type Top_Mask = 0U; }; //*************************************************************************** @@ -984,11 +998,25 @@ namespace etl template <> class bitset<0U, char, false> : public bitset_constants<> { + public: + + typedef char element_type; + + typedef element_type* pointer; + typedef const element_type* const_pointer; + + static ETL_CONSTANT size_t Bits_Per_Element = 0U; + static ETL_CONSTANT size_t Number_Of_Elements = 0U; + static ETL_CONSTANT size_t Allocated_Bits = 0U; + static ETL_CONSTANT element_type All_Set_Element = 0U; + static ETL_CONSTANT element_type All_Clear_Element = 0U; + static ETL_CONSTANT size_t Top_Mask_Shift = 0U; + static ETL_CONSTANT element_type Top_Mask = 0U; }; //*************************************************************************** - /// Specialisation that uses a single element if the element type is the - /// same size as the number of active bits. + /// Specialisation that uses a single element if the number of active bits + /// fits into the element type size. //*************************************************************************** template class bitset : public bitset_constants<> @@ -1177,16 +1205,6 @@ namespace etl return *this; } - //************************************************************************* - /// Set from a value. - //************************************************************************* - ETL_CONSTEXPR14 bitset& set(element_type value) ETL_NOEXCEPT - { - buffer = value; - - return *this; - } - //************************************************************************* /// Set the bit at the position. //************************************************************************* @@ -3333,7 +3351,7 @@ namespace etl //************************************************************************* /// The number of bits in the bitset. //************************************************************************* - ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT + ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT { return Active_Bits; } @@ -4143,7 +4161,7 @@ namespace etl //************************************************************************* /// The number of bits in the bitset. //************************************************************************* - ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT + ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT { return Active_Bits; } From 58f469ebd43a1ac851917fcf8d10d95b4459ea68 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 29 Dec 2023 09:33:20 +0000 Subject: [PATCH 023/131] Work in progress Finished updating explicit single element tests --- include/etl/private/bitset_new.h | 3864 ++++++----------- ...itset_new_explicit_single_element_type.cpp | 926 ++-- 2 files changed, 1897 insertions(+), 2893 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 71fd8ea1..7a766f64 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -76,14 +76,81 @@ SOFTWARE. namespace etl { - template - struct bitset_constants - { - static ETL_CONSTANT size_t npos = etl::integral_limits::max; - }; + //namespace private_bitset + //{ + // //*************************************************************************** + // /// Common definitions for etl::bitset_impl + // ///\ingroup bitset + // //*************************************************************************** + // template + // struct bitset_impl_common + // { + // typedef TElement element_type; + // typedef element_type* pointer; + // typedef const element_type* const_pointer; - template - ETL_CONSTANT size_t bitset_constants::npos; + // static ETL_CONSTANT size_t npos = etl::integral_limits::max; + + // static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; + // static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; + // static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + // }; + + // template + // ETL_CONSTANT size_t bitset_impl_common::npos; + + // template + // ETL_CONSTANT size_t bitset_impl_common::Bits_Per_Element; + + // template + // ETL_CONSTANT TElement bitset_impl_common::All_Set_Element; + + // template + // ETL_CONSTANT TElement bitset_impl_common::All_Clear_Element; + + // //*************************************************************************** + // /// Common definitions for etl::bitset + // ///\ingroup bitset + // //*************************************************************************** + // template + // struct bitset_common : public bitset_impl_common + // { + // typedef TElement element_type; + + // static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; + // static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; + // static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); + // static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); + + // static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. + + // typedef etl::span span_type; + // typedef etl::span const_span_type; + // }; + + // template + // ETL_CONSTANT size_t bitset_common::Number_Of_Elements; + + // template + // ETL_CONSTANT size_t bitset_common::Allocated_Bits; + + // template + // ETL_CONSTANT size_t bitset_common::Top_Mask_Shift; + + // template + // ETL_CONSTANT typename bitset_common::element_type private_bitset::bitset_common::Top_Mask; + //} + + //*************************************************************************** + /// Flags to indicate whether the bitset is contained in a single element + /// or spread over an array of elements. + ///\ingroup bitset + //*************************************************************************** + struct bitset_layout + { + static ETL_CONSTANT bool Single = true; + static ETL_CONSTANT bool Multi = false; + }; //*************************************************************************** /// Exception base for bitset @@ -142,23 +209,685 @@ namespace etl }; //************************************************************************* - /// The implementation class for multi-element etl::bitset + /// Bitset implementation declaration. + ///\ingroup bitset + //************************************************************************* + template + class bitset_impl; + + //************************************************************************* + /// The implementation class for single element etl::bitset ///\ingroup bitset //************************************************************************* template - class bitset_impl : public bitset_constants<> + class bitset_impl { public: - typedef typename etl::make_unsigned::type element_type; + //static ETL_CONSTANT bool Element_Layout = etl::bitset_layout::Single; + typedef TElement element_type; typedef element_type* pointer; typedef const element_type* const_pointer; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; - static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + static ETL_CONSTANT size_t npos = etl::integral_limits::max; + static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; + static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; + static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + + //************************************************************************* + /// Set all of the bits. + //************************************************************************* + ETL_CONSTEXPR14 + static + void set(pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *pbuffer = All_Set_Element; + } + + //************************************************************************* + /// Set the bit at the position. + //************************************************************************* + ETL_CONSTEXPR14 + static + void set(pointer pbuffer, + size_t /*number_of_elements*/, + size_t position, + bool value = true) + { + const element_type mask = element_type(element_type(1) << position); + + if (value == true) + { + *pbuffer |= mask; + } + else + { + *pbuffer &= ~mask; + } + } + + //************************************************************************* + /// Reset all of the bits. + //************************************************************************* + ETL_CONSTEXPR14 + static + void reset(pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *pbuffer = All_Clear_Element; + } + + //************************************************************************* + /// Reset the bit at the position. + //************************************************************************* + ETL_CONSTEXPR14 + static + void reset(pointer pbuffer, + size_t /*number_of_elements*/, + size_t position) + { + const element_type mask = element_type(element_type(1) << position); + *pbuffer &= ~mask; + } + + //************************************************************************* + /// Set from a string. + //************************************************************************* + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + const char* text) ETL_NOEXCEPT + { + if (text == ETL_NULLPTR) + { + reset(pbuffer, 1U); + } + else + { + size_t string_length = etl::strlen(text); + + // Build from the string. + string_length = etl::min(active_bits, string_length); + + element_type mask = element_type(element_type(1) << (string_length - 1U)); + + for (size_t i = 0U; i < string_length; ++i) + { + if (text[i] == ETL_STR('1')) + { + *pbuffer |= mask; + } + else + { + *pbuffer &= ~mask; + } + + mask >>= 1U; + } + } + } + + //************************************************************************* + /// Set from a wide string. + //************************************************************************* + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + const wchar_t* text) ETL_NOEXCEPT + { + if (text == ETL_NULLPTR) + { + reset(pbuffer, 1U); + } + else + { + size_t string_length = etl::strlen(text); + + // Build from the string. + string_length = etl::min(active_bits, string_length); + + element_type mask = element_type(element_type(1) << (string_length - 1U)); + + for (size_t i = 0U; i < string_length; ++i) + { + if (text[i] == ETL_STRL('1')) + { + *pbuffer |= mask; + } + else + { + *pbuffer &= ~mask; + } + + mask >>= 1U; + } + } + } + + //************************************************************************* + /// Set from a u16 string. + //************************************************************************* + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + const char16_t* text) ETL_NOEXCEPT + { + if (text == ETL_NULLPTR) + { + reset(pbuffer, 1U); + } + else + { + size_t string_length = etl::strlen(text); + + // Build from the string. + string_length = etl::min(active_bits, string_length); + + element_type mask = element_type(element_type(1) << (string_length - 1U)); + + for (size_t i = 0U; i < string_length; ++i) + { + if (text[i] == ETL_STRu('1')) + { + *pbuffer |= mask; + } + else + { + *pbuffer &= ~mask; + } + + mask >>= 1U; + } + } + } + + //************************************************************************* + /// Set from a u32 string. + //************************************************************************* + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + const char32_t* text) ETL_NOEXCEPT + { + if (text == ETL_NULLPTR) + { + reset(pbuffer, 1U); + } + else + { + size_t string_length = etl::strlen(text); + + // Build from the string. + string_length = etl::min(active_bits, string_length); + + element_type mask = element_type(element_type(1) << (string_length - 1U)); + + for (size_t i = 0U; i < string_length; ++i) + { + if (text[i] == ETL_STRU('1')) + { + *pbuffer |= mask; + } + else + { + *pbuffer &= ~mask; + } + + mask >>= 1U; + } + } + } + + //************************************************************************* + /// Get as an integral value. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + T value(const_pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + return T(*pbuffer); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + T extract(const_pointer pbuffer, + size_t position, + size_t length = etl::integral_limits::bits) + { + typedef typename etl::make_unsigned::type unsigned_t; + + 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; + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); + } + + //************************************************************************* + /// Tests a bit at a position. + /// Positions greater than the number of configured bits will return false. + //************************************************************************* + ETL_CONSTEXPR14 + static + bool test(const_pointer pbuffer, + size_t /*number_of_elements*/, + size_t position) + { + const element_type mask = element_type(element_type(1) << position); + return (*pbuffer & mask) != 0U; + } + + //************************************************************************* + /// Count the number of bits set. + //************************************************************************* + ETL_CONSTEXPR14 + static + size_t count(const_pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + return etl::count_bits(*pbuffer); + } + + //************************************************************************* + // Are all the bits sets? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool all(const_pointer pbuffer, + size_t /*number_of_elements*/, + element_type top_mask) ETL_NOEXCEPT + { + return (*pbuffer & top_mask) == top_mask; + } + + //************************************************************************* + // Are all the mask bits sets? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool all(const_pointer pbuffer, + size_t /*number_of_elements*/, + element_type top_mask, + element_type mask) ETL_NOEXCEPT + { + return (*pbuffer & top_mask & mask) == mask; + } + + //************************************************************************* + /// Are none of the bits set? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool none(const_pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + return *pbuffer == All_Clear_Element; + } + + //************************************************************************* + /// Are none of the mask bits set? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool none(const_pointer pbuffer, + size_t /*number_of_elements*/, + element_type mask) ETL_NOEXCEPT + { + return (*pbuffer & mask) == All_Clear_Element; + } + + //************************************************************************* + /// Are any of the bits set? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool any(const_pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + return *pbuffer != All_Clear_Element; + } + + //************************************************************************* + /// Are any of the mask bits set? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool any(const_pointer pbuffer, + size_t /*number_of_elements*/, + element_type mask) ETL_NOEXCEPT + { + return (*pbuffer & mask) != All_Clear_Element; + } + + //************************************************************************* + /// Flip all of the bits. + //************************************************************************* + ETL_CONSTEXPR14 + static + void flip(pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *pbuffer = ~*pbuffer; + } + + //************************************************************************* + /// Flip some of the bits. + //************************************************************************* + ETL_CONSTEXPR14 + static + void flip_bits(pointer pbuffer, + size_t /*number_of_elements*/, + element_type mask = etl::integral_limits::max) ETL_NOEXCEPT + { + *pbuffer ^= mask; + } + + //************************************************************************* + /// Flip the bit at the position. + //************************************************************************* + ETL_CONSTEXPR14 + static + void flip(pointer pbuffer, + size_t /*number_of_elements*/, + size_t position) + { + const element_type mask = element_type(element_type(1) << position); + *pbuffer ^= mask; + } + + //************************************************************************* + /// Read [] operator. + //************************************************************************* + ETL_CONSTEXPR14 + static + bool read_bit(const_pointer pbuffer, + size_t active_bits, + size_t /*number_of_elements*/, + size_t position) ETL_NOEXCEPT + { + if (position < active_bits) + { + const element_type mask = element_type(element_type(1) << position); + return (*pbuffer & mask) != 0U; + } + + return false; + } + + //************************************************************************* + /// Write [] operator. + //************************************************************************* + ETL_CONSTEXPR14 + static + void write_bit(pointer pbuffer, + size_t /*number_of_elements*/, + size_t position) ETL_NOEXCEPT + { + return bit_reference(*this, position); + } + + //************************************************************************* + /// Returns a string representing the bitset. + //************************************************************************* +#if ETL_USING_CPP11 + template > +#else + template +#endif + ETL_CONSTEXPR14 + static + TString to_string(const_pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + typename TString::value_type zero = typename TString::value_type('0'), + typename TString::value_type one = typename TString::value_type('1')) + { + TString result; + + result.resize(active_bits, '\0'); + + // Check that the string type can contain the digits. + ETL_ASSERT_OR_RETURN_VALUE(result.size() == active_bits, ETL_ERROR(etl::bitset_string_too_small), result); + + for (size_t i = active_bits; i > 0; --i) + { + result[active_bits - i] = test(pbuffer, 0, i - 1) ? one : zero; + } + + return result; + } + + //************************************************************************* + /// Finds the next bit in the specified state. + ///\param state The state to search for. + ///\param position The position to start from. + ///\returns The position of the bit or npos if none were found. + //************************************************************************* + ETL_CONSTEXPR14 + static + size_t find_next(const_pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + bool state, + size_t position) ETL_NOEXCEPT + { + if (position < active_bits) + { + // Where to start. + size_t bit = position; + + element_type mask = 1U << position; + + // Needs checking? + if ((state && (*pbuffer != All_Clear_Element)) || (!state && (*pbuffer != All_Set_Element))) + { + // For each bit in the element... + while (bit < active_bits) + { + // Equal to the required state? + if (((*pbuffer & mask) != 0) == state) + { + return bit; + } + + // Move on to the next bit. + mask <<= 1; + ++bit; + } + } + } + + return npos; + } + + //************************************************************************* + /// operator assignment + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_assignment(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *lhs_pbuffer = *rhs_pbuffer; + } + + //************************************************************************* + /// operator and + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_and(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *lhs_pbuffer &= *rhs_pbuffer; + } + + //************************************************************************* + /// operator or + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_or(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *lhs_pbuffer |= *rhs_pbuffer; + } + + //************************************************************************* + /// operator xor + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_xor(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *lhs_pbuffer ^= *rhs_pbuffer; + } + + //************************************************************************* + /// operator ~ + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_not(pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + *pbuffer = ~*pbuffer; + } + + //************************************************************************* + /// operator_shift_left + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_shift_left(pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + size_t shift) ETL_NOEXCEPT + { + if (shift >= active_bits) + { + reset(pbuffer, 1U); + } + else + { + *pbuffer <<= shift; + } + } + + //************************************************************************* + /// operator_shift_right + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_shift_right(pointer pbuffer, + size_t /*number_of_elements*/, + size_t active_bits, + size_t shift) ETL_NOEXCEPT + { + if (shift >= active_bits) + { + reset(pbuffer, 1U); + } + else + { + *pbuffer >>= shift; + } + } + + //************************************************************************* + /// operator_equality + //************************************************************************* + ETL_CONSTEXPR14 + static + bool operator_equality(const_pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + return (*lhs_pbuffer == *rhs_pbuffer); + } + + //************************************************************************* + /// Initialise from an unsigned long long. + //************************************************************************* + ETL_CONSTEXPR14 + static + void initialise(pointer pbuffer, + size_t /*number_of_elements*/, + unsigned long long value) ETL_NOEXCEPT + { + *pbuffer = static_cast(value); + } + + //************************************************************************* + /// swap + //************************************************************************* + ETL_CONSTEXPR14 + static + void swap(pointer lhs_pbuffer, + pointer rhs_pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT + { + using ETL_OR_STD::iter_swap; + + iter_swap(lhs_pbuffer, rhs_pbuffer); + } + }; + + //template + //ETL_CONSTANT bool etl::bitset_impl::Element_Layout; + + //************************************************************************* + /// The implementation class for multi element etl::bitset + ///\ingroup bitset + //************************************************************************* + template + class bitset_impl + { + public: + + typedef TElement element_type; + typedef element_type* pointer; + typedef const element_type* const_pointer; + + static ETL_CONSTANT size_t npos = etl::integral_limits::max; + + static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; + static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; + static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + + //static ETL_CONSTANT bool Element_Layout = etl::bitset_layout::Multi; + + //************************************************************************* + /// Check to see if the requested extract is contained within one element. + //************************************************************************* template struct value_is_in_one_element { @@ -168,7 +897,10 @@ namespace etl //************************************************************************* /// Count the number of bits set. //************************************************************************* - ETL_CONSTEXPR14 size_t count(const_pointer pbuffer, size_t number_of_elements) const ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + size_t count(const_pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { size_t n = 0UL; @@ -184,7 +916,11 @@ namespace etl /// Tests a bit at a position. /// Positions greater than the number of configured bits will return false. //************************************************************************* - ETL_CONSTEXPR14 bool test(const_pointer pbuffer, size_t number_of_elements, size_t position) const ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + bool test(const_pointer pbuffer, + size_t number_of_elements, + size_t position) ETL_NOEXCEPT { size_t index = 0U; element_type mask = element_type(0); @@ -207,7 +943,12 @@ namespace etl //************************************************************************* /// Set the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 void set(pointer pbuffer, size_t number_of_elements, size_t position, bool value = true) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void set(pointer pbuffer, + size_t number_of_elements, + size_t position, + bool value = true) ETL_NOEXCEPT { size_t index = 0; element_type bit = 0; @@ -240,7 +981,12 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 void from_string(pointer pbuffer, size_t number_of_elements, size_t total_bits, const char* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const char* text) ETL_NOEXCEPT { if (text == ETL_NULLPTR) { @@ -270,7 +1016,12 @@ namespace etl //************************************************************************* /// Set from a wide string. //************************************************************************* - ETL_CONSTEXPR14 void from_string(pointer pbuffer, size_t number_of_elements, size_t total_bits, const wchar_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const wchar_t* text) ETL_NOEXCEPT { if (text == ETL_NULLPTR) { @@ -300,7 +1051,12 @@ namespace etl //************************************************************************* /// Set from a u16 string. //************************************************************************* - ETL_CONSTEXPR14 void from_string(pointer pbuffer, size_t number_of_elements, size_t total_bits, const char16_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const char16_t* text) ETL_NOEXCEPT { if (text == ETL_NULLPTR) { @@ -330,7 +1086,12 @@ namespace etl //************************************************************************* /// Set from a u32 string. //************************************************************************* - ETL_CONSTEXPR14 void from_string(pointer pbuffer, size_t number_of_elements, size_t total_bits, const char32_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void from_string(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const char32_t* text) ETL_NOEXCEPT { if (text == ETL_NULLPTR) { @@ -360,7 +1121,12 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 void set(pointer pbuffer, size_t number_of_elements, size_t total_bits, const char* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void set(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const char* text) ETL_NOEXCEPT { from_string(pbuffer, number_of_elements, total_bits, text); } @@ -368,7 +1134,12 @@ namespace etl //************************************************************************* /// Set from a wstring. //************************************************************************* - ETL_CONSTEXPR14 void set(pointer pbuffer, size_t number_of_elements, size_t total_bits, const wchar_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void set(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const wchar_t* text) ETL_NOEXCEPT { from_string(pbuffer, number_of_elements, total_bits, text); } @@ -376,7 +1147,12 @@ namespace etl //************************************************************************* /// Set from a u16string. //************************************************************************* - ETL_CONSTEXPR14 void set(pointer pbuffer, size_t number_of_elements, size_t total_bits, const char16_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void set(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const char16_t* text) ETL_NOEXCEPT { from_string(pbuffer, number_of_elements, total_bits, text); } @@ -384,18 +1160,53 @@ namespace etl //************************************************************************* /// Set from a u32string. //************************************************************************* - ETL_CONSTEXPR14 void set(pointer pbuffer, size_t number_of_elements, size_t total_bits, const char32_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void set(pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + const char32_t* text) ETL_NOEXCEPT { from_string(pbuffer, number_of_elements, total_bits, text); } + //************************************************************************* + /// Reset all of the bits. + //************************************************************************* + ETL_CONSTEXPR14 + static + void reset(pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + while (number_of_elements-- != 0U) + { + *pbuffer++ = All_Clear_Element; + } + } + + //************************************************************************* + /// Reset the bit at the position. + //************************************************************************* + ETL_CONSTEXPR14 + static + void reset(pointer pbuffer, + size_t number_of_elements, + size_t position) ETL_NOEXCEPT + { + const size_t index = position >> etl::log2::value;; + const element_type bit = element_type(1) << (position & (Bits_Per_Element - 1)); + + pbuffer[index] &= ~bit; + } + //************************************************************************* /// Get as a value. //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - value(const_pointer pbuffer, size_t number_of_elements) const ETL_NOEXCEPT + static + T value(const_pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { T v = T(0); @@ -420,10 +1231,11 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 + static typename etl::make_unsigned::type extract_from_multiple_elements(const element_type* pbuffer, int element_index, size_t active_bits_in_msb, - size_t length) const ETL_NOEXCEPT + size_t length) ETL_NOEXCEPT { typedef typename etl::make_unsigned::type unsigned_t; @@ -470,7 +1282,10 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::make_unsigned::type extract_from_buffer(const_pointer pbuffer, size_t position, size_t length) const ETL_NOEXCEPT + static + typename etl::make_unsigned::type extract_from_buffer(const_pointer pbuffer, + size_t position, + size_t length) ETL_NOEXCEPT { typedef typename etl::make_unsigned::type unsigned_t; @@ -502,12 +1317,13 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value when the value fits in one element. //************************************************************************* template ETL_CONSTEXPR14 + static typename etl::enable_if::value, typename etl::make_unsigned::type>::type - extract_from_buffer(const_pointer pbuffer) const + extract_from_buffer(const_pointer pbuffer) { typedef typename etl::make_unsigned::type unsigned_t; @@ -519,12 +1335,13 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value when the value spans more than one element. //************************************************************************* template ETL_CONSTEXPR14 + static typename etl::enable_if::value, typename etl::make_unsigned::type>::type - extract_from_buffer(const_pointer pbuffer) const + extract_from_buffer(const_pointer pbuffer) { const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; @@ -540,65 +1357,28 @@ namespace etl return extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); } - //************************************************************************* - /// Reset the bit at the position. - //************************************************************************* - ETL_CONSTEXPR14 void reset(pointer pbuffer, size_t number_of_elements, size_t position) ETL_NOEXCEPT - { - size_t index = 0U; - element_type bit = element_type(0); - - if (number_of_elements == 0) ETL_UNLIKELY - { - return; - } - else if (number_of_elements == 1) - { - index = 0; - bit = element_type(1) << position; - } - else - { - index = position >> etl::log2::value; - bit = element_type(1) << (position & (Bits_Per_Element - 1)); - } - - pbuffer[index] &= ~bit; - } - //************************************************************************* /// Flip all of the bits. //************************************************************************* - ETL_CONSTEXPR14 void flip(pointer pbuffer, size_t number_of_elements) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void flip(pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { - etl::transform_n(pbuffer, - number_of_elements, - pbuffer, - etl::binary_not()); + operator_not(pbuffer, number_of_elements); } //************************************************************************* /// Flip the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 void flip(pointer pbuffer, size_t number_of_elements, size_t position) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void flip(pointer pbuffer, + size_t number_of_elements, + size_t position) ETL_NOEXCEPT { - size_t index = 0U; - element_type bit = element_type(0); - - if (number_of_elements == 0) ETL_UNLIKELY - { - return; - } - else if (number_of_elements == 1) - { - index = 0; - bit = element_type(1) << position; - } - else - { - index = position >> log2::value; - bit = element_type(1) << (position & (Bits_Per_Element - 1)); - } + const size_t index = position >> etl::log2::value;; + const element_type bit = element_type(1) << (position & (Bits_Per_Element - 1)); pbuffer[index] ^= bit; } @@ -606,13 +1386,12 @@ namespace etl //************************************************************************* // Are all the bits sets? //************************************************************************* - ETL_CONSTEXPR14 bool all(const_pointer pbuffer, size_t number_of_elements, element_type top_mask) const ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + bool all(const_pointer pbuffer, + size_t number_of_elements, + element_type top_mask) ETL_NOEXCEPT { - if (number_of_elements == 0UL) - { - return true; - } - // All but the last. for (size_t i = 0UL; i < (number_of_elements - 1U); ++i) { @@ -634,7 +1413,10 @@ namespace etl //************************************************************************* /// Are none of the bits set? //************************************************************************* - ETL_CONSTEXPR14 bool none(const_pointer pbuffer, size_t number_of_elements) const ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + bool none(const_pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { for (size_t i = 0UL; i < number_of_elements; ++i) { @@ -647,23 +1429,19 @@ namespace etl return true; } - //************************************************************************* - /// Finds the first bit in the specified state. - ///\param state The state to search for. - ///\returns The position of the bit or Number_Of_Elements if none were found. - //************************************************************************* - ETL_CONSTEXPR14 size_t find_first(const_pointer pbuffer, size_t number_of_elements, size_t total_bits, bool state) const ETL_NOEXCEPT - { - return find_next(pbuffer, number_of_elements, total_bits, state, 0); - } - //************************************************************************* /// Finds the next bit in the specified state. ///\param state The state to search for. ///\param position The position to start from. ///\returns The position of the bit or npos if none were found. //************************************************************************* - ETL_CONSTEXPR14 size_t find_next(const_pointer pbuffer, size_t number_of_elements, size_t total_bits, bool state, size_t position) const ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + size_t find_next(const_pointer pbuffer, + size_t number_of_elements, + size_t total_bits, + bool state, + size_t position) ETL_NOEXCEPT { // Where to start. size_t index = position >> log2::value; @@ -714,11 +1492,13 @@ namespace etl /// Returns a string representing the bitset. //************************************************************************* template - ETL_CONSTEXPR14 TString to_string(const_pointer pbuffer, - size_t number_of_elements, - size_t active_bits, - typename TString::value_type zero, - typename TString::value_type one) const + ETL_CONSTEXPR14 + static + TString to_string(const_pointer pbuffer, + size_t number_of_elements, + size_t active_bits, + typename TString::value_type zero, + typename TString::value_type one) { TString result; @@ -736,249 +1516,265 @@ namespace etl } //************************************************************************* - /// shift_left_equals + /// operator assignment //************************************************************************* - ETL_CONSTEXPR14 void shift_left_equals(pointer pbuffer, size_t number_of_elements, size_t shift) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void operator_assignment(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { - if (number_of_elements == 1U) + while (number_of_elements != 0) { - // Just one element. - pbuffer[0] <<= shift; + *lhs_pbuffer++ = *rhs_pbuffer++; } - else if ((shift % Bits_Per_Element) == 0U) + } + + //************************************************************************* + /// operator and + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_and(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + while (number_of_elements-- != 0) { - // Shift by whole element. - const size_t element_shift = shift / Bits_Per_Element; - etl::copy_backward(pbuffer, pbuffer + number_of_elements - element_shift, pbuffer + number_of_elements); - etl::fill_n(pbuffer, element_shift, All_Clear_Element); + *lhs_pbuffer++ &= *rhs_pbuffer++; } - else + } + + //************************************************************************* + /// operator or + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_or(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + while (number_of_elements-- != 0) { - // The place where the elements are split when shifting. - const size_t split_position = Bits_Per_Element - (shift % Bits_Per_Element); + *lhs_pbuffer++ != *rhs_pbuffer++; + } + } - // Where we are shifting from. - int src_index = int(number_of_elements - (shift / Bits_Per_Element) - 1U); + //************************************************************************* + /// operator xor + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_xor(pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + while (number_of_elements-- != 0) + { + *lhs_pbuffer++ ^= *rhs_pbuffer++; + } + } - // Where we are shifting to. - int dst_index = int(number_of_elements - 1U); + //************************************************************************* + /// operator not + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_not(pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + while (number_of_elements-- != 0) + { + *pbuffer++ = ~*pbuffer++; + } + } - // Shift control constants. - const size_t lsb_shift = Bits_Per_Element - split_position; - const size_t msb_shift = split_position; + //************************************************************************* + /// operator_shift_left + //************************************************************************* + ETL_CONSTEXPR14 + static + void operator_shift_left(pointer pbuffer, + size_t number_of_elements, + size_t active_bits, + size_t shift) ETL_NOEXCEPT + { + // The place where the elements are split when shifting. + const size_t split_position = Bits_Per_Element - (shift % Bits_Per_Element); - const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); - const element_type msb_mask = etl::integral_limits::max - lsb_mask; - const element_type lsb_shifted_mask = element_type(lsb_mask << lsb_shift); - - // First lsb. + // Where we are shifting from. + int src_index = int(number_of_elements - (shift / Bits_Per_Element) - 1U); + + // Where we are shifting to. + int dst_index = int(number_of_elements - 1U); + + // Shift control constants. + const size_t lsb_shift = Bits_Per_Element - split_position; + const size_t msb_shift = split_position; + + const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); + const element_type msb_mask = etl::integral_limits::max - lsb_mask; + const element_type lsb_shifted_mask = element_type(lsb_mask << lsb_shift); + + // First lsb. + element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); + pbuffer[dst_index] = lsb; + --src_index; + + // Now do the shifting. + while (src_index >= 0) + { + // Shift msb. + element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); + pbuffer[dst_index] = pbuffer[dst_index] | msb; + --dst_index; + + // Shift lsb. element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); pbuffer[dst_index] = lsb; --src_index; + } - // Now do the shifting. - while (src_index >= 0) - { - // Shift msb. - element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); - pbuffer[dst_index] = pbuffer[dst_index] | msb; - --dst_index; + // Clear the remaining bits. + // First lsb. + pbuffer[dst_index] &= lsb_shifted_mask; - // Shift lsb. - element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); - pbuffer[dst_index] = lsb; - --src_index; - } - - // Clear the remaining bits. - // First lsb. - pbuffer[dst_index] &= lsb_shifted_mask; -// --dst_index; - - // The other remaining bytes on the right. - for (int i = 0; i < dst_index; ++i) - { - pbuffer[i] = 0; - } + // The other remaining bytes on the right. + for (int i = 0; i < dst_index; ++i) + { + pbuffer[i] = 0; } } //************************************************************************* - /// shift_right_equals + /// operator_shift_right //************************************************************************* - ETL_CONSTEXPR14 void shift_right_equals(pointer pbuffer, size_t number_of_elements, size_t shift) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void operator_shift_right(pointer pbuffer, + size_t number_of_elements, + size_t active_bits, + size_t shift) ETL_NOEXCEPT { - if (number_of_elements == 1U) + // The place where the elements are split when shifting. + const size_t split_position = shift % Bits_Per_Element; + + // Where we are shifting from. + int src_index = int(shift / Bits_Per_Element); + + // Where we are shifting to. + int dst_index = 0; + + // Shift control constants. + const size_t lsb_shift = Bits_Per_Element - split_position; + const size_t msb_shift = split_position; + + const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); + const element_type msb_mask = etl::integral_limits::max - lsb_mask; + const element_type msb_shifted_mask = element_type(msb_mask >> msb_shift); + + // Now do the shifting. + while (src_index < int(number_of_elements - 1)) { - // Just one element. - pbuffer[0] >>= shift; - } - else if ((shift % Bits_Per_Element) == 0U) - { - // Shift by whole elements. - const size_t element_shift = (shift / Bits_Per_Element); - pointer pzeros_begin = etl::copy(pbuffer + element_shift, pbuffer + number_of_elements, pbuffer); - etl::fill_n(pzeros_begin, element_shift, All_Clear_Element); - } - else - { - // The place where the elements are split when shifting. - const size_t split_position = shift % Bits_Per_Element; - - // Where we are shifting from. - int src_index = int(shift / Bits_Per_Element); - - // Where we are shifting to. - int dst_index = 0; - - // Shift control constants. - const size_t lsb_shift = Bits_Per_Element - split_position; - const size_t msb_shift = split_position; - - const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); - const element_type msb_mask = etl::integral_limits::max - lsb_mask; - const element_type msb_shifted_mask = element_type(msb_mask >> msb_shift); - - // Now do the shifting. - while (src_index < int(number_of_elements - 1)) - { - // Shift msb. - element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); - ++src_index; - - // Shift lsb. - element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); - - // Combine them. - pbuffer[dst_index] = lsb | msb; - ++dst_index; - } - - // Final msb. + // Shift msb. element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); - pbuffer[dst_index] = msb; + ++src_index; - // Clear the remaining bits. - // First msb. - pbuffer[dst_index] &= msb_shifted_mask; + // Shift lsb. + element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); + + // Combine them. + pbuffer[dst_index] = lsb | msb; ++dst_index; + } - // The other remaining bytes. - while (dst_index < int(number_of_elements)) - { - pbuffer[dst_index] = 0; - ++dst_index; - } + // Final msb. + element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); + pbuffer[dst_index] = msb; + + // Clear the remaining bits. + // First msb. + pbuffer[dst_index] &= msb_shifted_mask; + ++dst_index; + + // The other remaining bytes. + while (dst_index < int(number_of_elements)) + { + pbuffer[dst_index] = 0; + ++dst_index; } } //************************************************************************* - /// and_equals + /// operator_equality //************************************************************************* - ETL_CONSTEXPR14 void and_equals(pointer pbuffer, const_pointer pbuffer2, size_t number_of_elements) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + bool operator_equality(const_pointer lhs_pbuffer, + const_pointer rhs_pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { - for (size_t i = 0U; i < number_of_elements; ++i) - { - pbuffer[i] &= pbuffer2[i]; - } - } - - //************************************************************************* - /// or_equals - //************************************************************************* - ETL_CONSTEXPR14 void or_equals(pointer pbuffer, const_pointer pbuffer2, size_t number_of_elements) ETL_NOEXCEPT - { - for (size_t i = 0U; i < number_of_elements; ++i) - { - pbuffer[i] |= pbuffer2[i]; - } - } - - //************************************************************************* - /// xor_equals - //************************************************************************* - ETL_CONSTEXPR14 void xor_equals(pointer pbuffer, const_pointer pbuffer2, size_t number_of_elements) ETL_NOEXCEPT - { - for (size_t i = 0U; i < number_of_elements; ++i) - { - pbuffer[i] ^= pbuffer2[i]; - } + return etl::equal(lhs_pbuffer, lhs_pbuffer + number_of_elements, rhs_pbuffer); } //************************************************************************* /// Initialise from an unsigned long long. //************************************************************************* - ETL_CONSTEXPR14 void initialise(pointer pbuffer, size_t number_of_elements, unsigned long long value) ETL_NOEXCEPT + ETL_CONSTEXPR14 + static + void initialise(pointer pbuffer, + size_t number_of_elements, + unsigned long long value) ETL_NOEXCEPT { - const size_t Shift = (etl::integral_limits::bits <= (int)Bits_Per_Element) ? 0 : Bits_Per_Element; + size_t i = 0UL; + const size_t Shift = etl::integral_limits::bits; - // Can we do it in one hit? - if (Shift == 0) + // Set the non-zero elements. + while ((value != 0) && (i != number_of_elements)) { - pbuffer[0] = element_type(value); + pbuffer[i++] = value & All_Set_Element; + value = value >> Shift; } - else + + // Clear the remaining elements. + while (i != number_of_elements) { - size_t i = 0UL; - - // Set the non-zero elements. - while ((value != 0) && (i != number_of_elements)) - { - pbuffer[i++] = value & All_Set_Element; - value = value >> Shift; - } - - // Clear the remaining elements. - while (i != number_of_elements) - { - pbuffer[i++] = All_Clear_Element; - } + pbuffer[i++] = All_Clear_Element; } } //************************************************************************* /// Swap bitset buffers. //************************************************************************* - ETL_CONSTEXPR14 void swap(pointer pbuffer1, pointer pbuffer2, size_t number_of_elements) + ETL_CONSTEXPR14 + static + void swap(pointer pbuffer1, + pointer pbuffer2, + size_t number_of_elements) { - const pointer pbuffer1_end = pbuffer1 + number_of_elements; - - while (pbuffer1 != pbuffer1_end) - { - element_type temp = *pbuffer1; - *pbuffer1 = *pbuffer2; - *pbuffer2 = temp; - ++pbuffer1; - ++pbuffer2; - } + etl::swap_ranges(pbuffer1, pbuffer1 + number_of_elements, pbuffer2); } }; - - template - ETL_CONSTANT size_t bitset_impl::Bits_Per_Element; - template - ETL_CONSTANT typename bitset_impl::element_type bitset_impl::All_Set_Element; - - template - ETL_CONSTANT typename bitset_impl::element_type bitset_impl::All_Clear_Element; + //template + //ETL_CONSTANT bool etl::bitset_impl::Element_Layout; //*************************************************************************** - template ::bits >= Active_Bits> + /// Bitset forward declaration + //*************************************************************************** + template class bitset; //*************************************************************************** /// Specialisation for zero bits. - /// Just defines 'npos'. //*************************************************************************** template <> - class bitset<0U, char, true> : public bitset_constants<> + class bitset<0U, unsigned char> { public: - typedef char element_type; + typedef unsigned char element_type; typedef element_type* pointer; typedef const element_type* const_pointer; @@ -990,970 +1786,34 @@ namespace etl static ETL_CONSTANT element_type All_Clear_Element = 0U; static ETL_CONSTANT size_t Top_Mask_Shift = 0U; static ETL_CONSTANT element_type Top_Mask = 0U; + + static ETL_CONSTANT size_t npos = etl::integral_limits::max; }; - //*************************************************************************** - /// Specialisation for zero bits. - //*************************************************************************** - template <> - class bitset<0U, char, false> : public bitset_constants<> - { - public: - - typedef char element_type; - - typedef element_type* pointer; - typedef const element_type* const_pointer; - - static ETL_CONSTANT size_t Bits_Per_Element = 0U; - static ETL_CONSTANT size_t Number_Of_Elements = 0U; - static ETL_CONSTANT size_t Allocated_Bits = 0U; - static ETL_CONSTANT element_type All_Set_Element = 0U; - static ETL_CONSTANT element_type All_Clear_Element = 0U; - static ETL_CONSTANT size_t Top_Mask_Shift = 0U; - static ETL_CONSTANT element_type Top_Mask = 0U; - }; - - //*************************************************************************** - /// Specialisation that uses a single element if the number of active bits - /// fits into the element type size. - //*************************************************************************** + //************************************************************************* + /// The bitset top level template. + //************************************************************************* template - class bitset : public bitset_constants<> + class bitset { public: - // The element type is the unsigned variant of 'TElement'. - typedef typename etl::make_unsigned::type element_type; + ETL_STATIC_ASSERT(etl::is_unsigned::value, "The element type must be unsigned"); + typedef TElement element_type; typedef element_type* pointer; typedef const element_type* const_pointer; + static ETL_CONSTANT size_t npos = etl::integral_limits::max; + + //static ETL_CONSTANT bool Element_Layout = implementation::Element_Layout; + static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT size_t Number_Of_Elements = 1U; - static ETL_CONSTANT size_t Allocated_Bits = Bits_Per_Element; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::type>::max; + static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; static ETL_CONSTANT element_type All_Clear_Element = element_type(0); - static ETL_CONSTANT size_t Top_Mask_Shift = 0U; - static ETL_CONSTANT element_type Top_Mask = All_Set_Element; - - typedef etl::span span_type; - typedef etl::span const_span_type; - - //************************************************************************* - /// The reference type returned. - //************************************************************************* - class bit_reference - { - public: - - friend class bitset; - - //******************************* - /// Copy constructor. - //******************************* - ETL_CONSTEXPR14 bit_reference(const bit_reference& other) ETL_NOEXCEPT - : p_bitset(other.p_bitset) - , position(other.position) - { - } - - //******************************* - /// Conversion operator. - //******************************* - ETL_CONSTEXPR14 operator bool() const ETL_NOEXCEPT - { - return p_bitset->test(position); - } - - //******************************* - /// Assignment operator. - //******************************* - ETL_CONSTEXPR14 bit_reference& operator = (bool b) ETL_NOEXCEPT - { - p_bitset->set(position, b); - return *this; - } - - //******************************* - /// Assignment operator. - //******************************* - ETL_CONSTEXPR14 bit_reference& operator = (const bit_reference& r) ETL_NOEXCEPT - { - p_bitset->set(position, bool(r)); - return *this; - } - - //******************************* - /// Flip the bit. - //******************************* - ETL_CONSTEXPR14 bit_reference& flip() ETL_NOEXCEPT - { - p_bitset->flip(position); - return *this; - } - - //******************************* - /// Return the logical inverse of the bit. - //******************************* - ETL_CONSTEXPR14 bool operator~() const ETL_NOEXCEPT - { - return !p_bitset->test(position); - } - - private: - - //******************************* - /// Default constructor. - //******************************* - ETL_CONSTEXPR14 bit_reference() ETL_NOEXCEPT - : p_bitset(ETL_NULLPTR) - , position(0) - { - } - - //******************************* - /// Constructor. - //******************************* - ETL_CONSTEXPR14 bit_reference(bitset& r_bitset, size_t position_) ETL_NOEXCEPT - : p_bitset(&r_bitset) - , position(position_) - { - } - - bitset* p_bitset; ///< The bitset. - size_t position; ///< The position in the bitset. - }; - - //************************************************************************* - /// Default constructor. - //************************************************************************* - ETL_CONSTEXPR14 bitset() ETL_NOEXCEPT - : buffer(All_Clear_Element) - { - } - - //************************************************************************* - /// Copy constructor. - //************************************************************************* - ETL_CONSTEXPR14 bitset(const bitset& other) ETL_NOEXCEPT - : buffer(other.buffer) - { - } - - //************************************************************************* - /// Construct from a value. - //************************************************************************* - ETL_CONSTEXPR14 bitset(unsigned long long value) ETL_NOEXCEPT - : buffer(element_type(value)) - { - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset(const char* text) ETL_NOEXCEPT - : buffer(All_Clear_Element) - { - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset(const wchar_t* text) ETL_NOEXCEPT - : buffer(All_Clear_Element) - { - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset(const char16_t* text) ETL_NOEXCEPT - : buffer(All_Clear_Element) - { - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset(const char32_t* text) ETL_NOEXCEPT - : buffer(All_Clear_Element) - { - set(text); - } - - //************************************************************************* - /// Assignment operator. - //************************************************************************* - ETL_CONSTEXPR14 bitset& operator =(const bitset& other) ETL_NOEXCEPT - { - buffer = other.buffer; - - return *this; - } - - //************************************************************************* - /// Set all of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset& set() ETL_NOEXCEPT - { - buffer = All_Set_Element; - - return *this; - } - - //************************************************************************* - /// Set the bit at the position. - //************************************************************************* - ETL_CONSTEXPR14 bitset& set(size_t position, bool value = true) - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - - const element_type mask = element_type(element_type(1) << position); - if (value == true) - { - buffer |= mask; - } - else - { - buffer &= ~mask; - } - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const wchar_t* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char16_t* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char32_t* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const char* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STR('1')) - { - buffer |= mask; - } - else - { - buffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Set from a wide string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const wchar_t* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STRL('1')) - { - buffer |= mask; - } - else - { - buffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Set from a u16 string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const char16_t* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STRu('1')) - { - buffer |= mask; - } - else - { - buffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Set from a u32 string. - //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const char32_t* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STRU('1')) - { - buffer |= mask; - } - else - { - buffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Get as an integral value. - //************************************************************************* - template - ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - value() const ETL_NOEXCEPT - { - ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); - ETL_STATIC_ASSERT((sizeof(T) * CHAR_BIT) >= (Number_Of_Elements * Bits_Per_Element), "Integral type too small"); - - T v = T(0); - - const bool OK = (sizeof(T) * CHAR_BIT) >= Bits_Per_Element; - - if (OK) - { - v = T(typename etl::make_unsigned::type(buffer)); - } - - return v; - } - - //************************************************************************* - /// Extract an integral value from an arbitary position and length. - //************************************************************************* - template - ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract(size_t position, size_t length = etl::integral_limits::bits) const - { - ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); - ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - - typedef typename etl::make_unsigned::type unsigned_t; - - const unsigned_t Mask = etl::make_lsb_mask< unsigned_t>(length); - const unsigned_t Shift = position % Bits_Per_Element; - - unsigned_t value = static_cast(buffer >> Shift) & Mask; - - if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value, length); - } - - return static_cast(value); - } - - //************************************************************************* - /// Extract an integral value from an arbitary position and length. - //************************************************************************* - template ::bits> - ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract() const ETL_NOEXCEPT - { - ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); - ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - - typedef typename etl::make_unsigned::type unsigned_t; - - const unsigned_t Mask = etl::make_lsb_mask(); - const unsigned_t Shift = Position % Bits_Per_Element; - - unsigned_t value = static_cast(buffer >> Shift) & Mask; - - if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value); - } - - return static_cast(value); - } - - //************************************************************************* - /// Get as an unsigned long. - //************************************************************************* - ETL_CONSTEXPR14 unsigned long to_ulong() const ETL_NOEXCEPT - { - return value(); - } - - //************************************************************************* - /// Get as an unsigned long long. - //************************************************************************* - ETL_CONSTEXPR14 unsigned long long to_ullong() const ETL_NOEXCEPT - { - return value(); - } - - //************************************************************************* - /// Reset all of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset& reset() ETL_NOEXCEPT - { - buffer = All_Clear_Element; - - return *this; - } - - //************************************************************************* - /// Reset the bit at the position. - //************************************************************************* - ETL_CONSTEXPR14 bitset& reset(size_t position) - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - - const element_type mask = element_type(element_type(1) << position); - buffer &= ~mask; - - return *this; - } - - //************************************************************************* - /// Tests a bit at a position. - /// Positions greater than the number of configured bits will return false. - //************************************************************************* - ETL_CONSTEXPR14 bool test(size_t position) const - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), false); - - const element_type mask = element_type(element_type(1) << position); - return (buffer & mask) != 0U; - } - - //************************************************************************* - /// The number of bits in the bitset. - //************************************************************************* - ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT - { - return Active_Bits; - } - - //************************************************************************* - /// Count the number of bits set. - //************************************************************************* - ETL_CONSTEXPR14 size_t count() const ETL_NOEXCEPT - { - return etl::count_bits(buffer); - } - - //************************************************************************* - // Are all the bits sets? - //************************************************************************* - ETL_CONSTEXPR14 bool all() const ETL_NOEXCEPT - { - return buffer == All_Set_Element; - } - - //************************************************************************* - // Are all the bits sets? - //************************************************************************* - ETL_CONSTEXPR14 bool all(element_type mask) const ETL_NOEXCEPT - { - return buffer == (All_Set_Element & mask); - } - - //************************************************************************* - /// Are none of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool none() const ETL_NOEXCEPT - { - return buffer == All_Clear_Element; - } - - //************************************************************************* - /// Are none of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool none(element_type mask) const ETL_NOEXCEPT - { - return (buffer & mask) == All_Clear_Element; - } - - //************************************************************************* - /// Are any of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool any() const ETL_NOEXCEPT - { - return !none(); - } - - //************************************************************************* - /// Are any of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool any(element_type mask) const ETL_NOEXCEPT - { - return !none(mask); - } - - //************************************************************************* - /// Flip all of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset& flip() ETL_NOEXCEPT - { - buffer = ~buffer; - - return *this; - } - - //************************************************************************* - /// Flip some of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset& flip_bits(element_type mask = etl::integral_limits::max) ETL_NOEXCEPT - { - buffer ^= mask; - - return *this; - } - - //************************************************************************* - /// Flip the bit at the position. - //************************************************************************* - ETL_CONSTEXPR14 bitset& flip(size_t position) - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - - const element_type mask = element_type(element_type(1) << position); - buffer ^= mask; - - return *this; - } - - //************************************************************************* - /// Read [] operator. - //************************************************************************* - ETL_CONSTEXPR14 bool operator[] (size_t position) const ETL_NOEXCEPT - { - if (position < Active_Bits) - { - const element_type mask = element_type(element_type(1) << position); - return (buffer & mask) != 0U; - } - - return false; - } - - //************************************************************************* - /// Write [] operator. - //************************************************************************* - ETL_CONSTEXPR14 bit_reference operator [] (size_t position) ETL_NOEXCEPT - { - return bit_reference(*this, position); - } - - //************************************************************************* - /// Returns a string representing the bitset. - //************************************************************************* -#if ETL_USING_CPP11 - template > -#else - template -#endif - ETL_CONSTEXPR14 TString to_string(typename TString::value_type zero = typename TString::value_type('0'), - typename TString::value_type one = typename TString::value_type('1')) const - { - TString result; - - result.resize(Active_Bits, '\0'); - - // Check that the string type can contain the digits. - ETL_ASSERT_OR_RETURN_VALUE(result.size() == Active_Bits, ETL_ERROR(etl::bitset_string_too_small), result); - - for (size_t i = Active_Bits; i > 0; --i) - { - result[Active_Bits - i] = test(i - 1) ? one : zero; - } - - return result; - } - - //************************************************************************* - /// Finds the first bit in the specified state. - ///\param state The state to search for. - ///\returns The position of the bit or npos if none were found. - //************************************************************************* - ETL_CONSTEXPR14 size_t find_first(bool state) const ETL_NOEXCEPT - { - return find_next(state, 0U); - } - - //************************************************************************* - /// Finds the next bit in the specified state. - ///\param state The state to search for. - ///\param position The position to start from. - ///\returns The position of the bit or npos if none were found. - //************************************************************************* - ETL_CONSTEXPR14 size_t find_next(bool state, size_t position) const ETL_NOEXCEPT - { - if (position < Active_Bits) - { - // Where to start. - size_t bit = position; - - element_type mask = 1U << position; - - // Needs checking? - if ((state && (buffer != All_Clear_Element)) || (!state && (buffer != All_Set_Element))) - { - // For each bit in the element... - while (bit < Active_Bits) - { - // Equal to the required state? - if (((buffer & mask) != 0) == state) - { - return bit; - } - - // Move on to the next bit. - mask <<= 1; - ++bit; - } - } - } - - return npos; - } - - //************************************************************************* - /// operator & - //************************************************************************* - ETL_CONSTEXPR14 bitset operator &(const bitset& other) const ETL_NOEXCEPT - { - etl::bitset temp(*this); - - temp &= other; - - return temp; - } - - //************************************************************************* - /// operator &= - //************************************************************************* - ETL_CONSTEXPR14 bitset& operator &=(const bitset& other) ETL_NOEXCEPT - { - buffer &= other.buffer; - - return *this; - } - - //************************************************************************* - /// operator | - //************************************************************************* - ETL_CONSTEXPR14 bitset operator |(const bitset& other) const ETL_NOEXCEPT - { - etl::bitset temp(*this); - - temp |= other; - - return temp; - } - - //************************************************************************* - /// operator |= - //************************************************************************* - ETL_CONSTEXPR14 bitset& operator |=(const bitset& other) ETL_NOEXCEPT - { - buffer |= other.buffer; - - return *this; - } - - //************************************************************************* - /// operator ^ - //************************************************************************* - ETL_CONSTEXPR14 bitset operator ^(const bitset& other) const ETL_NOEXCEPT - { - etl::bitset temp(*this); - - temp ^= other; - - return temp; - } - - //************************************************************************* - /// operator ^= - //************************************************************************* - ETL_CONSTEXPR14 bitset& operator ^=(const bitset& other) ETL_NOEXCEPT - { - buffer ^= other.buffer; - - return *this; - } - - //************************************************************************* - /// operator ~ - //************************************************************************* - ETL_CONSTEXPR14 bitset operator ~() const ETL_NOEXCEPT - { - etl::bitset temp(*this); - - temp.flip(); - - return temp; - } - - //************************************************************************* - /// operator << - //************************************************************************* - ETL_CONSTEXPR14 bitset operator <<(size_t shift) const ETL_NOEXCEPT - { - etl::bitset temp(*this); - - temp <<= shift; - - return temp; - } - - //************************************************************************* - /// operator <<= - //************************************************************************* - ETL_CONSTEXPR14 bitset& operator <<=(size_t shift) ETL_NOEXCEPT - { - if (shift >= Active_Bits) - { - reset(); - } - else - { - buffer <<= shift; - } - - return *this; - } - - //************************************************************************* - /// operator >> - //************************************************************************* - ETL_CONSTEXPR14 bitset operator >>(size_t shift) const ETL_NOEXCEPT - { - etl::bitset temp(*this); - - temp >>= shift; - - return temp; - } - - //************************************************************************* - /// operator >>= - //************************************************************************* - ETL_CONSTEXPR14 bitset& operator >>=(size_t shift) ETL_NOEXCEPT - { - if (shift >= Active_Bits) - { - reset(); - } - else - { - buffer >>= shift; - } - - return *this; - } - - //************************************************************************* - /// operator == - //************************************************************************* - friend ETL_CONSTEXPR14 bool operator ==(const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT - { - return (lhs.buffer == rhs.buffer); - } - - //************************************************************************* - /// swap - //************************************************************************* - ETL_CONSTEXPR14 void swap(etl::bitset& other) ETL_NOEXCEPT - { - element_type temp = buffer; - buffer = other.buffer; - other.buffer = temp; - } - - //************************************************************************* - /// span - /// Returns a span of the underlying buffer. - //************************************************************************* - ETL_CONSTEXPR14 span_type span() ETL_NOEXCEPT - { - return span_type(&buffer, 1); - } - - //************************************************************************* - /// span - /// Returns a const span of the underlying buffer. - //************************************************************************* - ETL_CONSTEXPR14 const_span_type span() const ETL_NOEXCEPT - { - return const_span_type(&buffer, 1); - } - - private: - - element_type buffer; - }; - - template - ETL_CONSTANT size_t bitset::Bits_Per_Element; - - template - ETL_CONSTANT size_t bitset::Number_Of_Elements; - - template - ETL_CONSTANT size_t bitset::Allocated_Bits; - - template - ETL_CONSTANT typename bitset::element_type bitset::All_Set_Element; - - template - ETL_CONSTANT typename bitset::element_type bitset::All_Clear_Element; - - template - ETL_CONSTANT size_t bitset::Top_Mask_Shift; - - template - ETL_CONSTANT typename bitset::element_type bitset::Top_Mask; - - //************************************************************************* - /// The specialisation that uses an array of the default element type. - //************************************************************************* - template - class bitset : public bitset_constants<> - { - private: - - //************************************************************************* - // If the 'TElement' is the default 'void', then use 'char', otherwise uses - // the unsigned variant of 'TElement'. - //************************************************************************* - struct select_element_type - { - typedef typename etl::make_unsigned::value, char, TElement>::type>::type type; - }; - - public: - - typedef typename select_element_type::type element_type; - typedef element_type* pointer; - typedef const element_type* const_pointer; - - static ETL_CONSTANT size_t Bits_Per_Element = etl::bitset_impl::Bits_Per_Element; static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); - static ETL_CONSTANT element_type All_Set_Element = etl::bitset_impl::All_Set_Element; - static ETL_CONSTANT element_type All_Clear_Element = etl::bitset_impl::All_Clear_Element; static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. @@ -2042,7 +1902,7 @@ namespace etl { } - bitset* p_bitset; ///< The bitset. + bitset* p_bitset; ///< The bitset. size_t position; ///< The position in the bitset. }; @@ -2050,18 +1910,17 @@ namespace etl /// Default constructor. //************************************************************************* ETL_CONSTEXPR14 bitset() ETL_NOEXCEPT - : buffer() { - reset(); + implementation::reset(buffer, Number_Of_Elements); } //************************************************************************* /// Copy constructor. //************************************************************************* - ETL_CONSTEXPR14 bitset(const bitset& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset(const bitset& other) ETL_NOEXCEPT : buffer() { - etl::copy_n(other.buffer, Number_Of_Elements, buffer); + implementation::operator_assignment(buffer, other.buffer, Number_Of_Elements); } //************************************************************************* @@ -2070,8 +1929,7 @@ namespace etl ETL_CONSTEXPR14 bitset(unsigned long long value) ETL_NOEXCEPT : buffer() { - ibitset.initialise(buffer, Number_Of_Elements, value); - clear_unused_bits_in_msb(); + implementation::initialise(buffer, Number_Of_Elements, value); } //************************************************************************* @@ -2080,8 +1938,7 @@ namespace etl ETL_CONSTEXPR14 bitset(const char* text) ETL_NOEXCEPT : buffer() { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2090,8 +1947,7 @@ namespace etl ETL_CONSTEXPR14 bitset(const wchar_t* text) ETL_NOEXCEPT : buffer() { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2100,8 +1956,7 @@ namespace etl ETL_CONSTEXPR14 bitset(const char16_t* text) ETL_NOEXCEPT : buffer() { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2110,14 +1965,13 @@ namespace etl ETL_CONSTEXPR14 bitset(const char32_t* text) ETL_NOEXCEPT : buffer() { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* /// Assignment operator. //************************************************************************* - ETL_CONSTEXPR14 bitset& operator =(const bitset& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& operator =(const bitset& other) ETL_NOEXCEPT { etl::copy_n(other.buffer, Number_Of_Elements, buffer); @@ -2127,10 +1981,9 @@ namespace etl //************************************************************************* /// Set all of the bits. //************************************************************************* - ETL_CONSTEXPR14 bitset& set() ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& set() ETL_NOEXCEPT { - etl::fill_n(buffer, Number_Of_Elements, All_Set_Element); - clear_unused_bits_in_msb(); + implementation::set(buffer, Number_Of_Elements); return *this; } @@ -2138,12 +1991,11 @@ namespace etl //************************************************************************* /// Set the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(size_t position, bool value = true) + ETL_CONSTEXPR14 bitset& set(size_t position, bool value = true) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - ibitset.set(buffer, Number_Of_Elements, position, value); - clear_unused_bits_in_msb(); + implementation::set(buffer, Number_Of_Elements, position, value); return *this; } @@ -2151,9 +2003,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& set(const char* text) ETL_NOEXCEPT { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2161,9 +2013,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const wchar_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& set(const wchar_t* text) ETL_NOEXCEPT { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2171,9 +2023,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char16_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& set(const char16_t* text) ETL_NOEXCEPT { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2181,9 +2033,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char32_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& set(const char32_t* text) ETL_NOEXCEPT { - ibitset.set(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2191,9 +2043,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const char* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& from_string(const char* text) ETL_NOEXCEPT { - ibitset.from_string(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2201,9 +2053,9 @@ namespace etl //************************************************************************* /// Set from a wide string. //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const wchar_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& from_string(const wchar_t* text) ETL_NOEXCEPT { - ibitset.from_string(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2211,9 +2063,9 @@ namespace etl //************************************************************************* /// Set from a u16 string. //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const char16_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& from_string(const char16_t* text) ETL_NOEXCEPT { - ibitset.from_string(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2221,9 +2073,9 @@ namespace etl //************************************************************************* /// Set from a u32 string. //************************************************************************* - ETL_CONSTEXPR14 bitset& from_string(const char32_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& from_string(const char32_t* text) ETL_NOEXCEPT { - ibitset.from_string(buffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2237,9 +2089,9 @@ namespace etl value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); - ETL_STATIC_ASSERT((sizeof(T) * CHAR_BIT) >= (Number_Of_Elements * Bits_Per_Element), "Type too small"); + ETL_STATIC_ASSERT(etl::integral_limits::bits >= (Number_Of_Elements * Bits_Per_Element), "Type too small"); - return ibitset.template value(buffer, Number_Of_Elements); + return implementation::template value(buffer, Number_Of_Elements); } //************************************************************************* @@ -2247,21 +2099,14 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract(size_t position, size_t length = etl::integral_limits::bits) const + T extract(size_t position, size_t length = etl::integral_limits::bits) const { - ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); - typedef typename etl::make_unsigned::type unsigned_t; + ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - unsigned_t value = ibitset.template extract_from_buffer(buffer, position, length);; - - if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value, length); - } - - return static_cast(value); + return implementation::extract(buffer, position, length); } //************************************************************************* @@ -2269,21 +2114,13 @@ namespace etl //************************************************************************* template ::bits> ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract() const ETL_NOEXCEPT + T extract() const { - ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); + ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - typedef typename etl::make_unsigned::type unsigned_t; - - unsigned_t value = ibitset.template extract_from_buffer(buffer); - - if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value); - } - - return static_cast(value); + return implementation::extract(buffer, Position, Length); } //************************************************************************* @@ -2291,7 +2128,9 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 unsigned long to_ulong() const ETL_NOEXCEPT { - return value(); + ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "to_ulong() : Active_Bits > unsigned long"); + + return implementation::template value(buffer, Number_Of_Elements); } //************************************************************************* @@ -2299,14 +2138,17 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 unsigned long long to_ullong() const ETL_NOEXCEPT { - return value(); + ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "to_ullong() : Active_Bits > unsigned long long"); + + return implementation::template value(buffer, Number_Of_Elements); } + //************************************************************************* /// Reset all of the bits. //************************************************************************* - ETL_CONSTEXPR14 bitset& reset() ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& reset() ETL_NOEXCEPT { - etl::fill_n(buffer, Number_Of_Elements, All_Clear_Element); + implementation::reset(buffer, Number_Of_Elements); return *this; } @@ -2314,11 +2156,11 @@ namespace etl //************************************************************************* /// Reset the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset& reset(size_t position) + ETL_CONSTEXPR14 bitset& reset(size_t position) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - ibitset.reset(buffer, Number_Of_Elements, position); + implementation::reset(buffer, Number_Of_Elements, position); return *this; } @@ -2331,7 +2173,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), false); - return ibitset.test(buffer, Number_Of_Elements, position); + return implementation::test(buffer, Number_Of_Elements, position); } //************************************************************************* @@ -2347,7 +2189,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 size_t count() const ETL_NOEXCEPT { - return ibitset.count(buffer, Number_Of_Elements); + return implementation::count(buffer, Number_Of_Elements); } //************************************************************************* @@ -2355,7 +2197,15 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool all() const ETL_NOEXCEPT { - return ibitset.all(buffer, Number_Of_Elements, Top_Mask); + return implementation::all(buffer, Number_Of_Elements, Top_Mask); + } + + //************************************************************************* + // Are all the mask bits sets? + //************************************************************************* + ETL_CONSTEXPR14 bool all(element_type mask) const ETL_NOEXCEPT + { + return implementation::all(buffer, Number_Of_Elements, Top_Mask, mask); } //************************************************************************* @@ -2363,7 +2213,15 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool none() const ETL_NOEXCEPT { - return ibitset.none(buffer, Number_Of_Elements); + return implementation::none(buffer, Number_Of_Elements); + } + + //************************************************************************* + /// Are none of the mask bits set? + //************************************************************************* + ETL_CONSTEXPR14 bool none(element_type mask) const ETL_NOEXCEPT + { + return implementation::none(buffer, Number_Of_Elements, mask); } //************************************************************************* @@ -2371,16 +2229,23 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool any() const ETL_NOEXCEPT { - return !none(); + return implementation::any(buffer, Number_Of_Elements); } + //************************************************************************* + /// Are any of the mask bits set? + //************************************************************************* + ETL_CONSTEXPR14 bool any(element_type mask) const ETL_NOEXCEPT + { + return implementation::any(buffer, Number_Of_Elements, mask); + } + //************************************************************************* /// Flip all of the bits. //************************************************************************* - ETL_CONSTEXPR14 bitset& flip() ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& flip() ETL_NOEXCEPT { - ibitset.flip(buffer, Number_Of_Elements); - clear_unused_bits_in_msb(); + implementation::flip(buffer, Number_Of_Elements); return *this; } @@ -2388,11 +2253,11 @@ namespace etl //************************************************************************* /// Flip the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset& flip(size_t position) + ETL_CONSTEXPR14 bitset& flip(size_t position) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - ibitset.flip(buffer, Number_Of_Elements, position); + implementation::flip(buffer, Number_Of_Elements, position); return *this; } @@ -2402,7 +2267,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool operator[] (size_t position) const ETL_NOEXCEPT { - return ibitset.test(buffer, Number_Of_Elements, position); + return implementation::test(buffer, Number_Of_Elements, position); } //************************************************************************* @@ -2424,7 +2289,7 @@ namespace etl ETL_CONSTEXPR14 TString to_string(typename TString::value_type zero = typename TString::value_type('0'), typename TString::value_type one = typename TString::value_type('1')) const { - return ibitset.template to_string(buffer, Number_Of_Elements, Active_Bits, zero, one); + return implementation::template to_string(buffer, Number_Of_Elements, Active_Bits, zero, one); } //************************************************************************* @@ -2434,7 +2299,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 size_t find_first(bool state) const ETL_NOEXCEPT { - return ibitset.find_next(buffer, Number_Of_Elements, Active_Bits, state, 0); + return implementation::find_next(buffer, Number_Of_Elements, Active_Bits, state, 0); } //************************************************************************* @@ -2445,17 +2310,17 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 size_t find_next(bool state, size_t position) const ETL_NOEXCEPT { - return ibitset.find_next(buffer, Number_Of_Elements, Active_Bits, state, position); + return implementation::find_next(buffer, Number_Of_Elements, Active_Bits, state, position); } //************************************************************************* /// operator & //************************************************************************* - ETL_CONSTEXPR14 bitset operator &(const bitset& other) const ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset operator &(const bitset& other) const ETL_NOEXCEPT { - etl::bitset temp(*this); + etl::bitset temp(*this); - temp &= other; + implementation::operator_and(temp.buffer, other.buffer, Number_Of_Elements); return temp; } @@ -2463,9 +2328,9 @@ namespace etl //************************************************************************* /// operator &= //************************************************************************* - ETL_CONSTEXPR14 bitset& operator &=(const bitset& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& operator &=(const bitset& other) ETL_NOEXCEPT { - ibitset.and_equals(&buffer[0], &other.buffer[0], Number_Of_Elements); + implementation::operator_and(buffer, other.buffer, Number_Of_Elements); return *this; } @@ -2473,11 +2338,11 @@ namespace etl //************************************************************************* /// operator | //************************************************************************* - ETL_CONSTEXPR14 bitset operator |(const bitset& other) const ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset operator |(const bitset& other) const ETL_NOEXCEPT { - etl::bitset temp(*this); + etl::bitset temp(*this); - temp |= other; + implementation::operator_or(temp.buffer, other.buffer, Number_Of_Elements); return temp; } @@ -2485,9 +2350,9 @@ namespace etl //************************************************************************* /// operator |= //************************************************************************* - ETL_CONSTEXPR14 bitset& operator |=(const bitset& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& operator |=(const bitset& other) ETL_NOEXCEPT { - ibitset.or_equals(&buffer[0], &other.buffer[0], Number_Of_Elements); + implementation::operator_or(&buffer[0], &other.buffer[0], Number_Of_Elements); return *this; } @@ -2495,11 +2360,11 @@ namespace etl //************************************************************************* /// operator ^ //************************************************************************* - ETL_CONSTEXPR14 bitset operator ^(const bitset& other) const ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset operator ^(const bitset& other) const ETL_NOEXCEPT { - etl::bitset temp(*this); + etl::bitset temp(*this); - temp ^= other; + implementation::operator_xor(temp.buffer, other.buffer, Number_Of_Elements); return temp; } @@ -2507,9 +2372,9 @@ namespace etl //************************************************************************* /// operator ^= //************************************************************************* - ETL_CONSTEXPR14 bitset& operator ^=(const bitset& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& operator ^=(const bitset& other) ETL_NOEXCEPT { - ibitset.xor_equals(&buffer[0], &other.buffer[0], Number_Of_Elements); + implementation::operator_xor(buffer, other.buffer, Number_Of_Elements); return *this; } @@ -2517,11 +2382,11 @@ namespace etl //************************************************************************* /// operator ~ //************************************************************************* - ETL_CONSTEXPR14 bitset operator ~() const ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset operator ~() const ETL_NOEXCEPT { - etl::bitset temp(*this); + etl::bitset temp(*this); - temp.flip(); + implementation::flip(temp.buffer, Number_Of_Elements); return temp; } @@ -2529,11 +2394,11 @@ namespace etl //************************************************************************* /// operator << //************************************************************************* - ETL_CONSTEXPR14 bitset operator <<(size_t shift) const ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset operator <<(size_t shift) const ETL_NOEXCEPT { - etl::bitset temp(*this); + etl::bitset temp(*this); - temp <<= shift; + implementation::operator_shift_left(temp.buffer, Number_Of_Elements, Active_Bits, shift); return temp; } @@ -2541,16 +2406,15 @@ namespace etl //************************************************************************* /// operator <<= //************************************************************************* - ETL_CONSTEXPR14 bitset& operator <<=(size_t shift) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& operator <<=(size_t shift) ETL_NOEXCEPT { if (shift >= Active_Bits) { - reset(); + implementation::reset(buffer, Number_Of_Elements); } else { - ibitset.shift_left_equals(buffer, Number_Of_Elements, shift); - clear_unused_bits_in_msb(); + implementation::operator_shift_left(buffer, Number_Of_Elements, Active_Bits, shift); } return *this; @@ -2559,11 +2423,11 @@ namespace etl //************************************************************************* /// operator >> //************************************************************************* - ETL_CONSTEXPR14 bitset operator >>(size_t shift) const ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset operator >>(size_t shift) const ETL_NOEXCEPT { - bitset temp(*this); + bitset temp(*this); - temp >>= shift; + implementation::operator_shift_right(temp.buffer, Number_Of_Elements, Active_Bits, shift); return temp; } @@ -2571,15 +2435,15 @@ namespace etl //************************************************************************* /// operator >>= //************************************************************************* - ETL_CONSTEXPR14 bitset& operator >>=(size_t shift) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset& operator >>=(size_t shift) ETL_NOEXCEPT { if (shift >= Active_Bits) { - reset(); + implementation::reset(buffer, Number_Of_Elements); } else { - ibitset.shift_right_equals(buffer, Number_Of_Elements, shift); + implementation::operator_shift_right(buffer, Number_Of_Elements, Active_Bits, shift); } return *this; @@ -2588,7 +2452,7 @@ namespace etl //************************************************************************* /// operator == //************************************************************************* - friend ETL_CONSTEXPR14 bool operator ==(const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT + friend ETL_CONSTEXPR14 bool operator ==(const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT { return etl::equal(lhs.buffer, lhs.buffer + lhs.Number_Of_Elements, @@ -2598,9 +2462,9 @@ namespace etl //************************************************************************* /// swap //************************************************************************* - ETL_CONSTEXPR14 void swap(etl::bitset& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 void swap(etl::bitset& other) ETL_NOEXCEPT { - ibitset.swap(buffer, other.buffer, Number_Of_Elements); + implementation::swap(buffer, other.buffer, Number_Of_Elements); } //************************************************************************* @@ -2626,43 +2490,24 @@ namespace etl //************************************************************************* /// Correct the unused top bits after bit manipulation. //************************************************************************* - ETL_CONSTEXPR14 void clear_unused_bits_in_msb() ETL_NOEXCEPT + ETL_CONSTEXPR14 static void clear_unused_bits_in_msb(pointer pbuffer) ETL_NOEXCEPT { buffer[Number_Of_Elements - 1U] &= Top_Mask; } - etl::bitset_impl ibitset; + // The implementation of the bitset functionality. + typedef etl::bitset_impl implementation; - element_type buffer[Number_Of_Elements > 0U ? Number_Of_Elements : 1U]; + // The storage for the bitset. + element_type buffer[Number_Of_Elements]; }; - template - ETL_CONSTANT size_t bitset::Bits_Per_Element; - - template - ETL_CONSTANT size_t bitset::Number_Of_Elements; - - template - ETL_CONSTANT size_t bitset::Allocated_Bits; - - template - ETL_CONSTANT typename bitset::element_type bitset::All_Set_Element; - - template - ETL_CONSTANT typename bitset::element_type bitset::All_Clear_Element; - - template - ETL_CONSTANT size_t bitset::Top_Mask_Shift; - - template - ETL_CONSTANT typename bitset::element_type bitset::Top_Mask; - //*************************************************************************** /// operator & ///\ingroup bitset //*************************************************************************** - template - ETL_CONSTEXPR14 bitset operator & (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 bitset operator & (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT { bitset temp(lhs); temp &= rhs; @@ -2673,8 +2518,8 @@ namespace etl /// operator | ///\ingroup bitset //*************************************************************************** - template - ETL_CONSTEXPR14 bitset operator | (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 bitset operator | (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT { bitset temp(lhs); temp |= rhs; @@ -2685,8 +2530,8 @@ namespace etl /// operator ^ ///\ingroup bitset //*************************************************************************** - template - ETL_CONSTEXPR14 bitset operator ^ (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 bitset operator ^ (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT { bitset temp(lhs); temp ^= rhs; @@ -2697,8 +2542,8 @@ namespace etl /// operator != ///\ingroup bitset //*************************************************************************** - template - ETL_CONSTEXPR14 bool operator != (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 bool operator != (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT { return !(lhs == rhs); } @@ -2707,8 +2552,8 @@ namespace etl //************************************************************************* /// swap //************************************************************************* -template -ETL_CONSTEXPR14 void swap(etl::bitset& lhs, etl::bitset& rhs) ETL_NOEXCEPT +template +ETL_CONSTEXPR14 void swap(etl::bitset& lhs, etl::bitset& rhs) ETL_NOEXCEPT { lhs.swap(rhs); } @@ -2720,990 +2565,65 @@ namespace etl { //*************************************************************************** template ::bits == Active_Bits> - class bitset_ext; - - //*************************************************************************** - /// Specialisation for zero bits. - /// Just defines 'npos'. - //*************************************************************************** - template <> - class bitset_ext<0U, char, true> : public bitset_constants<> - { - }; + typename TElement = unsigned char> + class bitset_ext; //*************************************************************************** /// Specialisation for zero bits. //*************************************************************************** template <> - class bitset_ext<0U, char, false> : public bitset_constants<> - { - }; - - //*************************************************************************** - /// Specialisation that uses a single element if the element type is the - /// same size as the number of active bits. - //*************************************************************************** - template - class bitset_ext : public bitset_constants<> + class bitset_ext<0U, unsigned char> { public: - // The element type is the unsigned variant of 'TElement'. - typedef typename etl::make_unsigned::type element_type; + typedef unsigned char element_type; typedef element_type* pointer; typedef const element_type* const_pointer; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT size_t Number_Of_Elements = 1U; - static ETL_CONSTANT size_t Allocated_Bits = Bits_Per_Element; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::type>::max; - static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + static ETL_CONSTANT size_t Bits_Per_Element = 0U; + static ETL_CONSTANT size_t Number_Of_Elements = 0U; + static ETL_CONSTANT size_t Allocated_Bits = 0U; + static ETL_CONSTANT element_type All_Set_Element = 0U; + static ETL_CONSTANT element_type All_Clear_Element = 0U; static ETL_CONSTANT size_t Top_Mask_Shift = 0U; - static ETL_CONSTANT element_type Top_Mask = All_Set_Element; + static ETL_CONSTANT element_type Top_Mask = 0U; - typedef etl::span span_type; - typedef etl::span const_span_type; - - typedef element_type buffer_type; - - //************************************************************************* - /// The reference type returned. - //************************************************************************* - class bit_reference - { - public: - - friend class bitset_ext; - - //******************************* - /// Copy constructor. - //******************************* - ETL_CONSTEXPR14 bit_reference(const bit_reference& other) ETL_NOEXCEPT - : p_bitset(other.p_bitset) - , position(other.position) - { - } - - //******************************* - /// Conversion operator. - //******************************* - ETL_CONSTEXPR14 operator bool() const ETL_NOEXCEPT - { - return p_bitset->test(position); - } - - //******************************* - /// Assignment operator. - //******************************* - ETL_CONSTEXPR14 bit_reference& operator = (bool b) ETL_NOEXCEPT - { - p_bitset->set(position, b); - return *this; - } - - //******************************* - /// Assignment operator. - //******************************* - ETL_CONSTEXPR14 bit_reference& operator = (const bit_reference& r) ETL_NOEXCEPT - { - p_bitset->set(position, bool(r)); - return *this; - } - - //******************************* - /// Flip the bit. - //******************************* - ETL_CONSTEXPR14 bit_reference& flip() ETL_NOEXCEPT - { - p_bitset->flip(position); - return *this; - } - - //******************************* - /// Return the logical inverse of the bit. - //******************************* - ETL_CONSTEXPR14 bool operator~() const ETL_NOEXCEPT - { - return !p_bitset->test(position); - } - - private: - - //******************************* - /// Default constructor. - //******************************* - ETL_CONSTEXPR14 bit_reference() ETL_NOEXCEPT - : p_bitset(ETL_NULLPTR) - , position(0) - { - } - - //******************************* - /// Constructor. - //******************************* - ETL_CONSTEXPR14 bit_reference(bitset_ext& r_bitset, size_t position_) ETL_NOEXCEPT - : p_bitset(&r_bitset) - , position(position_) - { - } - - bitset_ext* p_bitset; ///< The bitset. - size_t position; ///< The position in the bitset. - }; - - //************************************************************************* - /// Default constructor. - //************************************************************************* - ETL_CONSTEXPR14 explicit bitset_ext(element_type* pbuffer_) - : pbuffer(pbuffer_) - { - ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - *pbuffer = All_Clear_Element; - } - - //************************************************************************* - /// Default constructor. - //************************************************************************* - ETL_CONSTEXPR14 explicit bitset_ext(buffer_type& buffer) ETL_NOEXCEPT - : pbuffer(&buffer) - { - *pbuffer = All_Clear_Element; - } - - //************************************************************************* - /// Construct copy. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, element_type* pbuffer_) - : pbuffer(pbuffer_) - { - ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - *pbuffer = *other.pbuffer; - } - - //************************************************************************* - /// Construct copy. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, buffer_type& buffer) ETL_NOEXCEPT - : pbuffer(&buffer) - { - *pbuffer = *other.pbuffer; - } - - //************************************************************************* - /// Copy Constructor (Deleted). - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other) ETL_NOEXCEPT ETL_DELETE; - - //************************************************************************* - /// Construct from a value. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(unsigned long long value, element_type* pbuffer_) - : pbuffer(pbuffer_) - { - ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - *pbuffer = element_type(value); - } - - //************************************************************************* - /// Construct from a value. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(unsigned long long value, buffer_type& buffer) ETL_NOEXCEPT - : pbuffer(&buffer) - { - *pbuffer = element_type(value); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char* text, element_type* pbuffer_) - : pbuffer(pbuffer_) - { - ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char* text, buffer_type& buffer) ETL_NOEXCEPT - : pbuffer(&buffer) - { - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, element_type* pbuffer_) - : pbuffer(pbuffer_) - { - ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, buffer_type& buffer) ETL_NOEXCEPT - : pbuffer(&buffer) - { - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char16_t* text, element_type* pbuffer_) - : pbuffer(pbuffer_) - { - ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char16_t* text, buffer_type& buffer) ETL_NOEXCEPT - : pbuffer(&buffer) - { - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char32_t* text, element_type* pbuffer_) - : pbuffer(pbuffer_) - { - ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Construct from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const char32_t* text, buffer_type& buffer) ETL_NOEXCEPT - : pbuffer(&buffer) - { - *pbuffer = All_Clear_Element; - set(text); - } - - //************************************************************************* - /// Assignment operator. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator =(const bitset_ext& other) ETL_NOEXCEPT - { - *pbuffer = *other.pbuffer; - - return *this; - } - - //************************************************************************* - /// Set all of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set() ETL_NOEXCEPT - { - *pbuffer = All_Set_Element; - - return *this; - } - - //************************************************************************* - /// Set the bit at the position. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(size_t position, bool value = true) - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - - const element_type mask = element_type(element_type(1) << position); - if (value == true) - { - *pbuffer |= mask; - } - else - { - *pbuffer &= ~mask; - } - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const wchar_t* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char16_t* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char32_t* text) ETL_NOEXCEPT - { - from_string(text); - - return *this; - } - - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const char* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STR('1')) - { - *pbuffer |= mask; - } - else - { - *pbuffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Set from a wide string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const wchar_t* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STRL('1')) - { - *pbuffer |= mask; - } - else - { - *pbuffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Set from a u16 string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const char16_t* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STRu('1')) - { - *pbuffer |= mask; - } - else - { - *pbuffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Set from a u32 string. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const char32_t* text) ETL_NOEXCEPT - { - if (text == ETL_NULLPTR) - { - reset(); - } - else - { - size_t string_length = etl::strlen(text); - - // Build from the string. - string_length = etl::min(Active_Bits, string_length); - - element_type mask = element_type(element_type(1) << (string_length - 1U)); - - for (size_t i = 0U; i < string_length; ++i) - { - if (text[i] == ETL_STRU('1')) - { - *pbuffer |= mask; - } - else - { - *pbuffer &= ~mask; - } - - mask >>= 1U; - } - } - - return *this; - } - - //************************************************************************* - /// Get as an integral value. - //************************************************************************* - template - ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - value() const ETL_NOEXCEPT - { - ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); - ETL_STATIC_ASSERT((sizeof(T) * CHAR_BIT) >= (Number_Of_Elements * Bits_Per_Element), "Integral type too small"); - - T v = T(0); - - const bool OK = (sizeof(T) * CHAR_BIT) >= Bits_Per_Element; - - if (OK) - { - v = T(typename etl::make_unsigned::type(*pbuffer)); - } - - return v; - } - - //************************************************************************* - /// Extract an integral value from an arbitary position and length. - //************************************************************************* - template - ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract(size_t position, size_t length = etl::integral_limits::bits) const - { - ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - - typedef typename etl::make_unsigned::type unsigned_t; - - 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; - - if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value, length); - } - - return static_cast(value); - } - - //************************************************************************* - /// Extract an integral value from an arbitary position and length. - //************************************************************************* - template ::bits> - ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract() const ETL_NOEXCEPT - { - ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - - typedef typename etl::make_unsigned::type unsigned_t; - - const unsigned_t Mask = etl::make_lsb_mask(); - const unsigned_t Shift = Position % Bits_Per_Element; - - unsigned_t value = static_cast(*pbuffer >> Shift) & Mask; - - if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value); - } - - return static_cast(value); - } - - //************************************************************************* - /// Get as an unsigned long. - //************************************************************************* - ETL_CONSTEXPR14 unsigned long to_ulong() const ETL_NOEXCEPT - { - return value(); - } - - //************************************************************************* - /// Get as an unsigned long long. - //************************************************************************* - ETL_CONSTEXPR14 unsigned long long to_ullong() const ETL_NOEXCEPT - { - return value(); - } - - //************************************************************************* - /// Reset all of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& reset() ETL_NOEXCEPT - { - *pbuffer = All_Clear_Element; - - return *this; - } - - //************************************************************************* - /// Reset the bit at the position. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& reset(size_t position) - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - - const element_type mask = element_type(element_type(1) << position); - *pbuffer &= ~mask; - - return *this; - } - - //************************************************************************* - /// Tests a bit at a position. - /// Positions greater than the number of configured bits will return false. - //************************************************************************* - ETL_CONSTEXPR14 bool test(size_t position) const - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), false); - - const element_type mask = element_type(element_type(1) << position); - return (*pbuffer & mask) != 0U; - } - - //************************************************************************* - /// The number of bits in the bitset. - //************************************************************************* - ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT - { - return Active_Bits; - } - - //************************************************************************* - /// Count the number of bits set. - //************************************************************************* - ETL_CONSTEXPR14 size_t count() const ETL_NOEXCEPT - { - return etl::count_bits(*pbuffer); - } - - //************************************************************************* - // Are all the bits sets? - //************************************************************************* - ETL_CONSTEXPR14 bool all() const ETL_NOEXCEPT - { - return *pbuffer == All_Set_Element; - } - - //************************************************************************* - // Are all the bits sets? - //************************************************************************* - ETL_CONSTEXPR14 bool all(element_type mask) const ETL_NOEXCEPT - { - return *pbuffer == (All_Set_Element & mask); - } - - //************************************************************************* - /// Are none of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool none() const ETL_NOEXCEPT - { - return *pbuffer == All_Clear_Element; - } - - //************************************************************************* - /// Are none of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool none(element_type mask) const ETL_NOEXCEPT - { - return (*pbuffer & mask) == All_Clear_Element; - } - - //************************************************************************* - /// Are any of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool any() const ETL_NOEXCEPT - { - return !none(); - } - - //************************************************************************* - /// Are any of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 bool any(element_type mask) const ETL_NOEXCEPT - { - return !none(mask); - } - - //************************************************************************* - /// Flip all of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& flip() ETL_NOEXCEPT - { - *pbuffer = ~*pbuffer; - - return *this; - } - - //************************************************************************* - /// Flip some of the bits. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& flip_bits(element_type mask = etl::integral_limits::max) ETL_NOEXCEPT - { - *pbuffer ^= mask; - - return *this; - } - - //************************************************************************* - /// Flip the bit at the position. - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& flip(size_t position) - { - ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - - const element_type mask = element_type(element_type(1) << position); - *pbuffer ^= mask; - - return *this; - } - - //************************************************************************* - /// Read [] operator. - //************************************************************************* - ETL_CONSTEXPR14 bool operator[] (size_t position) const ETL_NOEXCEPT - { - if (position < Active_Bits) - { - const element_type mask = element_type(element_type(1) << position); - return (*pbuffer & mask) != 0U; - } - - return false; - } - - //************************************************************************* - /// Write [] operator. - //************************************************************************* - ETL_CONSTEXPR14 bit_reference operator [] (size_t position) ETL_NOEXCEPT - { - return bit_reference(*this, position); - } - - //************************************************************************* - /// Returns a string representing the bitset. - //************************************************************************* -#if ETL_USING_CPP11 - template > -#else - template -#endif - ETL_CONSTEXPR14 TString to_string(typename TString::value_type zero = typename TString::value_type('0'), - typename TString::value_type one = typename TString::value_type('1')) const - { - TString result; - - result.resize(Active_Bits, '\0'); - - // Check that the string type can contain the digits. - ETL_ASSERT_OR_RETURN_VALUE(result.size() == Active_Bits, ETL_ERROR(etl::bitset_string_too_small), result); - - for (size_t i = Active_Bits; i > 0; --i) - { - result[Active_Bits - i] = test(i - 1) ? one : zero; - } - - return result; - } - - //************************************************************************* - /// Finds the first bit in the specified state. - ///\param state The state to search for. - ///\returns The position of the bit or npos if none were found. - //************************************************************************* - ETL_CONSTEXPR14 size_t find_first(bool state) const ETL_NOEXCEPT - { - return find_next(state, 0U); - } - - //************************************************************************* - /// Finds the next bit in the specified state. - ///\param state The state to search for. - ///\param position The position to start from. - ///\returns The position of the bit or npos if none were found. - //************************************************************************* - ETL_CONSTEXPR14 size_t find_next(bool state, size_t position) const ETL_NOEXCEPT - { - if (position < Active_Bits) - { - // Where to start. - size_t bit = position; - - element_type mask = 1U << position; - - // Needs checking? - if ((state && (*pbuffer != All_Clear_Element)) || (!state && (*pbuffer != All_Set_Element))) - { - // For each bit in the element... - while (bit < Active_Bits) - { - // Equal to the required state? - if (((*pbuffer & mask) != 0) == state) - { - return bit; - } - - // Move on to the next bit. - mask <<= 1; - ++bit; - } - } - } - - return npos; - } - - //************************************************************************* - /// operator &= - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator &=(const bitset_ext& other) ETL_NOEXCEPT - { - *pbuffer &= *other.pbuffer; - - return *this; - } - - //************************************************************************* - /// operator |= - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator |=(const bitset_ext& other) ETL_NOEXCEPT - { - *pbuffer |= *other.pbuffer; - - return *this; - } - - //************************************************************************* - /// operator ^= - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator ^=(const bitset_ext& other) ETL_NOEXCEPT - { - *pbuffer ^= *other.pbuffer; - - return *this; - } - - //************************************************************************* - /// operator <<= - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator <<=(size_t shift) ETL_NOEXCEPT - { - if (shift >= Active_Bits) - { - reset(); - } - else - { - *pbuffer <<= shift; - } - - return *this; - } - - //************************************************************************* - /// operator >>= - //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator >>=(size_t shift) ETL_NOEXCEPT - { - if (shift >= Active_Bits) - { - reset(); - } - else - { - *pbuffer >>= shift; - } - - return *this; - } - - //************************************************************************* - /// operator == - //************************************************************************* - friend ETL_CONSTEXPR14 bool operator ==(const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT - { - return (*lhs.pbuffer == *rhs.pbuffer); - } - - //************************************************************************* - /// swap - //************************************************************************* - ETL_CONSTEXPR14 void swap(etl::bitset_ext& other) ETL_NOEXCEPT - { - element_type temp = *pbuffer; - *pbuffer = *other.pbuffer; - *other.pbuffer = temp; - } - - //************************************************************************* - /// span - /// Returns a span of the underlying buffer. - //************************************************************************* - ETL_CONSTEXPR14 span_type span() ETL_NOEXCEPT - { - return span_type(pbuffer, 1); - } - - //************************************************************************* - /// span - /// Returns a const span of the underlying buffer. - //************************************************************************* - ETL_CONSTEXPR14 const_span_type span() const ETL_NOEXCEPT - { - return const_span_type(pbuffer, 1); - } - - private: - - element_type* pbuffer; + static ETL_CONSTANT size_t npos = etl::integral_limits::max; }; - template - ETL_CONSTANT size_t bitset_ext::Bits_Per_Element; - - template - ETL_CONSTANT size_t bitset_ext::Number_Of_Elements; - - template - ETL_CONSTANT size_t bitset_ext::Allocated_Bits; - - template - ETL_CONSTANT typename bitset_ext::element_type bitset_ext::All_Set_Element; - - template - ETL_CONSTANT typename bitset_ext::element_type bitset_ext::All_Clear_Element; - - template - ETL_CONSTANT size_t bitset_ext::Top_Mask_Shift; - - template - ETL_CONSTANT typename bitset_ext::element_type bitset_ext::Top_Mask; - //************************************************************************* /// The specialisation that uses an array of the default element type. //************************************************************************* template - class bitset_ext : public bitset_constants<> + class bitset_ext// : public etl::private_bitset::bitset_common { - private: - - //************************************************************************* - // If the 'TElement' is the default 'void', then use 'char', otherwise uses - // the unsigned variant of 'TElement'. - //************************************************************************* - struct select_element_type - { - typedef typename etl::make_unsigned::value, char, TElement>::type>::type type; - }; - public: - typedef typename select_element_type::type element_type; - typedef element_type* pointer; + ETL_STATIC_ASSERT(etl::is_unsigned::value, "The element type must be unsigned"); + + typedef TElement element_type; + typedef element_type* pointer; typedef const element_type* const_pointer; - static ETL_CONSTANT size_t Bits_Per_Element = etl::bitset_impl::Bits_Per_Element; + static ETL_CONSTANT size_t npos = etl::integral_limits::max; + + //static ETL_CONSTANT bool Element_Layout = implementation::Element_Layout; + + static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; + static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; + static ETL_CONSTANT element_type All_Clear_Element = element_type(0); static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); - static ETL_CONSTANT element_type All_Set_Element = etl::bitset_impl::All_Set_Element; - static ETL_CONSTANT element_type All_Clear_Element = etl::bitset_impl::All_Clear_Element; static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. + typedef etl::array buffer_type; typedef etl::span span_type; typedef etl::span const_span_type; - typedef etl::array buffer_type; - //************************************************************************* /// The reference type returned. //************************************************************************* @@ -3785,7 +2705,7 @@ namespace etl { } - bitset_ext* p_bitset; ///< The bitset. + bitset_ext* p_bitset; ///< The bitset. size_t position; ///< The position in the bitset. }; @@ -3812,7 +2732,7 @@ namespace etl //************************************************************************* /// Construct copy. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, element_type* pbuffer_) + ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, element_type* pbuffer_) : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); @@ -3822,7 +2742,7 @@ namespace etl //************************************************************************* /// Construct copy. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, buffer_type& buffer) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { etl::copy_n(other.pbuffer, Number_Of_Elements, pbuffer); @@ -3831,7 +2751,7 @@ namespace etl //************************************************************************* /// Copy Constructor (Deleted). //************************************************************************* - ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other) ETL_NOEXCEPT ETL_DELETE; + ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other) ETL_NOEXCEPT ETL_DELETE; //************************************************************************* /// Construct from a value. @@ -3840,8 +2760,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - ibitset.initialise(pbuffer, Number_Of_Elements, value); - clear_unused_bits_in_msb(); + implementation::initialise(pbuffer, Number_Of_Elements, value); } //************************************************************************* @@ -3850,8 +2769,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(unsigned long long value, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - ibitset.initialise(pbuffer, Number_Of_Elements, value); - clear_unused_bits_in_msb(); + implementation::initialise(pbuffer, Number_Of_Elements, value); } //************************************************************************* @@ -3861,8 +2779,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -3871,8 +2788,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const char* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -3882,8 +2798,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -3892,8 +2807,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -3903,8 +2817,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -3913,8 +2826,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const char16_t* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -3924,8 +2836,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -3934,16 +2845,15 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const char32_t* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* /// Assignment operator. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator =(const bitset_ext& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& operator =(const bitset_ext& other) ETL_NOEXCEPT { - etl::copy_n(other.pbuffer, Number_Of_Elements, pbuffer); + implementation::operator_assignment(pbuffer, other.pbuffer, Number_Of_Elements); return *this; } @@ -3951,10 +2861,9 @@ namespace etl //************************************************************************* /// Set all of the bits. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set() ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& set() ETL_NOEXCEPT { - etl::fill_n(pbuffer, Number_Of_Elements, All_Set_Element); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, All_Set_Element); return *this; } @@ -3962,12 +2871,11 @@ namespace etl //************************************************************************* /// Set the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(size_t position, bool value = true) + ETL_CONSTEXPR14 bitset_ext& set(size_t position, bool value = true) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - ibitset.set(pbuffer, Number_Of_Elements, position, value); - clear_unused_bits_in_msb(); + implementation::set(pbuffer, Number_Of_Elements, position, value); return *this; } @@ -3975,9 +2883,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& set(const char* text) ETL_NOEXCEPT { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -3985,9 +2893,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const wchar_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& set(const wchar_t* text) ETL_NOEXCEPT { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -3995,9 +2903,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char16_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& set(const char16_t* text) ETL_NOEXCEPT { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -4005,9 +2913,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char32_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& set(const char32_t* text) ETL_NOEXCEPT { - ibitset.set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -4015,9 +2923,9 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const char* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& from_string(const char* text) ETL_NOEXCEPT { - ibitset.from_string(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -4025,9 +2933,9 @@ namespace etl //************************************************************************* /// Set from a wide string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const wchar_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& from_string(const wchar_t* text) ETL_NOEXCEPT { - ibitset.from_string(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -4035,9 +2943,9 @@ namespace etl //************************************************************************* /// Set from a u16 string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const char16_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& from_string(const char16_t* text) ETL_NOEXCEPT { - ibitset.from_string(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -4045,9 +2953,9 @@ namespace etl //************************************************************************* /// Set from a u32 string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& from_string(const char32_t* text) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& from_string(const char32_t* text) ETL_NOEXCEPT { - ibitset.from_string(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -4057,13 +2965,12 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - value() const ETL_NOEXCEPT + T value() const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); - ETL_STATIC_ASSERT((sizeof(T) * CHAR_BIT) >= (Number_Of_Elements * Bits_Per_Element), "Type too small"); + ETL_STATIC_ASSERT(etl::integral_limits::bits >= (Number_Of_Elements * Bits_Per_Element), "Type too small"); - return ibitset.template value(pbuffer, Number_Of_Elements); + return implementation::template value(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -4071,21 +2978,14 @@ namespace etl //************************************************************************* template ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract(size_t position, size_t length = etl::integral_limits::bits) const + T extract(size_t position, size_t length = etl::integral_limits::bits) { - ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); + ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); - typedef typename etl::make_unsigned::type unsigned_t; + ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); + ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - unsigned_t value = ibitset.template extract_from_buffer(pbuffer, position, length); - - if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value, length); - } - - return static_cast(value); + return implementation::extract(pbuffer, position, length); } //************************************************************************* @@ -4093,21 +2993,13 @@ namespace etl //************************************************************************* template ::bits> ETL_CONSTEXPR14 - typename etl::enable_if::value, T>::type - extract() const ETL_NOEXCEPT + T extract() const { - ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); + ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); + ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); + ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - typedef typename etl::make_unsigned::type unsigned_t; - - unsigned_t value = ibitset.template extract_from_buffer(pbuffer); - - if ETL_IF_CONSTEXPR((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) - { - value = etl::sign_extend(value); - } - - return static_cast(value); + return implementation::extract(pbuffer, Position, Length); } //************************************************************************* @@ -4115,7 +3007,9 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 unsigned long to_ulong() const ETL_NOEXCEPT { - return value(); + ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "Active_Bits > unsigned long"); + + return implementation::template value(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -4123,14 +3017,17 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 unsigned long long to_ullong() const ETL_NOEXCEPT { - return value(); + ETL_STATIC_ASSERT(etl::integral_limits::bits >= Active_Bits, "Active_Bits > unsigned long long"); + + return implementation::template value(pbuffer, Number_Of_Elements); } + //************************************************************************* /// Reset all of the bits. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& reset() ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& reset() ETL_NOEXCEPT { - etl::fill_n(pbuffer, Number_Of_Elements, All_Clear_Element); + implementation::reset(pbuffer, Number_Of_Elements); return *this; } @@ -4138,11 +3035,11 @@ namespace etl //************************************************************************* /// Reset the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& reset(size_t position) + ETL_CONSTEXPR14 bitset_ext& reset(size_t position) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - ibitset.reset(pbuffer, Number_Of_Elements, position); + implementation::reset(pbuffer, Number_Of_Elements, position); return *this; } @@ -4155,7 +3052,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), false); - return ibitset.test(pbuffer, Number_Of_Elements, position); + return implementation::test(pbuffer, Number_Of_Elements, position); } //************************************************************************* @@ -4171,7 +3068,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 size_t count() const ETL_NOEXCEPT { - return ibitset.count(pbuffer, Number_Of_Elements); + return implementation::count(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -4179,7 +3076,15 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool all() const ETL_NOEXCEPT { - return ibitset.all(pbuffer, Number_Of_Elements, Top_Mask); + return implementation::all(pbuffer, Number_Of_Elements, Top_Mask); + } + + //************************************************************************* + // Are all the mask bits sets? + //************************************************************************* + ETL_CONSTEXPR14 bool all(element_type mask) const ETL_NOEXCEPT + { + return implementation::all(pbuffer, Number_Of_Elements, Top_Mask, mask); } //************************************************************************* @@ -4187,7 +3092,15 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool none() const ETL_NOEXCEPT { - return ibitset.none(pbuffer, Number_Of_Elements); + return implementation::none(pbuffer, Number_Of_Elements); + } + + //************************************************************************* + /// Are none of the mask bits set? + //************************************************************************* + ETL_CONSTEXPR14 bool none(element_type mask) const ETL_NOEXCEPT + { + return implementation::none(pbuffer, Number_Of_Elements, mask); } //************************************************************************* @@ -4195,16 +3108,23 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool any() const ETL_NOEXCEPT { - return !none(); + return implementation::any(pbuffer, Number_Of_Elements, Top_Mask); + } + + //************************************************************************* + /// Are any of the mask bits set? + //************************************************************************* + ETL_CONSTEXPR14 bool any(element_type mask) const ETL_NOEXCEPT + { + return implementation::any(pbuffer, Number_Of_Elements, Top_Mask, mask); } //************************************************************************* /// Flip all of the bits. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& flip() ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& flip() ETL_NOEXCEPT { - ibitset.flip(pbuffer, Number_Of_Elements); - clear_unused_bits_in_msb(); + implementation::flip(pbuffer, Number_Of_Elements); return *this; } @@ -4212,11 +3132,11 @@ namespace etl //************************************************************************* /// Flip the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& flip(size_t position) + ETL_CONSTEXPR14 bitset_ext& flip(size_t position) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - ibitset.flip(pbuffer, Number_Of_Elements, position); + implementation::flip(pbuffer, Number_Of_Elements, position); return *this; } @@ -4226,7 +3146,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool operator[] (size_t position) const ETL_NOEXCEPT { - return ibitset.test(pbuffer, Number_Of_Elements, position); + return implementation::test(pbuffer, Number_Of_Elements, position); } //************************************************************************* @@ -4248,7 +3168,7 @@ namespace etl ETL_CONSTEXPR14 TString to_string(typename TString::value_type zero = typename TString::value_type('0'), typename TString::value_type one = typename TString::value_type('1')) const { - return ibitset.template to_string(pbuffer, Number_Of_Elements, Active_Bits, zero, one); + return implementation::template to_string(pbuffer, Number_Of_Elements, Active_Bits, zero, one); } //************************************************************************* @@ -4258,7 +3178,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 size_t find_first(bool state) const ETL_NOEXCEPT { - return ibitset.find_next(pbuffer, Number_Of_Elements, Active_Bits, state, 0); + return implementation::find_next(pbuffer, Number_Of_Elements, Active_Bits, state, 0); } //************************************************************************* @@ -4269,15 +3189,15 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 size_t find_next(bool state, size_t position) const ETL_NOEXCEPT { - return ibitset.find_next(pbuffer, Number_Of_Elements, Active_Bits, state, position); + return implementation::find_next(pbuffer, Number_Of_Elements, Active_Bits, state, position); } //************************************************************************* /// operator &= //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator &=(const bitset_ext& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& operator &=(const bitset_ext& other) ETL_NOEXCEPT { - ibitset.and_equals(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); + implementation::operator_and(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); return *this; } @@ -4285,9 +3205,9 @@ namespace etl //************************************************************************* /// operator |= //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator |=(const bitset_ext& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& operator |=(const bitset_ext& other) ETL_NOEXCEPT { - ibitset.or_equals(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); + implementation::operator_or(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); return *this; } @@ -4295,9 +3215,9 @@ namespace etl //************************************************************************* /// operator ^= //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator ^=(const bitset_ext& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& operator ^=(const bitset_ext& other) ETL_NOEXCEPT { - ibitset.xor_equals(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); + implementation::xoperator_or(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); return *this; } @@ -4305,17 +3225,9 @@ namespace etl //************************************************************************* /// operator <<= //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator <<=(size_t shift) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& operator <<=(size_t shift) ETL_NOEXCEPT { - if (shift >= Active_Bits) - { - reset(); - } - else - { - ibitset.shift_left_equals(pbuffer, Number_Of_Elements, shift); - clear_unused_bits_in_msb(); - } + implementation::operator_shift_left(pbuffer, Number_Of_Elements, Active_Bits, shift); return *this; } @@ -4323,16 +3235,9 @@ namespace etl //************************************************************************* /// operator >>= //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& operator >>=(size_t shift) ETL_NOEXCEPT + ETL_CONSTEXPR14 bitset_ext& operator >>=(size_t shift) ETL_NOEXCEPT { - if (shift >= Active_Bits) - { - reset(); - } - else - { - ibitset.shift_right_equals(pbuffer, Number_Of_Elements, shift); - } + implementation::operator_shift_right(pbuffer, Number_Of_Elements, Active_Bits, shift); return *this; } @@ -4340,19 +3245,17 @@ namespace etl //************************************************************************* /// operator == //************************************************************************* - friend ETL_CONSTEXPR14 bool operator ==(const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT + friend ETL_CONSTEXPR14 bool operator ==(const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT { - return etl::equal(lhs.pbuffer, - lhs.pbuffer + lhs.Number_Of_Elements, - rhs.pbuffer); + return etl::equal(lhs.pbuffer, lhs.pbuffer + lhs.Number_Of_Elements, rhs.pbuffer); } //************************************************************************* /// swap //************************************************************************* - ETL_CONSTEXPR14 void swap(etl::bitset_ext& other) ETL_NOEXCEPT + ETL_CONSTEXPR14 void swap(etl::bitset_ext& other) ETL_NOEXCEPT { - ibitset.swap(pbuffer, other.pbuffer, Number_Of_Elements); + implementation::swap(pbuffer, other.pbuffer, Number_Of_Elements); } //************************************************************************* @@ -4378,42 +3281,24 @@ namespace etl //************************************************************************* /// Correct the unused top bits after bit manipulation. //************************************************************************* - ETL_CONSTEXPR14 void clear_unused_bits_in_msb() ETL_NOEXCEPT + ETL_CONSTEXPR14 static void clear_unused_bits_in_msb() ETL_NOEXCEPT { pbuffer[Number_Of_Elements - 1U] &= Top_Mask; } - etl::bitset_impl ibitset; + // The implementation of the bitset functionality. + typedef etl::bitset_impl implementation; + + // Pointer to the storage for the bitset. element_type* pbuffer; }; - template - ETL_CONSTANT size_t bitset_ext::Bits_Per_Element; - - template - ETL_CONSTANT size_t bitset_ext::Number_Of_Elements; - - template - ETL_CONSTANT size_t bitset_ext::Allocated_Bits; - - template - ETL_CONSTANT typename bitset_ext::element_type bitset_ext::All_Set_Element; - - template - ETL_CONSTANT typename bitset_ext::element_type bitset_ext::All_Clear_Element; - - template - ETL_CONSTANT size_t bitset_ext::Top_Mask_Shift; - - template - ETL_CONSTANT typename bitset_ext::element_type bitset_ext::Top_Mask; - //*************************************************************************** /// operator != ///\ingroup bitset //*************************************************************************** - template - ETL_CONSTEXPR14 bool operator != (const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 bool operator != (const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT { return !(lhs == rhs); } @@ -4422,13 +3307,12 @@ namespace etl //************************************************************************* /// swap //************************************************************************* -template -ETL_CONSTEXPR14 void swap(etl::bitset_ext& lhs, etl::bitset_ext& rhs) ETL_NOEXCEPT +template +ETL_CONSTEXPR14 void swap(etl::bitset_ext& lhs, etl::bitset_ext& rhs) ETL_NOEXCEPT { lhs.swap(rhs); } - #include "minmax_pop.h" #endif diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 05ed79a9..291c6836 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -123,7 +123,7 @@ namespace TEST(test_default_constructor) { ETL_CONSTEXPR14 std::bitset<64> compare; - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data; CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -137,10 +137,10 @@ namespace //************************************************************************* TEST(test_default_constructor_single_element) { - etl::bitset<8, int8_t> data8; - etl::bitset<16, int16_t> data16; - etl::bitset<32, int32_t> data32; - etl::bitset<64, int64_t> data64; + etl::bitset<8, uint8_t> data8; + etl::bitset<16, uint16_t> data16; + etl::bitset<32, uint32_t> data32; + etl::bitset<64, uint64_t> data64; CHECK_EQUAL(1U, data8.Number_Of_Elements); CHECK_EQUAL(1U, data16.Number_Of_Elements); @@ -152,7 +152,7 @@ namespace TEST(test_construct_from_value) { ETL_CONSTEXPR14 std::bitset<64> compare(0x123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(0x123456731234567ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(0x123456731234567ULL); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -168,10 +168,10 @@ namespace TEST(test_copy_construct) { ETL_CONSTEXPR14 std::bitset<64> compare(0x123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(0x123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data_copy(data); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(0x123456731234567ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data_copy(data); - CHECK_EQUAL(compare.size(), data_copy.size()); + CHECK_EQUAL(compare.size(), data_copy.size()); CHECK_EQUAL(compare.count(), data_copy.count()); for (size_t i = 0UL; i < data_copy.size(); ++i) @@ -184,7 +184,7 @@ namespace TEST(test_construct_from_excess_value) { ETL_CONSTEXPR14 std::bitset<64> compare(0x8765432187654321ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(0x8765432187654321ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(0x8765432187654321ULL); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -199,7 +199,7 @@ namespace TEST(test_construct_from_char_string) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64, uint64_t> data("110001001000110100010101100111001100010010001101000101011001"); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -214,9 +214,9 @@ namespace TEST(test_construct_from_wchar_t_string) { std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data(L"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64, uint64_t> data(L"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -229,9 +229,9 @@ namespace TEST(test_construct_from_char16_t_string) { std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data(u"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64, uint64_t> data(u"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -244,9 +244,9 @@ namespace TEST(test_construct_from_char32_t_string) { std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data(U"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64, uint64_t> data(U"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -260,7 +260,7 @@ namespace { const char* s = nullptr; - etl::bitset<60, int64_t> data(s); + etl::bitset<60, uint64_t> data(s); CHECK_EQUAL(60, data.size()); CHECK_EQUAL(0, data.count()); @@ -271,10 +271,10 @@ namespace { const wchar_t* s = nullptr; - etl::bitset<60, int64_t> data(s); + etl::bitset<60, uint64_t> data(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -282,10 +282,10 @@ namespace { const char16_t* s = nullptr; - etl::bitset<60, int64_t> data(s); + etl::bitset<60, uint64_t> data(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -293,17 +293,17 @@ namespace { const char32_t* s = nullptr; - etl::bitset<60, int64_t> data(s); + etl::bitset<60, uint64_t> data(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* TEST(test_construct_from_excess_string) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001111100001"); - etl::bitset<64, int64_t> data("110001001000110100010101100111001100010010001101000101011001111100001"); + etl::bitset<64, uint64_t> data("110001001000110100010101100111001100010010001101000101011001111100001"); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -320,9 +320,9 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_set_helper() + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_set_helper() { - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.set(); return data; @@ -331,7 +331,7 @@ namespace TEST(test_set) { std::bitset<64> compare; - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(test_set_helper()); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_set_helper()); compare.set(); @@ -357,7 +357,7 @@ namespace TEST(test_set_with_char_string) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.set("110001001000110100010101100111001100010010001101000101011001"); @@ -377,15 +377,15 @@ namespace TEST(test_set_with_wchar_t_string) { std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.set(L"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -397,15 +397,15 @@ namespace TEST(test_set_with_char16_t_string) { std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.set(u"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -417,15 +417,15 @@ namespace TEST(test_set_with_char32_t_string) { std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.set(U"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -438,11 +438,11 @@ namespace { const char* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.set(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -450,11 +450,11 @@ namespace { const wchar_t* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.set(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -462,11 +462,11 @@ namespace { const char16_t* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.set(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -474,26 +474,26 @@ namespace { const char32_t* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.set(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* TEST(test_from_string_with_char) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.from_string("110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -505,15 +505,15 @@ namespace TEST(test_from_string_with_wchar_t) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.from_string(L"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -525,15 +525,15 @@ namespace TEST(test_from_char16_t_6string) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.from_string(u"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -545,15 +545,15 @@ namespace TEST(test_from_string_with_char32_t) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.from_string(U"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -566,11 +566,11 @@ namespace { const char* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.from_string(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -578,11 +578,11 @@ namespace { const wchar_t* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.from_string(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -590,11 +590,11 @@ namespace { const char16_t* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.from_string(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -602,11 +602,11 @@ namespace { const char32_t* s = nullptr; - etl::bitset<60, int64_t> data; + etl::bitset<60, uint64_t> data; data.from_string(s); CHECK_EQUAL(60, data.size()); - CHECK_EQUAL(0, data.count()); + CHECK_EQUAL(0, data.count()); } //************************************************************************* @@ -721,7 +721,7 @@ namespace TEST(test_value_u64_min) { ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::min); - ETL_CONSTEXPR14 int64_t value = data.value(); + ETL_CONSTEXPR14 uint64_t value = data.value(); CHECK_EQUAL(std::numeric_limits::min(), value); } @@ -730,7 +730,7 @@ namespace TEST(test_value_u64_max) { ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::max); - ETL_CONSTEXPR14 int64_t value = data.value(); + ETL_CONSTEXPR14 uint64_t value = data.value(); CHECK_EQUAL(std::numeric_limits::max(), value); } @@ -739,7 +739,7 @@ namespace TEST(test_value_s64_min) { ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::min); - ETL_CONSTEXPR14 int64_t value = data.value(); + ETL_CONSTEXPR14 uint64_t value = data.value(); CHECK_EQUAL(std::numeric_limits::min(), value); } @@ -748,7 +748,7 @@ namespace TEST(test_value_s64_max) { ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::max); - ETL_CONSTEXPR14 int64_t value = data.value(); + ETL_CONSTEXPR14 uint64_t value = data.value(); CHECK_EQUAL(std::numeric_limits::max(), value); } @@ -757,7 +757,7 @@ namespace TEST(test_position_set) { std::bitset<64> compare; - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; for (size_t i = 0UL; i < data.size(); ++i) { @@ -786,9 +786,9 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_reset_helper() + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_reset_helper() { - etl::bitset<64, int64_t> data(0xFFFFFFFFFFFFFFFULL); + etl::bitset<64, uint64_t> data(0xFFFFFFFFFFFFFFFULL); data.reset(); return data; @@ -797,7 +797,7 @@ namespace TEST(test_reset) { std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(test_reset_helper()); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_reset_helper()); compare.reset(); @@ -814,9 +814,9 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_position_reset_helper() + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_position_reset_helper() { - etl::bitset<64, int64_t> data(0xFFFFFFFFFFFFFFFULL); + etl::bitset<64, uint64_t> data(0xFFFFFFFFFFFFFFFULL); data.reset(1); data.reset(3); data.reset(7); @@ -828,7 +828,7 @@ namespace TEST(test_position_reset) { std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(test_position_reset_helper()); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_position_reset_helper()); compare.reset(1); compare.reset(3); @@ -875,7 +875,7 @@ namespace TEST(test_index_operator_read) { ETL_CONSTEXPR14 std::bitset<64> compare(0x3123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(0x3123456731234567ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(0x3123456731234567ULL); ETL_CONSTEXPR14 bool bc0 = compare[1U]; ETL_CONSTEXPR14 bool bd0 = data[1U]; @@ -895,9 +895,9 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_index_operator_write_helper() + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_index_operator_write_helper() { - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data[1U] = true; data[3U] = true; @@ -909,7 +909,7 @@ namespace TEST(test_index_operator_write) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(test_index_operator_write_helper()); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_index_operator_write_helper()); CHECK(data[1U]); CHECK(data[3U]); @@ -920,10 +920,10 @@ namespace //************************************************************************* TEST(test_any) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(ull(0x0000000000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(ull(0x1000010001000100)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 bool bd1 = data1.any(); ETL_CONSTEXPR14 bool bd2 = data2.any(); @@ -939,10 +939,10 @@ namespace //************************************************************************* TEST(test_any_with_mask) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(ull(0xF000000000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(ull(0x1000010001000100)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(ull(0xF000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 ull mask = ull(0x0FFFFFFFFFFFFFFF); @@ -960,10 +960,10 @@ namespace //************************************************************************* TEST(test_none) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(ull(0x0000000000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(ull(0x1000010001000100)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 bool bd1 = data1.none(); ETL_CONSTEXPR14 bool bd2 = data2.none(); @@ -979,10 +979,10 @@ namespace //************************************************************************* TEST(test_none_with_mask) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(ull(0xF000000000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(ull(0x1000010001000100)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(ull(0xF000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 ull mask = ull(0x0FFFFFFFFFFFFFFF); @@ -1000,10 +1000,10 @@ namespace //************************************************************************* TEST(test_all) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(ull(0x0000000000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(ull(0x1000010001000100)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 bool bd1 = data1.all(); ETL_CONSTEXPR14 bool bd2 = data2.all(); @@ -1019,10 +1019,10 @@ namespace //************************************************************************* TEST(test_all_with_mask) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(ull(0x0000000000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(ull(0x1000010001000100)); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(ull(0x0FFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(ull(0x0FFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 ull mask = ull(0x0FFFFFFFFFFFFFFF); @@ -1038,9 +1038,129 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_flip_helper() + TEST(test_any_with_reduced_active_bits) { - etl::bitset<64, int64_t> data; + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 bool bd1 = data1.any(); + ETL_CONSTEXPR14 bool bd2 = data2.any(); + ETL_CONSTEXPR14 bool bd3 = data3.any(); + ETL_CONSTEXPR14 bool bd4 = data4.any(); + + CHECK_FALSE(bd1); + CHECK_TRUE(bd2); + CHECK_TRUE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_any_with_mask_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data1(ull(0xF000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 ull mask = ull(0x0FFFFFFFFFFFFFFF); + + ETL_CONSTEXPR14 bool bd1 = data1.any(mask); + ETL_CONSTEXPR14 bool bd2 = data2.any(mask); + ETL_CONSTEXPR14 bool bd3 = data3.any(mask); + ETL_CONSTEXPR14 bool bd4 = data4.any(mask); + + CHECK_FALSE(bd1); + CHECK_TRUE(bd2); + CHECK_TRUE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_none_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 bool bd1 = data1.none(); + ETL_CONSTEXPR14 bool bd2 = data2.none(); + ETL_CONSTEXPR14 bool bd3 = data3.none(); + ETL_CONSTEXPR14 bool bd4 = data4.none(); + + CHECK_TRUE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_FALSE(bd4); + } + + //************************************************************************* + TEST(test_none_with_mask_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data1(ull(0xF000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 ull mask = ull(0x0FFFFFFFFFFFFFFF); + + ETL_CONSTEXPR14 bool bd1 = data1.none(mask); + ETL_CONSTEXPR14 bool bd2 = data2.none(mask); + ETL_CONSTEXPR14 bool bd3 = data3.none(mask); + ETL_CONSTEXPR14 bool bd4 = data4.none(mask); + + CHECK_TRUE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_FALSE(bd4); + } + + //************************************************************************* + TEST(test_all_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 bool bd1 = data1.all(); + ETL_CONSTEXPR14 bool bd2 = data2.all(); + ETL_CONSTEXPR14 bool bd3 = data3.all(); + ETL_CONSTEXPR14 bool bd4 = data4.all(); + + CHECK_FALSE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_all_with_mask_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60, uint64_t> data4(ull(0x0FFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 ull mask = ull(0x00FFFFFFFFFFFFFF); + + ETL_CONSTEXPR14 bool bd1 = data1.all(mask); + ETL_CONSTEXPR14 bool bd2 = data2.all(mask); + ETL_CONSTEXPR14 bool bd3 = data3.all(mask); + ETL_CONSTEXPR14 bool bd4 = data4.all(mask); + + CHECK_FALSE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_flip_helper() + { + etl::bitset<64, uint64_t> data; data.flip(); return data; @@ -1049,7 +1169,7 @@ namespace TEST(test_flip) { std::bitset<64> compare; - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(test_flip_helper()); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_flip_helper()); compare.flip(); @@ -1060,9 +1180,9 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_flip_position_helper() + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_flip_position_helper() { - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data.flip(1); data.flip(3); data.flip(7); @@ -1074,7 +1194,7 @@ namespace TEST(test_flip_position) { std::bitset<64> compare; - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(test_flip_position_helper()); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_flip_position_helper()); compare.flip(1); compare.flip(3); @@ -1088,9 +1208,9 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_flip_reference_helper() + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_flip_reference_helper() { - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; data[1].flip(); data[3].flip(); data[7].flip(); @@ -1102,7 +1222,7 @@ namespace TEST(test_flip_reference) { std::bitset<64> compare; - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data(test_flip_reference_helper()); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_flip_reference_helper()); compare[1].flip(); compare[3].flip(); @@ -1119,7 +1239,7 @@ namespace TEST(test_invert_reference) { std::bitset<64> compare; - etl::bitset<64, int64_t> data; + etl::bitset<64, uint64_t> data; bool bc = ~compare[3]; bool bd = ~data[3]; @@ -1127,7 +1247,7 @@ namespace } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_assignment_operator_helper(etl::bitset<64, int64_t> to, const etl::bitset<64, int64_t>& from) + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_assignment_operator_helper(etl::bitset<64, uint64_t> to, const etl::bitset<64, uint64_t>& from) { to = from; @@ -1137,8 +1257,8 @@ namespace TEST(test_assignment_operator) { ETL_CONSTEXPR14 std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0xFFFFFFFFFFFFFFFULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(test_assignment_operator_helper(etl::bitset<64, int64_t>(), data1)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0xFFFFFFFFFFFFFFFULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(test_assignment_operator_helper(etl::bitset<64, uint64_t>(), data1)); for (size_t i = 0UL; i < data2.size(); ++i) { @@ -1149,9 +1269,9 @@ namespace //************************************************************************* TEST(test_equality_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3; ETL_CONSTEXPR14 bool equal = (data1 == data2); ETL_CONSTEXPR14 bool not_equal = !(data1 == data3); @@ -1163,9 +1283,9 @@ namespace //************************************************************************* TEST(test_inequality_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3; ETL_CONSTEXPR14 bool equal = !(data1 != data2); ETL_CONSTEXPR14 bool not_equal = (data1 != data3); @@ -1177,38 +1297,38 @@ namespace //************************************************************************* TEST(test_shift_left_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift1(0x2468ACF0ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift2(0x48D159E0ULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift11(0x91A2B3C000ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift1(0x2468ACF0ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift2(0x48D159E0ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift11(0x91A2B3C000ULL); - CHECK((generate_shift_left_bitset<64, int64_t>(0x12345678ULL, 1U)) == shift1); - CHECK((generate_shift_left_bitset<64, int64_t>(0x12345678ULL, 2U)) == shift2); - CHECK((generate_shift_left_bitset<64, int64_t>(0x12345678ULL, 11U)) == shift11); + CHECK((generate_shift_left_bitset<64, uint64_t>(0x12345678ULL, 1U)) == shift1); + CHECK((generate_shift_left_bitset<64, uint64_t>(0x12345678ULL, 2U)) == shift2); + CHECK((generate_shift_left_bitset<64, uint64_t>(0x12345678ULL, 11U)) == shift11); } //************************************************************************* TEST(test_shift_left_operator_overflow) { - ETL_CONSTEXPR14 etl::bitset<32, int32_t> data(generate_shift_left_bitset<32, int32_t>(0x7FFFFFFFULL, 1U)); - ETL_CONSTEXPR14 etl::bitset<32, int32_t> shifted(0xFFFFFFFEUL); + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> data(generate_shift_left_bitset<32, uint32_t>(0x7FFFFFFFULL, 1U)); + ETL_CONSTEXPR14 etl::bitset<32, uint32_t> shifted(0xFFFFFFFEUL); - CHECK_EQUAL_HEX(shifted.value(), data.value()); + CHECK_EQUAL_HEX(shifted.value(), data.value()); } //************************************************************************* TEST(test_shift_left_copy_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift8(0x1234567800ULL); - CHECK_EQUAL_HEX(shift8.value(), (generate_shift_left_bitset_copy<64, int64_t>(0x12345678UL, 8U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift8(0x1234567800ULL); + CHECK_EQUAL_HEX(shift8.value(), (generate_shift_left_bitset_copy<64, uint64_t>(0x12345678UL, 8U).value())); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift16(0x123456780000ULL); - CHECK_EQUAL_HEX(shift16.value(), (generate_shift_left_bitset_copy<64, int64_t>(0x12345678UL, 16U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift16(0x123456780000ULL); + CHECK_EQUAL_HEX(shift16.value(), (generate_shift_left_bitset_copy<64, uint64_t>(0x12345678UL, 16U).value())); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift24(0x12345678000000ULL); - CHECK_EQUAL_HEX(shift24.value(), (generate_shift_left_bitset_copy<64, int64_t>(0x12345678UL, 24U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift24(0x12345678000000ULL); + CHECK_EQUAL_HEX(shift24.value(), (generate_shift_left_bitset_copy<64, uint64_t>(0x12345678UL, 24U).value())); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift64(0x0000000000000000ULL); - CHECK_EQUAL_HEX(shift64.value(), (generate_shift_left_bitset_copy<64, int64_t>(0x12345678UL, 64U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift64(0x0000000000000000ULL); + CHECK_EQUAL_HEX(shift64.value(), (generate_shift_left_bitset_copy<64, uint64_t>(0x12345678UL, 64U).value())); } //************************************************************************* @@ -1286,189 +1406,189 @@ namespace //************************************************************************* TEST(test_shift_right_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift1(0x91A2B3CULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift2(0x48D159EULL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift11(0x2468AULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift1(0x91A2B3CULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift2(0x48D159EULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift11(0x2468AULL); - CHECK_EQUAL_HEX(shift1.value(), (generate_shift_right_bitset<64, int64_t>(0x12345678ULL, 1U).value())); - CHECK_EQUAL_HEX(shift2.value(), (generate_shift_right_bitset<64, int64_t>(0x12345678ULL, 2U).value())); - CHECK_EQUAL_HEX(shift11.value(), (generate_shift_right_bitset<64, int64_t>(0x12345678ULL, 11U).value())); + CHECK_EQUAL_HEX(shift1.value(), (generate_shift_right_bitset<64, uint64_t>(0x12345678ULL, 1U).value())); + CHECK_EQUAL_HEX(shift2.value(), (generate_shift_right_bitset<64, uint64_t>(0x12345678ULL, 2U).value())); + CHECK_EQUAL_HEX(shift11.value(), (generate_shift_right_bitset<64, uint64_t>(0x12345678ULL, 11U).value())); } //************************************************************************* TEST(test_shift_right_copy_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift8(0x123456ULL); - CHECK_EQUAL_HEX(shift8.value(), (generate_shift_right_bitset_copy<64, int64_t>(0x12345678UL, 8U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift8(0x123456ULL); + CHECK_EQUAL_HEX(shift8.value(), (generate_shift_right_bitset_copy<64, uint64_t>(0x12345678UL, 8U).value())); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift16(0x1234ULL); - CHECK_EQUAL_HEX(shift16.value(), (generate_shift_right_bitset_copy<64, int64_t>(0x12345678UL, 16U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift16(0x1234ULL); + CHECK_EQUAL_HEX(shift16.value(), (generate_shift_right_bitset_copy<64, uint64_t>(0x12345678UL, 16U).value())); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift24(0x12ULL); - CHECK_EQUAL_HEX(shift24.value(), (generate_shift_right_bitset_copy<64, int64_t>(0x12345678UL, 24U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift24(0x12ULL); + CHECK_EQUAL_HEX(shift24.value(), (generate_shift_right_bitset_copy<64, uint64_t>(0x12345678UL, 24U).value())); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> shift60(0x00ULL); - CHECK_EQUAL_HEX(shift60.value(), (generate_shift_right_bitset_copy<64, int64_t>(0x12345678UL, 60U).value())); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> shift60(0x00ULL); + CHECK_EQUAL_HEX(shift60.value(), (generate_shift_right_bitset_copy<64, uint64_t>(0x12345678UL, 60U).value())); } //************************************************************************* TEST(test_shift_right_operator_all_shifts_full_size) { - int64_t value = 0x0123456789ABCDEFULL; + uint64_t value = 0x0123456789ABCDEFULL; - CHECK_EQUAL_HEX((value >> 0U), (generate_shift_right_bitset<64, int64_t>(value, 0U).value())); - CHECK_EQUAL_HEX((value >> 1U), (generate_shift_right_bitset<64, int64_t>(value, 1U).value())); - CHECK_EQUAL_HEX((value >> 2U), (generate_shift_right_bitset<64, int64_t>(value, 2U).value())); - CHECK_EQUAL_HEX((value >> 3U), (generate_shift_right_bitset<64, int64_t>(value, 3U).value())); - CHECK_EQUAL_HEX((value >> 4U), (generate_shift_right_bitset<64, int64_t>(value, 4U).value())); - CHECK_EQUAL_HEX((value >> 5U), (generate_shift_right_bitset<64, int64_t>(value, 5U).value())); - CHECK_EQUAL_HEX((value >> 6U), (generate_shift_right_bitset<64, int64_t>(value, 6U).value())); - CHECK_EQUAL_HEX((value >> 7U), (generate_shift_right_bitset<64, int64_t>(value, 7U).value())); - CHECK_EQUAL_HEX((value >> 8U), (generate_shift_right_bitset<64, int64_t>(value, 8U).value())); - CHECK_EQUAL_HEX((value >> 9U), (generate_shift_right_bitset<64, int64_t>(value, 9U).value())); - CHECK_EQUAL_HEX((value >> 10U), (generate_shift_right_bitset<64, int64_t>(value, 10U).value())); - CHECK_EQUAL_HEX((value >> 11U), (generate_shift_right_bitset<64, int64_t>(value, 11U).value())); - CHECK_EQUAL_HEX((value >> 12U), (generate_shift_right_bitset<64, int64_t>(value, 12U).value())); - CHECK_EQUAL_HEX((value >> 13U), (generate_shift_right_bitset<64, int64_t>(value, 13U).value())); - CHECK_EQUAL_HEX((value >> 14U), (generate_shift_right_bitset<64, int64_t>(value, 14U).value())); - CHECK_EQUAL_HEX((value >> 15U), (generate_shift_right_bitset<64, int64_t>(value, 15U).value())); - CHECK_EQUAL_HEX((value >> 16U), (generate_shift_right_bitset<64, int64_t>(value, 16U).value())); - CHECK_EQUAL_HEX((value >> 17U), (generate_shift_right_bitset<64, int64_t>(value, 17U).value())); - CHECK_EQUAL_HEX((value >> 18U), (generate_shift_right_bitset<64, int64_t>(value, 18U).value())); - CHECK_EQUAL_HEX((value >> 19U), (generate_shift_right_bitset<64, int64_t>(value, 19U).value())); - CHECK_EQUAL_HEX((value >> 20U), (generate_shift_right_bitset<64, int64_t>(value, 20U).value())); - CHECK_EQUAL_HEX((value >> 21U), (generate_shift_right_bitset<64, int64_t>(value, 21U).value())); - CHECK_EQUAL_HEX((value >> 22U), (generate_shift_right_bitset<64, int64_t>(value, 22U).value())); - CHECK_EQUAL_HEX((value >> 23U), (generate_shift_right_bitset<64, int64_t>(value, 23U).value())); - CHECK_EQUAL_HEX((value >> 24U), (generate_shift_right_bitset<64, int64_t>(value, 24U).value())); - CHECK_EQUAL_HEX((value >> 25U), (generate_shift_right_bitset<64, int64_t>(value, 25U).value())); - CHECK_EQUAL_HEX((value >> 26U), (generate_shift_right_bitset<64, int64_t>(value, 26U).value())); - CHECK_EQUAL_HEX((value >> 27U), (generate_shift_right_bitset<64, int64_t>(value, 27U).value())); - CHECK_EQUAL_HEX((value >> 28U), (generate_shift_right_bitset<64, int64_t>(value, 28U).value())); - CHECK_EQUAL_HEX((value >> 29U), (generate_shift_right_bitset<64, int64_t>(value, 29U).value())); - CHECK_EQUAL_HEX((value >> 30U), (generate_shift_right_bitset<64, int64_t>(value, 30U).value())); - CHECK_EQUAL_HEX((value >> 31U), (generate_shift_right_bitset<64, int64_t>(value, 31U).value())); - CHECK_EQUAL_HEX((value >> 32U), (generate_shift_right_bitset<64, int64_t>(value, 32U).value())); - CHECK_EQUAL_HEX((value >> 33U), (generate_shift_right_bitset<64, int64_t>(value, 33U).value())); - CHECK_EQUAL_HEX((value >> 34U), (generate_shift_right_bitset<64, int64_t>(value, 34U).value())); - CHECK_EQUAL_HEX((value >> 35U), (generate_shift_right_bitset<64, int64_t>(value, 35U).value())); - CHECK_EQUAL_HEX((value >> 36U), (generate_shift_right_bitset<64, int64_t>(value, 36U).value())); - CHECK_EQUAL_HEX((value >> 37U), (generate_shift_right_bitset<64, int64_t>(value, 37U).value())); - CHECK_EQUAL_HEX((value >> 38U), (generate_shift_right_bitset<64, int64_t>(value, 38U).value())); - CHECK_EQUAL_HEX((value >> 39U), (generate_shift_right_bitset<64, int64_t>(value, 39U).value())); - CHECK_EQUAL_HEX((value >> 40U), (generate_shift_right_bitset<64, int64_t>(value, 40U).value())); - CHECK_EQUAL_HEX((value >> 41U), (generate_shift_right_bitset<64, int64_t>(value, 41U).value())); - CHECK_EQUAL_HEX((value >> 42U), (generate_shift_right_bitset<64, int64_t>(value, 42U).value())); - CHECK_EQUAL_HEX((value >> 43U), (generate_shift_right_bitset<64, int64_t>(value, 43U).value())); - CHECK_EQUAL_HEX((value >> 44U), (generate_shift_right_bitset<64, int64_t>(value, 44U).value())); - CHECK_EQUAL_HEX((value >> 45U), (generate_shift_right_bitset<64, int64_t>(value, 45U).value())); - CHECK_EQUAL_HEX((value >> 46U), (generate_shift_right_bitset<64, int64_t>(value, 46U).value())); - CHECK_EQUAL_HEX((value >> 47U), (generate_shift_right_bitset<64, int64_t>(value, 47U).value())); - CHECK_EQUAL_HEX((value >> 48U), (generate_shift_right_bitset<64, int64_t>(value, 48U).value())); - CHECK_EQUAL_HEX((value >> 49U), (generate_shift_right_bitset<64, int64_t>(value, 49U).value())); - CHECK_EQUAL_HEX((value >> 50U), (generate_shift_right_bitset<64, int64_t>(value, 50U).value())); - CHECK_EQUAL_HEX((value >> 51U), (generate_shift_right_bitset<64, int64_t>(value, 51U).value())); - CHECK_EQUAL_HEX((value >> 52U), (generate_shift_right_bitset<64, int64_t>(value, 52U).value())); - CHECK_EQUAL_HEX((value >> 53U), (generate_shift_right_bitset<64, int64_t>(value, 53U).value())); - CHECK_EQUAL_HEX((value >> 54U), (generate_shift_right_bitset<64, int64_t>(value, 54U).value())); - CHECK_EQUAL_HEX((value >> 55U), (generate_shift_right_bitset<64, int64_t>(value, 55U).value())); - CHECK_EQUAL_HEX((value >> 56U), (generate_shift_right_bitset<64, int64_t>(value, 56U).value())); - CHECK_EQUAL_HEX((value >> 57U), (generate_shift_right_bitset<64, int64_t>(value, 57U).value())); - CHECK_EQUAL_HEX((value >> 58U), (generate_shift_right_bitset<64, int64_t>(value, 58U).value())); - CHECK_EQUAL_HEX((value >> 59U), (generate_shift_right_bitset<64, int64_t>(value, 59U).value())); - CHECK_EQUAL_HEX((value >> 60U), (generate_shift_right_bitset<64, int64_t>(value, 60U).value())); - CHECK_EQUAL_HEX((value >> 61U), (generate_shift_right_bitset<64, int64_t>(value, 61U).value())); - CHECK_EQUAL_HEX((value >> 62U), (generate_shift_right_bitset<64, int64_t>(value, 62U).value())); - CHECK_EQUAL_HEX((value >> 63U), (generate_shift_right_bitset<64, int64_t>(value, 63U).value())); - CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<64, int64_t>(value, 64U).value())); + CHECK_EQUAL_HEX((value >> 0U), (generate_shift_right_bitset<64, uint64_t>(value, 0U).value())); + CHECK_EQUAL_HEX((value >> 1U), (generate_shift_right_bitset<64, uint64_t>(value, 1U).value())); + CHECK_EQUAL_HEX((value >> 2U), (generate_shift_right_bitset<64, uint64_t>(value, 2U).value())); + CHECK_EQUAL_HEX((value >> 3U), (generate_shift_right_bitset<64, uint64_t>(value, 3U).value())); + CHECK_EQUAL_HEX((value >> 4U), (generate_shift_right_bitset<64, uint64_t>(value, 4U).value())); + CHECK_EQUAL_HEX((value >> 5U), (generate_shift_right_bitset<64, uint64_t>(value, 5U).value())); + CHECK_EQUAL_HEX((value >> 6U), (generate_shift_right_bitset<64, uint64_t>(value, 6U).value())); + CHECK_EQUAL_HEX((value >> 7U), (generate_shift_right_bitset<64, uint64_t>(value, 7U).value())); + CHECK_EQUAL_HEX((value >> 8U), (generate_shift_right_bitset<64, uint64_t>(value, 8U).value())); + CHECK_EQUAL_HEX((value >> 9U), (generate_shift_right_bitset<64, uint64_t>(value, 9U).value())); + CHECK_EQUAL_HEX((value >> 10U), (generate_shift_right_bitset<64, uint64_t>(value, 10U).value())); + CHECK_EQUAL_HEX((value >> 11U), (generate_shift_right_bitset<64, uint64_t>(value, 11U).value())); + CHECK_EQUAL_HEX((value >> 12U), (generate_shift_right_bitset<64, uint64_t>(value, 12U).value())); + CHECK_EQUAL_HEX((value >> 13U), (generate_shift_right_bitset<64, uint64_t>(value, 13U).value())); + CHECK_EQUAL_HEX((value >> 14U), (generate_shift_right_bitset<64, uint64_t>(value, 14U).value())); + CHECK_EQUAL_HEX((value >> 15U), (generate_shift_right_bitset<64, uint64_t>(value, 15U).value())); + CHECK_EQUAL_HEX((value >> 16U), (generate_shift_right_bitset<64, uint64_t>(value, 16U).value())); + CHECK_EQUAL_HEX((value >> 17U), (generate_shift_right_bitset<64, uint64_t>(value, 17U).value())); + CHECK_EQUAL_HEX((value >> 18U), (generate_shift_right_bitset<64, uint64_t>(value, 18U).value())); + CHECK_EQUAL_HEX((value >> 19U), (generate_shift_right_bitset<64, uint64_t>(value, 19U).value())); + CHECK_EQUAL_HEX((value >> 20U), (generate_shift_right_bitset<64, uint64_t>(value, 20U).value())); + CHECK_EQUAL_HEX((value >> 21U), (generate_shift_right_bitset<64, uint64_t>(value, 21U).value())); + CHECK_EQUAL_HEX((value >> 22U), (generate_shift_right_bitset<64, uint64_t>(value, 22U).value())); + CHECK_EQUAL_HEX((value >> 23U), (generate_shift_right_bitset<64, uint64_t>(value, 23U).value())); + CHECK_EQUAL_HEX((value >> 24U), (generate_shift_right_bitset<64, uint64_t>(value, 24U).value())); + CHECK_EQUAL_HEX((value >> 25U), (generate_shift_right_bitset<64, uint64_t>(value, 25U).value())); + CHECK_EQUAL_HEX((value >> 26U), (generate_shift_right_bitset<64, uint64_t>(value, 26U).value())); + CHECK_EQUAL_HEX((value >> 27U), (generate_shift_right_bitset<64, uint64_t>(value, 27U).value())); + CHECK_EQUAL_HEX((value >> 28U), (generate_shift_right_bitset<64, uint64_t>(value, 28U).value())); + CHECK_EQUAL_HEX((value >> 29U), (generate_shift_right_bitset<64, uint64_t>(value, 29U).value())); + CHECK_EQUAL_HEX((value >> 30U), (generate_shift_right_bitset<64, uint64_t>(value, 30U).value())); + CHECK_EQUAL_HEX((value >> 31U), (generate_shift_right_bitset<64, uint64_t>(value, 31U).value())); + CHECK_EQUAL_HEX((value >> 32U), (generate_shift_right_bitset<64, uint64_t>(value, 32U).value())); + CHECK_EQUAL_HEX((value >> 33U), (generate_shift_right_bitset<64, uint64_t>(value, 33U).value())); + CHECK_EQUAL_HEX((value >> 34U), (generate_shift_right_bitset<64, uint64_t>(value, 34U).value())); + CHECK_EQUAL_HEX((value >> 35U), (generate_shift_right_bitset<64, uint64_t>(value, 35U).value())); + CHECK_EQUAL_HEX((value >> 36U), (generate_shift_right_bitset<64, uint64_t>(value, 36U).value())); + CHECK_EQUAL_HEX((value >> 37U), (generate_shift_right_bitset<64, uint64_t>(value, 37U).value())); + CHECK_EQUAL_HEX((value >> 38U), (generate_shift_right_bitset<64, uint64_t>(value, 38U).value())); + CHECK_EQUAL_HEX((value >> 39U), (generate_shift_right_bitset<64, uint64_t>(value, 39U).value())); + CHECK_EQUAL_HEX((value >> 40U), (generate_shift_right_bitset<64, uint64_t>(value, 40U).value())); + CHECK_EQUAL_HEX((value >> 41U), (generate_shift_right_bitset<64, uint64_t>(value, 41U).value())); + CHECK_EQUAL_HEX((value >> 42U), (generate_shift_right_bitset<64, uint64_t>(value, 42U).value())); + CHECK_EQUAL_HEX((value >> 43U), (generate_shift_right_bitset<64, uint64_t>(value, 43U).value())); + CHECK_EQUAL_HEX((value >> 44U), (generate_shift_right_bitset<64, uint64_t>(value, 44U).value())); + CHECK_EQUAL_HEX((value >> 45U), (generate_shift_right_bitset<64, uint64_t>(value, 45U).value())); + CHECK_EQUAL_HEX((value >> 46U), (generate_shift_right_bitset<64, uint64_t>(value, 46U).value())); + CHECK_EQUAL_HEX((value >> 47U), (generate_shift_right_bitset<64, uint64_t>(value, 47U).value())); + CHECK_EQUAL_HEX((value >> 48U), (generate_shift_right_bitset<64, uint64_t>(value, 48U).value())); + CHECK_EQUAL_HEX((value >> 49U), (generate_shift_right_bitset<64, uint64_t>(value, 49U).value())); + CHECK_EQUAL_HEX((value >> 50U), (generate_shift_right_bitset<64, uint64_t>(value, 50U).value())); + CHECK_EQUAL_HEX((value >> 51U), (generate_shift_right_bitset<64, uint64_t>(value, 51U).value())); + CHECK_EQUAL_HEX((value >> 52U), (generate_shift_right_bitset<64, uint64_t>(value, 52U).value())); + CHECK_EQUAL_HEX((value >> 53U), (generate_shift_right_bitset<64, uint64_t>(value, 53U).value())); + CHECK_EQUAL_HEX((value >> 54U), (generate_shift_right_bitset<64, uint64_t>(value, 54U).value())); + CHECK_EQUAL_HEX((value >> 55U), (generate_shift_right_bitset<64, uint64_t>(value, 55U).value())); + CHECK_EQUAL_HEX((value >> 56U), (generate_shift_right_bitset<64, uint64_t>(value, 56U).value())); + CHECK_EQUAL_HEX((value >> 57U), (generate_shift_right_bitset<64, uint64_t>(value, 57U).value())); + CHECK_EQUAL_HEX((value >> 58U), (generate_shift_right_bitset<64, uint64_t>(value, 58U).value())); + CHECK_EQUAL_HEX((value >> 59U), (generate_shift_right_bitset<64, uint64_t>(value, 59U).value())); + CHECK_EQUAL_HEX((value >> 60U), (generate_shift_right_bitset<64, uint64_t>(value, 60U).value())); + CHECK_EQUAL_HEX((value >> 61U), (generate_shift_right_bitset<64, uint64_t>(value, 61U).value())); + CHECK_EQUAL_HEX((value >> 62U), (generate_shift_right_bitset<64, uint64_t>(value, 62U).value())); + CHECK_EQUAL_HEX((value >> 63U), (generate_shift_right_bitset<64, uint64_t>(value, 63U).value())); + CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<64, uint64_t>(value, 64U).value())); } //************************************************************************* TEST(test_shift_right_operator_all_shifts_partial_size) { - int64_t value = 0x0123456789ABCDEFULL; - int64_t mask = 0x0FFFFFFFFFFFFFFFULL; + uint64_t value = 0x0123456789ABCDEFULL; + uint64_t mask = 0x0FFFFFFFFFFFFFFFULL; - CHECK_EQUAL_HEX((value >> 0U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 0U).value())); - CHECK_EQUAL_HEX((value >> 1U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 1U).value())); - CHECK_EQUAL_HEX((value >> 2U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 2U).value())); - CHECK_EQUAL_HEX((value >> 3U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 3U).value())); - CHECK_EQUAL_HEX((value >> 4U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 4U).value())); - CHECK_EQUAL_HEX((value >> 5U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 5U).value())); - CHECK_EQUAL_HEX((value >> 6U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 6U).value())); - CHECK_EQUAL_HEX((value >> 7U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 7U).value())); - CHECK_EQUAL_HEX((value >> 8U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 8U).value())); - CHECK_EQUAL_HEX((value >> 9U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 9U).value())); - CHECK_EQUAL_HEX((value >> 10U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 10U).value())); - CHECK_EQUAL_HEX((value >> 11U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 11U).value())); - CHECK_EQUAL_HEX((value >> 12U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 12U).value())); - CHECK_EQUAL_HEX((value >> 13U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 13U).value())); - CHECK_EQUAL_HEX((value >> 14U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 14U).value())); - CHECK_EQUAL_HEX((value >> 15U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 15U).value())); - CHECK_EQUAL_HEX((value >> 16U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 16U).value())); - CHECK_EQUAL_HEX((value >> 17U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 17U).value())); - CHECK_EQUAL_HEX((value >> 18U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 18U).value())); - CHECK_EQUAL_HEX((value >> 19U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 19U).value())); - CHECK_EQUAL_HEX((value >> 20U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 20U).value())); - CHECK_EQUAL_HEX((value >> 21U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 21U).value())); - CHECK_EQUAL_HEX((value >> 22U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 22U).value())); - CHECK_EQUAL_HEX((value >> 23U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 23U).value())); - CHECK_EQUAL_HEX((value >> 24U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 24U).value())); - CHECK_EQUAL_HEX((value >> 25U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 25U).value())); - CHECK_EQUAL_HEX((value >> 26U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 26U).value())); - CHECK_EQUAL_HEX((value >> 27U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 27U).value())); - CHECK_EQUAL_HEX((value >> 28U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 28U).value())); - CHECK_EQUAL_HEX((value >> 29U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 29U).value())); - CHECK_EQUAL_HEX((value >> 30U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 30U).value())); - CHECK_EQUAL_HEX((value >> 31U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 31U).value())); - CHECK_EQUAL_HEX((value >> 32U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 32U).value())); - CHECK_EQUAL_HEX((value >> 33U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 33U).value())); - CHECK_EQUAL_HEX((value >> 34U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 34U).value())); - CHECK_EQUAL_HEX((value >> 35U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 35U).value())); - CHECK_EQUAL_HEX((value >> 36U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 36U).value())); - CHECK_EQUAL_HEX((value >> 37U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 37U).value())); - CHECK_EQUAL_HEX((value >> 38U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 38U).value())); - CHECK_EQUAL_HEX((value >> 39U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 39U).value())); - CHECK_EQUAL_HEX((value >> 40U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 40U).value())); - CHECK_EQUAL_HEX((value >> 41U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 41U).value())); - CHECK_EQUAL_HEX((value >> 42U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 42U).value())); - CHECK_EQUAL_HEX((value >> 43U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 43U).value())); - CHECK_EQUAL_HEX((value >> 44U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 44U).value())); - CHECK_EQUAL_HEX((value >> 45U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 45U).value())); - CHECK_EQUAL_HEX((value >> 46U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 46U).value())); - CHECK_EQUAL_HEX((value >> 47U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 47U).value())); - CHECK_EQUAL_HEX((value >> 48U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 48U).value())); - CHECK_EQUAL_HEX((value >> 49U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 49U).value())); - CHECK_EQUAL_HEX((value >> 50U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 50U).value())); - CHECK_EQUAL_HEX((value >> 51U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 51U).value())); - CHECK_EQUAL_HEX((value >> 52U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 52U).value())); - CHECK_EQUAL_HEX((value >> 53U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 53U).value())); - CHECK_EQUAL_HEX((value >> 54U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 54U).value())); - CHECK_EQUAL_HEX((value >> 55U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 55U).value())); - CHECK_EQUAL_HEX((value >> 56U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 56U).value())); - CHECK_EQUAL_HEX((value >> 57U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 57U).value())); - CHECK_EQUAL_HEX((value >> 58U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 58U).value())); - CHECK_EQUAL_HEX((value >> 59U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 59U).value())); - CHECK_EQUAL_HEX((value >> 60U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 60U).value())); - CHECK_EQUAL_HEX((value >> 61U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 61U).value())); - CHECK_EQUAL_HEX((value >> 62U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 62U).value())); - CHECK_EQUAL_HEX((value >> 63U) & mask, (generate_shift_right_bitset<64, int64_t>(value, 63U).value())); - CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<64, int64_t>(value, 64U).value())); + CHECK_EQUAL_HEX((value >> 0U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 0U).value())); + CHECK_EQUAL_HEX((value >> 1U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 1U).value())); + CHECK_EQUAL_HEX((value >> 2U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 2U).value())); + CHECK_EQUAL_HEX((value >> 3U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 3U).value())); + CHECK_EQUAL_HEX((value >> 4U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 4U).value())); + CHECK_EQUAL_HEX((value >> 5U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 5U).value())); + CHECK_EQUAL_HEX((value >> 6U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 6U).value())); + CHECK_EQUAL_HEX((value >> 7U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 7U).value())); + CHECK_EQUAL_HEX((value >> 8U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 8U).value())); + CHECK_EQUAL_HEX((value >> 9U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 9U).value())); + CHECK_EQUAL_HEX((value >> 10U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 10U).value())); + CHECK_EQUAL_HEX((value >> 11U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 11U).value())); + CHECK_EQUAL_HEX((value >> 12U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 12U).value())); + CHECK_EQUAL_HEX((value >> 13U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 13U).value())); + CHECK_EQUAL_HEX((value >> 14U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 14U).value())); + CHECK_EQUAL_HEX((value >> 15U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 15U).value())); + CHECK_EQUAL_HEX((value >> 16U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 16U).value())); + CHECK_EQUAL_HEX((value >> 17U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 17U).value())); + CHECK_EQUAL_HEX((value >> 18U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 18U).value())); + CHECK_EQUAL_HEX((value >> 19U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 19U).value())); + CHECK_EQUAL_HEX((value >> 20U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 20U).value())); + CHECK_EQUAL_HEX((value >> 21U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 21U).value())); + CHECK_EQUAL_HEX((value >> 22U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 22U).value())); + CHECK_EQUAL_HEX((value >> 23U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 23U).value())); + CHECK_EQUAL_HEX((value >> 24U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 24U).value())); + CHECK_EQUAL_HEX((value >> 25U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 25U).value())); + CHECK_EQUAL_HEX((value >> 26U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 26U).value())); + CHECK_EQUAL_HEX((value >> 27U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 27U).value())); + CHECK_EQUAL_HEX((value >> 28U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 28U).value())); + CHECK_EQUAL_HEX((value >> 29U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 29U).value())); + CHECK_EQUAL_HEX((value >> 30U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 30U).value())); + CHECK_EQUAL_HEX((value >> 31U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 31U).value())); + CHECK_EQUAL_HEX((value >> 32U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 32U).value())); + CHECK_EQUAL_HEX((value >> 33U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 33U).value())); + CHECK_EQUAL_HEX((value >> 34U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 34U).value())); + CHECK_EQUAL_HEX((value >> 35U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 35U).value())); + CHECK_EQUAL_HEX((value >> 36U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 36U).value())); + CHECK_EQUAL_HEX((value >> 37U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 37U).value())); + CHECK_EQUAL_HEX((value >> 38U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 38U).value())); + CHECK_EQUAL_HEX((value >> 39U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 39U).value())); + CHECK_EQUAL_HEX((value >> 40U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 40U).value())); + CHECK_EQUAL_HEX((value >> 41U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 41U).value())); + CHECK_EQUAL_HEX((value >> 42U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 42U).value())); + CHECK_EQUAL_HEX((value >> 43U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 43U).value())); + CHECK_EQUAL_HEX((value >> 44U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 44U).value())); + CHECK_EQUAL_HEX((value >> 45U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 45U).value())); + CHECK_EQUAL_HEX((value >> 46U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 46U).value())); + CHECK_EQUAL_HEX((value >> 47U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 47U).value())); + CHECK_EQUAL_HEX((value >> 48U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 48U).value())); + CHECK_EQUAL_HEX((value >> 49U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 49U).value())); + CHECK_EQUAL_HEX((value >> 50U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 50U).value())); + CHECK_EQUAL_HEX((value >> 51U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 51U).value())); + CHECK_EQUAL_HEX((value >> 52U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 52U).value())); + CHECK_EQUAL_HEX((value >> 53U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 53U).value())); + CHECK_EQUAL_HEX((value >> 54U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 54U).value())); + CHECK_EQUAL_HEX((value >> 55U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 55U).value())); + CHECK_EQUAL_HEX((value >> 56U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 56U).value())); + CHECK_EQUAL_HEX((value >> 57U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 57U).value())); + CHECK_EQUAL_HEX((value >> 58U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 58U).value())); + CHECK_EQUAL_HEX((value >> 59U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 59U).value())); + CHECK_EQUAL_HEX((value >> 60U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 60U).value())); + CHECK_EQUAL_HEX((value >> 61U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 61U).value())); + CHECK_EQUAL_HEX((value >> 62U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 62U).value())); + CHECK_EQUAL_HEX((value >> 63U) & mask, (generate_shift_right_bitset<64, uint64_t>(value, 63U).value())); + CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<64, uint64_t>(value, 64U).value())); } //************************************************************************* TEST(test_and_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x12345678UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(0x12345678UL & 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(0x12345678UL & 0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3 = data1 & data2; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3 = data1 & data2; CHECK(data3 == data4); } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_and_equals_operator_helper(etl::bitset<64, int64_t> data1, const etl::bitset<64, int64_t>& data2) + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_and_equals_operator_helper(etl::bitset<64, uint64_t> data1, const etl::bitset<64, uint64_t>& data2) { data1 &= data2; @@ -1477,10 +1597,10 @@ namespace TEST(test_and_equals_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x12345678UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(test_and_equals_operator_helper(data1, data2)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(test_and_equals_operator_helper(data1, data2)); CHECK((data1 & data2) == data3); } @@ -1488,16 +1608,16 @@ namespace //************************************************************************* TEST(test_or_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x12345678UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(0x12345678UL | 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(0x12345678UL | 0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3 = data1 | data2; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3 = data1 | data2; CHECK(data3 == data4); } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_or_equals_operator_helper(etl::bitset<64, int64_t> data1, const etl::bitset<64, int64_t>& data2) + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_or_equals_operator_helper(etl::bitset<64, uint64_t> data1, const etl::bitset<64, uint64_t>& data2) { data1 |= data2; @@ -1506,10 +1626,10 @@ namespace TEST(test_or_equals_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x12345678UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(test_or_equals_operator_helper(data1, data2)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(test_or_equals_operator_helper(data1, data2)); CHECK((data1 | data2) == data3); } @@ -1517,16 +1637,16 @@ namespace //************************************************************************* TEST(test_xor_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x12345678UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data4(0x12345678UL ^ 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data4(0x12345678UL ^ 0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3 = data1 ^ data2; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3 = data1 ^ data2; CHECK(data3 == data4); } //************************************************************************* - ETL_CONSTEXPR14 etl::bitset<64, int64_t> test_xor_equals_operator_helper(etl::bitset<64, int64_t> data1, const etl::bitset<64, int64_t>& data2) + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_xor_equals_operator_helper(etl::bitset<64, uint64_t> data1, const etl::bitset<64, uint64_t>& data2) { data1 ^= data2; @@ -1535,10 +1655,10 @@ namespace TEST(test_xor_equals_operator) { - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data1(0x12345678UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x23456789UL); - ETL_CONSTEXPR14 etl::bitset<64, int64_t> data3(test_xor_equals_operator_helper(data1, data2)); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data3(test_xor_equals_operator_helper(data1, data2)); CHECK((data1 ^ data2) == data3); } @@ -1546,102 +1666,102 @@ namespace //************************************************************************* TEST(test_find_first) { - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs1(ull(0x00)); - ETL_CONSTEXPR14 size_t bs1fff = bs1.find_first(false); - ETL_CONSTEXPR14 size_t bs1fft = bs1.find_first(true); - CHECK_EQUAL(0U, bs1fff); - CHECK_EQUAL(etl::bitset<>::npos, bs1fft); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs1(ull(0x00)); + ETL_CONSTEXPR14 size_t bs1find_first_false = bs1.find_first(false); + ETL_CONSTEXPR14 size_t bs1find_first_true = bs1.find_first(true); + CHECK_EQUAL(0U, bs1find_first_false); + CHECK_EQUAL(etl::bitset<>::npos, bs1find_first_true); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs2(ull(0xFF)); - ETL_CONSTEXPR14 size_t bs2fff = bs2.find_first(false); - ETL_CONSTEXPR14 size_t bs2fft = bs2.find_first(true); - CHECK_EQUAL(etl::bitset<>::npos, bs2fff); - CHECK_EQUAL(0U, bs2fft); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs2(ull(0xFF)); + ETL_CONSTEXPR14 size_t bs2find_first_false = bs2.find_first(false); + ETL_CONSTEXPR14 size_t bs2find_first_true = bs2.find_first(true); + CHECK_EQUAL(etl::bitset<>::npos, bs2find_first_false); + CHECK_EQUAL(0U, bs2find_first_true); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs3(ull(0x01)); - ETL_CONSTEXPR14 size_t bs3fff = bs3.find_first(false); - ETL_CONSTEXPR14 size_t bs3fft = bs3.find_first(true); - CHECK_EQUAL(1U, bs3fff); - CHECK_EQUAL(0U, bs3fft); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs3(ull(0x01)); + ETL_CONSTEXPR14 size_t bs3find_first_false = bs3.find_first(false); + ETL_CONSTEXPR14 size_t bs3find_first_true = bs3.find_first(true); + CHECK_EQUAL(1U, bs3find_first_false); + CHECK_EQUAL(0U, bs3find_first_true); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs4(ull(0x20)); - ETL_CONSTEXPR14 size_t bs4fff = bs4.find_first(false); - ETL_CONSTEXPR14 size_t bs4fft = bs4.find_first(true); - CHECK_EQUAL(0U, bs4fff); - CHECK_EQUAL(5U, bs4fft); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs4(ull(0x20)); + ETL_CONSTEXPR14 size_t bs4find_first_false = bs4.find_first(false); + ETL_CONSTEXPR14 size_t bs4find_first_true = bs4.find_first(true); + CHECK_EQUAL(0U, bs4find_first_false); + CHECK_EQUAL(5U, bs4find_first_true); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs5(ull(0x21)); - ETL_CONSTEXPR14 size_t bs5fff = bs5.find_first(false); - ETL_CONSTEXPR14 size_t bs5fft = bs5.find_first(true); - CHECK_EQUAL(1U, bs5fff); - CHECK_EQUAL(0U, bs5fft); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs5(ull(0x21)); + ETL_CONSTEXPR14 size_t bs5find_first_false = bs5.find_first(false); + ETL_CONSTEXPR14 size_t bs5find_first_true = bs5.find_first(true); + CHECK_EQUAL(1U, bs5find_first_false); + CHECK_EQUAL(0U, bs5find_first_true); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs6(ull(0x0E)); - ETL_CONSTEXPR14 size_t bs6fff = bs6.find_first(false); - ETL_CONSTEXPR14 size_t bs6fft = bs6.find_first(true); - CHECK_EQUAL(0U, bs6fff); - CHECK_EQUAL(1U, bs6fft); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs6(ull(0x0E)); + ETL_CONSTEXPR14 size_t bs6find_first_false = bs6.find_first(false); + ETL_CONSTEXPR14 size_t bs6find_first_true = bs6.find_first(true); + CHECK_EQUAL(0U, bs6find_first_false); + CHECK_EQUAL(1U, bs6find_first_true); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs7(ull(0x31)); - ETL_CONSTEXPR14 size_t bs7fff = bs7.find_first(false); - ETL_CONSTEXPR14 size_t bs7fft = bs7.find_first(true); - CHECK_EQUAL(1U, bs7fff); - CHECK_EQUAL(0U, bs7fft); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs7(ull(0x31)); + ETL_CONSTEXPR14 size_t bs7find_first_false = bs7.find_first(false); + ETL_CONSTEXPR14 size_t bs7find_first_true = bs7.find_first(true); + CHECK_EQUAL(1U, bs7find_first_false); + CHECK_EQUAL(0U, bs7find_first_true); } //************************************************************************* TEST(test_find_next) { - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs1(ull(0x00)); - ETL_CONSTEXPR14 size_t bs1fnf0 = bs1.find_next(false, 0); - ETL_CONSTEXPR14 size_t bs1fnf1 = bs1.find_next(false, 1); - ETL_CONSTEXPR14 size_t bs1fnt2 = bs1.find_next(true, 2); - CHECK_EQUAL(0U, bs1fnf0); - CHECK_EQUAL(1U, bs1fnf1); - CHECK_EQUAL(etl::bitset<>::npos, bs1fnt2); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs1(ull(0x00)); + ETL_CONSTEXPR14 size_t bs1find_next_false0 = bs1.find_next(false, 0); + ETL_CONSTEXPR14 size_t bs1find_next_false1 = bs1.find_next(false, 1); + ETL_CONSTEXPR14 size_t bs1find_next_true2 = bs1.find_next(true, 2); + CHECK_EQUAL(0U, bs1find_next_false0); + CHECK_EQUAL(1U, bs1find_next_false1); + CHECK_EQUAL(etl::bitset<>::npos, bs1find_next_true2); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs2(ull(0xFF)); - ETL_CONSTEXPR14 size_t bs2fnt0 = bs2.find_next(true, 0); - ETL_CONSTEXPR14 size_t bs2fnt1 = bs2.find_next(true, 1); - ETL_CONSTEXPR14 size_t bs2fnf2 = bs2.find_next(false, 2); - CHECK_EQUAL(0U, bs2fnt0); - CHECK_EQUAL(1U, bs2fnt1); - CHECK_EQUAL(etl::bitset<>::npos, bs2fnf2); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs2(ull(0xFF)); + ETL_CONSTEXPR14 size_t bs2find_next_true0 = bs2.find_next(true, 0); + ETL_CONSTEXPR14 size_t bs2find_next_true1 = bs2.find_next(true, 1); + ETL_CONSTEXPR14 size_t bs2find_next_false2 = bs2.find_next(false, 2); + CHECK_EQUAL(0U, bs2find_next_true0); + CHECK_EQUAL(1U, bs2find_next_true1); + CHECK_EQUAL(etl::bitset<>::npos, bs2find_next_false2); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs3(ull(0x0E)); - ETL_CONSTEXPR14 size_t bs3fnf0 = bs3.find_next(false, 0); - ETL_CONSTEXPR14 size_t bs3fnt1 = bs3.find_next(true, 1); - ETL_CONSTEXPR14 size_t bs3fnf2 = bs3.find_next(false, 2); - CHECK_EQUAL(0U, bs3fnf0); - CHECK_EQUAL(1U, bs3fnt1); - CHECK_EQUAL(4U, bs3fnf2); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs3(ull(0x0E)); + ETL_CONSTEXPR14 size_t bs3find_next_false0 = bs3.find_next(false, 0); + ETL_CONSTEXPR14 size_t bs3find_next_true1 = bs3.find_next(true, 1); + ETL_CONSTEXPR14 size_t bs3find_next_false2 = bs3.find_next(false, 2); + CHECK_EQUAL(0U, bs3find_next_false0); + CHECK_EQUAL(1U, bs3find_next_true1); + CHECK_EQUAL(4U, bs3find_next_false2); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> bs4(ull(0x31)); - ETL_CONSTEXPR14 size_t bs4fnt0 = bs4.find_next(true, 0); - ETL_CONSTEXPR14 size_t bs4fnf0 = bs4.find_next(false, 0); - ETL_CONSTEXPR14 size_t bs4fnt1 = bs4.find_next(true, 1); - CHECK_EQUAL(0U, bs4fnt0); - CHECK_EQUAL(1U, bs4fnf0); - CHECK_EQUAL(4U, bs4fnt1); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> bs4(ull(0x31)); + ETL_CONSTEXPR14 size_t bs4find_next_true0 = bs4.find_next(true, 0); + ETL_CONSTEXPR14 size_t bs4find_next_false0 = bs4.find_next(false, 0); + ETL_CONSTEXPR14 size_t bs4find_next_true1 = bs4.find_next(true, 1); + CHECK_EQUAL(0U, bs4find_next_true0); + CHECK_EQUAL(1U, bs4find_next_false0); + CHECK_EQUAL(4U, bs4find_next_true1); } //************************************************************************* - ETL_CONSTEXPR14 std::pair, etl::bitset<8, int8_t>> test_swap_helper() + ETL_CONSTEXPR14 std::pair, etl::bitset<8, uint8_t>> test_swap_helper() { - etl::bitset<8, int8_t> data1(ull(0x2A)); - etl::bitset<8, int8_t> data2(ull(0x15)); + etl::bitset<8, uint8_t> data1(ull(0x2A)); + etl::bitset<8, uint8_t> data2(ull(0x15)); swap(data1, data2); - return std::pair, etl::bitset<8, int8_t>>(data1, data2); + return std::pair, etl::bitset<8, uint8_t>>(data1, data2); } TEST(test_swap) { - ETL_CONSTEXPR14 etl::bitset<8, int8_t> compare1(0x2A); - ETL_CONSTEXPR14 etl::bitset<8, int8_t> compare2(0x15); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> compare1(0x2A); + ETL_CONSTEXPR14 etl::bitset<8, uint8_t> compare2(0x15); - ETL_CONSTEXPR14 std::pair, etl::bitset<8, int8_t>> swapped = test_swap_helper(); + ETL_CONSTEXPR14 std::pair, etl::bitset<8, uint8_t>> swapped = test_swap_helper(); CHECK(swapped.first == compare2); CHECK(swapped.second == compare1); @@ -1661,9 +1781,9 @@ namespace //************************************************************************* TEST(test_const_span) { - using span_t = etl::bitset<32, int32_t>::const_span_type; + using span_t = etl::bitset<32, uint32_t>::const_span_type; - const etl::bitset<32, int32_t> b(0x12345678UL); + const etl::bitset<32, uint32_t> b(0x12345678UL); span_t s = b.span(); CHECK_EQUAL(0x12345678UL, s[0]); @@ -1672,7 +1792,7 @@ namespace //************************************************************************* TEST(test_to_string) { - using bs32 = etl::bitset<32, int32_t>; + using bs32 = etl::bitset<32, uint32_t>; ETL_CONSTEXPR14 bs32 b(0x12345678UL); @@ -1687,7 +1807,7 @@ namespace //************************************************************************* TEST(test_to_wstring) { - using bs32 = etl::bitset<32, int32_t>; + using bs32 = etl::bitset<32, uint32_t>; ETL_CONSTEXPR14 bs32 b(0x12345678UL); @@ -1701,7 +1821,7 @@ namespace //************************************************************************* TEST(test_to_u16string) { - using bs32 = etl::bitset<32, int32_t>; + using bs32 = etl::bitset<32, uint32_t>; ETL_CONSTEXPR14 bs32 b(0x12345678UL); @@ -1715,7 +1835,7 @@ namespace //************************************************************************* TEST(test_to_u32string) { - using bs32 = etl::bitset<32, int32_t>; + using bs32 = etl::bitset<32, uint32_t>; ETL_CONSTEXPR14 bs32 b(0x12345678UL); @@ -1726,7 +1846,7 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } - //************************************************************************* + ////************************************************************************* TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32, uint32_t> b(0x12345678UL); From 78d2ccf55ee5d3b1560a9ce4f337a1d8a43a182a Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Fri, 29 Dec 2023 16:00:10 +0000 Subject: [PATCH 024/131] Work in progress Finished updating explicit single element tests for bitset_ext --- include/etl/private/bitset_new.h | 240 ++--- ...itset_new_explicit_single_element_type.cpp | 32 + ...t_new_ext_explicit_single_element_type.cpp | 977 +++++++++++------- 3 files changed, 688 insertions(+), 561 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 7a766f64..7a4a7fa1 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -45,11 +45,16 @@ SOFTWARE. #include "../error_handler.h" #include "../span.h" #include "../string.h" +#include "../enum_type.h" #include #include #include +#if ETL_USING_STL +#include +#endif + #include "minmax_push.h" #if defined(ETL_COMPILER_KEIL) @@ -76,71 +81,6 @@ SOFTWARE. namespace etl { - //namespace private_bitset - //{ - // //*************************************************************************** - // /// Common definitions for etl::bitset_impl - // ///\ingroup bitset - // //*************************************************************************** - // template - // struct bitset_impl_common - // { - // typedef TElement element_type; - // typedef element_type* pointer; - // typedef const element_type* const_pointer; - - // static ETL_CONSTANT size_t npos = etl::integral_limits::max; - - // static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - // static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; - // static ETL_CONSTANT element_type All_Clear_Element = element_type(0); - // }; - - // template - // ETL_CONSTANT size_t bitset_impl_common::npos; - - // template - // ETL_CONSTANT size_t bitset_impl_common::Bits_Per_Element; - - // template - // ETL_CONSTANT TElement bitset_impl_common::All_Set_Element; - - // template - // ETL_CONSTANT TElement bitset_impl_common::All_Clear_Element; - - // //*************************************************************************** - // /// Common definitions for etl::bitset - // ///\ingroup bitset - // //*************************************************************************** - // template - // struct bitset_common : public bitset_impl_common - // { - // typedef TElement element_type; - - // static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; - // static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - // static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); - // static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); - - // static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. - - // typedef etl::span span_type; - // typedef etl::span const_span_type; - // }; - - // template - // ETL_CONSTANT size_t bitset_common::Number_Of_Elements; - - // template - // ETL_CONSTANT size_t bitset_common::Allocated_Bits; - - // template - // ETL_CONSTANT size_t bitset_common::Top_Mask_Shift; - - // template - // ETL_CONSTANT typename bitset_common::element_type private_bitset::bitset_common::Top_Mask; - //} - //*************************************************************************** /// Flags to indicate whether the bitset is contained in a single element /// or spread over an array of elements. @@ -148,8 +88,9 @@ namespace etl //*************************************************************************** struct bitset_layout { - static ETL_CONSTANT bool Single = true; - static ETL_CONSTANT bool Multi = false; + static ETL_CONSTANT char Undefined = 0; + static ETL_CONSTANT char Single = 1; + static ETL_CONSTANT char Multi = 2; }; //*************************************************************************** @@ -212,7 +153,7 @@ namespace etl /// Bitset implementation declaration. ///\ingroup bitset //************************************************************************* - template + template class bitset_impl; //************************************************************************* @@ -224,16 +165,14 @@ namespace etl { public: - //static ETL_CONSTANT bool Element_Layout = etl::bitset_layout::Single; - typedef TElement element_type; typedef element_type* pointer; typedef const element_type* const_pointer; static ETL_CONSTANT size_t npos = etl::integral_limits::max; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; + static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; + static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; static ETL_CONSTANT element_type All_Clear_Element = element_type(0); //************************************************************************* @@ -241,10 +180,11 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void set(pointer pbuffer, - size_t /*number_of_elements*/) ETL_NOEXCEPT + void set(pointer pbuffer, + size_t /*number_of_elements*/, + element_type top_mask) ETL_NOEXCEPT { - *pbuffer = All_Set_Element; + *pbuffer = All_Set_Element & top_mask; } //************************************************************************* @@ -303,11 +243,9 @@ namespace etl size_t active_bits, const char* text) ETL_NOEXCEPT { - if (text == ETL_NULLPTR) - { - reset(pbuffer, 1U); - } - else + reset(pbuffer, 1U); + + if (text != ETL_NULLPTR) { size_t string_length = etl::strlen(text); @@ -322,10 +260,6 @@ namespace etl { *pbuffer |= mask; } - else - { - *pbuffer &= ~mask; - } mask >>= 1U; } @@ -342,11 +276,9 @@ namespace etl size_t active_bits, const wchar_t* text) ETL_NOEXCEPT { - if (text == ETL_NULLPTR) - { - reset(pbuffer, 1U); - } - else + reset(pbuffer, 1U); + + if (text != ETL_NULLPTR) { size_t string_length = etl::strlen(text); @@ -361,10 +293,6 @@ namespace etl { *pbuffer |= mask; } - else - { - *pbuffer &= ~mask; - } mask >>= 1U; } @@ -381,11 +309,9 @@ namespace etl size_t active_bits, const char16_t* text) ETL_NOEXCEPT { - if (text == ETL_NULLPTR) - { - reset(pbuffer, 1U); - } - else + reset(pbuffer, 1U); + + if (text != ETL_NULLPTR) { size_t string_length = etl::strlen(text); @@ -400,10 +326,6 @@ namespace etl { *pbuffer |= mask; } - else - { - *pbuffer &= ~mask; - } mask >>= 1U; } @@ -420,11 +342,9 @@ namespace etl size_t active_bits, const char32_t* text) ETL_NOEXCEPT { - if (text == ETL_NULLPTR) - { - reset(pbuffer, 1U); - } - else + reset(pbuffer, 1U); + + if (text != ETL_NULLPTR) { size_t string_length = etl::strlen(text); @@ -439,10 +359,6 @@ namespace etl { *pbuffer |= mask; } - else - { - *pbuffer &= ~mask; - } mask >>= 1U; } @@ -725,6 +641,7 @@ namespace etl //************************************************************************* /// operator assignment + /// Assigns rhs to lhs //************************************************************************* ETL_CONSTEXPR14 static @@ -737,6 +654,7 @@ namespace etl //************************************************************************* /// operator and + /// AND lhs and rhs and put the result in lhs //************************************************************************* ETL_CONSTEXPR14 static @@ -749,6 +667,7 @@ namespace etl //************************************************************************* /// operator or + /// OR lhs and rhs and put the result in lhs //************************************************************************* ETL_CONSTEXPR14 static @@ -761,6 +680,7 @@ namespace etl //************************************************************************* /// operator xor + /// XOR lhs and rhs and put the result in lhs //************************************************************************* ETL_CONSTEXPR14 static @@ -773,6 +693,7 @@ namespace etl //************************************************************************* /// operator ~ + /// NOT the value in the buffer //************************************************************************* ETL_CONSTEXPR14 static @@ -855,15 +776,12 @@ namespace etl pointer rhs_pbuffer, size_t /*number_of_elements*/) ETL_NOEXCEPT { - using ETL_OR_STD::iter_swap; - - iter_swap(lhs_pbuffer, rhs_pbuffer); + element_type temp = *lhs_pbuffer; + *lhs_pbuffer = *rhs_pbuffer; + *rhs_pbuffer = temp; } }; - //template - //ETL_CONSTANT bool etl::bitset_impl::Element_Layout; - //************************************************************************* /// The implementation class for multi element etl::bitset ///\ingroup bitset @@ -883,8 +801,6 @@ namespace etl static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; static ETL_CONSTANT element_type All_Clear_Element = element_type(0); - //static ETL_CONSTANT bool Element_Layout = etl::bitset_layout::Multi; - //************************************************************************* /// Check to see if the requested extract is contained within one element. //************************************************************************* @@ -1756,9 +1672,6 @@ namespace etl } }; - //template - //ETL_CONSTANT bool etl::bitset_impl::Element_Layout; - //*************************************************************************** /// Bitset forward declaration //*************************************************************************** @@ -1784,8 +1697,7 @@ namespace etl static ETL_CONSTANT size_t Allocated_Bits = 0U; static ETL_CONSTANT element_type All_Set_Element = 0U; static ETL_CONSTANT element_type All_Clear_Element = 0U; - static ETL_CONSTANT size_t Top_Mask_Shift = 0U; - static ETL_CONSTANT element_type Top_Mask = 0U; + static ETL_CONSTANT char Element_Layout = etl::bitset_layout::Undefined; static ETL_CONSTANT size_t npos = etl::integral_limits::max; }; @@ -1806,15 +1718,19 @@ namespace etl static ETL_CONSTANT size_t npos = etl::integral_limits::max; - //static ETL_CONSTANT bool Element_Layout = implementation::Element_Layout; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; static ETL_CONSTANT element_type All_Clear_Element = element_type(0); static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); - static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); + static ETL_CONSTANT char Element_Layout = (Number_Of_Elements == 1U) ? etl::bitset_layout::Single : etl::bitset_layout::Multi; + + private: + + static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); + static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); + + public: static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. @@ -1910,6 +1826,7 @@ namespace etl /// Default constructor. //************************************************************************* ETL_CONSTEXPR14 bitset() ETL_NOEXCEPT + : buffer() { implementation::reset(buffer, Number_Of_Elements); } @@ -1973,7 +1890,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset& operator =(const bitset& other) ETL_NOEXCEPT { - etl::copy_n(other.buffer, Number_Of_Elements, buffer); + implementation::operator_assignment(buffer, other.buffer, Number_Of_Elements); return *this; } @@ -1983,7 +1900,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset& set() ETL_NOEXCEPT { - implementation::set(buffer, Number_Of_Elements); + implementation::set(buffer, Number_Of_Elements, Top_Mask); return *this; } @@ -2454,9 +2371,7 @@ namespace etl //************************************************************************* friend ETL_CONSTEXPR14 bool operator ==(const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT { - return etl::equal(lhs.buffer, - lhs.buffer + lhs.Number_Of_Elements, - rhs.buffer); + return implementation::operator_equality(lhs.buffer, rhs.buffer, lhs.Number_Of_Elements); } //************************************************************************* @@ -2586,8 +2501,7 @@ namespace etl static ETL_CONSTANT size_t Allocated_Bits = 0U; static ETL_CONSTANT element_type All_Set_Element = 0U; static ETL_CONSTANT element_type All_Clear_Element = 0U; - static ETL_CONSTANT size_t Top_Mask_Shift = 0U; - static ETL_CONSTANT element_type Top_Mask = 0U; + static ETL_CONSTANT char Element_Layout = etl::bitset_layout::Undefined; static ETL_CONSTANT size_t npos = etl::integral_limits::max; }; @@ -2596,7 +2510,7 @@ namespace etl /// The specialisation that uses an array of the default element type. //************************************************************************* template - class bitset_ext// : public etl::private_bitset::bitset_common + class bitset_ext { public: @@ -2608,15 +2522,19 @@ namespace etl static ETL_CONSTANT size_t npos = etl::integral_limits::max; - //static ETL_CONSTANT bool Element_Layout = implementation::Element_Layout; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; static ETL_CONSTANT element_type All_Clear_Element = element_type(0); static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); - static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); + static ETL_CONSTANT char Element_Layout = (Number_Of_Elements == 1U) ? etl::bitset_layout::Single : etl::bitset_layout::Multi; + + private: + + static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); + static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); + + public: static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. @@ -2716,7 +2634,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - reset(); + implementation::reset(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -2726,7 +2644,7 @@ namespace etl : pbuffer(buffer.data()) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - reset(); + implementation::reset(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -2736,7 +2654,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - etl::copy_n(other.pbuffer, Number_Of_Elements, pbuffer); + implementation::operator_assignment(pbuffer, other.pbuffer, Number_Of_Elements); } //************************************************************************* @@ -2745,7 +2663,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const bitset_ext& other, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - etl::copy_n(other.pbuffer, Number_Of_Elements, pbuffer); + implementation::operator_assignment(pbuffer, other.pbuffer, Number_Of_Elements); } //************************************************************************* @@ -2779,7 +2697,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2788,7 +2706,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const char* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2798,7 +2716,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2807,7 +2725,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const wchar_t* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2817,7 +2735,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2826,7 +2744,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const char16_t* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2836,7 +2754,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2845,7 +2763,7 @@ namespace etl ETL_CONSTEXPR14 bitset_ext(const char32_t* text, buffer_type& buffer) ETL_NOEXCEPT : pbuffer(buffer.data()) { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); } //************************************************************************* @@ -2863,7 +2781,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& set() ETL_NOEXCEPT { - implementation::set(pbuffer, Number_Of_Elements, All_Set_Element); + implementation::set(pbuffer, Number_Of_Elements, Top_Mask); return *this; } @@ -2885,7 +2803,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& set(const char* text) ETL_NOEXCEPT { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2895,7 +2813,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& set(const wchar_t* text) ETL_NOEXCEPT { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2905,7 +2823,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& set(const char16_t* text) ETL_NOEXCEPT { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -2915,7 +2833,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& set(const char32_t* text) ETL_NOEXCEPT { - implementation::set(pbuffer, Number_Of_Elements, Active_Bits, text); + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); return *this; } @@ -3108,7 +3026,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool any() const ETL_NOEXCEPT { - return implementation::any(pbuffer, Number_Of_Elements, Top_Mask); + return implementation::any(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -3116,7 +3034,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool any(element_type mask) const ETL_NOEXCEPT { - return implementation::any(pbuffer, Number_Of_Elements, Top_Mask, mask); + return implementation::any(pbuffer, Number_Of_Elements, mask); } //************************************************************************* @@ -3217,7 +3135,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& operator ^=(const bitset_ext& other) ETL_NOEXCEPT { - implementation::xoperator_or(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); + implementation::operator_xor(&pbuffer[0], &other.pbuffer[0], Number_Of_Elements); return *this; } @@ -3247,7 +3165,7 @@ namespace etl //************************************************************************* friend ETL_CONSTEXPR14 bool operator ==(const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT { - return etl::equal(lhs.pbuffer, lhs.pbuffer + lhs.Number_Of_Elements, rhs.pbuffer); + return implementation::operator_equality(lhs.pbuffer, rhs.pbuffer, lhs.Number_Of_Elements); } //************************************************************************* diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 291c6836..18d19157 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -146,6 +146,11 @@ namespace CHECK_EQUAL(1U, data16.Number_Of_Elements); CHECK_EQUAL(1U, data32.Number_Of_Elements); CHECK_EQUAL(1U, data64.Number_Of_Elements); + + CHECK_EQUAL(etl::bitset_layout::Single, data8.Element_Layout); + CHECK_EQUAL(etl::bitset_layout::Single, data16.Element_Layout); + CHECK_EQUAL(etl::bitset_layout::Single, data32.Element_Layout); + CHECK_EQUAL(etl::bitset_layout::Single, data64.Element_Layout); } //************************************************************************* @@ -353,6 +358,33 @@ namespace } } + //************************************************************************* + TEST(test_set_less_than_full_size) + { + std::bitset<60> compare; + etl::bitset<60, uint64_t> data; + + compare.set(); + data.set(); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + //************************************************************************* TEST(test_set_with_char_string) { 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 4b3d3948..cbba1ed4 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -47,7 +47,7 @@ namespace //************************************************************************* TEST(test_construct_from_nullptr_buffer) { - using BsExt = etl::bitset_ext<64, int64_t>; + using BsExt = etl::bitset_ext<64, uint64_t>; BsExt::buffer_type buffer; BsExt bs2a(buffer); @@ -64,9 +64,9 @@ namespace //************************************************************************* TEST(test_default_constructor_from_array) { - etl::bitset_ext<64, int64_t>::element_type buffer[etl::bitset_ext<64, int64_t>::Number_Of_Elements]; + etl::bitset_ext<64, uint64_t>::element_type buffer[etl::bitset_ext<64, uint64_t>::Number_Of_Elements]; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -80,9 +80,9 @@ namespace //************************************************************************* TEST(test_default_constructor_from_buffer_type) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -96,28 +96,33 @@ namespace //************************************************************************* TEST(test_default_constructor_single_element) { - etl::bitset_ext<8, int8_t>::buffer_type buffer8; - etl::bitset_ext<16, int16_t>::buffer_type buffer16; - etl::bitset_ext<32, int32_t>::buffer_type buffer32; - etl::bitset_ext<64, int64_t>::buffer_type buffer64; + etl::bitset_ext<8, uint8_t>::buffer_type buffer8; + etl::bitset_ext<16, uint16_t>::buffer_type buffer16; + etl::bitset_ext<32, uint32_t>::buffer_type buffer32; + etl::bitset_ext<64, uint64_t>::buffer_type buffer64; - etl::bitset_ext<8, int8_t> data8(buffer8); - etl::bitset_ext<16, int16_t> data16(buffer16); - etl::bitset_ext<32, int32_t> data32(buffer32); - etl::bitset_ext<64, int64_t> data64(buffer64); + etl::bitset_ext<8, uint8_t> data8(buffer8); + etl::bitset_ext<16, uint16_t> data16(buffer16); + etl::bitset_ext<32, uint32_t> data32(buffer32); + etl::bitset_ext<64, uint64_t> data64(buffer64); CHECK_EQUAL(1U, data8.Number_Of_Elements); CHECK_EQUAL(1U, data16.Number_Of_Elements); CHECK_EQUAL(1U, data32.Number_Of_Elements); CHECK_EQUAL(1U, data64.Number_Of_Elements); + + CHECK_EQUAL(etl::bitset_layout::Single, data8.Element_Layout); + CHECK_EQUAL(etl::bitset_layout::Single, data16.Element_Layout); + CHECK_EQUAL(etl::bitset_layout::Single, data32.Element_Layout); + CHECK_EQUAL(etl::bitset_layout::Single, data64.Element_Layout); } //************************************************************************* TEST(test_construct_from_value) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; std::bitset<64> compare(0x123456731234567ULL); - etl::bitset_ext<64, int64_t> data(0x123456731234567ULL, buffer1); + etl::bitset_ext<64, uint64_t> data(0x123456731234567ULL, buffer1); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -132,11 +137,11 @@ namespace //************************************************************************* TEST(test_copy_construct) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; std::bitset<64> compare(0x123456731234567ULL); - etl::bitset_ext<64, int64_t> data(0x123456731234567ULL, buffer1); - etl::bitset_ext<64, int64_t> data_copy(data, buffer2); + etl::bitset_ext<64, uint64_t> data(0x123456731234567ULL, buffer1); + etl::bitset_ext<64, uint64_t> data_copy(data, buffer2); CHECK_EQUAL(compare.size(), data_copy.size()); CHECK_EQUAL(compare.count(), data_copy.count()); @@ -150,9 +155,9 @@ namespace //************************************************************************* TEST(test_construct_from_excess_value) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(0x8765432187654321ULL); - etl::bitset_ext<64, int64_t> data(0x8765432187654321ULL, buffer); + etl::bitset_ext<64, uint64_t> data(0x8765432187654321ULL, buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -166,9 +171,9 @@ namespace //************************************************************************* TEST(test_construct_from_char_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data("110001001000110100010101100111001100010010001101000101011001", buffer); + etl::bitset_ext<64, uint64_t> data("110001001000110100010101100111001100010010001101000101011001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -182,9 +187,9 @@ namespace //************************************************************************* TEST(test_construct_from_wchar_t_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(L"110001001000110100010101100111001100010010001101000101011001", buffer); + etl::bitset_ext<64, uint64_t> data(L"110001001000110100010101100111001100010010001101000101011001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -198,9 +203,9 @@ namespace //************************************************************************* TEST(test_construct_from_char16_t_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(u"110001001000110100010101100111001100010010001101000101011001", buffer); + etl::bitset_ext<64, uint64_t> data(u"110001001000110100010101100111001100010010001101000101011001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -214,9 +219,9 @@ namespace //************************************************************************* TEST(test_construct_from_char32_t_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(U"110001001000110100010101100111001100010010001101000101011001", buffer); + etl::bitset_ext<64, uint64_t> data(U"110001001000110100010101100111001100010010001101000101011001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -232,8 +237,8 @@ namespace { const char* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(s, buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(s, buffer); CHECK_EQUAL(60, data.size()); CHECK_EQUAL(0, data.count()); @@ -244,8 +249,8 @@ namespace { const wchar_t* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(s, buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(s, buffer); CHECK_EQUAL(60, data.size()); CHECK_EQUAL(0, data.count()); @@ -256,8 +261,8 @@ namespace { const char16_t* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(s, buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(s, buffer); CHECK_EQUAL(60, data.size()); CHECK_EQUAL(0, data.count()); @@ -268,8 +273,8 @@ namespace { const char32_t* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(s, buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(s, buffer); CHECK_EQUAL(60, data.size()); CHECK_EQUAL(0, data.count()); @@ -278,9 +283,9 @@ namespace //************************************************************************* TEST(test_construct_from_excess_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001111100001"); - etl::bitset_ext<64, int64_t> data("110001001000110100010101100111001100010010001101000101011001111100001", buffer); + etl::bitset_ext<64, uint64_t> data("110001001000110100010101100111001100010010001101000101011001111100001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -299,9 +304,9 @@ namespace //************************************************************************* TEST(test_set) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); compare.set(); data.set(); @@ -324,12 +329,40 @@ namespace } } + //************************************************************************* + TEST(test_set_less_than_full_size) + { + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + std::bitset<60> compare; + etl::bitset_ext<60, uint64_t> data(buffer); + + compare.set(); + data.set(); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + //************************************************************************* TEST(test_set_with_char_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.set("110001001000110100010101100111001100010010001101000101011001"); @@ -348,9 +381,9 @@ namespace //************************************************************************* TEST(test_set_with_wchar_t_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.set(L"110001001000110100010101100111001100010010001101000101011001"); @@ -369,9 +402,9 @@ namespace //************************************************************************* TEST(test_set_with_char16_t_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.set(u"110001001000110100010101100111001100010010001101000101011001"); @@ -390,9 +423,9 @@ namespace //************************************************************************* TEST(test_set_with_char32_t_string) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.set(U"110001001000110100010101100111001100010010001101000101011001"); @@ -413,8 +446,8 @@ namespace { const char* s = nullptr; - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); data.set(s); CHECK_EQUAL(64, data.size()); @@ -426,8 +459,8 @@ namespace { const wchar_t* s = nullptr; - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); data.set(s); CHECK_EQUAL(64, data.size()); @@ -439,8 +472,8 @@ namespace { const char16_t* s = nullptr; - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); data.set(s); CHECK_EQUAL(64, data.size()); @@ -452,8 +485,8 @@ namespace { const char32_t* s = nullptr; - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); data.set(s); CHECK_EQUAL(64, data.size()); @@ -463,9 +496,9 @@ namespace //************************************************************************* TEST(test_from_string_with_char) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.from_string("110001001000110100010101100111001100010010001101000101011001"); @@ -484,9 +517,9 @@ namespace //************************************************************************* TEST(test_from_string_with_wchar_t) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.from_string(L"110001001000110100010101100111001100010010001101000101011001"); @@ -505,9 +538,9 @@ namespace //************************************************************************* TEST(test_from_string_with_char16_t) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.from_string(u"110001001000110100010101100111001100010010001101000101011001"); @@ -526,9 +559,9 @@ namespace //************************************************************************* TEST(test_from_string_with_char32_t) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); data.from_string(U"110001001000110100010101100111001100010010001101000101011001"); @@ -549,8 +582,8 @@ namespace { const char* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(buffer); data.from_string(s); CHECK_EQUAL(60, data.size()); @@ -562,8 +595,8 @@ namespace { const wchar_t* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(buffer); data.from_string(s); CHECK_EQUAL(60, data.size()); @@ -575,8 +608,8 @@ namespace { const char16_t* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(buffer); data.from_string(s); CHECK_EQUAL(60, data.size()); @@ -588,8 +621,8 @@ namespace { const char16_t* s = nullptr; - etl::bitset_ext<60, int64_t>::buffer_type buffer; - etl::bitset_ext<60, int64_t> data(buffer); + etl::bitset_ext<60, uint64_t>::buffer_type buffer; + etl::bitset_ext<60, uint64_t> data(buffer); data.from_string(s); CHECK_EQUAL(60, data.size()); @@ -599,8 +632,8 @@ namespace //************************************************************************* TEST(test_value_u8_min) { - etl::bitset_ext<8, int8_t>::buffer_type buffer; - etl::bitset_ext<8, int8_t> data((unsigned long long)etl::integral_limits::min, buffer); + etl::bitset_ext<8, uint8_t>::buffer_type buffer; + etl::bitset_ext<8, uint8_t> data((unsigned long long)etl::integral_limits::min, buffer); uint8_t value = data.value(); CHECK_EQUAL(std::numeric_limits::min(), value); @@ -609,8 +642,8 @@ namespace //************************************************************************* TEST(test_value_u8_max) { - etl::bitset_ext<8, int8_t>::buffer_type buffer; - etl::bitset_ext<8, int8_t> data((unsigned long long)etl::integral_limits::max, buffer); + etl::bitset_ext<8, uint8_t>::buffer_type buffer; + etl::bitset_ext<8, uint8_t> data((unsigned long long)etl::integral_limits::max, buffer); uint8_t value = data.value(); CHECK_EQUAL(std::numeric_limits::max(), value); @@ -619,28 +652,28 @@ namespace //************************************************************************* TEST(test_value_s8_min) { - etl::bitset_ext<8, int8_t>::buffer_type buffer; - etl::bitset_ext<8, int8_t> data((unsigned long long)etl::integral_limits::min, buffer); - int8_t value = data.value(); + etl::bitset_ext<8, uint8_t>::buffer_type buffer; + etl::bitset_ext<8, uint8_t> data((unsigned long long)etl::integral_limits::min, buffer); + uint8_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_s8_max) { - etl::bitset_ext<8, int8_t>::buffer_type buffer; - etl::bitset_ext<8, int8_t> data((unsigned long long)etl::integral_limits::max, buffer); - int8_t value = data.value(); + etl::bitset_ext<8, uint8_t>::buffer_type buffer; + etl::bitset_ext<8, uint8_t> data((unsigned long long)etl::integral_limits::max, buffer); + uint8_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_u16_min) { - etl::bitset_ext<16, int16_t>::buffer_type buffer; - etl::bitset_ext<16, int16_t> data((unsigned long long)etl::integral_limits::min, buffer); + etl::bitset_ext<16, uint16_t>::buffer_type buffer; + etl::bitset_ext<16, uint16_t> data((unsigned long long)etl::integral_limits::min, buffer); uint16_t value = data.value(); CHECK_EQUAL(std::numeric_limits::min(), value); @@ -649,8 +682,8 @@ namespace //************************************************************************* TEST(test_value_u16_max) { - etl::bitset_ext<16, int16_t>::buffer_type buffer; - etl::bitset_ext<16, int16_t> data((unsigned long long)etl::integral_limits::max, buffer); + etl::bitset_ext<16, uint16_t>::buffer_type buffer; + etl::bitset_ext<16, uint16_t> data((unsigned long long)etl::integral_limits::max, buffer); uint16_t value = data.value(); CHECK_EQUAL(std::numeric_limits::max(), value); @@ -659,109 +692,109 @@ namespace //************************************************************************* TEST(test_value_s16_min) { - etl::bitset_ext<16, int16_t>::buffer_type buffer; - etl::bitset_ext<16, int16_t> data((unsigned long long)etl::integral_limits::min, buffer); - int16_t value = data.value(); + etl::bitset_ext<16, uint16_t>::buffer_type buffer; + etl::bitset_ext<16, uint16_t> data((unsigned long long)etl::integral_limits::min, buffer); + uint16_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_s16_max) { - etl::bitset_ext<16, int16_t>::buffer_type buffer; - etl::bitset_ext<16, int16_t> data((unsigned long long)etl::integral_limits::max, buffer); - int16_t value = data.value(); + etl::bitset_ext<16, uint16_t>::buffer_type buffer; + etl::bitset_ext<16, uint16_t> data((unsigned long long)etl::integral_limits::max, buffer); + uint16_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_u32_min) { - etl::bitset_ext<32, int32_t>::buffer_type buffer; - etl::bitset_ext<32, int32_t> data((unsigned long long)etl::integral_limits::min, buffer); - int32_t value = data.value(); + etl::bitset_ext<32, uint32_t>::buffer_type buffer; + etl::bitset_ext<32, uint32_t> data((unsigned long long)etl::integral_limits::min, buffer); + uint32_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_u32_max) { - etl::bitset_ext<32, int32_t>::buffer_type buffer; - etl::bitset_ext<32, int32_t> data((unsigned long long)etl::integral_limits::max, buffer); - int32_t value = data.value(); + etl::bitset_ext<32, uint32_t>::buffer_type buffer; + etl::bitset_ext<32, uint32_t> data((unsigned long long)etl::integral_limits::max, buffer); + uint32_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_s32_min) { - etl::bitset_ext<32, int32_t>::buffer_type buffer; - etl::bitset_ext<32, int32_t> data((unsigned long long)etl::integral_limits::min, buffer); - int32_t value = data.value(); + etl::bitset_ext<32, uint32_t>::buffer_type buffer; + etl::bitset_ext<32, uint32_t> data((unsigned long long)etl::integral_limits::min, buffer); + uint32_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_s32_max) { - etl::bitset_ext<32, int32_t>::buffer_type buffer; - etl::bitset_ext<32, int32_t> data((unsigned long long)etl::integral_limits::max, buffer); - int32_t value = data.value(); + etl::bitset_ext<32, uint32_t>::buffer_type buffer; + etl::bitset_ext<32, uint32_t> data((unsigned long long)etl::integral_limits::max, buffer); + uint32_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_u64_min) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data((unsigned long long)etl::integral_limits::min, buffer); - int64_t value = data.value(); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data((unsigned long long)etl::integral_limits::min, buffer); + uint64_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_u64_max) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data((unsigned long long)etl::integral_limits::max, buffer); - int64_t value = data.value(); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data((unsigned long long)etl::integral_limits::max, buffer); + uint64_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_s64_min) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data((unsigned long long)etl::integral_limits::min, buffer); - int64_t value = data.value(); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data((unsigned long long)etl::integral_limits::min, buffer); + uint64_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_s64_max) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data((unsigned long long)etl::integral_limits::max, buffer); - int64_t value = data.value(); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data((unsigned long long)etl::integral_limits::max, buffer); + uint64_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_position_set) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); for (size_t i = 0UL; i < data.size(); ++i) { @@ -793,9 +826,9 @@ namespace //************************************************************************* TEST(test_reset) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset_ext<64, int64_t> data(0xFFFFFFFFFFFFFFFULL, buffer); + etl::bitset_ext<64, uint64_t> data(0xFFFFFFFFFFFFFFFULL, buffer); compare.reset(); data.reset(); @@ -815,9 +848,9 @@ namespace //************************************************************************* TEST(test_position_reset) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset_ext<64, int64_t> data(0xFFFFFFFFFFFFFFFULL, buffer); + etl::bitset_ext<64, uint64_t> data(0xFFFFFFFFFFFFFFFULL, buffer); compare.reset(1); compare.reset(3); @@ -871,9 +904,9 @@ namespace //************************************************************************* TEST(test_index_operator_read) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare(0x3123456731234567ULL); - etl::bitset_ext<64, int64_t> data(0x3123456731234567ULL, buffer); + etl::bitset_ext<64, uint64_t> data(0x3123456731234567ULL, buffer); bool bc0 = compare[1U]; bool bd0 = data[1U]; @@ -895,8 +928,8 @@ namespace //************************************************************************* TEST(test_index_operator_write) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); data[1U] = true; data[3U] = true; @@ -912,14 +945,14 @@ namespace //************************************************************************* TEST(test_any) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(ull(0x0000000000000000), buffer1); - etl::bitset_ext<64, int64_t> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<64, int64_t> data3(ull(0x1000010001000100), buffer3); - etl::bitset_ext<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<64, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); bool bd1 = data1.any(); bool bd2 = data2.any(); @@ -935,14 +968,14 @@ namespace //************************************************************************* TEST(test_any_with_mask) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(ull(0xF000000000000000), buffer1); - etl::bitset_ext<64, int64_t> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<64, int64_t> data3(ull(0x1000010001000100), buffer3); - etl::bitset_ext<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data1(ull(0xF000000000000000), buffer1); + etl::bitset_ext<64, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); ull mask = ull(0x0FFFFFFFFFFFFFFF); @@ -960,14 +993,14 @@ namespace //************************************************************************* TEST(test_none) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(ull(0x0000000000000000), buffer1); - etl::bitset_ext<64, int64_t> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<64, int64_t> data3(ull(0x1000010001000100), buffer3); - etl::bitset_ext<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<64, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); bool bd1 = data1.none(); bool bd2 = data2.none(); @@ -983,14 +1016,14 @@ namespace //************************************************************************* TEST(test_none_with_mask) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(ull(0xF000000000000000), buffer1); - etl::bitset_ext<64, int64_t> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<64, int64_t> data3(ull(0x1000010001000100), buffer3); - etl::bitset_ext<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data1(ull(0xF000000000000000), buffer1); + etl::bitset_ext<64, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); ull mask = ull(0x0FFFFFFFFFFFFFFF); @@ -1008,14 +1041,14 @@ namespace //************************************************************************* TEST(test_all) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(ull(0x0000000000000000), buffer1); - etl::bitset_ext<64, int64_t> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<64, int64_t> data3(ull(0x1000010001000100), buffer3); - etl::bitset_ext<64, int64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<64, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); bool bd1 = data1.all(); bool bd2 = data2.all(); @@ -1031,14 +1064,14 @@ namespace //************************************************************************* TEST(test_all_with_mask) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(ull(0x0000000000000000), buffer1); - etl::bitset_ext<64, int64_t> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<64, int64_t> data3(ull(0x1000010001000100), buffer3); - etl::bitset_ext<64, int64_t> data4(ull(0x0FFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<64, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64, uint64_t> data4(ull(0x0FFFFFFFFFFFFFFF), buffer4); ull mask = ull(0x0FFFFFFFFFFFFFFF); @@ -1053,12 +1086,156 @@ namespace CHECK_TRUE(bd4); } + //************************************************************************* + TEST(test_any_with_reduced_active_bits) + { + etl::bitset_ext<60, uint64_t>::buffer_type buffer1; + etl::bitset_ext<60, uint64_t>::buffer_type buffer2; + etl::bitset_ext<60, uint64_t>::buffer_type buffer3; + etl::bitset_ext<60, uint64_t>::buffer_type buffer4; + etl::bitset_ext<60, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + bool bd1 = data1.any(); + bool bd2 = data2.any(); + bool bd3 = data3.any(); + bool bd4 = data4.any(); + + CHECK_FALSE(bd1); + CHECK_TRUE(bd2); + CHECK_TRUE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_any_with_mask_with_reduced_active_bits) + { + etl::bitset_ext<60, uint64_t>::buffer_type buffer1; + etl::bitset_ext<60, uint64_t>::buffer_type buffer2; + etl::bitset_ext<60, uint64_t>::buffer_type buffer3; + etl::bitset_ext<60, uint64_t>::buffer_type buffer4; + etl::bitset_ext<60, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + ull mask = ull(0x0FFFFFFFFFFFFFFF); + + bool bd1 = data1.any(mask); + bool bd2 = data2.any(mask); + bool bd3 = data3.any(mask); + bool bd4 = data4.any(mask); + + CHECK_FALSE(bd1); + CHECK_TRUE(bd2); + CHECK_TRUE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_none_with_reduced_active_bits) + { + etl::bitset_ext<60, uint64_t>::buffer_type buffer1; + etl::bitset_ext<60, uint64_t>::buffer_type buffer2; + etl::bitset_ext<60, uint64_t>::buffer_type buffer3; + etl::bitset_ext<60, uint64_t>::buffer_type buffer4; + etl::bitset_ext<60, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + bool bd1 = data1.none(); + bool bd2 = data2.none(); + bool bd3 = data3.none(); + bool bd4 = data4.none(); + + CHECK_TRUE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_FALSE(bd4); + } + + //************************************************************************* + TEST(test_none_with_mask_with_reduced_active_bits) + { + etl::bitset_ext<60, uint64_t>::buffer_type buffer1; + etl::bitset_ext<60, uint64_t>::buffer_type buffer2; + etl::bitset_ext<60, uint64_t>::buffer_type buffer3; + etl::bitset_ext<60, uint64_t>::buffer_type buffer4; + etl::bitset_ext<60, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + ull mask = ull(0x0FFFFFFFFFFFFFFF); + + bool bd1 = data1.none(mask); + bool bd2 = data2.none(mask); + bool bd3 = data3.none(mask); + bool bd4 = data4.none(mask); + + CHECK_TRUE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_FALSE(bd4); + } + + //************************************************************************* + TEST(test_all_with_reduced_active_bits) + { + etl::bitset_ext<60, uint64_t>::buffer_type buffer1; + etl::bitset_ext<60, uint64_t>::buffer_type buffer2; + etl::bitset_ext<60, uint64_t>::buffer_type buffer3; + etl::bitset_ext<60, uint64_t>::buffer_type buffer4; + etl::bitset_ext<60, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + bool bd1 = data1.all(); + bool bd2 = data2.all(); + bool bd3 = data3.all(); + bool bd4 = data4.all(); + + CHECK_FALSE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_all_with_mask_with_reduced_active_bits) + { + etl::bitset_ext<60, uint64_t>::buffer_type buffer1; + etl::bitset_ext<60, uint64_t>::buffer_type buffer2; + etl::bitset_ext<60, uint64_t>::buffer_type buffer3; + etl::bitset_ext<60, uint64_t>::buffer_type buffer4; + etl::bitset_ext<60, uint64_t> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60, uint64_t> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60, uint64_t> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60, uint64_t> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + ull mask = ull(0x00FFFFFFFFFFFFFF); + + bool bd1 = data1.all(mask); + bool bd2 = data2.all(mask); + bool bd3 = data3.all(mask); + bool bd4 = data4.all(mask); + + CHECK_FALSE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_TRUE(bd4); + } + //************************************************************************* TEST(test_flip) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); compare.flip(); data.flip(); @@ -1072,9 +1249,9 @@ namespace //************************************************************************* TEST(test_flip_position) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); compare.flip(1); compare.flip(3); @@ -1095,9 +1272,9 @@ namespace //************************************************************************* TEST(test_flip_reference) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); compare[1].flip(); compare[3].flip(); @@ -1118,9 +1295,9 @@ namespace //************************************************************************* TEST(test_invert_reference) { - etl::bitset_ext<64, int64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; std::bitset<64> compare; - etl::bitset_ext<64, int64_t> data(buffer); + etl::bitset_ext<64, uint64_t> data(buffer); bool bc = ~compare[3]; bool bd = ~data[3]; @@ -1128,18 +1305,18 @@ namespace } //************************************************************************* - void test_assignment_operator_helper(etl::bitset_ext<64, int64_t>& from, etl::bitset_ext<64, int64_t>& to) + void test_assignment_operator_helper(etl::bitset_ext<64, uint64_t>& from, etl::bitset_ext<64, uint64_t>& to) { to = from; } TEST(test_assignment_operator) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset_ext<64, int64_t> data1(0xFFFFFFFFFFFFFFFULL, buffer1); - etl::bitset_ext<64, int64_t> data2(buffer2); + etl::bitset_ext<64, uint64_t> data1(0xFFFFFFFFFFFFFFFULL, buffer1); + etl::bitset_ext<64, uint64_t> data2(buffer2); test_assignment_operator_helper(data1, data2); @@ -1152,12 +1329,12 @@ namespace //************************************************************************* TEST(test_equality_operator) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t> data1(0x123456781234567ULL, buffer1); - etl::bitset_ext<64, int64_t> data2(0x123456781234567ULL, buffer2); - etl::bitset_ext<64, int64_t> data3(buffer3); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t> data1(0x123456781234567ULL, buffer1); + etl::bitset_ext<64, uint64_t> data2(0x123456781234567ULL, buffer2); + etl::bitset_ext<64, uint64_t> data3(buffer3); bool equal = (data1 == data2); bool not_equal = !(data1 == data3); @@ -1169,12 +1346,12 @@ namespace //************************************************************************* TEST(test_inequality_operator) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t> data1(0x123456781234567ULL, buffer1); - etl::bitset_ext<64, int64_t> data2(0x123456781234567ULL, buffer2); - etl::bitset_ext<64, int64_t> data3(buffer3); + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t> data1(0x123456781234567ULL, buffer1); + etl::bitset_ext<64, uint64_t> data2(0x123456781234567ULL, buffer2); + etl::bitset_ext<64, uint64_t> data3(buffer3); bool equal = !(data1 != data2); bool not_equal = (data1 != data3); @@ -1186,71 +1363,71 @@ namespace //************************************************************************* TEST(test_shift_left_operator) { - int64_t value = 0x0123456789ABCDEFULL; + uint64_t value = 0x0123456789ABCDEFULL; uint64_t mask = 0xFFFFFFFFFFFFFFFFULL; - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t> original(0x0123456789ABCDEFULL, buffer1); + etl::bitset_ext<64, uint64_t> original(0x0123456789ABCDEFULL, buffer1); for (ull shift = 0U; shift < 64U; ++shift) { - etl::bitset_ext<64, int64_t> data(original, buffer2); - CHECK_EQUAL_HEX(((value & mask) << shift), (data <<= shift).value()); + etl::bitset_ext<64, uint64_t> data(original, buffer2); + CHECK_EQUAL_HEX(((value & mask) << shift), (data <<= shift).value()); mask >>= 1; } - etl::bitset_ext<64, int64_t> data(original, buffer2); - CHECK_EQUAL_HEX(0ULL, (data <<= 64U).value()); + etl::bitset_ext<64, uint64_t> data(original, buffer2); + CHECK_EQUAL_HEX(0ULL, (data <<= 64U).value()); } //************************************************************************* TEST(test_shift_left_operator_overflow) { - etl::bitset_ext<32, int32_t>::buffer_type buffer1; - etl::bitset_ext<32, int32_t>::buffer_type buffer2; + etl::bitset_ext<32, uint32_t>::buffer_type buffer1; + etl::bitset_ext<32, uint32_t>::buffer_type buffer2; - etl::bitset_ext<32, int32_t> data(0xFFFFFFFFULL, buffer1); + etl::bitset_ext<32, uint32_t> data(0xFFFFFFFFULL, buffer1); data <<= 1U; - etl::bitset_ext<32, int32_t> shifted(0xFFFFFFFEUL, buffer2); + etl::bitset_ext<32, uint32_t> shifted(0xFFFFFFFEUL, buffer2); - CHECK_EQUAL_HEX(shifted.value(), data.value()); + CHECK_EQUAL_HEX(shifted.value(), data.value()); } //************************************************************************* TEST(test_shift_right_operator) { - int64_t value = 0x0123456789ABCDEFULL; + uint64_t value = 0x0123456789ABCDEFULL; - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t> original(0x0123456789ABCDEFULL, buffer1); + etl::bitset_ext<64, uint64_t> original(0x0123456789ABCDEFULL, buffer1); for (ull shift = 0U; shift < 64U; ++shift) { - etl::bitset_ext<64, int64_t> data(original, buffer2); - CHECK_EQUAL_HEX((value >> shift), (data >>= shift).value()); + etl::bitset_ext<64, uint64_t> data(original, buffer2); + CHECK_EQUAL_HEX((value >> shift), (data >>= shift).value()); } - etl::bitset_ext<64, int64_t> data(original, buffer2); - CHECK_EQUAL_HEX(0ULL, (data >>= 64U).value()); + etl::bitset_ext<64, uint64_t> data(original, buffer2); + CHECK_EQUAL_HEX(0ULL, (data >>= 64U).value()); } //************************************************************************* TEST(test_and_equals_operator) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(0x12345678UL, buffer1); - etl::bitset_ext<64, int64_t> data2(0x23456789UL, buffer2); - etl::bitset_ext<64, int64_t> data3(0x12345678UL & 0x23456789UL, buffer3); + etl::bitset_ext<64, uint64_t> data1(0x12345678UL, buffer1); + etl::bitset_ext<64, uint64_t> data2(0x23456789UL, buffer2); + etl::bitset_ext<64, uint64_t> data3(0x12345678UL & 0x23456789UL, buffer3); - etl::bitset_ext<64, int64_t> data4(data1, buffer4); + etl::bitset_ext<64, uint64_t> data4(data1, buffer4); data4 &= data2; CHECK(data3 == data4); } @@ -1258,16 +1435,16 @@ namespace //************************************************************************* TEST(test_or_equals_operator) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(0x12345678UL, buffer1); - etl::bitset_ext<64, int64_t> data2(0x23456789UL, buffer2); - etl::bitset_ext<64, int64_t> data3(0x12345678UL | 0x23456789UL, buffer3); + etl::bitset_ext<64, uint64_t> data1(0x12345678UL, buffer1); + etl::bitset_ext<64, uint64_t> data2(0x23456789UL, buffer2); + etl::bitset_ext<64, uint64_t> data3(0x12345678UL | 0x23456789UL, buffer3); - etl::bitset_ext<64, int64_t> data4(data1, buffer4); + etl::bitset_ext<64, uint64_t> data4(data1, buffer4); data4 |= data2; CHECK(data3 == data4); } @@ -1275,16 +1452,16 @@ namespace //************************************************************************* TEST(test_xor_equals_operator) { - etl::bitset_ext<64, int64_t>::buffer_type buffer1; - etl::bitset_ext<64, int64_t>::buffer_type buffer2; - etl::bitset_ext<64, int64_t>::buffer_type buffer3; - etl::bitset_ext<64, int64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t>::buffer_type buffer1; + etl::bitset_ext<64, uint64_t>::buffer_type buffer2; + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; - etl::bitset_ext<64, int64_t> data1(0x12345678UL, buffer1); - etl::bitset_ext<64, int64_t> data2(0x23456789UL, buffer2); - etl::bitset_ext<64, int64_t> data3(0x12345678UL ^ 0x23456789UL, buffer3); + etl::bitset_ext<64, uint64_t> data1(0x12345678UL, buffer1); + etl::bitset_ext<64, uint64_t> data2(0x23456789UL, buffer2); + etl::bitset_ext<64, uint64_t> data3(0x12345678UL ^ 0x23456789UL, buffer3); - etl::bitset_ext<64, int64_t> data4(data1, buffer4); + etl::bitset_ext<64, uint64_t> data4(data1, buffer4); data4 ^= data2; CHECK(data3 == data4); } @@ -1292,45 +1469,45 @@ namespace //************************************************************************* TEST(test_find_first) { - etl::bitset_ext<8, int8_t>::buffer_type buffer; + etl::bitset_ext<8, uint8_t>::buffer_type buffer; - etl::bitset_ext<8, int8_t> bs1(ull(0x00), buffer); + etl::bitset_ext<8, uint8_t> bs1(ull(0x00), buffer); size_t bs1fff = bs1.find_first(false); size_t bs1fft = bs1.find_first(true); CHECK_EQUAL(0U, bs1fff); CHECK_EQUAL(etl::bitset_ext<>::npos, bs1fft); - etl::bitset_ext<8, int8_t> bs2(ull(0xFF), buffer); + etl::bitset_ext<8, uint8_t> bs2(ull(0xFF), buffer); size_t bs2fff = bs2.find_first(false); size_t bs2fft = bs2.find_first(true); CHECK_EQUAL(etl::bitset_ext<>::npos, bs2fff); CHECK_EQUAL(0U, bs2fft); - etl::bitset_ext<8, int8_t> bs3(ull(0x01), buffer); + etl::bitset_ext<8, uint8_t> bs3(ull(0x01), buffer); size_t bs3fff = bs3.find_first(false); size_t bs3fft = bs3.find_first(true); CHECK_EQUAL(1U, bs3fff); CHECK_EQUAL(0U, bs3fft); - etl::bitset_ext<8, int8_t> bs4(ull(0x20), buffer); + etl::bitset_ext<8, uint8_t> bs4(ull(0x20), buffer); size_t bs4fff = bs4.find_first(false); size_t bs4fft = bs4.find_first(true); CHECK_EQUAL(0U, bs4fff); CHECK_EQUAL(5U, bs4fft); - etl::bitset_ext<8, int8_t> bs5(ull(0x21), buffer); + etl::bitset_ext<8, uint8_t> bs5(ull(0x21), buffer); size_t bs5fff = bs5.find_first(false); size_t bs5fft = bs5.find_first(true); CHECK_EQUAL(1U, bs5fff); CHECK_EQUAL(0U, bs5fft); - etl::bitset_ext<8, int8_t> bs6(ull(0x0E), buffer); + etl::bitset_ext<8, uint8_t> bs6(ull(0x0E), buffer); size_t bs6fff = bs6.find_first(false); size_t bs6fft = bs6.find_first(true); CHECK_EQUAL(0U, bs6fff); CHECK_EQUAL(1U, bs6fft); - etl::bitset_ext<8, int8_t> bs7(ull(0x31), buffer); + etl::bitset_ext<8, uint8_t> bs7(ull(0x31), buffer); size_t bs7fff = bs7.find_first(false); size_t bs7fft = bs7.find_first(true); CHECK_EQUAL(1U, bs7fff); @@ -1340,9 +1517,9 @@ namespace //************************************************************************* TEST(test_find_next) { - etl::bitset_ext<8, int8_t>::buffer_type buffer; + etl::bitset_ext<8, uint8_t>::buffer_type buffer; - etl::bitset_ext<8, int8_t> bs1(ull(0x00), buffer); + etl::bitset_ext<8, uint8_t> bs1(ull(0x00), buffer); size_t bs1fnf0 = bs1.find_next(false, 0); size_t bs1fnf1 = bs1.find_next(false, 1); size_t bs1fnt2 = bs1.find_next(true, 2); @@ -1350,7 +1527,7 @@ namespace CHECK_EQUAL(1U, bs1fnf1); CHECK_EQUAL(etl::bitset_ext<>::npos, bs1fnt2); - etl::bitset_ext<8, int8_t> bs2(ull(0xFF), buffer); + etl::bitset_ext<8, uint8_t> bs2(ull(0xFF), buffer); size_t bs2fnt0 = bs2.find_next(true, 0); size_t bs2fnt1 = bs2.find_next(true, 1); size_t bs2fnf2 = bs2.find_next(false, 2); @@ -1358,7 +1535,7 @@ namespace CHECK_EQUAL(1U, bs2fnt1); CHECK_EQUAL(etl::bitset_ext<>::npos, bs2fnf2); - etl::bitset_ext<8, int8_t> bs3(ull(0x0E), buffer); + etl::bitset_ext<8, uint8_t> bs3(ull(0x0E), buffer); size_t bs3fnf0 = bs3.find_next(false, 0); size_t bs3fnt1 = bs3.find_next(true, 1); size_t bs3fnf2 = bs3.find_next(false, 2); @@ -1366,7 +1543,7 @@ namespace CHECK_EQUAL(1U, bs3fnt1); CHECK_EQUAL(4U, bs3fnf2); - etl::bitset_ext<8, int8_t> bs4(ull(0x31), buffer); + etl::bitset_ext<8, uint8_t> bs4(ull(0x31), buffer); size_t bs4fnt0 = bs4.find_next(true, 0); size_t bs4fnf0 = bs4.find_next(false, 0); size_t bs4fnt1 = bs4.find_next(true, 1); @@ -1378,15 +1555,15 @@ namespace //************************************************************************* TEST(test_swap) { - etl::bitset_ext<16, int16_t>::buffer_type buffer1; - etl::bitset_ext<16, int16_t>::buffer_type buffer2; - etl::bitset_ext<16, int16_t>::buffer_type buffer3; - etl::bitset_ext<16, int16_t>::buffer_type buffer4; + etl::bitset_ext<16, uint16_t>::buffer_type buffer1; + etl::bitset_ext<16, uint16_t>::buffer_type buffer2; + etl::bitset_ext<16, uint16_t>::buffer_type buffer3; + etl::bitset_ext<16, uint16_t>::buffer_type buffer4; - etl::bitset_ext<16, int16_t> compare1(0x2A, buffer1); - etl::bitset_ext<16, int16_t> compare2(0x15, buffer2); - etl::bitset_ext<16, int16_t> compare1a(0x2A, buffer3); - etl::bitset_ext<16, int16_t> compare2a(0x15, buffer4); + etl::bitset_ext<16, uint16_t> compare1(0x2A, buffer1); + etl::bitset_ext<16, uint16_t> compare2(0x15, buffer2); + etl::bitset_ext<16, uint16_t> compare1a(0x2A, buffer3); + etl::bitset_ext<16, uint16_t> compare2a(0x15, buffer4); swap(compare1a, compare2a); @@ -1397,7 +1574,7 @@ namespace //************************************************************************* TEST(test_span) { - etl::bitset_ext<32, int32_t>::buffer_type buffer; + etl::bitset_ext<32, uint32_t>::buffer_type buffer; etl::bitset_ext<32, uint32_t> data(0x12345678UL, buffer); using span_t = etl::bitset_ext<32, uint32_t>::span_type; @@ -1409,7 +1586,7 @@ namespace //************************************************************************* TEST(test_const_span) { - etl::bitset_ext<32, int32_t>::buffer_type buffer; + etl::bitset_ext<32, uint32_t>::buffer_type buffer; const etl::bitset_ext<32, uint32_t> data(0x12345678UL, buffer); using span_t = const etl::bitset_ext<32, uint32_t>::const_span_type; @@ -1421,7 +1598,7 @@ namespace //************************************************************************* TEST(test_to_string) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 data(0x12345678UL, buffer); @@ -1437,7 +1614,7 @@ namespace //************************************************************************* TEST(test_to_wstring) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); @@ -1452,7 +1629,7 @@ namespace //************************************************************************* TEST(test_to_u16string) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); @@ -1467,7 +1644,7 @@ namespace //************************************************************************* TEST(test_to_u32string) { - using bs32 = etl::bitset_ext<32, int32_t>; + using bs32 = etl::bitset_ext<32, uint32_t>; bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); @@ -1568,16 +1745,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); @@ -1596,8 +1773,8 @@ namespace CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); - CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); - CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); } //************************************************************************* @@ -1608,16 +1785,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); @@ -1637,8 +1814,8 @@ namespace CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); // The lines below should static assert. - //int8_t v1 = b.extract(); - //int8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); } //************************************************************************* @@ -1726,34 +1903,34 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); - CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); - CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); - CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); - CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); - CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); - CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); - CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); - CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); - CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); - CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); - CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); - CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); - CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); - CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); - CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); - CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); - CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); - CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); - CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); - CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); - CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); - CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); - CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); - CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); - CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); - CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* @@ -1764,35 +1941,35 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); // The lines below should static assert. - //int8_t v1 = b.extract(); - //int8_t v2 = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); } //************************************************************************* @@ -1931,26 +2108,26 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); - CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); - CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); - CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); - CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); - CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); - CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); - CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); - CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); - CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); - CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); - CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); - CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); - CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); - CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); - CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); - CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); - CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); - CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); } //************************************************************************* @@ -1961,27 +2138,27 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); // The lines below should static assert. - //int16_t v1 = b.extract()); - //int16_t v2 = b.extract()); + //uint16_t v1 = b.extract()); + //uint16_t v2 = b.extract()); } }; } From a7271e470a2ccaaedd6150b76f76e10b849e167d Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 4 Jan 2024 00:03:20 +0000 Subject: [PATCH 025/131] Work in progress Comprehensive bitset type comparisons --- include/etl/private/bitset_new.h | 1089 +++++--- test/test_bitset_new_comparisons.cpp | 239 ++ test/test_bitset_new_default_element_type.cpp | 2243 +++++++---------- ...itset_new_explicit_single_element_type.cpp | 20 +- ...st_bitset_new_ext_default_element_type.cpp | 1981 +++++---------- ...t_new_ext_explicit_single_element_type.cpp | 16 +- test/vs2022/etl.vcxproj | 1 + test/vs2022/etl.vcxproj.filters | 9 +- 8 files changed, 2552 insertions(+), 3046 deletions(-) create mode 100644 test/test_bitset_new_comparisons.cpp diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 7a4a7fa1..1f76a448 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -46,6 +46,8 @@ SOFTWARE. #include "../span.h" #include "../string.h" #include "../enum_type.h" +#include "../largest.h" +#include "../smallest.h" #include #include @@ -86,7 +88,7 @@ namespace etl /// or spread over an array of elements. ///\ingroup bitset //*************************************************************************** - struct bitset_layout + struct bitset_storage_model { static ETL_CONSTANT char Undefined = 0; static ETL_CONSTANT char Single = 1; @@ -161,7 +163,7 @@ namespace etl ///\ingroup bitset //************************************************************************* template - class bitset_impl + class bitset_impl { public: @@ -180,9 +182,9 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void set(pointer pbuffer, - size_t /*number_of_elements*/, - element_type top_mask) ETL_NOEXCEPT + void set_all(pointer pbuffer, + size_t /*number_of_elements*/, + element_type top_mask) ETL_NOEXCEPT { *pbuffer = All_Set_Element & top_mask; } @@ -192,10 +194,9 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void set(pointer pbuffer, - size_t /*number_of_elements*/, - size_t position, - bool value = true) + void set_position(pointer pbuffer, + size_t position, + bool value = true) { const element_type mask = element_type(element_type(1) << position); @@ -214,8 +215,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void reset(pointer pbuffer, - size_t /*number_of_elements*/) ETL_NOEXCEPT + void reset_all(pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT { *pbuffer = All_Clear_Element; } @@ -225,9 +226,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void reset(pointer pbuffer, - size_t /*number_of_elements*/, - size_t position) + void reset_position(pointer pbuffer, + size_t position) { const element_type mask = element_type(element_type(1) << position); *pbuffer &= ~mask; @@ -243,7 +243,7 @@ namespace etl size_t active_bits, const char* text) ETL_NOEXCEPT { - reset(pbuffer, 1U); + reset_all(pbuffer, 1U); if (text != ETL_NULLPTR) { @@ -276,7 +276,7 @@ namespace etl size_t active_bits, const wchar_t* text) ETL_NOEXCEPT { - reset(pbuffer, 1U); + reset_all(pbuffer, 1U); if (text != ETL_NULLPTR) { @@ -309,7 +309,7 @@ namespace etl size_t active_bits, const char16_t* text) ETL_NOEXCEPT { - reset(pbuffer, 1U); + reset_all(pbuffer, 1U); if (text != ETL_NULLPTR) { @@ -342,7 +342,7 @@ namespace etl size_t active_bits, const char32_t* text) ETL_NOEXCEPT { - reset(pbuffer, 1U); + reset_all(pbuffer, 1U); if (text != ETL_NULLPTR) { @@ -402,6 +402,29 @@ namespace etl return static_cast(value); } + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template ::bits> + ETL_CONSTEXPR14 + static + T extract(const_pointer pbuffer) + { + typedef typename etl::make_unsigned::type unsigned_t; + + 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; + + if ((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, Length); + } + + return static_cast(value); + } + //************************************************************************* /// Tests a bit at a position. /// Positions greater than the number of configured bits will return false. @@ -409,7 +432,6 @@ namespace etl ETL_CONSTEXPR14 static bool test(const_pointer pbuffer, - size_t /*number_of_elements*/, size_t position) { const element_type mask = element_type(element_type(1) << position); @@ -503,8 +525,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void flip(pointer pbuffer, - size_t /*number_of_elements*/) ETL_NOEXCEPT + void flip_all(pointer pbuffer, + size_t /*number_of_elements*/) ETL_NOEXCEPT { *pbuffer = ~*pbuffer; } @@ -515,7 +537,6 @@ namespace etl ETL_CONSTEXPR14 static void flip_bits(pointer pbuffer, - size_t /*number_of_elements*/, element_type mask = etl::integral_limits::max) ETL_NOEXCEPT { *pbuffer ^= mask; @@ -526,57 +547,20 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void flip(pointer pbuffer, - size_t /*number_of_elements*/, - size_t position) + void flip_position(pointer pbuffer, + size_t position) { const element_type mask = element_type(element_type(1) << position); *pbuffer ^= mask; } - //************************************************************************* - /// Read [] operator. - //************************************************************************* - ETL_CONSTEXPR14 - static - bool read_bit(const_pointer pbuffer, - size_t active_bits, - size_t /*number_of_elements*/, - size_t position) ETL_NOEXCEPT - { - if (position < active_bits) - { - const element_type mask = element_type(element_type(1) << position); - return (*pbuffer & mask) != 0U; - } - - return false; - } - - //************************************************************************* - /// Write [] operator. - //************************************************************************* - ETL_CONSTEXPR14 - static - void write_bit(pointer pbuffer, - size_t /*number_of_elements*/, - size_t position) ETL_NOEXCEPT - { - return bit_reference(*this, position); - } - //************************************************************************* /// Returns a string representing the bitset. //************************************************************************* -#if ETL_USING_CPP11 - template > -#else template -#endif ETL_CONSTEXPR14 static TString to_string(const_pointer pbuffer, - size_t /*number_of_elements*/, size_t active_bits, typename TString::value_type zero = typename TString::value_type('0'), typename TString::value_type one = typename TString::value_type('1')) @@ -590,7 +574,7 @@ namespace etl for (size_t i = active_bits; i > 0; --i) { - result[active_bits - i] = test(pbuffer, 0, i - 1) ? one : zero; + result[active_bits - i] = test(pbuffer, i - 1) ? one : zero; } return result; @@ -715,7 +699,7 @@ namespace etl { if (shift >= active_bits) { - reset(pbuffer, 1U); + reset_all(pbuffer, 1U); } else { @@ -735,7 +719,7 @@ namespace etl { if (shift >= active_bits) { - reset(pbuffer, 1U); + reset_all(pbuffer, 1U); } else { @@ -787,7 +771,7 @@ namespace etl ///\ingroup bitset //************************************************************************* template - class bitset_impl + class bitset_impl { public: @@ -810,79 +794,135 @@ namespace etl static ETL_CONSTANT bool value = ((Position + Length - 1) >> etl::log2::value) == (Position >> etl::log2::value); }; - //************************************************************************* - /// Count the number of bits set. - //************************************************************************* - ETL_CONSTEXPR14 - static - size_t count(const_pointer pbuffer, - size_t number_of_elements) ETL_NOEXCEPT - { - size_t n = 0UL; - - for (size_t i = 0UL; i < number_of_elements; ++i) - { - n += etl::count_bits(pbuffer[i]); - } - - return n; - } - //************************************************************************* /// Tests a bit at a position. /// Positions greater than the number of configured bits will return false. //************************************************************************* ETL_CONSTEXPR14 static - bool test(const_pointer pbuffer, - size_t number_of_elements, + bool test(const_pointer pbuffer, size_t position) ETL_NOEXCEPT { - size_t index = 0U; - element_type mask = element_type(0); - - if (number_of_elements == 1U) - { - index = 0; - mask = element_type(1) << position; - } - else - { - index = position >> etl::log2::value; - mask = element_type(1) << (position & (Bits_Per_Element - 1)); - } + size_t index = position >> etl::log2::value; + element_type mask = element_type(1) << (position & (Bits_Per_Element - 1)); return (pbuffer[index] & mask) != 0; } + //************************************************************************* + /// Count the number of bits set. + //************************************************************************* + ETL_CONSTEXPR14 + static + size_t count(const_pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + size_t count = 0; + + while (number_of_elements-- != 0) + { + count += etl::count_bits(*pbuffer++); + } + + return count; + } + + //************************************************************************* + // Are all the bits sets? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool all(const_pointer pbuffer, + size_t number_of_elements, + element_type top_mask) ETL_NOEXCEPT + { + // All but the last. + while (number_of_elements-- != 1U) + { + if (*pbuffer++ != All_Set_Element) + { + return false; + } + } + + // The last. + if ((*pbuffer & top_mask) != top_mask) + { + return false; + } + + return true; + } + + //************************************************************************* + /// Are none of the bits set? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool none(const_pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + while (number_of_elements-- != 0) + { + if (*pbuffer++ != 0) + { + return false; + } + } + + return true; + } + + //************************************************************************* + /// Are any of the bits set? + //************************************************************************* + ETL_CONSTEXPR14 + static + bool any(const_pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT + { + bool any_set = false; + + while (number_of_elements-- != 0) + { + if (*pbuffer++ != All_Clear_Element) + { + any_set = true; + break; + } + } + + return any_set; + } + + //************************************************************************* + /// Set all bits + //************************************************************************* + ETL_CONSTEXPR14 + static + void set_all(pointer pbuffer, + size_t number_of_elements, + element_type top_mask) ETL_NOEXCEPT + { + while (number_of_elements-- != 1U) + { + *pbuffer++ = All_Set_Element; + } + + *pbuffer = (All_Set_Element & top_mask); + } //************************************************************************* /// Set the bit at the position. //************************************************************************* ETL_CONSTEXPR14 static - void set(pointer pbuffer, - size_t number_of_elements, - size_t position, - bool value = true) ETL_NOEXCEPT + void set_position(pointer pbuffer, + size_t position, + bool value = true) ETL_NOEXCEPT { - size_t index = 0; - element_type bit = 0; - - if (number_of_elements == 0) ETL_UNLIKELY - { - return; - } - else if (number_of_elements == 1U) - { - index = 0; - bit = element_type(1) << position; - } - else - { - index = position >> etl::log2::value; - bit = element_type(1) << (position & (Bits_Per_Element - 1)); - } + size_t index = position >> etl::log2::value; + element_type bit = element_type(1) << (position & (Bits_Per_Element - 1)); if (value) { @@ -924,7 +964,7 @@ namespace etl while (i > 0) { - set(pbuffer, number_of_elements, --i, *text++ == ETL_STR('1')); + set_position(pbuffer, --i, *text++ == ETL_STR('1')); } } } @@ -959,7 +999,7 @@ namespace etl while (i > 0) { - set(pbuffer, number_of_elements, --i, *text++ == ETL_STRL('1')); + set_position(pbuffer, --i, *text++ == ETL_STRL('1')); } } } @@ -994,7 +1034,7 @@ namespace etl while (i > 0) { - set(pbuffer, number_of_elements, --i, *text++ == ETL_STRu('1')); + set_position(pbuffer, --i, *text++ == ETL_STRu('1')); } } } @@ -1029,70 +1069,18 @@ namespace etl while (i > 0) { - set(pbuffer, number_of_elements, --i, *text++ == ETL_STRU('1')); + set_position(pbuffer, --i, *text++ == ETL_STRU('1')); } } } - //************************************************************************* - /// Set from a string. - //************************************************************************* - ETL_CONSTEXPR14 - static - void set(pointer pbuffer, - size_t number_of_elements, - size_t total_bits, - const char* text) ETL_NOEXCEPT - { - from_string(pbuffer, number_of_elements, total_bits, text); - } - - //************************************************************************* - /// Set from a wstring. - //************************************************************************* - ETL_CONSTEXPR14 - static - void set(pointer pbuffer, - size_t number_of_elements, - size_t total_bits, - const wchar_t* text) ETL_NOEXCEPT - { - from_string(pbuffer, number_of_elements, total_bits, text); - } - - //************************************************************************* - /// Set from a u16string. - //************************************************************************* - ETL_CONSTEXPR14 - static - void set(pointer pbuffer, - size_t number_of_elements, - size_t total_bits, - const char16_t* text) ETL_NOEXCEPT - { - from_string(pbuffer, number_of_elements, total_bits, text); - } - - //************************************************************************* - /// Set from a u32string. - //************************************************************************* - ETL_CONSTEXPR14 - static - void set(pointer pbuffer, - size_t number_of_elements, - size_t total_bits, - const char32_t* text) ETL_NOEXCEPT - { - from_string(pbuffer, number_of_elements, total_bits, text); - } - //************************************************************************* /// Reset all of the bits. //************************************************************************* ETL_CONSTEXPR14 static - void reset(pointer pbuffer, - size_t number_of_elements) ETL_NOEXCEPT + void reset_all(pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { while (number_of_elements-- != 0U) { @@ -1105,9 +1093,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void reset(pointer pbuffer, - size_t number_of_elements, - size_t position) ETL_NOEXCEPT + void reset_position(pointer pbuffer, + size_t position) ETL_NOEXCEPT { const size_t index = position >> etl::log2::value;; const element_type bit = element_type(1) << (position & (Bits_Per_Element - 1)); @@ -1195,6 +1182,7 @@ namespace etl //************************************************************************* /// Extract an integral value from an arbitary position and length. + /// Run time position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -1234,6 +1222,7 @@ namespace etl //************************************************************************* /// Extract an integral value when the value fits in one element. + /// Compile time position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -1252,6 +1241,7 @@ namespace etl //************************************************************************* /// Extract an integral value when the value spans more than one element. + /// Compile time position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -1259,18 +1249,55 @@ namespace etl typename etl::enable_if::value, typename etl::make_unsigned::type>::type extract_from_buffer(const_pointer pbuffer) { + // Start with index of the element containing the msb. const int Msb_Element_Index = (Position + Length - 1) >> etl::log2::value; - // Start with index of the element containing the msb. - int element_index = Msb_Element_Index; - - // The value is spread over multiple elements. - size_t length = Length; - // Get the number of active bits in the first element - size_t active_bits_in_msb = ((Position + Length - 1) % Bits_Per_Element) + 1; + const size_t Active_Bits_In_Msb = ((Position + Length - 1) % Bits_Per_Element) + 1; - return extract_from_multiple_elements(pbuffer, element_index, active_bits_in_msb, length); + return extract_from_multiple_elements(pbuffer, Msb_Element_Index, Active_Bits_In_Msb, Length); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + T extract(const_pointer pbuffer, + size_t position, + size_t length = etl::integral_limits::bits) + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = extract_from_buffer(pbuffer, position, length); + + if ((length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, length); + } + + return static_cast(value); + } + + //************************************************************************* + /// Extract an integral value from an arbitary position and length. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + T extract(const_pointer pbuffer) + { + typedef typename etl::make_unsigned::type unsigned_t; + + unsigned_t value = extract_from_buffer(pbuffer); + + if ((Length != etl::integral_limits::bits) && etl::integral_limits::is_signed) + { + value = etl::sign_extend(value, Length); + } + + return static_cast(value); } //************************************************************************* @@ -1278,8 +1305,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void flip(pointer pbuffer, - size_t number_of_elements) ETL_NOEXCEPT + void flip_all(pointer pbuffer, + size_t number_of_elements) ETL_NOEXCEPT { operator_not(pbuffer, number_of_elements); } @@ -1289,9 +1316,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 static - void flip(pointer pbuffer, - size_t number_of_elements, - size_t position) ETL_NOEXCEPT + void flip_position(pointer pbuffer, + size_t position) ETL_NOEXCEPT { const size_t index = position >> etl::log2::value;; const element_type bit = element_type(1) << (position & (Bits_Per_Element - 1)); @@ -1299,52 +1325,6 @@ namespace etl pbuffer[index] ^= bit; } - //************************************************************************* - // Are all the bits sets? - //************************************************************************* - ETL_CONSTEXPR14 - static - bool all(const_pointer pbuffer, - size_t number_of_elements, - element_type top_mask) ETL_NOEXCEPT - { - // All but the last. - for (size_t i = 0UL; i < (number_of_elements - 1U); ++i) - { - if (pbuffer[i] != All_Set_Element) - { - return false; - } - } - - // The last. - if (pbuffer[number_of_elements - 1U] != (All_Set_Element & top_mask)) - { - return false; - } - - return true; - } - - //************************************************************************* - /// Are none of the bits set? - //************************************************************************* - ETL_CONSTEXPR14 - static - bool none(const_pointer pbuffer, - size_t number_of_elements) ETL_NOEXCEPT - { - for (size_t i = 0UL; i < number_of_elements; ++i) - { - if (pbuffer[i] != 0) - { - return false; - } - } - - return true; - } - //************************************************************************* /// Finds the next bit in the specified state. ///\param state The state to search for. @@ -1411,7 +1391,6 @@ namespace etl ETL_CONSTEXPR14 static TString to_string(const_pointer pbuffer, - size_t number_of_elements, size_t active_bits, typename TString::value_type zero, typename TString::value_type one) @@ -1425,7 +1404,7 @@ namespace etl for (size_t i = active_bits; i > 0; --i) { - result[active_bits - i] = test(pbuffer, number_of_elements, i - 1) ? one : zero; + result[active_bits - i] = test(pbuffer, i - 1) ? one : zero; } return result; @@ -1440,9 +1419,11 @@ namespace etl const_pointer rhs_pbuffer, size_t number_of_elements) ETL_NOEXCEPT { - while (number_of_elements != 0) + while (number_of_elements-- != 0) { - *lhs_pbuffer++ = *rhs_pbuffer++; + *lhs_pbuffer = *rhs_pbuffer; + ++lhs_pbuffer; + ++rhs_pbuffer; } } @@ -1457,7 +1438,9 @@ namespace etl { while (number_of_elements-- != 0) { - *lhs_pbuffer++ &= *rhs_pbuffer++; + *lhs_pbuffer &= *rhs_pbuffer; + ++lhs_pbuffer; + ++rhs_pbuffer; } } @@ -1472,7 +1455,9 @@ namespace etl { while (number_of_elements-- != 0) { - *lhs_pbuffer++ != *rhs_pbuffer++; + *lhs_pbuffer |= *rhs_pbuffer; + ++lhs_pbuffer; + ++rhs_pbuffer; } } @@ -1487,7 +1472,9 @@ namespace etl { while (number_of_elements-- != 0) { - *lhs_pbuffer++ ^= *rhs_pbuffer++; + *lhs_pbuffer ^= *rhs_pbuffer; + ++lhs_pbuffer; + ++rhs_pbuffer; } } @@ -1501,7 +1488,8 @@ namespace etl { while (number_of_elements-- != 0) { - *pbuffer++ = ~*pbuffer++; + *pbuffer = ~*pbuffer; + ++pbuffer; } } @@ -1515,50 +1503,57 @@ namespace etl size_t active_bits, size_t shift) ETL_NOEXCEPT { - // The place where the elements are split when shifting. - const size_t split_position = Bits_Per_Element - (shift % Bits_Per_Element); - - // Where we are shifting from. - int src_index = int(number_of_elements - (shift / Bits_Per_Element) - 1U); - - // Where we are shifting to. - int dst_index = int(number_of_elements - 1U); - - // Shift control constants. - const size_t lsb_shift = Bits_Per_Element - split_position; - const size_t msb_shift = split_position; - - const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); - const element_type msb_mask = etl::integral_limits::max - lsb_mask; - const element_type lsb_shifted_mask = element_type(lsb_mask << lsb_shift); - - // First lsb. - element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); - pbuffer[dst_index] = lsb; - --src_index; - - // Now do the shifting. - while (src_index >= 0) + if (shift >= active_bits) { - // Shift msb. - element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); - pbuffer[dst_index] = pbuffer[dst_index] | msb; - --dst_index; + reset_all(pbuffer, number_of_elements); + } + else + { + // The place where the elements are split when shifting. + const size_t split_position = Bits_Per_Element - (shift % Bits_Per_Element); - // Shift lsb. + // Where we are shifting from. + int src_index = int(number_of_elements - (shift / Bits_Per_Element) - 1U); + + // Where we are shifting to. + int dst_index = int(number_of_elements - 1U); + + // Shift control constants. + const size_t lsb_shift = Bits_Per_Element - split_position; + const size_t msb_shift = split_position; + + const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); + const element_type msb_mask = etl::integral_limits::max - lsb_mask; + const element_type lsb_shifted_mask = element_type(lsb_mask << lsb_shift); + + // First lsb. element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); pbuffer[dst_index] = lsb; --src_index; - } - // Clear the remaining bits. - // First lsb. - pbuffer[dst_index] &= lsb_shifted_mask; + // Now do the shifting. + while (src_index >= 0) + { + // Shift msb. + element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); + pbuffer[dst_index] = pbuffer[dst_index] | msb; + --dst_index; - // The other remaining bytes on the right. - for (int i = 0; i < dst_index; ++i) - { - pbuffer[i] = 0; + // Shift lsb. + element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); + pbuffer[dst_index] = lsb; + --src_index; + } + + // Clear the remaining bits. + // First lsb. + pbuffer[dst_index] &= lsb_shifted_mask; + + // The other remaining bytes on the right. + for (int i = 0; i < dst_index; ++i) + { + pbuffer[i] = 0; + } } } @@ -1572,52 +1567,59 @@ namespace etl size_t active_bits, size_t shift) ETL_NOEXCEPT { - // The place where the elements are split when shifting. - const size_t split_position = shift % Bits_Per_Element; - - // Where we are shifting from. - int src_index = int(shift / Bits_Per_Element); - - // Where we are shifting to. - int dst_index = 0; - - // Shift control constants. - const size_t lsb_shift = Bits_Per_Element - split_position; - const size_t msb_shift = split_position; - - const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); - const element_type msb_mask = etl::integral_limits::max - lsb_mask; - const element_type msb_shifted_mask = element_type(msb_mask >> msb_shift); - - // Now do the shifting. - while (src_index < int(number_of_elements - 1)) + if (shift >= active_bits) { - // Shift msb. - element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); - ++src_index; - - // Shift lsb. - element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); - - // Combine them. - pbuffer[dst_index] = lsb | msb; - ++dst_index; + reset_all(pbuffer, number_of_elements); } - - // Final msb. - element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); - pbuffer[dst_index] = msb; - - // Clear the remaining bits. - // First msb. - pbuffer[dst_index] &= msb_shifted_mask; - ++dst_index; - - // The other remaining bytes. - while (dst_index < int(number_of_elements)) + else { - pbuffer[dst_index] = 0; + // The place where the elements are split when shifting. + const size_t split_position = shift % Bits_Per_Element; + + // Where we are shifting from. + int src_index = int(shift / Bits_Per_Element); + + // Where we are shifting to. + int dst_index = 0; + + // Shift control constants. + const size_t lsb_shift = Bits_Per_Element - split_position; + const size_t msb_shift = split_position; + + const element_type lsb_mask = element_type(etl::integral_limits::max >> (Bits_Per_Element - split_position)); + const element_type msb_mask = etl::integral_limits::max - lsb_mask; + const element_type msb_shifted_mask = element_type(msb_mask >> msb_shift); + + // Now do the shifting. + while (src_index < int(number_of_elements - 1)) + { + // Shift msb. + element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); + ++src_index; + + // Shift lsb. + element_type lsb = element_type((pbuffer[src_index] & lsb_mask) << lsb_shift); + + // Combine them. + pbuffer[dst_index] = lsb | msb; + ++dst_index; + } + + // Final msb. + element_type msb = element_type((pbuffer[src_index] & msb_mask) >> msb_shift); + pbuffer[dst_index] = msb; + + // Clear the remaining bits. + // First msb. + pbuffer[dst_index] &= msb_shifted_mask; ++dst_index; + + // The other remaining bytes. + while (dst_index < int(number_of_elements)) + { + pbuffer[dst_index] = 0; + ++dst_index; + } } } @@ -1697,7 +1699,8 @@ namespace etl static ETL_CONSTANT size_t Allocated_Bits = 0U; static ETL_CONSTANT element_type All_Set_Element = 0U; static ETL_CONSTANT element_type All_Clear_Element = 0U; - static ETL_CONSTANT char Element_Layout = etl::bitset_layout::Undefined; + static ETL_CONSTANT size_t Size = 0U; + static ETL_CONSTANT char Storage_Model = etl::bitset_storage_model::Undefined; static ETL_CONSTANT size_t npos = etl::integral_limits::max; }; @@ -1723,7 +1726,8 @@ namespace etl static ETL_CONSTANT element_type All_Clear_Element = element_type(0); static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - static ETL_CONSTANT char Element_Layout = (Number_Of_Elements == 1U) ? etl::bitset_layout::Single : etl::bitset_layout::Multi; + static ETL_CONSTANT size_t Size = Active_Bits; + static ETL_CONSTANT char Storage_Model = (Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; private: @@ -1828,7 +1832,7 @@ namespace etl ETL_CONSTEXPR14 bitset() ETL_NOEXCEPT : buffer() { - implementation::reset(buffer, Number_Of_Elements); + implementation::reset_all(buffer, Number_Of_Elements); } //************************************************************************* @@ -1900,7 +1904,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset& set() ETL_NOEXCEPT { - implementation::set(buffer, Number_Of_Elements, Top_Mask); + implementation::set_all(buffer, Number_Of_Elements, Top_Mask); return *this; } @@ -1912,7 +1916,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - implementation::set(buffer, Number_Of_Elements, position, value); + implementation::set_position(buffer, position, value); return *this; } @@ -2013,6 +2017,7 @@ namespace etl //************************************************************************* /// Extract an integral value from an arbitary position and length. + /// Run time position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -2023,11 +2028,12 @@ namespace etl ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return implementation::extract(buffer, position, length); + return implementation::template extract(buffer, position, length); } //************************************************************************* /// Extract an integral value from an arbitary position and length. + /// Compile time position and length. //************************************************************************* template ::bits> ETL_CONSTEXPR14 @@ -2037,7 +2043,7 @@ namespace etl ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return implementation::extract(buffer, Position, Length); + return implementation::template extract(buffer); } //************************************************************************* @@ -2065,7 +2071,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset& reset() ETL_NOEXCEPT { - implementation::reset(buffer, Number_Of_Elements); + implementation::reset_all(buffer, Number_Of_Elements); return *this; } @@ -2077,7 +2083,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - implementation::reset(buffer, Number_Of_Elements, position); + implementation::reset_position(buffer, position); return *this; } @@ -2090,7 +2096,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), false); - return implementation::test(buffer, Number_Of_Elements, position); + return implementation::test(buffer, position); } //************************************************************************* @@ -2122,6 +2128,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool all(element_type mask) const ETL_NOEXCEPT { + ETL_STATIC_ASSERT(Storage_Model == etl::bitset_storage_model::Single, "Not supported for 'Multi' bitset storage model"); + return implementation::all(buffer, Number_Of_Elements, Top_Mask, mask); } @@ -2138,6 +2146,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool none(element_type mask) const ETL_NOEXCEPT { + ETL_STATIC_ASSERT(Storage_Model == etl::bitset_storage_model::Single, "Not supported for 'Multi' bitset storage model"); + return implementation::none(buffer, Number_Of_Elements, mask); } @@ -2154,6 +2164,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool any(element_type mask) const ETL_NOEXCEPT { + ETL_STATIC_ASSERT(Storage_Model == etl::bitset_storage_model::Single, "Not supported for 'Multi' bitset storage model"); + return implementation::any(buffer, Number_Of_Elements, mask); } @@ -2162,7 +2174,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset& flip() ETL_NOEXCEPT { - implementation::flip(buffer, Number_Of_Elements); + implementation::flip_all(buffer, Number_Of_Elements); return *this; } @@ -2174,7 +2186,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - implementation::flip(buffer, Number_Of_Elements, position); + implementation::flip_position(buffer, position); return *this; } @@ -2184,7 +2196,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool operator[] (size_t position) const ETL_NOEXCEPT { - return implementation::test(buffer, Number_Of_Elements, position); + return implementation::test(buffer, position); } //************************************************************************* @@ -2206,7 +2218,7 @@ namespace etl ETL_CONSTEXPR14 TString to_string(typename TString::value_type zero = typename TString::value_type('0'), typename TString::value_type one = typename TString::value_type('1')) const { - return implementation::template to_string(buffer, Number_Of_Elements, Active_Bits, zero, one); + return implementation::template to_string(buffer, Active_Bits, zero, one); } //************************************************************************* @@ -2303,7 +2315,7 @@ namespace etl { etl::bitset temp(*this); - implementation::flip(temp.buffer, Number_Of_Elements); + implementation::flip_all(temp.buffer, Number_Of_Elements); return temp; } @@ -2327,7 +2339,7 @@ namespace etl { if (shift >= Active_Bits) { - implementation::reset(buffer, Number_Of_Elements); + implementation::reset_all(buffer, Number_Of_Elements); } else { @@ -2356,7 +2368,7 @@ namespace etl { if (shift >= Active_Bits) { - implementation::reset(buffer, Number_Of_Elements); + implementation::reset_all(buffer, Number_Of_Elements); } else { @@ -2374,6 +2386,14 @@ namespace etl return implementation::operator_equality(lhs.buffer, rhs.buffer, lhs.Number_Of_Elements); } + //************************************************************************* + /// operator != + //************************************************************************* + friend ETL_CONSTEXPR14 bool operator !=(const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT + { + return !(lhs == rhs); + } + //************************************************************************* /// swap //************************************************************************* @@ -2405,13 +2425,13 @@ namespace etl //************************************************************************* /// Correct the unused top bits after bit manipulation. //************************************************************************* - ETL_CONSTEXPR14 static void clear_unused_bits_in_msb(pointer pbuffer) ETL_NOEXCEPT - { - buffer[Number_Of_Elements - 1U] &= Top_Mask; - } + //ETL_CONSTEXPR14 static void clear_unused_bits_in_msb(pointer pbuffer) ETL_NOEXCEPT + //{ + // pbuffer[Number_Of_Elements - 1U] &= Top_Mask; + //} // The implementation of the bitset functionality. - typedef etl::bitset_impl implementation; + typedef etl::bitset_impl implementation; // The storage for the bitset. element_type buffer[Number_Of_Elements]; @@ -2452,16 +2472,16 @@ namespace etl temp ^= rhs; return temp; } +} - //*************************************************************************** - /// operator != - ///\ingroup bitset - //*************************************************************************** - template - ETL_CONSTEXPR14 bool operator != (const bitset& lhs, const bitset& rhs) ETL_NOEXCEPT - { - return !(lhs == rhs); - } +//*************************************************************************** +/// operator != +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 bool operator != (const etl::bitset& lhs, const etl::bitset& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); } //************************************************************************* @@ -2501,7 +2521,8 @@ namespace etl static ETL_CONSTANT size_t Allocated_Bits = 0U; static ETL_CONSTANT element_type All_Set_Element = 0U; static ETL_CONSTANT element_type All_Clear_Element = 0U; - static ETL_CONSTANT char Element_Layout = etl::bitset_layout::Undefined; + static ETL_CONSTANT size_t Size = 0U; + static ETL_CONSTANT char Storage_Model = etl::bitset_storage_model::Undefined; static ETL_CONSTANT size_t npos = etl::integral_limits::max; }; @@ -2527,7 +2548,8 @@ namespace etl static ETL_CONSTANT element_type All_Clear_Element = element_type(0); static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - static ETL_CONSTANT char Element_Layout = (Number_Of_Elements == 1U) ? etl::bitset_layout::Single : etl::bitset_layout::Multi; + static ETL_CONSTANT size_t Size = Active_Bits; + static ETL_CONSTANT char Storage_Model = (Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; private: @@ -2634,7 +2656,7 @@ namespace etl : pbuffer(pbuffer_) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - implementation::reset(pbuffer, Number_Of_Elements); + implementation::reset_all(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -2644,7 +2666,7 @@ namespace etl : pbuffer(buffer.data()) { ETL_ASSERT(pbuffer != ETL_NULLPTR, ETL_ERROR(etl::bitset_invalid_buffer)); - implementation::reset(pbuffer, Number_Of_Elements); + implementation::reset_all(pbuffer, Number_Of_Elements); } //************************************************************************* @@ -2781,7 +2803,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& set() ETL_NOEXCEPT { - implementation::set(pbuffer, Number_Of_Elements, Top_Mask); + implementation::set_all(pbuffer, Number_Of_Elements, Top_Mask); return *this; } @@ -2793,7 +2815,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - implementation::set(pbuffer, Number_Of_Elements, position, value); + implementation::set_position(pbuffer, position, value); return *this; } @@ -2893,6 +2915,7 @@ namespace etl //************************************************************************* /// Extract an integral value from an arbitary position and length. + /// Run time position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -2903,21 +2926,22 @@ namespace etl ETL_ASSERT_OR_RETURN_VALUE(length <= etl::integral_limits::bits, ETL_ERROR(bitset_overflow), 0); ETL_ASSERT_OR_RETURN_VALUE((position + length) <= Active_Bits, ETL_ERROR(bitset_overflow), 0); - return implementation::extract(pbuffer, position, length); + return implementation::template extract(pbuffer, position, length); } //************************************************************************* /// Extract an integral value from an arbitary position and length. + /// Compile time position and length. //************************************************************************* template ::bits> ETL_CONSTEXPR14 - T extract() const + T extract() const { ETL_STATIC_ASSERT(etl::is_integral::value, "Only integral types are supported"); ETL_STATIC_ASSERT(Length <= etl::integral_limits::bits, "Length is larger that the required type"); ETL_STATIC_ASSERT((Position + Length) <= Active_Bits, "Position/Length overflows bitset"); - return implementation::extract(pbuffer, Position, Length); + return implementation::template extract(pbuffer); } //************************************************************************* @@ -2945,7 +2969,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& reset() ETL_NOEXCEPT { - implementation::reset(pbuffer, Number_Of_Elements); + implementation::reset_all(pbuffer, Number_Of_Elements); return *this; } @@ -2957,7 +2981,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - implementation::reset(pbuffer, Number_Of_Elements, position); + implementation::reset_position(pbuffer, position); return *this; } @@ -2970,7 +2994,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), false); - return implementation::test(pbuffer, Number_Of_Elements, position); + return implementation::test(pbuffer, position); } //************************************************************************* @@ -3002,6 +3026,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool all(element_type mask) const ETL_NOEXCEPT { + ETL_STATIC_ASSERT(Storage_Model == etl::bitset_storage_model::Single, "Not supported for 'Multi' bitset storage model"); + return implementation::all(pbuffer, Number_Of_Elements, Top_Mask, mask); } @@ -3018,6 +3044,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool none(element_type mask) const ETL_NOEXCEPT { + ETL_STATIC_ASSERT(Storage_Model == etl::bitset_storage_model::Single, "Not supported for 'Multi' bitset storage model"); + return implementation::none(pbuffer, Number_Of_Elements, mask); } @@ -3034,6 +3062,8 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool any(element_type mask) const ETL_NOEXCEPT { + ETL_STATIC_ASSERT(Storage_Model == etl::bitset_storage_model::Single, "Not supported for 'Multi' bitset storage model"); + return implementation::any(pbuffer, Number_Of_Elements, mask); } @@ -3042,7 +3072,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bitset_ext& flip() ETL_NOEXCEPT { - implementation::flip(pbuffer, Number_Of_Elements); + implementation::flip_all(pbuffer, Number_Of_Elements); return *this; } @@ -3054,7 +3084,7 @@ namespace etl { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - implementation::flip(pbuffer, Number_Of_Elements, position); + implementation::flip_position(pbuffer, position); return *this; } @@ -3064,7 +3094,7 @@ namespace etl //************************************************************************* ETL_CONSTEXPR14 bool operator[] (size_t position) const ETL_NOEXCEPT { - return implementation::test(pbuffer, Number_Of_Elements, position); + return implementation::test(pbuffer, position); } //************************************************************************* @@ -3084,9 +3114,9 @@ namespace etl template #endif ETL_CONSTEXPR14 TString to_string(typename TString::value_type zero = typename TString::value_type('0'), - typename TString::value_type one = typename TString::value_type('1')) const + typename TString::value_type one = typename TString::value_type('1')) const { - return implementation::template to_string(pbuffer, Number_Of_Elements, Active_Bits, zero, one); + return implementation::template to_string(pbuffer, Active_Bits, zero, one); } //************************************************************************* @@ -3168,6 +3198,14 @@ namespace etl return implementation::operator_equality(lhs.pbuffer, rhs.pbuffer, lhs.Number_Of_Elements); } + //************************************************************************* + /// operator != + //************************************************************************* + friend ETL_CONSTEXPR14 bool operator !=(const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT + { + return !(lhs == rhs); + } + //************************************************************************* /// swap //************************************************************************* @@ -3196,30 +3234,30 @@ namespace etl private: - //************************************************************************* - /// Correct the unused top bits after bit manipulation. - //************************************************************************* - ETL_CONSTEXPR14 static void clear_unused_bits_in_msb() ETL_NOEXCEPT - { - pbuffer[Number_Of_Elements - 1U] &= Top_Mask; - } + ////************************************************************************* + ///// Correct the unused top bits after bit manipulation. + ////************************************************************************* + //ETL_CONSTEXPR14 static void clear_unused_bits_in_msb() ETL_NOEXCEPT + //{ + // pbuffer[Number_Of_Elements - 1U] &= Top_Mask; + //} // The implementation of the bitset functionality. - typedef etl::bitset_impl implementation; + typedef etl::bitset_impl implementation; // Pointer to the storage for the bitset. element_type* pbuffer; }; +} - //*************************************************************************** - /// operator != - ///\ingroup bitset - //*************************************************************************** - template - ETL_CONSTEXPR14 bool operator != (const bitset_ext& lhs, const bitset_ext& rhs) ETL_NOEXCEPT - { - return !(lhs == rhs); - } +//*************************************************************************** +/// operator != +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 bool operator != (const etl::bitset_ext& lhs, const etl::bitset_ext& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); } //************************************************************************* @@ -3231,6 +3269,275 @@ ETL_CONSTEXPR14 void swap(etl::bitset_ext& lhs, etl::bits lhs.swap(rhs); } +namespace etl +{ + namespace private_bitset + { + //************************************************************************* + /// Compare bitset spans. + /// Assumes that the lhs span's element type is larger than rhs's. + //************************************************************************* + template + bool compare_bitset_spans(const TLhsSpan& lhs_span, const TRhsSpan& rhs_span) + { + typedef typename TLhsSpan::value_type lhs_element_t; + typedef typename TRhsSpan::value_type rhs_element_t; + + const int steps = static_cast(sizeof(lhs_element_t) / sizeof(rhs_element_t)); + + typename TLhsSpan::iterator lhs_itr = lhs_span.begin(); + typename TRhsSpan::iterator rhs_itr = rhs_span.begin(); + + while (lhs_itr != lhs_span.end()) + { + const lhs_element_t& lhs_value = *lhs_itr; + + // Build the rhs element in terms of the lhs element type. + lhs_element_t rhs_value = 0; + + const int shift_step = etl::integral_limits::bits; + int shift = 0; + + for (int i = 0; i < steps; ++i) + { + rhs_value |= (static_cast(*rhs_itr) << shift); + ++rhs_itr; + shift += shift_step; + } + + if (lhs_value != rhs_value) + { + return false; + } + + ++lhs_itr; + } + + return true; + } + } +} + +//*************************************************************************** +/// operator == +/// bitset +/// Different element types +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type + operator == (const etl::bitset& lhs, const etl::bitset& rhs) ETL_NOEXCEPT +{ + // Get a span of each type. + typename etl::bitset::const_span_type lhs_span = lhs.span(); + typename etl::bitset::const_span_type rhs_span = rhs.span(); + + // Put the bitset with the largest element type as the first argument. + if ETL_IF_CONSTEXPR(sizeof(TLhsElement) > sizeof(TRhsElement)) + { + return etl::private_bitset::compare_bitset_spans(lhs_span, rhs_span); + } + else + { + return etl::private_bitset::compare_bitset_spans(rhs_span, lhs_span); + } +} + +//*************************************************************************** +/// operator != +/// bitset +/// Different element types +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type + operator != (const etl::bitset& lhs, const etl::bitset& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); +} + +//*************************************************************************** +/// operator == +/// bitset_ext +/// Different element types +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type + operator == (const etl::bitset_ext& lhs, const etl::bitset_ext& rhs) ETL_NOEXCEPT +{ + // Get a span of each type. + typename etl::bitset_ext::const_span_type lhs_span = lhs.span(); + typename etl::bitset_ext::const_span_type rhs_span = rhs.span(); + + // Put the bitset with the largest element type as the first argument. + if ETL_IF_CONSTEXPR(sizeof(TLhsElement) > sizeof(TRhsElement)) + { + return etl::private_bitset::compare_bitset_spans(lhs_span, rhs_span); + } + else + { + return etl::private_bitset::compare_bitset_spans(rhs_span, lhs_span); + } +} + +//*************************************************************************** +/// operator != +/// bitset_ext +/// Different element types +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type + operator != (const etl::bitset_ext& lhs, const etl::bitset_ext& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); +} + +//*************************************************************************** +/// operator == +/// bitset compared with bitset_ext, same element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +bool operator == (const etl::bitset& lhs, const etl::bitset_ext& rhs) ETL_NOEXCEPT +{ + const char Storage_Model = etl::bitset::Storage_Model; + const size_t Number_Of_Elements = etl::bitset::Number_Of_Elements; + + typename etl::bitset::const_span_type lhs_span = lhs.span(); + typename etl::bitset_ext::const_span_type rhs_span = rhs.span(); + + typedef etl::bitset_impl implementation; + + return implementation::operator_equality(lhs_span.begin(), rhs_span.begin(), Number_Of_Elements); +} + +//*************************************************************************** +/// operator != +/// bitset compared with bitset_ext, same element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +bool operator != (const etl::bitset& lhs, const etl::bitset_ext& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); +} + +//*************************************************************************** +/// operator == +/// bitset_ext compared with bitset, same element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +bool operator == (const etl::bitset_ext& lhs, const etl::bitset& rhs) ETL_NOEXCEPT +{ + const char Storage_Model = etl::bitset::Storage_Model; + const size_t Number_Of_Elements = etl::bitset::Number_Of_Elements; + + typename etl::bitset_ext::const_span_type lhs_span = lhs.span(); + typename etl::bitset::const_span_type rhs_span = rhs.span(); + + typedef etl::bitset_impl implementation; + + return implementation::operator_equality(lhs_span.begin(), rhs_span.begin(), Number_Of_Elements); +} + +//*************************************************************************** +/// operator != +/// bitset_ext compared with bitset, same element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +bool operator != (const etl::bitset_ext& lhs, const etl::bitset& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); +} + +//*************************************************************************** +/// operator == +/// bitset compared with bitset_ext, different element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type +operator == (const etl::bitset& lhs, const etl::bitset_ext& rhs) ETL_NOEXCEPT +{ + // Get a span of each type. + typename etl::bitset::const_span_type lhs_span = lhs.span(); + typename etl::bitset_ext::const_span_type rhs_span = rhs.span(); + + // Put the bitset with the largest element type as the first argument. + if ETL_IF_CONSTEXPR(sizeof(TLhsElement) > sizeof(TRhsElement)) + { + return etl::private_bitset::compare_bitset_spans(lhs_span, rhs_span); + } + else + { + return etl::private_bitset::compare_bitset_spans(rhs_span, lhs_span); + } +} + +//*************************************************************************** +/// operator != +/// bitset compared with bitset_ext, different element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type + operator != (const etl::bitset& lhs, const etl::bitset_ext& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); +} + +//*************************************************************************** +/// operator == +/// bitset_ext compared with bitset, different element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type + operator == (const etl::bitset_ext& lhs, const etl::bitset& rhs) ETL_NOEXCEPT +{ + // Get a span of each type. + typename etl::bitset_ext::const_span_type lhs_span = lhs.span(); + typename etl::bitset::const_span_type rhs_span = rhs.span(); + + // Put the bitset with the largest element type as the first argument. + if ETL_IF_CONSTEXPR(sizeof(TLhsElement) > sizeof(TRhsElement)) + { + return etl::private_bitset::compare_bitset_spans(lhs_span, rhs_span); + } + else + { + return etl::private_bitset::compare_bitset_spans(rhs_span, lhs_span); + } +} + +//*************************************************************************** +/// operator != +/// bitset_ext compared with bitset, different element types. +///\ingroup bitset +//*************************************************************************** +template +ETL_CONSTEXPR14 +typename etl::enable_if::value, bool>::type + operator != (const etl::bitset_ext& lhs, const etl::bitset& rhs) ETL_NOEXCEPT +{ + return !(lhs == rhs); +} + #include "minmax_pop.h" #endif diff --git a/test/test_bitset_new_comparisons.cpp b/test/test_bitset_new_comparisons.cpp new file mode 100644 index 00000000..4436982f --- /dev/null +++ b/test/test_bitset_new_comparisons.cpp @@ -0,0 +1,239 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2022 John Wellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#include "unit_test_framework.h" + +#include "etl/private/bitset_new.h" + +namespace +{ + using ull = unsigned long long; + + SUITE(test_bitset_new_comparisons) + { + //************************************************************************* + TEST(test_equality_single_storage_model) + { + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x0123456789012345ULL); + + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data3(0x0123456789012345ULL, buffer3); + etl::bitset_ext<64, uint64_t> data4(0x0123456789012345ULL, buffer4); + + // Double check we are using the single element storage model. + CHECK(etl::bitset_storage_model::Single == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data4.Storage_Model); + + CHECK(data1 == data2); // bitset == bitset + CHECK(data1 == data3); // bitset == bitset_ext + CHECK(data3 == data1); // bitset_ext == bitset + CHECK(data3 == data4); // bitset_ext == bitset_ext + } + + //************************************************************************* + TEST(test_inequality_single_storage_model) + { + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data2(0x0123456784012345ULL); + + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64, uint64_t>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data3(0x0123456787012345ULL, buffer3); + etl::bitset_ext<64, uint64_t> data4(0x0123426789012345ULL, buffer4); + + // Double check we are using the single element storage model. + CHECK(etl::bitset_storage_model::Single == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data4.Storage_Model); + + CHECK(data1 != data2); // bitset != bitset + CHECK(data1 != data3); // bitset != bitset_ext + CHECK(data3 != data1); // bitset_ext != bitset + CHECK(data3 != data4); // bitset_ext != bitset_ext + } + + //************************************************************************* + TEST(test_equality_multi_storage_model) + { + ETL_CONSTEXPR14 etl::bitset<64> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456789012345ULL); + + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; + etl::bitset_ext<64> data3(0x0123456789012345ULL, buffer3); + etl::bitset_ext<64> data4(0x0123456789012345ULL, buffer4); + + // Double check we are using the multi element storage model. + CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model); + + CHECK(data1 == data2); // bitset == bitset + CHECK(data1 == data3); // bitset == bitset_ext + CHECK(data3 == data1); // bitset_ext == bitset + CHECK(data3 == data4); // bitset_ext == bitset_ext + } + + //************************************************************************* + TEST(test_inequality_multi_storage_model) + { + ETL_CONSTEXPR14 etl::bitset<64> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456784012345ULL); + + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; + etl::bitset_ext<64> data3(0x0123456787012345ULL, buffer3); + etl::bitset_ext<64> data4(0x0123426789012345ULL, buffer4); + + // Double check we are using the multi element storage model. + CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model); + + CHECK(data1 != data2); // bitset != bitset + CHECK(data1 != data3); // bitset != bitset_ext + CHECK(data3 != data1); // bitset_ext != bitset + CHECK(data3 != data4); // bitset_ext != bitset_ext + } + + //************************************************************************* + TEST(test_equality_mixed_storage_model) + { + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456789012345ULL); + + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data3(0x0123456789012345ULL, buffer3); + etl::bitset_ext<64> data4(0x0123456789012345ULL, buffer4); + + // Double check we are using the single/multi element storage model. + CHECK(etl::bitset_storage_model::Single == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model); + + CHECK(data1 == data2); // bitset (S) == bitset (M) + CHECK(data2 == data1); // bitset (M) == bitset (S) + CHECK(data3 == data4); // bitset_ext (S) == bitset_ext (M) + CHECK(data4 == data3); // bitset_ext (M) == bitset_ext (S) + CHECK(data1 == data4); // bitset (S) == bitset_ext (M) + CHECK(data4 == data1); // bitset_ext (M) == bitset (S) + CHECK(data2 == data3); // bitset (M) == bitset_ext (S) + CHECK(data3 == data2); // bitset_ext (S) == bitset (M) + } + + //************************************************************************* + TEST(test_inequality_mixed_storage_model) + { + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x0123456784012345ULL); + + etl::bitset_ext<64, uint64_t>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; + etl::bitset_ext<64, uint64_t> data3(0x0123456787012345ULL, buffer3); + etl::bitset_ext<64> data4(0x0123426789012345ULL, buffer4); + + // Double check we are using the single/multi element storage model. + CHECK(etl::bitset_storage_model::Single == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Single == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model); + + CHECK(data1 != data2); // bitset (S) != bitset (M) + CHECK(data2 != data1); // bitset (M) != bitset (S) + CHECK(data3 != data4); // bitset_ext (S) != bitset_ext (M) + CHECK(data4 != data3); // bitset_ext (M) != bitset_ext (S) + CHECK(data1 != data4); // bitset (S) != bitset_ext (M) + CHECK(data4 != data1); // bitset_ext (M) != bitset (S) + CHECK(data2 != data3); // bitset (M) != bitset_ext (S) + CHECK(data3 != data2); // bitset_ext (S) != bitset (M) + } + + //************************************************************************* + TEST(test_equality_mixed_storage_model_different_element_types) + { + ETL_CONSTEXPR14 etl::bitset<64, uint32_t> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint8_t> data2(0x0123456789012345ULL); + + etl::bitset_ext<64, uint32_t>::buffer_type buffer3; + etl::bitset_ext<64, uint8_t>::buffer_type buffer4; + etl::bitset_ext<64, uint32_t> data3(0x0123456789012345ULL, buffer3); + etl::bitset_ext<64, uint8_t> data4(0x0123456789012345ULL, buffer4); + + // Double check we are using the multi element storage model. + CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model); + + CHECK(data1 == data2); // bitset (S) == bitset (M) + CHECK(data2 == data1); // bitset (M) == bitset (S) + CHECK(data3 == data4); // bitset_ext (S) == bitset_ext (M) + CHECK(data4 == data3); // bitset_ext (M) == bitset_ext (S) + CHECK(data1 == data4); // bitset (S) == bitset_ext (M) + CHECK(data4 == data1); // bitset_ext (M) == bitset (S) + CHECK(data2 == data3); // bitset (M) == bitset_ext (S) + CHECK(data3 == data2); // bitset_ext (S) == bitset (M) + } + + //************************************************************************* + TEST(test_inequality_mixed_storage_model_different_element_types) + { + ETL_CONSTEXPR14 etl::bitset<64, uint32_t> data1(0x0123456789012345ULL); + ETL_CONSTEXPR14 etl::bitset<64, uint8_t> data2(0x0123456784012345ULL); + + etl::bitset_ext<64, uint32_t>::buffer_type buffer3; + etl::bitset_ext<64, uint8_t>::buffer_type buffer4; + etl::bitset_ext<64, uint32_t> data3(0x0123456787012345ULL, buffer3); + etl::bitset_ext<64, uint8_t> data4(0x0123426789012345ULL, buffer4); + + // Double check we are using the multi element storage model. + CHECK(etl::bitset_storage_model::Multi == data1.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data2.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data3.Storage_Model); + CHECK(etl::bitset_storage_model::Multi == data4.Storage_Model); + + CHECK(data1 != data2); // bitset (S) != bitset (M) + CHECK(data2 != data1); // bitset (M) != bitset (S) + CHECK(data3 != data4); // bitset_ext (S) != bitset_ext (M) + CHECK(data4 != data3); // bitset_ext (M) != bitset_ext (S) + CHECK(data1 != data4); // bitset (S) != bitset_ext (M) + CHECK(data4 != data1); // bitset_ext (M) != bitset (S) + CHECK(data2 != data3); // bitset (M) != bitset_ext (S) + CHECK(data3 != data2); // bitset_ext (S) != bitset (M) + } + }; +} diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index b22f5a44..1a38ef2b 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -37,6 +37,7 @@ SOFTWARE. #include "etl/wstring.h" #include "etl/u16string.h" #include "etl/u32string.h" +#include "etl/endianness.h" namespace { @@ -46,9 +47,22 @@ namespace template ETL_CONSTEXPR14 etl::bitset generate_shift_left_bitset(ull value, size_t shift) { + ull mask = 0ULL; + + if (shift < 64U) + { + mask = etl::integral_limits::max >> shift; + } + + value &= mask; + etl::bitset data(value); - if (shift != 0U) + if (shift >= 64U) + { + data.reset(); + } + else if (shift != 0U) { data <<= shift; } @@ -63,7 +77,7 @@ namespace etl::bitset data1(value); etl::bitset data2; - if (shift != 0U) + if ((shift != 0U) && (shift != 64U)) { data2 = data1 << shift; } @@ -77,7 +91,11 @@ namespace { etl::bitset data(value); - if (shift != 0U) + if (shift >= 64U) + { + data.reset(); + } + else if (shift != 0U) { data >>= shift; } @@ -105,10 +123,10 @@ namespace //************************************************************************* TEST(test_default_constructor) { - ETL_CONSTEXPR14 std::bitset<60> compare; - ETL_CONSTEXPR14 etl::bitset<60> data; + ETL_CONSTEXPR14 std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data; - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -118,715 +136,41 @@ namespace } //************************************************************************* - TEST(test_default_constructor_multi_element) + TEST(test_default_constructor_single_element) { - etl::bitset<14, int8_t> data8; - etl::bitset<30, int16_t> data16; - etl::bitset<62, int32_t> data32; + etl::bitset<8> data8; + etl::bitset<16> data16; + etl::bitset<32> data32; + etl::bitset<64> data64; - CHECK_EQUAL(2U, data8.Number_Of_Elements); - CHECK_EQUAL(2U, data16.Number_Of_Elements); - CHECK_EQUAL(2U, data32.Number_Of_Elements); - } + using element_type = etl::bitset<8>::element_type; + size_t element_bits = etl::integral_limits::bits; - //************************************************************************* - TEST(test_default_constructor_default_element_type_bits) - { - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - } - - //************************************************************************* - TEST(test_default_constructor_default_element_type_number_of_elements) - { - CHECK_EQUAL(1U, etl::bitset<1>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset<2>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset<3>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset<4>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset<5>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset<6>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset<7>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset<8>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<9>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<10>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<11>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<12>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<13>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<14>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<15>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset<16>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<17>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<18>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<19>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<20>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<21>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<22>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<23>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset<24>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<25>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<26>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<27>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<28>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<29>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<30>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<31>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset<32>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<33>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<34>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<35>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<36>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<37>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<38>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<39>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset<40>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<41>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<42>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<43>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<44>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<45>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<46>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<47>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset<48>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<49>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<50>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<51>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<52>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<53>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<54>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<55>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset<56>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<57>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<58>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<59>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<60>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<61>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<62>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<63>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset<64>::Number_Of_Elements); - } + CHECK_EQUAL(8, data8.Size); + CHECK_EQUAL(16, data16.Size); + CHECK_EQUAL(32, data32.Size); + CHECK_EQUAL(64, data64.Size); - //************************************************************************* - TEST(test_default_constructor_explicit_int8_t_element_types_bits) - { - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - } + CHECK_EQUAL( 8 / element_bits, data8.Number_Of_Elements); + CHECK_EQUAL(16 / element_bits, data16.Number_Of_Elements); + CHECK_EQUAL(32 / element_bits, data32.Number_Of_Elements); + CHECK_EQUAL(64 / element_bits, data64.Number_Of_Elements); - //************************************************************************* - TEST(test_default_constructor_explicit_int8_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset<1, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<2, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<3, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<4, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<5, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<6, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<7, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<8, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<9, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<10, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<11, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<12, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<13, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<14, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<15, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<16, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<17, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<18, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<19, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<20, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<21, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<22, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<23, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<24, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<25, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<26, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<27, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<28, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<29, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<30, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<31, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<32, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<33, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<34, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<35, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<36, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<37, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<38, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<39, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset<40, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<41, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<42, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<43, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<44, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<45, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<46, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<47, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset<48, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<49, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<50, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<51, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<52, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<53, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<54, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<55, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset<56, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<57, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<58, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<59, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<60, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<61, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<62, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<63, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset<64, int8_t>::Number_Of_Elements)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int16_t_element_types_bits) - { - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int16_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset<1, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<2, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<3, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<4, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<5, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<6, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<7, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<8, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<9, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<10, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<11, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<12, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<13, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<14, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<15, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<16, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<17, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<18, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<19, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<20, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<21, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<22, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<23, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<24, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<25, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<26, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<27, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<28, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<29, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<30, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<31, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<32, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<33, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<34, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<35, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<36, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<37, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<38, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<39, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<40, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<41, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<42, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<43, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<44, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<45, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<46, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<47, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset<48, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<49, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<50, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<51, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<52, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<53, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<54, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<55, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<56, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<57, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<58, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<59, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<60, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<61, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<62, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<63, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset<64, int16_t>::Number_Of_Elements)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int32_t_element_types_bits) - { - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int32_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset<1, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<2, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<3, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<4, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<5, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<6, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<7, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<8, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<9, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<10, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<11, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<12, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<13, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<14, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<15, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<16, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<17, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<18, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<19, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<20, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<21, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<22, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<23, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<24, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<25, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<26, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<27, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<28, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<29, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<30, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<31, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<32, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<33, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<34, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<35, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<36, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<37, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<38, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<39, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<40, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<41, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<42, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<43, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<44, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<45, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<46, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<47, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<48, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<49, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<50, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<51, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<52, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<53, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<54, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<55, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<56, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<57, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<58, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<59, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<60, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<61, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<62, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<63, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset<64, int32_t>::Number_Of_Elements)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int64_t_element_types_bits) - { - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int64_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset<1, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<2, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<3, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<4, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<5, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<6, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<7, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<8, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<9, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<10, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<11, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<12, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<13, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<14, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<15, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<16, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<17, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<18, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<19, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<20, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<21, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<22, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<23, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<24, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<25, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<26, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<27, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<28, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<29, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<30, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<31, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<32, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<33, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<34, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<35, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<36, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<37, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<38, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<39, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<40, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<41, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<42, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<43, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<44, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<45, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<46, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<47, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<48, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<49, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<50, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<51, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<52, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<53, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<54, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<55, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<56, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<57, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<58, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<59, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<60, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<61, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<62, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<63, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset<64, int64_t>::Number_Of_Elements)); + CHECK_EQUAL(etl::bitset_storage_model::Single, data8.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Multi, data16.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Multi, data32.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Multi, data64.Storage_Model); } //************************************************************************* TEST(test_construct_from_value) { - ETL_CONSTEXPR14 std::bitset<60> compare(0x123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data(0x123456731234567ULL); + ETL_CONSTEXPR14 std::bitset<64> compare(0x123456731234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data(0x123456731234567ULL); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); + CHECK_EQUAL_HEX(compare.to_ullong(), data.to_ullong()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -837,9 +181,9 @@ namespace //************************************************************************* TEST(test_copy_construct) { - ETL_CONSTEXPR14 std::bitset<60> compare(0x123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data(0x123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data_copy(data); + ETL_CONSTEXPR14 std::bitset<64> compare(0x123456731234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data(0x123456731234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data_copy(data); CHECK_EQUAL(compare.size(), data_copy.size()); CHECK_EQUAL(compare.count(), data_copy.count()); @@ -853,10 +197,10 @@ namespace //************************************************************************* TEST(test_construct_from_excess_value) { - ETL_CONSTEXPR14 std::bitset<60> compare(0x8765432187654321ULL); - ETL_CONSTEXPR14 etl::bitset<60> data(0x8765432187654321ULL); + ETL_CONSTEXPR14 std::bitset<64> compare(0x8765432187654321ULL); + ETL_CONSTEXPR14 etl::bitset<64> data(0x8765432187654321ULL); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -868,10 +212,10 @@ namespace //************************************************************************* TEST(test_construct_from_char_string) { - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data("110001001000110100010101100111001100010010001101000101011001"); + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data("110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -883,8 +227,8 @@ namespace //************************************************************************* TEST(test_construct_from_wchar_t_string) { - std::bitset<60> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data(L"110001001000110100010101100111001100010010001101000101011001"); + std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data(L"110001001000110100010101100111001100010010001101000101011001"); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -898,8 +242,8 @@ namespace //************************************************************************* TEST(test_construct_from_char16_t_string) { - std::bitset<60> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data(u"110001001000110100010101100111001100010010001101000101011001"); + std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data(u"110001001000110100010101100111001100010010001101000101011001"); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -913,8 +257,8 @@ namespace //************************************************************************* TEST(test_construct_from_char32_t_string) { - std::bitset<60> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data(U"110001001000110100010101100111001100010010001101000101011001"); + std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data(U"110001001000110100010101100111001100010010001101000101011001"); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -947,7 +291,6 @@ namespace CHECK_EQUAL(0, data.count()); } - //************************************************************************* TEST(test_construct_from_nullptr_char16_t_string) { @@ -973,8 +316,8 @@ namespace //************************************************************************* TEST(test_construct_from_excess_string) { - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001111100001"); - etl::bitset<60> data("110001001000110100010101100111001100010010001101000101011001111100001"); + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001111100001"); + etl::bitset<64> data("110001001000110100010101100111001100010010001101000101011001111100001"); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -982,6 +325,8 @@ namespace CHECK_EQUAL(compare.any(), data.any()); CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL_HEX(compare.to_ullong(), data.to_ullong()); + for (size_t i = 0UL; i < data.size(); ++i) { CHECK_EQUAL(compare.test(i), data.test(i)); @@ -989,7 +334,41 @@ namespace } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_set_helper() + { + etl::bitset<64> data; + data.set(); + + return data; + } + TEST(test_set) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_set_helper()); + + compare.set(); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_less_than_full_size) { std::bitset<60> compare; etl::bitset<60> data; @@ -997,11 +376,17 @@ namespace compare.set(); data.set(); - CHECK_EQUAL(compare.size(), data.size()); - CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1012,8 +397,8 @@ namespace //************************************************************************* TEST(test_set_with_char_string) { - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.set("110001001000110100010101100111001100010010001101000101011001"); @@ -1032,16 +417,16 @@ namespace //************************************************************************* TEST(test_set_with_wchar_t_string) { - std::bitset<60> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.set(L"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1052,16 +437,16 @@ namespace //************************************************************************* TEST(test_set_with_char16_t_string) { - std::bitset<60> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.set(u"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1072,16 +457,16 @@ namespace //************************************************************************* TEST(test_set_with_char32_t_string) { - std::bitset<60> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.set(U"110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1140,8 +525,8 @@ namespace //************************************************************************* TEST(test_from_string_with_char) { - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.from_string("110001001000110100010101100111001100010010001101000101011001"); @@ -1160,8 +545,8 @@ namespace //************************************************************************* TEST(test_from_string_with_wchar_t) { - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.from_string(L"110001001000110100010101100111001100010010001101000101011001"); @@ -1178,10 +563,10 @@ namespace } //************************************************************************* - TEST(test_from_char16_t_6string) + TEST(test_from_string_with_char16_t) { - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.from_string(u"110001001000110100010101100111001100010010001101000101011001"); @@ -1200,8 +585,8 @@ namespace //************************************************************************* TEST(test_from_string_with_char32_t) { - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset<60> data; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset<64> data; data.from_string(U"110001001000110100010101100111001100010010001101000101011001"); @@ -1265,6 +650,42 @@ namespace CHECK_EQUAL(0, data.count()); } + //************************************************************************* + TEST(test_value_u8_min) + { + ETL_CONSTEXPR14 etl::bitset<8> data((unsigned long long)etl::integral_limits::min); + ETL_CONSTEXPR14 uint8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_value_u8_max) + { + ETL_CONSTEXPR14 etl::bitset<8> data((unsigned long long)etl::integral_limits::max); + ETL_CONSTEXPR14 uint8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_value_s8_min) + { + ETL_CONSTEXPR14 etl::bitset<8> data((unsigned long long)etl::integral_limits::min); + ETL_CONSTEXPR14 int8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_value_s8_max) + { + ETL_CONSTEXPR14 etl::bitset<8> data((unsigned long long)etl::integral_limits::max); + ETL_CONSTEXPR14 int8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + //************************************************************************* TEST(test_value_u16_min) { @@ -1304,19 +725,19 @@ namespace //************************************************************************* TEST(test_value_u32_min) { - ETL_CONSTEXPR14 etl::bitset<32> data((unsigned long long)etl::integral_limits::min); - ETL_CONSTEXPR14 uint32_t value = data.value(); + ETL_CONSTEXPR14 etl::bitset<32> data((unsigned long long)etl::integral_limits::min); + ETL_CONSTEXPR14 int32_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_u32_max) { - ETL_CONSTEXPR14 etl::bitset<32> data((unsigned long long)etl::integral_limits::max); - ETL_CONSTEXPR14 uint32_t value = data.value(); + ETL_CONSTEXPR14 etl::bitset<32> data((unsigned long long)etl::integral_limits::max); + ETL_CONSTEXPR14 int32_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* @@ -1340,26 +761,26 @@ namespace //************************************************************************* TEST(test_value_u64_min) { - ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::min); - ETL_CONSTEXPR14 uint64_t value = data.value(); + ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::min); + ETL_CONSTEXPR14 uint64_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_u64_max) { - ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::max); - ETL_CONSTEXPR14 uint64_t value = data.value(); + ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::max); + ETL_CONSTEXPR14 uint64_t value = data.value(); - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_s64_min) { ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::min); - ETL_CONSTEXPR14 int64_t value = data.value(); + ETL_CONSTEXPR14 uint64_t value = data.value(); CHECK_EQUAL(std::numeric_limits::min(), value); } @@ -1368,7 +789,7 @@ namespace TEST(test_value_s64_max) { ETL_CONSTEXPR14 etl::bitset<64> data((unsigned long long)etl::integral_limits::max); - ETL_CONSTEXPR14 int64_t value = data.value(); + ETL_CONSTEXPR14 uint64_t value = data.value(); CHECK_EQUAL(std::numeric_limits::max(), value); } @@ -1376,8 +797,8 @@ namespace //************************************************************************* TEST(test_position_set) { - std::bitset<60> compare; - etl::bitset<60> data; + std::bitset<64> compare; + etl::bitset<64> data; for (size_t i = 0UL; i < data.size(); ++i) { @@ -1406,13 +827,20 @@ namespace } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_reset_helper() + { + etl::bitset<64> data(0xFFFFFFFFFFFFFFFULL); + data.reset(); + + return data; + } + TEST(test_reset) { - std::bitset<60> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset<60> data(0xFFFFFFFFFFFFFFFULL); + std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); + ETL_CONSTEXPR14 etl::bitset<64> data(test_reset_helper()); compare.reset(); - data.reset(); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -1427,21 +855,27 @@ namespace } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_position_reset_helper() + { + etl::bitset<64> data(0xFFFFFFFFFFFFFFFULL); + data.reset(1); + data.reset(3); + data.reset(7); + data.reset(13); + + return data; + } + TEST(test_position_reset) { - std::bitset<60> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset<60> data(0xFFFFFFFFFFFFFFFULL); + std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); + ETL_CONSTEXPR14 etl::bitset<64> data(test_position_reset_helper()); compare.reset(1); compare.reset(3); compare.reset(7); compare.reset(13); - data.reset(1); - data.reset(3); - data.reset(7); - data.reset(13); - CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); CHECK_EQUAL(compare.none(), data.none()); @@ -1481,8 +915,8 @@ namespace //************************************************************************* TEST(test_index_operator_read) { - ETL_CONSTEXPR14 std::bitset<60> compare(0x3123456731234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data(0x3123456731234567ULL); + ETL_CONSTEXPR14 std::bitset<64> compare(0x3123456731234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data(0x3123456731234567ULL); ETL_CONSTEXPR14 bool bc0 = compare[1U]; ETL_CONSTEXPR14 bool bd0 = data[1U]; @@ -1502,15 +936,22 @@ namespace } //************************************************************************* - TEST(test_index_operator_write) + ETL_CONSTEXPR14 etl::bitset<64> test_index_operator_write_helper() { - etl::bitset<60> data; + etl::bitset<64> data; data[1U] = true; data[3U] = true; data[7U] = true; data[13U] = true; + return data; + } + + TEST(test_index_operator_write) + { + ETL_CONSTEXPR14 etl::bitset<64> data(test_index_operator_write_helper()); + CHECK(data[1U]); CHECK(data[3U]); CHECK(data[7U]); @@ -1520,10 +961,10 @@ namespace //************************************************************************* TEST(test_any) { - ETL_CONSTEXPR14 etl::bitset<60> data1(ull(0x0000000000000000)); - ETL_CONSTEXPR14 etl::bitset<60> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<60> data3(ull(0x0000010001000100)); - ETL_CONSTEXPR14 etl::bitset<60> data4(ull(0x0FFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 bool bd1 = data1.any(); ETL_CONSTEXPR14 bool bd2 = data2.any(); @@ -1539,10 +980,10 @@ namespace //************************************************************************* TEST(test_none) { - ETL_CONSTEXPR14 etl::bitset<60> data1(ull(0x0000000000000000)); - ETL_CONSTEXPR14 etl::bitset<60> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<60> data3(ull(0x0000010001000100)); - ETL_CONSTEXPR14 etl::bitset<60> data4(ull(0x0FFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 bool bd1 = data1.none(); ETL_CONSTEXPR14 bool bd2 = data2.none(); @@ -1558,10 +999,10 @@ namespace //************************************************************************* TEST(test_all) { - ETL_CONSTEXPR14 etl::bitset<60> data1(ull(0x0000000000000000)); - ETL_CONSTEXPR14 etl::bitset<60> data2(ull(0x0000010000000000)); - ETL_CONSTEXPR14 etl::bitset<60> data3(ull(0x0000010001000100)); - ETL_CONSTEXPR14 etl::bitset<60> data4(ull(0x0FFFFFFFFFFFFFFF)); + ETL_CONSTEXPR14 etl::bitset<64> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<64> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<64> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<64> data4(ull(0xFFFFFFFFFFFFFFFF)); ETL_CONSTEXPR14 bool bd1 = data1.all(); ETL_CONSTEXPR14 bool bd2 = data2.all(); @@ -1575,13 +1016,77 @@ namespace } //************************************************************************* + TEST(test_any_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 bool bd1 = data1.any(); + ETL_CONSTEXPR14 bool bd2 = data2.any(); + ETL_CONSTEXPR14 bool bd3 = data3.any(); + ETL_CONSTEXPR14 bool bd4 = data4.any(); + + CHECK_FALSE(bd1); + CHECK_TRUE(bd2); + CHECK_TRUE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_none_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 bool bd1 = data1.none(); + ETL_CONSTEXPR14 bool bd2 = data2.none(); + ETL_CONSTEXPR14 bool bd3 = data3.none(); + ETL_CONSTEXPR14 bool bd4 = data4.none(); + + CHECK_TRUE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_FALSE(bd4); + } + + //************************************************************************* + TEST(test_all_with_reduced_active_bits) + { + ETL_CONSTEXPR14 etl::bitset<60> data1(ull(0x0000000000000000)); + ETL_CONSTEXPR14 etl::bitset<60> data2(ull(0x0000010000000000)); + ETL_CONSTEXPR14 etl::bitset<60> data3(ull(0x1000010001000100)); + ETL_CONSTEXPR14 etl::bitset<60> data4(ull(0xFFFFFFFFFFFFFFFF)); + + ETL_CONSTEXPR14 bool bd1 = data1.all(); + ETL_CONSTEXPR14 bool bd2 = data2.all(); + ETL_CONSTEXPR14 bool bd3 = data3.all(); + ETL_CONSTEXPR14 bool bd4 = data4.all(); + + CHECK_FALSE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_flip_helper() + { + etl::bitset<64> data; + data.flip(); + + return data; + } + TEST(test_flip) { - std::bitset<60> compare; - etl::bitset<60> data; + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_flip_helper()); compare.flip(); - data.flip(); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1590,21 +1095,27 @@ namespace } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_flip_position_helper() + { + etl::bitset<64> data; + data.flip(1); + data.flip(3); + data.flip(7); + data.flip(13); + + return data; + } + TEST(test_flip_position) { - std::bitset<60> compare; - etl::bitset<60> data; + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_flip_position_helper()); compare.flip(1); compare.flip(3); compare.flip(7); compare.flip(13); - data.flip(1); - data.flip(3); - data.flip(7); - data.flip(13); - for (size_t i = 0UL; i < data.size(); ++i) { CHECK_EQUAL(compare.test(i), data.test(i)); @@ -1612,21 +1123,27 @@ namespace } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_flip_reference_helper() + { + etl::bitset<64> data; + data[1].flip(); + data[3].flip(); + data[7].flip(); + data[13].flip(); + + return data; + } + TEST(test_flip_reference) { - std::bitset<60> compare; - etl::bitset<60> data; + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_flip_reference_helper()); compare[1].flip(); compare[3].flip(); compare[7].flip(); compare[13].flip(); - data[1].flip(); - data[3].flip(); - data[7].flip(); - data[13].flip(); - for (size_t i = 0UL; i < data.size(); ++i) { CHECK_EQUAL(compare.test(i), data.test(i)); @@ -1636,8 +1153,8 @@ namespace //************************************************************************* TEST(test_invert_reference) { - std::bitset<60> compare; - etl::bitset<60> data; + std::bitset<64> compare; + etl::bitset<64> data; bool bc = ~compare[3]; bool bd = ~data[3]; @@ -1645,18 +1162,18 @@ namespace } //************************************************************************* - void test_assignment_operator_helper(etl::bitset<60>& from, etl::bitset<60>& to) + ETL_CONSTEXPR14 etl::bitset<64> test_assignment_operator_helper(etl::bitset<64> to, const etl::bitset<64>&from) { to = from; + + return to; } TEST(test_assignment_operator) { - std::bitset<60> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset<60> data1(0xFFFFFFFFFFFFFFFULL); - etl::bitset<60> data2; - - test_assignment_operator_helper(data1, data2); + ETL_CONSTEXPR14 std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); + ETL_CONSTEXPR14 etl::bitset<64> data1(0xFFFFFFFFFFFFFFFULL); + ETL_CONSTEXPR14 etl::bitset<64> data2(test_assignment_operator_helper(etl::bitset<64>(), data1)); for (size_t i = 0UL; i < data2.size(); ++i) { @@ -1667,11 +1184,11 @@ namespace //************************************************************************* TEST(test_equality_operator) { - ETL_CONSTEXPR14 etl::bitset<60> data1(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data2(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data3; + ETL_CONSTEXPR14 etl::bitset<64> data1(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data3; - ETL_CONSTEXPR14 bool equal = (data1 == data2); + ETL_CONSTEXPR14 bool equal = (data1 == data2); ETL_CONSTEXPR14 bool not_equal = !(data1 == data3); CHECK(equal); @@ -1681,9 +1198,9 @@ namespace //************************************************************************* TEST(test_inequality_operator) { - ETL_CONSTEXPR14 etl::bitset<60> data1(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data2(0x123456781234567ULL); - ETL_CONSTEXPR14 etl::bitset<60> data3; + ETL_CONSTEXPR14 etl::bitset<64> data1(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x123456781234567ULL); + ETL_CONSTEXPR14 etl::bitset<64> data3; ETL_CONSTEXPR14 bool equal = !(data1 != data2); ETL_CONSTEXPR14 bool not_equal = (data1 != data3); @@ -1695,139 +1212,138 @@ namespace //************************************************************************* TEST(test_shift_left_operator) { - ETL_CONSTEXPR14 etl::bitset<60> shift1(0x2468ACF0ULL); - ETL_CONSTEXPR14 etl::bitset<60> shift2(0x48D159E0ULL); - ETL_CONSTEXPR14 etl::bitset<60> shift11(0x91A2B3C000ULL); + ETL_CONSTEXPR14 etl::bitset<64> shift1(0x2468ACF0ULL); + ETL_CONSTEXPR14 etl::bitset<64> shift2(0x48D159E0ULL); + ETL_CONSTEXPR14 etl::bitset<64> shift11(0x91A2B3C000ULL); - CHECK(generate_shift_left_bitset<60>(0x12345678ULL, 1U) == shift1); - CHECK(generate_shift_left_bitset<60>(0x12345678ULL, 2U) == shift2); - CHECK(generate_shift_left_bitset<60>(0x12345678ULL, 11U) == shift11); + CHECK((generate_shift_left_bitset<64>(0x12345678ULL, 1U)) == shift1); + CHECK((generate_shift_left_bitset<64>(0x12345678ULL, 2U)) == shift2); + CHECK((generate_shift_left_bitset<64>(0x12345678ULL, 11U)) == shift11); } //************************************************************************* TEST(test_shift_left_operator_overflow) { - ETL_CONSTEXPR14 etl::bitset<31> data(generate_shift_left_bitset<31>(0x7FFFFFFFULL, 1U)); - ETL_CONSTEXPR14 etl::bitset<31> shifted(0x7FFFFFFEUL); + ETL_CONSTEXPR14 etl::bitset<32> data(generate_shift_left_bitset<32>(0x7FFFFFFFULL, 1U)); + ETL_CONSTEXPR14 etl::bitset<32> shifted(0xFFFFFFFEUL); - CHECK(data == shifted); + CHECK_EQUAL_HEX(shifted.value(), data.value()); } //************************************************************************* TEST(test_shift_left_copy_operator) { - ETL_CONSTEXPR14 etl::bitset<60> shift8(0x1234567800ULL); - CHECK_EQUAL_HEX(shift8.value(), generate_shift_left_bitset_copy<60>(0x12345678UL, 8U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift8(0x1234567800ULL); + CHECK_EQUAL_HEX(shift8.value(), (generate_shift_left_bitset_copy<64>(0x12345678UL, 8U).value())); - ETL_CONSTEXPR14 etl::bitset<60> shift16(0x123456780000ULL); - CHECK_EQUAL_HEX(shift16.value(), generate_shift_left_bitset_copy<60>(0x12345678UL, 16U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift16(0x123456780000ULL); + CHECK_EQUAL_HEX(shift16.value(), (generate_shift_left_bitset_copy<64>(0x12345678UL, 16U).value())); - ETL_CONSTEXPR14 etl::bitset<60> shift24(0x12345678000000ULL); - CHECK_EQUAL_HEX(shift24.value(), generate_shift_left_bitset_copy<60>(0x12345678UL, 24U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift24(0x12345678000000ULL); + CHECK_EQUAL_HEX(shift24.value(), (generate_shift_left_bitset_copy<64>(0x12345678UL, 24U).value())); - ETL_CONSTEXPR14 etl::bitset<60> shift60(0x0000000000000000ULL); - CHECK_EQUAL_HEX(shift60.value(), generate_shift_left_bitset_copy<60>(0x12345678UL, 60U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift64(0x0000000000000000ULL); + CHECK_EQUAL_HEX(shift64.value(), (generate_shift_left_bitset_copy<64>(0x12345678UL, 64U).value())); } //************************************************************************* - TEST(test_shift_left_operator_all_shifts_partial_size) + TEST(test_shift_left_operator_all_shifts_full_size) { uint64_t value = 0x0123456789ABCDEFULL; - uint64_t mask = 0x0FFFFFFFFFFFFFFFULL; - CHECK_EQUAL_HEX((value << 0U) & mask, (generate_shift_left_bitset<60>(value, 0U).value())); - CHECK_EQUAL_HEX((value << 1U) & mask, (generate_shift_left_bitset<60>(value, 1U).value())); - CHECK_EQUAL_HEX((value << 2U) & mask, (generate_shift_left_bitset<60>(value, 2U).value())); - CHECK_EQUAL_HEX((value << 3U) & mask, (generate_shift_left_bitset<60>(value, 3U).value())); - CHECK_EQUAL_HEX((value << 4U) & mask, (generate_shift_left_bitset<60>(value, 4U).value())); - CHECK_EQUAL_HEX((value << 5U) & mask, (generate_shift_left_bitset<60>(value, 5U).value())); - CHECK_EQUAL_HEX((value << 6U) & mask, (generate_shift_left_bitset<60>(value, 6U).value())); - CHECK_EQUAL_HEX((value << 7U) & mask, (generate_shift_left_bitset<60>(value, 7U).value())); - CHECK_EQUAL_HEX((value << 8U) & mask, (generate_shift_left_bitset<60>(value, 8U).value())); - CHECK_EQUAL_HEX((value << 9U) & mask, (generate_shift_left_bitset<60>(value, 9U).value())); - CHECK_EQUAL_HEX((value << 10U) & mask, (generate_shift_left_bitset<60>(value, 10U).value())); - CHECK_EQUAL_HEX((value << 11U) & mask, (generate_shift_left_bitset<60>(value, 11U).value())); - CHECK_EQUAL_HEX((value << 12U) & mask, (generate_shift_left_bitset<60>(value, 12U).value())); - CHECK_EQUAL_HEX((value << 13U) & mask, (generate_shift_left_bitset<60>(value, 13U).value())); - CHECK_EQUAL_HEX((value << 14U) & mask, (generate_shift_left_bitset<60>(value, 14U).value())); - CHECK_EQUAL_HEX((value << 15U) & mask, (generate_shift_left_bitset<60>(value, 15U).value())); - CHECK_EQUAL_HEX((value << 16U) & mask, (generate_shift_left_bitset<60>(value, 16U).value())); - CHECK_EQUAL_HEX((value << 17U) & mask, (generate_shift_left_bitset<60>(value, 17U).value())); - CHECK_EQUAL_HEX((value << 18U) & mask, (generate_shift_left_bitset<60>(value, 18U).value())); - CHECK_EQUAL_HEX((value << 19U) & mask, (generate_shift_left_bitset<60>(value, 19U).value())); - CHECK_EQUAL_HEX((value << 20U) & mask, (generate_shift_left_bitset<60>(value, 20U).value())); - CHECK_EQUAL_HEX((value << 21U) & mask, (generate_shift_left_bitset<60>(value, 21U).value())); - CHECK_EQUAL_HEX((value << 22U) & mask, (generate_shift_left_bitset<60>(value, 22U).value())); - CHECK_EQUAL_HEX((value << 23U) & mask, (generate_shift_left_bitset<60>(value, 23U).value())); - CHECK_EQUAL_HEX((value << 24U) & mask, (generate_shift_left_bitset<60>(value, 24U).value())); - CHECK_EQUAL_HEX((value << 25U) & mask, (generate_shift_left_bitset<60>(value, 25U).value())); - CHECK_EQUAL_HEX((value << 26U) & mask, (generate_shift_left_bitset<60>(value, 26U).value())); - CHECK_EQUAL_HEX((value << 27U) & mask, (generate_shift_left_bitset<60>(value, 27U).value())); - CHECK_EQUAL_HEX((value << 28U) & mask, (generate_shift_left_bitset<60>(value, 28U).value())); - CHECK_EQUAL_HEX((value << 29U) & mask, (generate_shift_left_bitset<60>(value, 29U).value())); - CHECK_EQUAL_HEX((value << 30U) & mask, (generate_shift_left_bitset<60>(value, 30U).value())); - CHECK_EQUAL_HEX((value << 31U) & mask, (generate_shift_left_bitset<60>(value, 31U).value())); - CHECK_EQUAL_HEX((value << 32U) & mask, (generate_shift_left_bitset<60>(value, 32U).value())); - CHECK_EQUAL_HEX((value << 33U) & mask, (generate_shift_left_bitset<60>(value, 33U).value())); - CHECK_EQUAL_HEX((value << 34U) & mask, (generate_shift_left_bitset<60>(value, 34U).value())); - CHECK_EQUAL_HEX((value << 35U) & mask, (generate_shift_left_bitset<60>(value, 35U).value())); - CHECK_EQUAL_HEX((value << 36U) & mask, (generate_shift_left_bitset<60>(value, 36U).value())); - CHECK_EQUAL_HEX((value << 37U) & mask, (generate_shift_left_bitset<60>(value, 37U).value())); - CHECK_EQUAL_HEX((value << 38U) & mask, (generate_shift_left_bitset<60>(value, 38U).value())); - CHECK_EQUAL_HEX((value << 39U) & mask, (generate_shift_left_bitset<60>(value, 39U).value())); - CHECK_EQUAL_HEX((value << 40U) & mask, (generate_shift_left_bitset<60>(value, 40U).value())); - CHECK_EQUAL_HEX((value << 41U) & mask, (generate_shift_left_bitset<60>(value, 41U).value())); - CHECK_EQUAL_HEX((value << 42U) & mask, (generate_shift_left_bitset<60>(value, 42U).value())); - CHECK_EQUAL_HEX((value << 43U) & mask, (generate_shift_left_bitset<60>(value, 43U).value())); - CHECK_EQUAL_HEX((value << 44U) & mask, (generate_shift_left_bitset<60>(value, 44U).value())); - CHECK_EQUAL_HEX((value << 45U) & mask, (generate_shift_left_bitset<60>(value, 45U).value())); - CHECK_EQUAL_HEX((value << 46U) & mask, (generate_shift_left_bitset<60>(value, 46U).value())); - CHECK_EQUAL_HEX((value << 47U) & mask, (generate_shift_left_bitset<60>(value, 47U).value())); - CHECK_EQUAL_HEX((value << 48U) & mask, (generate_shift_left_bitset<60>(value, 48U).value())); - CHECK_EQUAL_HEX((value << 49U) & mask, (generate_shift_left_bitset<60>(value, 49U).value())); - CHECK_EQUAL_HEX((value << 50U) & mask, (generate_shift_left_bitset<60>(value, 50U).value())); - CHECK_EQUAL_HEX((value << 51U) & mask, (generate_shift_left_bitset<60>(value, 51U).value())); - CHECK_EQUAL_HEX((value << 52U) & mask, (generate_shift_left_bitset<60>(value, 52U).value())); - CHECK_EQUAL_HEX((value << 53U) & mask, (generate_shift_left_bitset<60>(value, 53U).value())); - CHECK_EQUAL_HEX((value << 54U) & mask, (generate_shift_left_bitset<60>(value, 54U).value())); - CHECK_EQUAL_HEX((value << 55U) & mask, (generate_shift_left_bitset<60>(value, 55U).value())); - CHECK_EQUAL_HEX((value << 56U) & mask, (generate_shift_left_bitset<60>(value, 56U).value())); - CHECK_EQUAL_HEX((value << 57U) & mask, (generate_shift_left_bitset<60>(value, 57U).value())); - CHECK_EQUAL_HEX((value << 58U) & mask, (generate_shift_left_bitset<60>(value, 58U).value())); - CHECK_EQUAL_HEX((value << 59U) & mask, (generate_shift_left_bitset<60>(value, 59U).value())); - CHECK_EQUAL_HEX((value << 60U) & mask, (generate_shift_left_bitset<60>(value, 60U).value())); - CHECK_EQUAL_HEX((value << 61U) & mask, (generate_shift_left_bitset<60>(value, 61U).value())); - CHECK_EQUAL_HEX((value << 62U) & mask, (generate_shift_left_bitset<60>(value, 62U).value())); - CHECK_EQUAL_HEX((value << 63U) & mask, (generate_shift_left_bitset<60>(value, 63U).value())); - CHECK_EQUAL_HEX(0ULL, (generate_shift_left_bitset<60>(value, 64U).value())); + CHECK_EQUAL_HEX((value << 0U), (generate_shift_left_bitset<64>(value, 0U).value())); + CHECK_EQUAL_HEX((value << 1U), (generate_shift_left_bitset<64>(value, 1U).value())); + CHECK_EQUAL_HEX((value << 2U), (generate_shift_left_bitset<64>(value, 2U).value())); + CHECK_EQUAL_HEX((value << 3U), (generate_shift_left_bitset<64>(value, 3U).value())); + CHECK_EQUAL_HEX((value << 4U), (generate_shift_left_bitset<64>(value, 4U).value())); + CHECK_EQUAL_HEX((value << 5U), (generate_shift_left_bitset<64>(value, 5U).value())); + CHECK_EQUAL_HEX((value << 6U), (generate_shift_left_bitset<64>(value, 6U).value())); + CHECK_EQUAL_HEX((value << 7U), (generate_shift_left_bitset<64>(value, 7U).value())); + CHECK_EQUAL_HEX((value << 8U), (generate_shift_left_bitset<64>(value, 8U).value())); + CHECK_EQUAL_HEX((value << 9U), (generate_shift_left_bitset<64>(value, 9U).value())); + CHECK_EQUAL_HEX((value << 10U), (generate_shift_left_bitset<64>(value, 10U).value())); + CHECK_EQUAL_HEX((value << 11U), (generate_shift_left_bitset<64>(value, 11U).value())); + CHECK_EQUAL_HEX((value << 12U), (generate_shift_left_bitset<64>(value, 12U).value())); + CHECK_EQUAL_HEX((value << 13U), (generate_shift_left_bitset<64>(value, 13U).value())); + CHECK_EQUAL_HEX((value << 14U), (generate_shift_left_bitset<64>(value, 14U).value())); + CHECK_EQUAL_HEX((value << 15U), (generate_shift_left_bitset<64>(value, 15U).value())); + CHECK_EQUAL_HEX((value << 16U), (generate_shift_left_bitset<64>(value, 16U).value())); + CHECK_EQUAL_HEX((value << 17U), (generate_shift_left_bitset<64>(value, 17U).value())); + CHECK_EQUAL_HEX((value << 18U), (generate_shift_left_bitset<64>(value, 18U).value())); + CHECK_EQUAL_HEX((value << 19U), (generate_shift_left_bitset<64>(value, 19U).value())); + CHECK_EQUAL_HEX((value << 20U), (generate_shift_left_bitset<64>(value, 20U).value())); + CHECK_EQUAL_HEX((value << 21U), (generate_shift_left_bitset<64>(value, 21U).value())); + CHECK_EQUAL_HEX((value << 22U), (generate_shift_left_bitset<64>(value, 22U).value())); + CHECK_EQUAL_HEX((value << 23U), (generate_shift_left_bitset<64>(value, 23U).value())); + CHECK_EQUAL_HEX((value << 24U), (generate_shift_left_bitset<64>(value, 24U).value())); + CHECK_EQUAL_HEX((value << 25U), (generate_shift_left_bitset<64>(value, 25U).value())); + CHECK_EQUAL_HEX((value << 26U), (generate_shift_left_bitset<64>(value, 26U).value())); + CHECK_EQUAL_HEX((value << 27U), (generate_shift_left_bitset<64>(value, 27U).value())); + CHECK_EQUAL_HEX((value << 28U), (generate_shift_left_bitset<64>(value, 28U).value())); + CHECK_EQUAL_HEX((value << 29U), (generate_shift_left_bitset<64>(value, 29U).value())); + CHECK_EQUAL_HEX((value << 30U), (generate_shift_left_bitset<64>(value, 30U).value())); + CHECK_EQUAL_HEX((value << 31U), (generate_shift_left_bitset<64>(value, 31U).value())); + CHECK_EQUAL_HEX((value << 32U), (generate_shift_left_bitset<64>(value, 32U).value())); + CHECK_EQUAL_HEX((value << 33U), (generate_shift_left_bitset<64>(value, 33U).value())); + CHECK_EQUAL_HEX((value << 34U), (generate_shift_left_bitset<64>(value, 34U).value())); + CHECK_EQUAL_HEX((value << 35U), (generate_shift_left_bitset<64>(value, 35U).value())); + CHECK_EQUAL_HEX((value << 36U), (generate_shift_left_bitset<64>(value, 36U).value())); + CHECK_EQUAL_HEX((value << 37U), (generate_shift_left_bitset<64>(value, 37U).value())); + CHECK_EQUAL_HEX((value << 38U), (generate_shift_left_bitset<64>(value, 38U).value())); + CHECK_EQUAL_HEX((value << 39U), (generate_shift_left_bitset<64>(value, 39U).value())); + CHECK_EQUAL_HEX((value << 40U), (generate_shift_left_bitset<64>(value, 40U).value())); + CHECK_EQUAL_HEX((value << 41U), (generate_shift_left_bitset<64>(value, 41U).value())); + CHECK_EQUAL_HEX((value << 42U), (generate_shift_left_bitset<64>(value, 42U).value())); + CHECK_EQUAL_HEX((value << 43U), (generate_shift_left_bitset<64>(value, 43U).value())); + CHECK_EQUAL_HEX((value << 44U), (generate_shift_left_bitset<64>(value, 44U).value())); + CHECK_EQUAL_HEX((value << 45U), (generate_shift_left_bitset<64>(value, 45U).value())); + CHECK_EQUAL_HEX((value << 46U), (generate_shift_left_bitset<64>(value, 46U).value())); + CHECK_EQUAL_HEX((value << 47U), (generate_shift_left_bitset<64>(value, 47U).value())); + CHECK_EQUAL_HEX((value << 48U), (generate_shift_left_bitset<64>(value, 48U).value())); + CHECK_EQUAL_HEX((value << 49U), (generate_shift_left_bitset<64>(value, 49U).value())); + CHECK_EQUAL_HEX((value << 50U), (generate_shift_left_bitset<64>(value, 50U).value())); + CHECK_EQUAL_HEX((value << 51U), (generate_shift_left_bitset<64>(value, 51U).value())); + CHECK_EQUAL_HEX((value << 52U), (generate_shift_left_bitset<64>(value, 52U).value())); + CHECK_EQUAL_HEX((value << 53U), (generate_shift_left_bitset<64>(value, 53U).value())); + CHECK_EQUAL_HEX((value << 54U), (generate_shift_left_bitset<64>(value, 54U).value())); + CHECK_EQUAL_HEX((value << 55U), (generate_shift_left_bitset<64>(value, 55U).value())); + CHECK_EQUAL_HEX((value << 56U), (generate_shift_left_bitset<64>(value, 56U).value())); + CHECK_EQUAL_HEX((value << 57U), (generate_shift_left_bitset<64>(value, 57U).value())); + CHECK_EQUAL_HEX((value << 58U), (generate_shift_left_bitset<64>(value, 58U).value())); + CHECK_EQUAL_HEX((value << 59U), (generate_shift_left_bitset<64>(value, 59U).value())); + CHECK_EQUAL_HEX((value << 60U), (generate_shift_left_bitset<64>(value, 60U).value())); + CHECK_EQUAL_HEX((value << 61U), (generate_shift_left_bitset<64>(value, 61U).value())); + CHECK_EQUAL_HEX((value << 62U), (generate_shift_left_bitset<64>(value, 62U).value())); + CHECK_EQUAL_HEX((value << 63U), (generate_shift_left_bitset<64>(value, 63U).value())); + CHECK_EQUAL_HEX(0ULL, (generate_shift_left_bitset<64>(value, 64U).value())); } //************************************************************************* TEST(test_shift_right_operator) { - ETL_CONSTEXPR14 etl::bitset<60> shift1(0x91A2B3CULL); - ETL_CONSTEXPR14 etl::bitset<60> shift2(0x48D159EULL); - ETL_CONSTEXPR14 etl::bitset<60> shift11(0x2468AULL); + ETL_CONSTEXPR14 etl::bitset<64> shift1(0x91A2B3CULL); + ETL_CONSTEXPR14 etl::bitset<64> shift2(0x48D159EULL); + ETL_CONSTEXPR14 etl::bitset<64> shift11(0x2468AULL); - CHECK(generate_shift_right_bitset<60>(0x12345678ULL, 1U) == shift1); - CHECK(generate_shift_right_bitset<60>(0x12345678ULL, 2U) == shift2); - CHECK(generate_shift_right_bitset<60>(0x12345678ULL, 11U) == shift11); + CHECK_EQUAL_HEX(shift1.value(), (generate_shift_right_bitset<64>(0x12345678ULL, 1U).value())); + CHECK_EQUAL_HEX(shift2.value(), (generate_shift_right_bitset<64>(0x12345678ULL, 2U).value())); + CHECK_EQUAL_HEX(shift11.value(), (generate_shift_right_bitset<64>(0x12345678ULL, 11U).value())); } //************************************************************************* TEST(test_shift_right_copy_operator) { - ETL_CONSTEXPR14 etl::bitset<60> shift8(0x123456ULL); - CHECK_EQUAL_HEX(shift8.value(), generate_shift_right_bitset_copy<60>(0x12345678UL, 8U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift8(0x123456ULL); + CHECK_EQUAL_HEX(shift8.value(), (generate_shift_right_bitset_copy<64>(0x12345678UL, 8U).value())); - ETL_CONSTEXPR14 etl::bitset<60> shift16(0x1234ULL); - CHECK_EQUAL_HEX(shift16.value(), generate_shift_right_bitset_copy<60>(0x12345678UL, 16U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift16(0x1234ULL); + CHECK_EQUAL_HEX(shift16.value(), (generate_shift_right_bitset_copy<64>(0x12345678UL, 16U).value())); - ETL_CONSTEXPR14 etl::bitset<60> shift24(0x12ULL); - CHECK_EQUAL_HEX(shift24.value(), generate_shift_right_bitset_copy<60>(0x12345678UL, 24U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift24(0x12ULL); + CHECK_EQUAL_HEX(shift24.value(), (generate_shift_right_bitset_copy<64>(0x12345678UL, 24U).value())); - ETL_CONSTEXPR14 etl::bitset<60> shift60(0x00ULL); - CHECK_EQUAL_HEX(shift60.value(), generate_shift_right_bitset_copy<60>(0x12345678UL, 60U).value()); + ETL_CONSTEXPR14 etl::bitset<64> shift60(0x00ULL); + CHECK_EQUAL_HEX(shift60.value(), (generate_shift_right_bitset_copy<64>(0x12345678UL, 60U).value())); } //************************************************************************* @@ -1835,331 +1351,335 @@ namespace { uint64_t value = 0x0123456789ABCDEFULL; - CHECK_EQUAL_HEX((value >> 0U), (generate_shift_right_bitset<64>(value, 0U).value())); - CHECK_EQUAL_HEX((value >> 1U), (generate_shift_right_bitset<64>(value, 1U).value())); - CHECK_EQUAL_HEX((value >> 2U), (generate_shift_right_bitset<64>(value, 2U).value())); - CHECK_EQUAL_HEX((value >> 3U), (generate_shift_right_bitset<64>(value, 3U).value())); - CHECK_EQUAL_HEX((value >> 4U), (generate_shift_right_bitset<64>(value, 4U).value())); - CHECK_EQUAL_HEX((value >> 5U), (generate_shift_right_bitset<64>(value, 5U).value())); - CHECK_EQUAL_HEX((value >> 6U), (generate_shift_right_bitset<64>(value, 6U).value())); - CHECK_EQUAL_HEX((value >> 7U), (generate_shift_right_bitset<64>(value, 7U).value())); - CHECK_EQUAL_HEX((value >> 8U), (generate_shift_right_bitset<64>(value, 8U).value())); - CHECK_EQUAL_HEX((value >> 9U), (generate_shift_right_bitset<64>(value, 9U).value())); - CHECK_EQUAL_HEX((value >> 10U), (generate_shift_right_bitset<64>(value, 10U).value())); - CHECK_EQUAL_HEX((value >> 11U), (generate_shift_right_bitset<64>(value, 11U).value())); - CHECK_EQUAL_HEX((value >> 12U), (generate_shift_right_bitset<64>(value, 12U).value())); - CHECK_EQUAL_HEX((value >> 13U), (generate_shift_right_bitset<64>(value, 13U).value())); - CHECK_EQUAL_HEX((value >> 14U), (generate_shift_right_bitset<64>(value, 14U).value())); - CHECK_EQUAL_HEX((value >> 15U), (generate_shift_right_bitset<64>(value, 15U).value())); - CHECK_EQUAL_HEX((value >> 16U), (generate_shift_right_bitset<64>(value, 16U).value())); - CHECK_EQUAL_HEX((value >> 17U), (generate_shift_right_bitset<64>(value, 17U).value())); - CHECK_EQUAL_HEX((value >> 18U), (generate_shift_right_bitset<64>(value, 18U).value())); - CHECK_EQUAL_HEX((value >> 19U), (generate_shift_right_bitset<64>(value, 19U).value())); - CHECK_EQUAL_HEX((value >> 20U), (generate_shift_right_bitset<64>(value, 20U).value())); - CHECK_EQUAL_HEX((value >> 21U), (generate_shift_right_bitset<64>(value, 21U).value())); - CHECK_EQUAL_HEX((value >> 22U), (generate_shift_right_bitset<64>(value, 22U).value())); - CHECK_EQUAL_HEX((value >> 23U), (generate_shift_right_bitset<64>(value, 23U).value())); - CHECK_EQUAL_HEX((value >> 24U), (generate_shift_right_bitset<64>(value, 24U).value())); - CHECK_EQUAL_HEX((value >> 25U), (generate_shift_right_bitset<64>(value, 25U).value())); - CHECK_EQUAL_HEX((value >> 26U), (generate_shift_right_bitset<64>(value, 26U).value())); - CHECK_EQUAL_HEX((value >> 27U), (generate_shift_right_bitset<64>(value, 27U).value())); - CHECK_EQUAL_HEX((value >> 28U), (generate_shift_right_bitset<64>(value, 28U).value())); - CHECK_EQUAL_HEX((value >> 29U), (generate_shift_right_bitset<64>(value, 29U).value())); - CHECK_EQUAL_HEX((value >> 30U), (generate_shift_right_bitset<64>(value, 30U).value())); - CHECK_EQUAL_HEX((value >> 31U), (generate_shift_right_bitset<64>(value, 31U).value())); - CHECK_EQUAL_HEX((value >> 32U), (generate_shift_right_bitset<64>(value, 32U).value())); - CHECK_EQUAL_HEX((value >> 33U), (generate_shift_right_bitset<64>(value, 33U).value())); - CHECK_EQUAL_HEX((value >> 34U), (generate_shift_right_bitset<64>(value, 34U).value())); - CHECK_EQUAL_HEX((value >> 35U), (generate_shift_right_bitset<64>(value, 35U).value())); - CHECK_EQUAL_HEX((value >> 36U), (generate_shift_right_bitset<64>(value, 36U).value())); - CHECK_EQUAL_HEX((value >> 37U), (generate_shift_right_bitset<64>(value, 37U).value())); - CHECK_EQUAL_HEX((value >> 38U), (generate_shift_right_bitset<64>(value, 38U).value())); - CHECK_EQUAL_HEX((value >> 39U), (generate_shift_right_bitset<64>(value, 39U).value())); - CHECK_EQUAL_HEX((value >> 40U), (generate_shift_right_bitset<64>(value, 40U).value())); - CHECK_EQUAL_HEX((value >> 41U), (generate_shift_right_bitset<64>(value, 41U).value())); - CHECK_EQUAL_HEX((value >> 42U), (generate_shift_right_bitset<64>(value, 42U).value())); - CHECK_EQUAL_HEX((value >> 43U), (generate_shift_right_bitset<64>(value, 43U).value())); - CHECK_EQUAL_HEX((value >> 44U), (generate_shift_right_bitset<64>(value, 44U).value())); - CHECK_EQUAL_HEX((value >> 45U), (generate_shift_right_bitset<64>(value, 45U).value())); - CHECK_EQUAL_HEX((value >> 46U), (generate_shift_right_bitset<64>(value, 46U).value())); - CHECK_EQUAL_HEX((value >> 47U), (generate_shift_right_bitset<64>(value, 47U).value())); - CHECK_EQUAL_HEX((value >> 48U), (generate_shift_right_bitset<64>(value, 48U).value())); - CHECK_EQUAL_HEX((value >> 49U), (generate_shift_right_bitset<64>(value, 49U).value())); - CHECK_EQUAL_HEX((value >> 50U), (generate_shift_right_bitset<64>(value, 50U).value())); - CHECK_EQUAL_HEX((value >> 51U), (generate_shift_right_bitset<64>(value, 51U).value())); - CHECK_EQUAL_HEX((value >> 52U), (generate_shift_right_bitset<64>(value, 52U).value())); - CHECK_EQUAL_HEX((value >> 53U), (generate_shift_right_bitset<64>(value, 53U).value())); - CHECK_EQUAL_HEX((value >> 54U), (generate_shift_right_bitset<64>(value, 54U).value())); - CHECK_EQUAL_HEX((value >> 55U), (generate_shift_right_bitset<64>(value, 55U).value())); - CHECK_EQUAL_HEX((value >> 56U), (generate_shift_right_bitset<64>(value, 56U).value())); - CHECK_EQUAL_HEX((value >> 57U), (generate_shift_right_bitset<64>(value, 57U).value())); - CHECK_EQUAL_HEX((value >> 58U), (generate_shift_right_bitset<64>(value, 58U).value())); - CHECK_EQUAL_HEX((value >> 59U), (generate_shift_right_bitset<64>(value, 59U).value())); - CHECK_EQUAL_HEX((value >> 60U), (generate_shift_right_bitset<64>(value, 60U).value())); - CHECK_EQUAL_HEX((value >> 61U), (generate_shift_right_bitset<64>(value, 61U).value())); - CHECK_EQUAL_HEX((value >> 62U), (generate_shift_right_bitset<64>(value, 62U).value())); - CHECK_EQUAL_HEX((value >> 63U), (generate_shift_right_bitset<64>(value, 63U).value())); - CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<64>(value, 64U).value())); + CHECK_EQUAL_HEX((value >> 0U), (generate_shift_right_bitset<64>(value, 0U).value())); + CHECK_EQUAL_HEX((value >> 1U), (generate_shift_right_bitset<64>(value, 1U).value())); + CHECK_EQUAL_HEX((value >> 2U), (generate_shift_right_bitset<64>(value, 2U).value())); + CHECK_EQUAL_HEX((value >> 3U), (generate_shift_right_bitset<64>(value, 3U).value())); + CHECK_EQUAL_HEX((value >> 4U), (generate_shift_right_bitset<64>(value, 4U).value())); + CHECK_EQUAL_HEX((value >> 5U), (generate_shift_right_bitset<64>(value, 5U).value())); + CHECK_EQUAL_HEX((value >> 6U), (generate_shift_right_bitset<64>(value, 6U).value())); + CHECK_EQUAL_HEX((value >> 7U), (generate_shift_right_bitset<64>(value, 7U).value())); + CHECK_EQUAL_HEX((value >> 8U), (generate_shift_right_bitset<64>(value, 8U).value())); + CHECK_EQUAL_HEX((value >> 9U), (generate_shift_right_bitset<64>(value, 9U).value())); + CHECK_EQUAL_HEX((value >> 10U), (generate_shift_right_bitset<64>(value, 10U).value())); + CHECK_EQUAL_HEX((value >> 11U), (generate_shift_right_bitset<64>(value, 11U).value())); + CHECK_EQUAL_HEX((value >> 12U), (generate_shift_right_bitset<64>(value, 12U).value())); + CHECK_EQUAL_HEX((value >> 13U), (generate_shift_right_bitset<64>(value, 13U).value())); + CHECK_EQUAL_HEX((value >> 14U), (generate_shift_right_bitset<64>(value, 14U).value())); + CHECK_EQUAL_HEX((value >> 15U), (generate_shift_right_bitset<64>(value, 15U).value())); + CHECK_EQUAL_HEX((value >> 16U), (generate_shift_right_bitset<64>(value, 16U).value())); + CHECK_EQUAL_HEX((value >> 17U), (generate_shift_right_bitset<64>(value, 17U).value())); + CHECK_EQUAL_HEX((value >> 18U), (generate_shift_right_bitset<64>(value, 18U).value())); + CHECK_EQUAL_HEX((value >> 19U), (generate_shift_right_bitset<64>(value, 19U).value())); + CHECK_EQUAL_HEX((value >> 20U), (generate_shift_right_bitset<64>(value, 20U).value())); + CHECK_EQUAL_HEX((value >> 21U), (generate_shift_right_bitset<64>(value, 21U).value())); + CHECK_EQUAL_HEX((value >> 22U), (generate_shift_right_bitset<64>(value, 22U).value())); + CHECK_EQUAL_HEX((value >> 23U), (generate_shift_right_bitset<64>(value, 23U).value())); + CHECK_EQUAL_HEX((value >> 24U), (generate_shift_right_bitset<64>(value, 24U).value())); + CHECK_EQUAL_HEX((value >> 25U), (generate_shift_right_bitset<64>(value, 25U).value())); + CHECK_EQUAL_HEX((value >> 26U), (generate_shift_right_bitset<64>(value, 26U).value())); + CHECK_EQUAL_HEX((value >> 27U), (generate_shift_right_bitset<64>(value, 27U).value())); + CHECK_EQUAL_HEX((value >> 28U), (generate_shift_right_bitset<64>(value, 28U).value())); + CHECK_EQUAL_HEX((value >> 29U), (generate_shift_right_bitset<64>(value, 29U).value())); + CHECK_EQUAL_HEX((value >> 30U), (generate_shift_right_bitset<64>(value, 30U).value())); + CHECK_EQUAL_HEX((value >> 31U), (generate_shift_right_bitset<64>(value, 31U).value())); + CHECK_EQUAL_HEX((value >> 32U), (generate_shift_right_bitset<64>(value, 32U).value())); + CHECK_EQUAL_HEX((value >> 33U), (generate_shift_right_bitset<64>(value, 33U).value())); + CHECK_EQUAL_HEX((value >> 34U), (generate_shift_right_bitset<64>(value, 34U).value())); + CHECK_EQUAL_HEX((value >> 35U), (generate_shift_right_bitset<64>(value, 35U).value())); + CHECK_EQUAL_HEX((value >> 36U), (generate_shift_right_bitset<64>(value, 36U).value())); + CHECK_EQUAL_HEX((value >> 37U), (generate_shift_right_bitset<64>(value, 37U).value())); + CHECK_EQUAL_HEX((value >> 38U), (generate_shift_right_bitset<64>(value, 38U).value())); + CHECK_EQUAL_HEX((value >> 39U), (generate_shift_right_bitset<64>(value, 39U).value())); + CHECK_EQUAL_HEX((value >> 40U), (generate_shift_right_bitset<64>(value, 40U).value())); + CHECK_EQUAL_HEX((value >> 41U), (generate_shift_right_bitset<64>(value, 41U).value())); + CHECK_EQUAL_HEX((value >> 42U), (generate_shift_right_bitset<64>(value, 42U).value())); + CHECK_EQUAL_HEX((value >> 43U), (generate_shift_right_bitset<64>(value, 43U).value())); + CHECK_EQUAL_HEX((value >> 44U), (generate_shift_right_bitset<64>(value, 44U).value())); + CHECK_EQUAL_HEX((value >> 45U), (generate_shift_right_bitset<64>(value, 45U).value())); + CHECK_EQUAL_HEX((value >> 46U), (generate_shift_right_bitset<64>(value, 46U).value())); + CHECK_EQUAL_HEX((value >> 47U), (generate_shift_right_bitset<64>(value, 47U).value())); + CHECK_EQUAL_HEX((value >> 48U), (generate_shift_right_bitset<64>(value, 48U).value())); + CHECK_EQUAL_HEX((value >> 49U), (generate_shift_right_bitset<64>(value, 49U).value())); + CHECK_EQUAL_HEX((value >> 50U), (generate_shift_right_bitset<64>(value, 50U).value())); + CHECK_EQUAL_HEX((value >> 51U), (generate_shift_right_bitset<64>(value, 51U).value())); + CHECK_EQUAL_HEX((value >> 52U), (generate_shift_right_bitset<64>(value, 52U).value())); + CHECK_EQUAL_HEX((value >> 53U), (generate_shift_right_bitset<64>(value, 53U).value())); + CHECK_EQUAL_HEX((value >> 54U), (generate_shift_right_bitset<64>(value, 54U).value())); + CHECK_EQUAL_HEX((value >> 55U), (generate_shift_right_bitset<64>(value, 55U).value())); + CHECK_EQUAL_HEX((value >> 56U), (generate_shift_right_bitset<64>(value, 56U).value())); + CHECK_EQUAL_HEX((value >> 57U), (generate_shift_right_bitset<64>(value, 57U).value())); + CHECK_EQUAL_HEX((value >> 58U), (generate_shift_right_bitset<64>(value, 58U).value())); + CHECK_EQUAL_HEX((value >> 59U), (generate_shift_right_bitset<64>(value, 59U).value())); + CHECK_EQUAL_HEX((value >> 60U), (generate_shift_right_bitset<64>(value, 60U).value())); + CHECK_EQUAL_HEX((value >> 61U), (generate_shift_right_bitset<64>(value, 61U).value())); + CHECK_EQUAL_HEX((value >> 62U), (generate_shift_right_bitset<64>(value, 62U).value())); + CHECK_EQUAL_HEX((value >> 63U), (generate_shift_right_bitset<64>(value, 63U).value())); + CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<64>(value, 64U).value())); } //************************************************************************* TEST(test_shift_right_operator_all_shifts_partial_size) { uint64_t value = 0x0123456789ABCDEFULL; - uint64_t mask = 0x0FFFFFFFFFFFFFFFULL; + uint64_t mask = 0x0FFFFFFFFFFFFFFFULL; - CHECK_EQUAL_HEX((value >> 0U) & mask, (generate_shift_right_bitset<60>(value, 0U).value())); - CHECK_EQUAL_HEX((value >> 1U) & mask, (generate_shift_right_bitset<60>(value, 1U).value())); - CHECK_EQUAL_HEX((value >> 2U) & mask, (generate_shift_right_bitset<60>(value, 2U).value())); - CHECK_EQUAL_HEX((value >> 3U) & mask, (generate_shift_right_bitset<60>(value, 3U).value())); - CHECK_EQUAL_HEX((value >> 4U) & mask, (generate_shift_right_bitset<60>(value, 4U).value())); - CHECK_EQUAL_HEX((value >> 5U) & mask, (generate_shift_right_bitset<60>(value, 5U).value())); - CHECK_EQUAL_HEX((value >> 6U) & mask, (generate_shift_right_bitset<60>(value, 6U).value())); - CHECK_EQUAL_HEX((value >> 7U) & mask, (generate_shift_right_bitset<60>(value, 7U).value())); - CHECK_EQUAL_HEX((value >> 8U) & mask, (generate_shift_right_bitset<60>(value, 8U).value())); - CHECK_EQUAL_HEX((value >> 9U) & mask, (generate_shift_right_bitset<60>(value, 9U).value())); - CHECK_EQUAL_HEX((value >> 10U) & mask, (generate_shift_right_bitset<60>(value, 10U).value())); - CHECK_EQUAL_HEX((value >> 11U) & mask, (generate_shift_right_bitset<60>(value, 11U).value())); - CHECK_EQUAL_HEX((value >> 12U) & mask, (generate_shift_right_bitset<60>(value, 12U).value())); - CHECK_EQUAL_HEX((value >> 13U) & mask, (generate_shift_right_bitset<60>(value, 13U).value())); - CHECK_EQUAL_HEX((value >> 14U) & mask, (generate_shift_right_bitset<60>(value, 14U).value())); - CHECK_EQUAL_HEX((value >> 15U) & mask, (generate_shift_right_bitset<60>(value, 15U).value())); - CHECK_EQUAL_HEX((value >> 16U) & mask, (generate_shift_right_bitset<60>(value, 16U).value())); - CHECK_EQUAL_HEX((value >> 17U) & mask, (generate_shift_right_bitset<60>(value, 17U).value())); - CHECK_EQUAL_HEX((value >> 18U) & mask, (generate_shift_right_bitset<60>(value, 18U).value())); - CHECK_EQUAL_HEX((value >> 19U) & mask, (generate_shift_right_bitset<60>(value, 19U).value())); - CHECK_EQUAL_HEX((value >> 20U) & mask, (generate_shift_right_bitset<60>(value, 20U).value())); - CHECK_EQUAL_HEX((value >> 21U) & mask, (generate_shift_right_bitset<60>(value, 21U).value())); - CHECK_EQUAL_HEX((value >> 22U) & mask, (generate_shift_right_bitset<60>(value, 22U).value())); - CHECK_EQUAL_HEX((value >> 23U) & mask, (generate_shift_right_bitset<60>(value, 23U).value())); - CHECK_EQUAL_HEX((value >> 24U) & mask, (generate_shift_right_bitset<60>(value, 24U).value())); - CHECK_EQUAL_HEX((value >> 25U) & mask, (generate_shift_right_bitset<60>(value, 25U).value())); - CHECK_EQUAL_HEX((value >> 26U) & mask, (generate_shift_right_bitset<60>(value, 26U).value())); - CHECK_EQUAL_HEX((value >> 27U) & mask, (generate_shift_right_bitset<60>(value, 27U).value())); - CHECK_EQUAL_HEX((value >> 28U) & mask, (generate_shift_right_bitset<60>(value, 28U).value())); - CHECK_EQUAL_HEX((value >> 29U) & mask, (generate_shift_right_bitset<60>(value, 29U).value())); - CHECK_EQUAL_HEX((value >> 30U) & mask, (generate_shift_right_bitset<60>(value, 30U).value())); - CHECK_EQUAL_HEX((value >> 31U) & mask, (generate_shift_right_bitset<60>(value, 31U).value())); - CHECK_EQUAL_HEX((value >> 32U) & mask, (generate_shift_right_bitset<60>(value, 32U).value())); - CHECK_EQUAL_HEX((value >> 33U) & mask, (generate_shift_right_bitset<60>(value, 33U).value())); - CHECK_EQUAL_HEX((value >> 34U) & mask, (generate_shift_right_bitset<60>(value, 34U).value())); - CHECK_EQUAL_HEX((value >> 35U) & mask, (generate_shift_right_bitset<60>(value, 35U).value())); - CHECK_EQUAL_HEX((value >> 36U) & mask, (generate_shift_right_bitset<60>(value, 36U).value())); - CHECK_EQUAL_HEX((value >> 37U) & mask, (generate_shift_right_bitset<60>(value, 37U).value())); - CHECK_EQUAL_HEX((value >> 38U) & mask, (generate_shift_right_bitset<60>(value, 38U).value())); - CHECK_EQUAL_HEX((value >> 39U) & mask, (generate_shift_right_bitset<60>(value, 39U).value())); - CHECK_EQUAL_HEX((value >> 40U) & mask, (generate_shift_right_bitset<60>(value, 40U).value())); - CHECK_EQUAL_HEX((value >> 41U) & mask, (generate_shift_right_bitset<60>(value, 41U).value())); - CHECK_EQUAL_HEX((value >> 42U) & mask, (generate_shift_right_bitset<60>(value, 42U).value())); - CHECK_EQUAL_HEX((value >> 43U) & mask, (generate_shift_right_bitset<60>(value, 43U).value())); - CHECK_EQUAL_HEX((value >> 44U) & mask, (generate_shift_right_bitset<60>(value, 44U).value())); - CHECK_EQUAL_HEX((value >> 45U) & mask, (generate_shift_right_bitset<60>(value, 45U).value())); - CHECK_EQUAL_HEX((value >> 46U) & mask, (generate_shift_right_bitset<60>(value, 46U).value())); - CHECK_EQUAL_HEX((value >> 47U) & mask, (generate_shift_right_bitset<60>(value, 47U).value())); - CHECK_EQUAL_HEX((value >> 48U) & mask, (generate_shift_right_bitset<60>(value, 48U).value())); - CHECK_EQUAL_HEX((value >> 49U) & mask, (generate_shift_right_bitset<60>(value, 49U).value())); - CHECK_EQUAL_HEX((value >> 50U) & mask, (generate_shift_right_bitset<60>(value, 50U).value())); - CHECK_EQUAL_HEX((value >> 51U) & mask, (generate_shift_right_bitset<60>(value, 51U).value())); - CHECK_EQUAL_HEX((value >> 52U) & mask, (generate_shift_right_bitset<60>(value, 52U).value())); - CHECK_EQUAL_HEX((value >> 53U) & mask, (generate_shift_right_bitset<60>(value, 53U).value())); - CHECK_EQUAL_HEX((value >> 54U) & mask, (generate_shift_right_bitset<60>(value, 54U).value())); - CHECK_EQUAL_HEX((value >> 55U) & mask, (generate_shift_right_bitset<60>(value, 55U).value())); - CHECK_EQUAL_HEX((value >> 56U) & mask, (generate_shift_right_bitset<60>(value, 56U).value())); - CHECK_EQUAL_HEX((value >> 57U) & mask, (generate_shift_right_bitset<60>(value, 57U).value())); - CHECK_EQUAL_HEX((value >> 58U) & mask, (generate_shift_right_bitset<60>(value, 58U).value())); - CHECK_EQUAL_HEX((value >> 59U) & mask, (generate_shift_right_bitset<60>(value, 59U).value())); - CHECK_EQUAL_HEX((value >> 60U) & mask, (generate_shift_right_bitset<60>(value, 60U).value())); - CHECK_EQUAL_HEX((value >> 61U) & mask, (generate_shift_right_bitset<60>(value, 61U).value())); - CHECK_EQUAL_HEX((value >> 62U) & mask, (generate_shift_right_bitset<60>(value, 62U).value())); - CHECK_EQUAL_HEX((value >> 63U) & mask, (generate_shift_right_bitset<60>(value, 63U).value())); - CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<60>(value, 64U).value())); + CHECK_EQUAL_HEX((value >> 0U) & mask, (generate_shift_right_bitset<64>(value, 0U).value())); + CHECK_EQUAL_HEX((value >> 1U) & mask, (generate_shift_right_bitset<64>(value, 1U).value())); + CHECK_EQUAL_HEX((value >> 2U) & mask, (generate_shift_right_bitset<64>(value, 2U).value())); + CHECK_EQUAL_HEX((value >> 3U) & mask, (generate_shift_right_bitset<64>(value, 3U).value())); + CHECK_EQUAL_HEX((value >> 4U) & mask, (generate_shift_right_bitset<64>(value, 4U).value())); + CHECK_EQUAL_HEX((value >> 5U) & mask, (generate_shift_right_bitset<64>(value, 5U).value())); + CHECK_EQUAL_HEX((value >> 6U) & mask, (generate_shift_right_bitset<64>(value, 6U).value())); + CHECK_EQUAL_HEX((value >> 7U) & mask, (generate_shift_right_bitset<64>(value, 7U).value())); + CHECK_EQUAL_HEX((value >> 8U) & mask, (generate_shift_right_bitset<64>(value, 8U).value())); + CHECK_EQUAL_HEX((value >> 9U) & mask, (generate_shift_right_bitset<64>(value, 9U).value())); + CHECK_EQUAL_HEX((value >> 10U) & mask, (generate_shift_right_bitset<64>(value, 10U).value())); + CHECK_EQUAL_HEX((value >> 11U) & mask, (generate_shift_right_bitset<64>(value, 11U).value())); + CHECK_EQUAL_HEX((value >> 12U) & mask, (generate_shift_right_bitset<64>(value, 12U).value())); + CHECK_EQUAL_HEX((value >> 13U) & mask, (generate_shift_right_bitset<64>(value, 13U).value())); + CHECK_EQUAL_HEX((value >> 14U) & mask, (generate_shift_right_bitset<64>(value, 14U).value())); + CHECK_EQUAL_HEX((value >> 15U) & mask, (generate_shift_right_bitset<64>(value, 15U).value())); + CHECK_EQUAL_HEX((value >> 16U) & mask, (generate_shift_right_bitset<64>(value, 16U).value())); + CHECK_EQUAL_HEX((value >> 17U) & mask, (generate_shift_right_bitset<64>(value, 17U).value())); + CHECK_EQUAL_HEX((value >> 18U) & mask, (generate_shift_right_bitset<64>(value, 18U).value())); + CHECK_EQUAL_HEX((value >> 19U) & mask, (generate_shift_right_bitset<64>(value, 19U).value())); + CHECK_EQUAL_HEX((value >> 20U) & mask, (generate_shift_right_bitset<64>(value, 20U).value())); + CHECK_EQUAL_HEX((value >> 21U) & mask, (generate_shift_right_bitset<64>(value, 21U).value())); + CHECK_EQUAL_HEX((value >> 22U) & mask, (generate_shift_right_bitset<64>(value, 22U).value())); + CHECK_EQUAL_HEX((value >> 23U) & mask, (generate_shift_right_bitset<64>(value, 23U).value())); + CHECK_EQUAL_HEX((value >> 24U) & mask, (generate_shift_right_bitset<64>(value, 24U).value())); + CHECK_EQUAL_HEX((value >> 25U) & mask, (generate_shift_right_bitset<64>(value, 25U).value())); + CHECK_EQUAL_HEX((value >> 26U) & mask, (generate_shift_right_bitset<64>(value, 26U).value())); + CHECK_EQUAL_HEX((value >> 27U) & mask, (generate_shift_right_bitset<64>(value, 27U).value())); + CHECK_EQUAL_HEX((value >> 28U) & mask, (generate_shift_right_bitset<64>(value, 28U).value())); + CHECK_EQUAL_HEX((value >> 29U) & mask, (generate_shift_right_bitset<64>(value, 29U).value())); + CHECK_EQUAL_HEX((value >> 30U) & mask, (generate_shift_right_bitset<64>(value, 30U).value())); + CHECK_EQUAL_HEX((value >> 31U) & mask, (generate_shift_right_bitset<64>(value, 31U).value())); + CHECK_EQUAL_HEX((value >> 32U) & mask, (generate_shift_right_bitset<64>(value, 32U).value())); + CHECK_EQUAL_HEX((value >> 33U) & mask, (generate_shift_right_bitset<64>(value, 33U).value())); + CHECK_EQUAL_HEX((value >> 34U) & mask, (generate_shift_right_bitset<64>(value, 34U).value())); + CHECK_EQUAL_HEX((value >> 35U) & mask, (generate_shift_right_bitset<64>(value, 35U).value())); + CHECK_EQUAL_HEX((value >> 36U) & mask, (generate_shift_right_bitset<64>(value, 36U).value())); + CHECK_EQUAL_HEX((value >> 37U) & mask, (generate_shift_right_bitset<64>(value, 37U).value())); + CHECK_EQUAL_HEX((value >> 38U) & mask, (generate_shift_right_bitset<64>(value, 38U).value())); + CHECK_EQUAL_HEX((value >> 39U) & mask, (generate_shift_right_bitset<64>(value, 39U).value())); + CHECK_EQUAL_HEX((value >> 40U) & mask, (generate_shift_right_bitset<64>(value, 40U).value())); + CHECK_EQUAL_HEX((value >> 41U) & mask, (generate_shift_right_bitset<64>(value, 41U).value())); + CHECK_EQUAL_HEX((value >> 42U) & mask, (generate_shift_right_bitset<64>(value, 42U).value())); + CHECK_EQUAL_HEX((value >> 43U) & mask, (generate_shift_right_bitset<64>(value, 43U).value())); + CHECK_EQUAL_HEX((value >> 44U) & mask, (generate_shift_right_bitset<64>(value, 44U).value())); + CHECK_EQUAL_HEX((value >> 45U) & mask, (generate_shift_right_bitset<64>(value, 45U).value())); + CHECK_EQUAL_HEX((value >> 46U) & mask, (generate_shift_right_bitset<64>(value, 46U).value())); + CHECK_EQUAL_HEX((value >> 47U) & mask, (generate_shift_right_bitset<64>(value, 47U).value())); + CHECK_EQUAL_HEX((value >> 48U) & mask, (generate_shift_right_bitset<64>(value, 48U).value())); + CHECK_EQUAL_HEX((value >> 49U) & mask, (generate_shift_right_bitset<64>(value, 49U).value())); + CHECK_EQUAL_HEX((value >> 50U) & mask, (generate_shift_right_bitset<64>(value, 50U).value())); + CHECK_EQUAL_HEX((value >> 51U) & mask, (generate_shift_right_bitset<64>(value, 51U).value())); + CHECK_EQUAL_HEX((value >> 52U) & mask, (generate_shift_right_bitset<64>(value, 52U).value())); + CHECK_EQUAL_HEX((value >> 53U) & mask, (generate_shift_right_bitset<64>(value, 53U).value())); + CHECK_EQUAL_HEX((value >> 54U) & mask, (generate_shift_right_bitset<64>(value, 54U).value())); + CHECK_EQUAL_HEX((value >> 55U) & mask, (generate_shift_right_bitset<64>(value, 55U).value())); + CHECK_EQUAL_HEX((value >> 56U) & mask, (generate_shift_right_bitset<64>(value, 56U).value())); + CHECK_EQUAL_HEX((value >> 57U) & mask, (generate_shift_right_bitset<64>(value, 57U).value())); + CHECK_EQUAL_HEX((value >> 58U) & mask, (generate_shift_right_bitset<64>(value, 58U).value())); + CHECK_EQUAL_HEX((value >> 59U) & mask, (generate_shift_right_bitset<64>(value, 59U).value())); + CHECK_EQUAL_HEX((value >> 60U) & mask, (generate_shift_right_bitset<64>(value, 60U).value())); + CHECK_EQUAL_HEX((value >> 61U) & mask, (generate_shift_right_bitset<64>(value, 61U).value())); + CHECK_EQUAL_HEX((value >> 62U) & mask, (generate_shift_right_bitset<64>(value, 62U).value())); + CHECK_EQUAL_HEX((value >> 63U) & mask, (generate_shift_right_bitset<64>(value, 63U).value())); + CHECK_EQUAL_HEX(0ULL, (generate_shift_right_bitset<64>(value, 64U).value())); } //************************************************************************* TEST(test_and_operator) { - etl::bitset<60> data1(0x12345678UL); - etl::bitset<60> data2(0x23456789UL); - etl::bitset<60> data3(0x12345678UL & 0x23456789UL); - etl::bitset<60> data4(data1 & data2); + ETL_CONSTEXPR14 etl::bitset<64> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data4(0x12345678UL & 0x23456789UL); + + ETL_CONSTEXPR14 etl::bitset<64> data3 = data1 & data2; CHECK(data3 == data4); } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_and_equals_operator_helper(etl::bitset<64> data1, const etl::bitset<64>&data2) + { + data1 &= data2; + + return data1; + } + TEST(test_and_equals_operator) { - etl::bitset<60> data1(0x12345678UL); - etl::bitset<60> data2(0x23456789UL); - etl::bitset<60> data3(0x12345678UL & 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x23456789UL); - etl::bitset<60> data4(data1); - data4 &= data2; - CHECK(data3 == data4); + ETL_CONSTEXPR14 etl::bitset<64> data3(test_and_equals_operator_helper(data1, data2)); + + CHECK((data1 & data2) == data3); } //************************************************************************* TEST(test_or_operator) { - etl::bitset<60> data1(0x12345678UL); - etl::bitset<60> data2(0x23456789UL); - etl::bitset<60> data4(0x12345678UL | 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data4(0x12345678UL | 0x23456789UL); - etl::bitset<60> data3(data1 | data2); + ETL_CONSTEXPR14 etl::bitset<64> data3 = data1 | data2; CHECK(data3 == data4); } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_or_equals_operator_helper(etl::bitset<64> data1, const etl::bitset<64>&data2) + { + data1 |= data2; + + return data1; + } + TEST(test_or_equals_operator) { - etl::bitset<60> data1(0x12345678UL); - etl::bitset<60> data2(0x23456789UL); - etl::bitset<60> data3(0x12345678UL | 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x23456789UL); - etl::bitset<60> data4(data1); - data4 |= data2; - CHECK(data3 == data4); + ETL_CONSTEXPR14 etl::bitset<64> data3(test_or_equals_operator_helper(data1, data2)); + + CHECK((data1 | data2) == data3); } //************************************************************************* TEST(test_xor_operator) { - etl::bitset<60> data1(0x12345678UL); - etl::bitset<60> data2(0x23456789UL); - etl::bitset<60> data4(0x12345678UL ^ 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data4(0x12345678UL ^ 0x23456789UL); - etl::bitset<60> data3(data1 ^ data2); + ETL_CONSTEXPR14 etl::bitset<64> data3 = data1 ^ data2; CHECK(data3 == data4); } //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_xor_equals_operator_helper(etl::bitset<64> data1, const etl::bitset<64>&data2) + { + data1 ^= data2; + + return data1; + } + TEST(test_xor_equals_operator) { - etl::bitset<60> data1(0x12345678UL); - etl::bitset<60> data2(0x23456789UL); - etl::bitset<60> data3(0x12345678UL ^ 0x23456789UL); + ETL_CONSTEXPR14 etl::bitset<64> data1(0x12345678UL); + ETL_CONSTEXPR14 etl::bitset<64> data2(0x23456789UL); - etl::bitset<60> data4(data1); - data4 ^= data2; - CHECK(data3 == data4); + ETL_CONSTEXPR14 etl::bitset<64> data3(test_xor_equals_operator_helper(data1, data2)); + + CHECK((data1 ^ data2) == data3); } //************************************************************************* TEST(test_find_first) { - ETL_CONSTEXPR14 etl::bitset<9> bs1(ull(0x0000)); - ETL_CONSTEXPR14 size_t bs1fff = bs1.find_first(false); - ETL_CONSTEXPR14 size_t bs1fft = bs1.find_first(true); - CHECK_EQUAL(0U, bs1fff); - CHECK_EQUAL(etl::bitset<>::npos, bs1fft); + ETL_CONSTEXPR14 etl::bitset<8> bs1(ull(0x00)); + ETL_CONSTEXPR14 size_t bs1find_first_false = bs1.find_first(false); + ETL_CONSTEXPR14 size_t bs1find_first_true = bs1.find_first(true); + CHECK_EQUAL(0U, bs1find_first_false); + CHECK_EQUAL(etl::bitset<>::npos, bs1find_first_true); - ETL_CONSTEXPR14 etl::bitset<9> bs2(ull(0x01FF)); - ETL_CONSTEXPR14 size_t bs2fff = bs2.find_first(false); - ETL_CONSTEXPR14 size_t bs2fft = bs2.find_first(true); - CHECK_EQUAL(etl::bitset<>::npos, bs2fff); - CHECK_EQUAL(0U, bs2fft); + ETL_CONSTEXPR14 etl::bitset<8> bs2(ull(0xFF)); + ETL_CONSTEXPR14 size_t bs2find_first_false = bs2.find_first(false); + ETL_CONSTEXPR14 size_t bs2find_first_true = bs2.find_first(true); + CHECK_EQUAL(etl::bitset<>::npos, bs2find_first_false); + CHECK_EQUAL(0U, bs2find_first_true); - ETL_CONSTEXPR14 etl::bitset<9> bs3(ull(0x0001)); - ETL_CONSTEXPR14 size_t bs3fff = bs3.find_first(false); - ETL_CONSTEXPR14 size_t bs3fft = bs3.find_first(true); - CHECK_EQUAL(1U, bs3fff); - CHECK_EQUAL(0U, bs3fft); + ETL_CONSTEXPR14 etl::bitset<8> bs3(ull(0x01)); + ETL_CONSTEXPR14 size_t bs3find_first_false = bs3.find_first(false); + ETL_CONSTEXPR14 size_t bs3find_first_true = bs3.find_first(true); + CHECK_EQUAL(1U, bs3find_first_false); + CHECK_EQUAL(0U, bs3find_first_true); - ETL_CONSTEXPR14 etl::bitset<9> bs4(ull(0x0020)); - ETL_CONSTEXPR14 size_t bs4fff = bs4.find_first(false); - ETL_CONSTEXPR14 size_t bs4fft = bs4.find_first(true); - CHECK_EQUAL(0U, bs4fff); - CHECK_EQUAL(5U, bs4fft); + ETL_CONSTEXPR14 etl::bitset<8> bs4(ull(0x20)); + ETL_CONSTEXPR14 size_t bs4find_first_false = bs4.find_first(false); + ETL_CONSTEXPR14 size_t bs4find_first_true = bs4.find_first(true); + CHECK_EQUAL(0U, bs4find_first_false); + CHECK_EQUAL(5U, bs4find_first_true); - ETL_CONSTEXPR14 etl::bitset<9> bs5(ull(0x0021)); - ETL_CONSTEXPR14 size_t bs5fff = bs5.find_first(false); - ETL_CONSTEXPR14 size_t bs5fft = bs5.find_first(true); - CHECK_EQUAL(1U, bs5fff); - CHECK_EQUAL(0U, bs5fft); + ETL_CONSTEXPR14 etl::bitset<8> bs5(ull(0x21)); + ETL_CONSTEXPR14 size_t bs5find_first_false = bs5.find_first(false); + ETL_CONSTEXPR14 size_t bs5find_first_true = bs5.find_first(true); + CHECK_EQUAL(1U, bs5find_first_false); + CHECK_EQUAL(0U, bs5find_first_true); - ETL_CONSTEXPR14 etl::bitset<9> bs6(ull(0x000E)); - ETL_CONSTEXPR14 size_t bs6fff = bs6.find_first(false); - ETL_CONSTEXPR14 size_t bs6fft = bs6.find_first(true); - CHECK_EQUAL(0U, bs6fff); - CHECK_EQUAL(1U, bs6fft); + ETL_CONSTEXPR14 etl::bitset<8> bs6(ull(0x0E)); + ETL_CONSTEXPR14 size_t bs6find_first_false = bs6.find_first(false); + ETL_CONSTEXPR14 size_t bs6find_first_true = bs6.find_first(true); + CHECK_EQUAL(0U, bs6find_first_false); + CHECK_EQUAL(1U, bs6find_first_true); - ETL_CONSTEXPR14 etl::bitset<9> bs7(ull(0x31)); - ETL_CONSTEXPR14 size_t bs7fff = bs7.find_first(false); - ETL_CONSTEXPR14 size_t bs7fft = bs7.find_first(true); - CHECK_EQUAL(1U, bs7fff); - CHECK_EQUAL(0U, bs7fft); + ETL_CONSTEXPR14 etl::bitset<8> bs7(ull(0x31)); + ETL_CONSTEXPR14 size_t bs7find_first_false = bs7.find_first(false); + ETL_CONSTEXPR14 size_t bs7find_first_true = bs7.find_first(true); + CHECK_EQUAL(1U, bs7find_first_false); + CHECK_EQUAL(0U, bs7find_first_true); } - + //************************************************************************* TEST(test_find_next) { - ETL_CONSTEXPR14 etl::bitset<9> bs1(ull(0x0000)); - ETL_CONSTEXPR14 size_t bs1fnf0 = bs1.find_next(false, 0); - ETL_CONSTEXPR14 size_t bs1fnf1 = bs1.find_next(false, 1); - ETL_CONSTEXPR14 size_t bs1fnt2 = bs1.find_next(true, 2); - CHECK_EQUAL(0U, bs1fnf0); - CHECK_EQUAL(1U, bs1fnf1); - CHECK_EQUAL(etl::bitset<>::npos, bs1fnt2); + ETL_CONSTEXPR14 etl::bitset<8> bs1(ull(0x00)); + ETL_CONSTEXPR14 size_t bs1find_next_false0 = bs1.find_next(false, 0); + ETL_CONSTEXPR14 size_t bs1find_next_false1 = bs1.find_next(false, 1); + ETL_CONSTEXPR14 size_t bs1find_next_true2 = bs1.find_next(true, 2); + CHECK_EQUAL(0U, bs1find_next_false0); + CHECK_EQUAL(1U, bs1find_next_false1); + CHECK_EQUAL(etl::bitset<>::npos, bs1find_next_true2); - ETL_CONSTEXPR14 etl::bitset<9> bs2(ull(0x1FF)); - ETL_CONSTEXPR14 size_t bs2fnt0 = bs2.find_next(true, 0); - ETL_CONSTEXPR14 size_t bs2fnt1 = bs2.find_next(true, 1); - ETL_CONSTEXPR14 size_t bs2fnf2 = bs2.find_next(false, 2); - CHECK_EQUAL(0U, bs2fnt0); - CHECK_EQUAL(1U, bs2fnt1); - CHECK_EQUAL(etl::bitset<>::npos, bs2fnf2); + ETL_CONSTEXPR14 etl::bitset<8> bs2(ull(0xFF)); + ETL_CONSTEXPR14 size_t bs2find_next_true0 = bs2.find_next(true, 0); + ETL_CONSTEXPR14 size_t bs2find_next_true1 = bs2.find_next(true, 1); + ETL_CONSTEXPR14 size_t bs2find_next_false2 = bs2.find_next(false, 2); + CHECK_EQUAL(0U, bs2find_next_true0); + CHECK_EQUAL(1U, bs2find_next_true1); + CHECK_EQUAL(etl::bitset<>::npos, bs2find_next_false2); - ETL_CONSTEXPR14 etl::bitset<9> bs3(ull(0x000E)); - ETL_CONSTEXPR14 size_t bs3fnf0 = bs3.find_next(false, 0); - ETL_CONSTEXPR14 size_t bs3fnt1 = bs3.find_next(true, 1); - ETL_CONSTEXPR14 size_t bs3fnf2 = bs3.find_next(false, 2); - CHECK_EQUAL(0U, bs3fnf0); - CHECK_EQUAL(1U, bs3fnt1); - CHECK_EQUAL(4U, bs3fnf2); + ETL_CONSTEXPR14 etl::bitset<8> bs3(ull(0x0E)); + ETL_CONSTEXPR14 size_t bs3find_next_false0 = bs3.find_next(false, 0); + ETL_CONSTEXPR14 size_t bs3find_next_true1 = bs3.find_next(true, 1); + ETL_CONSTEXPR14 size_t bs3find_next_false2 = bs3.find_next(false, 2); + CHECK_EQUAL(0U, bs3find_next_false0); + CHECK_EQUAL(1U, bs3find_next_true1); + CHECK_EQUAL(4U, bs3find_next_false2); - ETL_CONSTEXPR14 etl::bitset<9> bs4(ull(0x0031)); - ETL_CONSTEXPR14 size_t bs4fnt0 = bs4.find_next(true, 0); - ETL_CONSTEXPR14 size_t bs4fnf0 = bs4.find_next(false, 0); - ETL_CONSTEXPR14 size_t bs4fnt1 = bs4.find_next(true, 1); - CHECK_EQUAL(0U, bs4fnt0); - CHECK_EQUAL(1U, bs4fnf0); - CHECK_EQUAL(4U, bs4fnt1); + ETL_CONSTEXPR14 etl::bitset<8> bs4(ull(0x31)); + ETL_CONSTEXPR14 size_t bs4find_next_true0 = bs4.find_next(true, 0); + ETL_CONSTEXPR14 size_t bs4find_next_false0 = bs4.find_next(false, 0); + ETL_CONSTEXPR14 size_t bs4find_next_true1 = bs4.find_next(true, 1); + CHECK_EQUAL(0U, bs4find_next_true0); + CHECK_EQUAL(1U, bs4find_next_false0); + CHECK_EQUAL(4U, bs4find_next_true1); } //************************************************************************* - TEST(test_find_next_github_issue_617) + ETL_CONSTEXPR14 std::pair, etl::bitset<8>> test_swap_helper() { - ETL_CONSTEXPR14 etl::bitset<64> bs1(ull(0xC000000000000031)); - ETL_CONSTEXPR14 size_t bs1fnt1 = bs1.find_next(true, 10); - ETL_CONSTEXPR14 size_t bs1fnt2 = bs1.find_next(true, 59); - CHECK_EQUAL(62U, bs1fnt1); - CHECK_EQUAL(62U, bs1fnt2); + etl::bitset<8> data1(ull(0x2A)); + etl::bitset<8> data2(ull(0x15)); - ETL_CONSTEXPR14 etl::bitset<64> bs2(ull(0x3FFFFFFFFFFFFFCE)); - ETL_CONSTEXPR14 size_t bs2fnf1 = bs2.find_next(false, 10); - ETL_CONSTEXPR14 size_t bs2fnf2 = bs2.find_next(false, 59); - CHECK_EQUAL(62U, bs2fnf1); - CHECK_EQUAL(62U, bs2fnf2); + swap(data1, data2); - ETL_CONSTEXPR14 etl::bitset<64, uint32_t> bs32(ull(0xC000000000000031)); - ETL_CONSTEXPR14 size_t bs32fnt1 = bs32.find_next(true, 10); - ETL_CONSTEXPR14 size_t bs32fnt2 = bs32.find_next(true, 59); - CHECK_EQUAL(62U, bs32fnt1); - CHECK_EQUAL(62U, bs32fnt2); + return std::pair, etl::bitset<8>>(data1, data2); } - //************************************************************************* - //************************************************************************* TEST(test_swap) { - etl::bitset<9> compare1(0x2A); - etl::bitset<9> compare2(0x15); - etl::bitset<9> compare1a(0x2A); - etl::bitset<9> compare2a(0x15); + ETL_CONSTEXPR14 etl::bitset<8> compare1(0x2A); + ETL_CONSTEXPR14 etl::bitset<8> compare2(0x15); - swap(compare1a, compare2a); + ETL_CONSTEXPR14 std::pair, etl::bitset<8>> swapped = test_swap_helper(); - CHECK(compare1 == compare2a); - CHECK(compare2 == compare1a); + CHECK(swapped.first == compare2); + CHECK(swapped.second == compare1); } //************************************************************************* @@ -2170,10 +1690,25 @@ namespace etl::bitset<32> b(0x12345678UL); span_t s = b.span(); - CHECK_EQUAL(0x78U, s[0]); - CHECK_EQUAL(0x56U, s[1]); - CHECK_EQUAL(0x34U, s[2]); - CHECK_EQUAL(0x12U, s[3]); + + if (etl::endianness::value() == etl::endian::little) + { + CHECK_EQUAL(0x78UL, s[0]); + CHECK_EQUAL(0x56UL, s[1]); + CHECK_EQUAL(0x34UL, s[2]); + CHECK_EQUAL(0x12UL, s[3]); + } + else + { + CHECK_EQUAL(0x78UL, s[3]); + CHECK_EQUAL(0x56UL, s[2]); + CHECK_EQUAL(0x34UL, s[1]); + CHECK_EQUAL(0x12UL, s[0]); + } + + s[2] = 0x9AU; + uint32_t value = b.value(); + CHECK_EQUAL(0x129A5678UL, value); } //************************************************************************* @@ -2184,28 +1719,44 @@ namespace const etl::bitset<32> b(0x12345678UL); span_t s = b.span(); - CHECK_EQUAL(0x78U, s[0]); - CHECK_EQUAL(0x56U, s[1]); - CHECK_EQUAL(0x34U, s[2]); - CHECK_EQUAL(0x12U, s[3]); + + if (etl::endianness::value() == etl::endian::little) + { + CHECK_EQUAL(0x78UL, s[0]); + CHECK_EQUAL(0x56UL, s[1]); + CHECK_EQUAL(0x34UL, s[2]); + CHECK_EQUAL(0x12UL, s[3]); + } + else + { + CHECK_EQUAL(0x78UL, s[3]); + CHECK_EQUAL(0x56UL, s[2]); + CHECK_EQUAL(0x34UL, s[1]); + CHECK_EQUAL(0x12UL, s[0]); + } } //************************************************************************* TEST(test_to_string) { - ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + using bs32 = etl::bitset<32>; + + ETL_CONSTEXPR14 bs32 b(0x12345678UL); etl::string<32> text = b.to_string('.', '*'); - std::string stdtext = b.to_string('.', '*'); + std::string stdtext = b.to_string('.', '*'); - CHECK_EQUAL("...*..*...**.*...*.*.**..****...", text.c_str()); - CHECK_EQUAL("...*..*...**.*...*.*.**..****...", stdtext.c_str()); + //CHECK_THROW(b.to_string>('.', '*'), etl::bitset_overflow); + CHECK_EQUAL(std::string("...*..*...**.*...*.*.**..****..."), std::string(text.c_str())); + CHECK_EQUAL(std::string("...*..*...**.*...*.*.**..****..."), std::string(stdtext.c_str())); } //************************************************************************* TEST(test_to_wstring) { - ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + using bs32 = etl::bitset<32>; + + ETL_CONSTEXPR14 bs32 b(0x12345678UL); etl::wstring<32> text = b.to_string>(L'.', L'*'); std::wstring stdtext = b.to_string(L'.', L'*'); @@ -2217,7 +1768,9 @@ namespace //************************************************************************* TEST(test_to_u16string) { - ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + using bs32 = etl::bitset<32>; + + ETL_CONSTEXPR14 bs32 b(0x12345678UL); etl::u16string<32> text = b.to_string>(u'.', u'*'); std::u16string stdtext = b.to_string(u'.', u'*'); @@ -2229,7 +1782,9 @@ namespace //************************************************************************* TEST(test_to_u32string) { - ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); + using bs32 = etl::bitset<32>; + + ETL_CONSTEXPR14 bs32 b(0x12345678UL); etl::u32string<32> text = b.to_string>(U'.', U'*'); std::u32string stdtext = b.to_string(U'.', U'*'); @@ -2238,21 +1793,21 @@ namespace CHECK(std::u32string(U"...*..*...**.*...*.*.**..****...") == std::u32string(stdtext.c_str())); } - //************************************************************************* + ////************************************************************************* TEST(test_extract_6_bit_uint8_t_with_run_time_parameters) { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); - CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); - CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); - CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); - CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); - CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); - CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); - CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); - CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); - CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract(0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract(1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract(4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract(5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract(7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract(9, 6))); CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); @@ -2280,16 +1835,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); @@ -2318,16 +1873,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); @@ -2355,16 +1910,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); @@ -2393,16 +1948,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); - CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); - CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); - CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); - CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); - CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); - CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); - CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); - CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); - CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract(0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract(1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract(2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract(3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract(4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract(5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract(6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract(7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract(8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract(9, 8)); CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); @@ -2418,7 +1973,7 @@ namespace CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); - + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } @@ -2428,16 +1983,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); @@ -2464,16 +2019,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); - CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); - CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); - CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); - CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); - CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); - CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); - CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); - CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); - CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(int8_t(0x78), b.extract(0, 8)); + CHECK_EQUAL_HEX(int8_t(0x3C), b.extract(1, 8)); + CHECK_EQUAL_HEX(int8_t(0x9E), b.extract(2, 8)); + CHECK_EQUAL_HEX(int8_t(0xCF), b.extract(3, 8)); + CHECK_EQUAL_HEX(int8_t(0x67), b.extract(4, 8)); + CHECK_EQUAL_HEX(int8_t(0xB3), b.extract(5, 8)); + CHECK_EQUAL_HEX(int8_t(0x59), b.extract(6, 8)); + CHECK_EQUAL_HEX(int8_t(0xAC), b.extract(7, 8)); + CHECK_EQUAL_HEX(int8_t(0x56), b.extract(8, 8)); + CHECK_EQUAL_HEX(int8_t(0x2B), b.extract(9, 8)); CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); @@ -2499,16 +2054,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); @@ -2535,16 +2090,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); - CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); - CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); - CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); - CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); - CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); - CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); - CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); - CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract(0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract(1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract(2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract(3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract(4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract(5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract(6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract(7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract(8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract(9, 13)); CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); @@ -2565,26 +2120,26 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x11A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x091A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x048D), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0246), (b.extract())); // The lines below should static assert. //uint16_t v1 = b.extract b(0x12345678UL); - CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); - CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); - CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); - CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); - CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); - CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); - CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); - CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); - CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract(0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract(1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract(2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract(3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract(4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract(5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract(6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract(7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract(8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract(9, 16)); CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); @@ -2623,16 +2178,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); @@ -2651,16 +2206,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); - CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); - CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); - CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); - CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); - CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); - CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); - CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); - CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); - CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(int16_t(0x5678), b.extract(0, 16)); + CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract(1, 16)); + CHECK_EQUAL_HEX(int16_t(0x159E), b.extract(2, 16)); + CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract(3, 16)); + CHECK_EQUAL_HEX(int16_t(0x4567), b.extract(4, 16)); + CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract(5, 16)); + CHECK_EQUAL_HEX(int16_t(0xD159), b.extract(6, 16)); + CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract(7, 16)); + CHECK_EQUAL_HEX(int16_t(0x3456), b.extract(8, 16)); + CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract(9, 16)); CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); @@ -2678,16 +2233,16 @@ namespace { ETL_CONSTEXPR14 etl::bitset<32> b(0x12345678UL); - CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 18d19157..0ce70049 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -117,7 +117,7 @@ namespace return data2; } - SUITE(test_bitset_new_implicit_element_type) + SUITE(test_bitset_new_explicit_element_type) { //************************************************************************* TEST(test_default_constructor) @@ -142,15 +142,20 @@ namespace etl::bitset<32, uint32_t> data32; etl::bitset<64, uint64_t> data64; + CHECK_EQUAL(8, data8.Size); + CHECK_EQUAL(16, data16.Size); + CHECK_EQUAL(32, data32.Size); + CHECK_EQUAL(64, data64.Size); + CHECK_EQUAL(1U, data8.Number_Of_Elements); CHECK_EQUAL(1U, data16.Number_Of_Elements); CHECK_EQUAL(1U, data32.Number_Of_Elements); CHECK_EQUAL(1U, data64.Number_Of_Elements); - CHECK_EQUAL(etl::bitset_layout::Single, data8.Element_Layout); - CHECK_EQUAL(etl::bitset_layout::Single, data16.Element_Layout); - CHECK_EQUAL(etl::bitset_layout::Single, data32.Element_Layout); - CHECK_EQUAL(etl::bitset_layout::Single, data64.Element_Layout); + CHECK_EQUAL(etl::bitset_storage_model::Single, data8.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Single, data16.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Single, data32.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Single, data64.Storage_Model); } //************************************************************************* @@ -554,7 +559,7 @@ namespace } //************************************************************************* - TEST(test_from_char16_t_6string) + TEST(test_from_string_with_char16_t) { std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); etl::bitset<64, uint64_t> data; @@ -1808,6 +1813,9 @@ namespace span_t s = b.span(); CHECK_EQUAL(0x12345678UL, s[0]); + + s[0] = 0x87654321UL; + CHECK_EQUAL(0x87654321UL, b.value()); } //************************************************************************* diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index 7cd47788..d62d5c42 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -37,6 +37,7 @@ SOFTWARE. #include "etl/wstring.h" #include "etl/u16string.h" #include "etl/u32string.h" +#include "etl/endianness.h" namespace { @@ -44,729 +45,6 @@ namespace SUITE(test_bitset_new_ext_default_element_type) { - //************************************************************************* - TEST(test_default_constructor) - { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare; - etl::bitset_ext<60> data(buffer); - - CHECK_EQUAL(compare.size(), data.size()); - CHECK_EQUAL(compare.count(), data.count()); - - for (size_t i = 0UL; i < data.size(); ++i) - { - CHECK_EQUAL(compare.test(i), data.test(i)); - } - } - - //************************************************************************* - TEST(test_default_constructor_multi_element) - { - etl::bitset_ext<14, int8_t>::buffer_type buffer14; - etl::bitset_ext<30, int16_t>::buffer_type buffer30; - etl::bitset_ext<62, int32_t>::buffer_type buffer62; - - etl::bitset_ext<14, int8_t> data8(buffer14); - etl::bitset_ext<30, int16_t> data16(buffer30); - etl::bitset_ext<62, int32_t> data32(buffer62); - - CHECK_EQUAL(2U, data8.Number_Of_Elements); - CHECK_EQUAL(2U, data16.Number_Of_Elements); - CHECK_EQUAL(2U, data32.Number_Of_Elements); - } - - //************************************************************************* - TEST(test_default_constructor_default_element_type_bits) - { - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - CHECK_EQUAL(8U, etl::integral_limits::element_type>::bits); - } - - //************************************************************************* - TEST(test_default_constructor_default_element_type_number_of_elements) - { - CHECK_EQUAL(1U, etl::bitset_ext<1>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset_ext<2>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset_ext<3>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset_ext<4>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset_ext<5>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset_ext<6>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset_ext<7>::Number_Of_Elements); - CHECK_EQUAL(1U, etl::bitset_ext<8>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<9>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<10>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<11>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<12>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<13>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<14>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<15>::Number_Of_Elements); - CHECK_EQUAL(2U, etl::bitset_ext<16>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<17>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<18>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<19>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<20>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<21>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<22>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<23>::Number_Of_Elements); - CHECK_EQUAL(3U, etl::bitset_ext<24>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<25>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<26>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<27>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<28>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<29>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<30>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<31>::Number_Of_Elements); - CHECK_EQUAL(4U, etl::bitset_ext<32>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<33>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<34>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<35>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<36>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<37>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<38>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<39>::Number_Of_Elements); - CHECK_EQUAL(5U, etl::bitset_ext<40>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<41>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<42>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<43>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<44>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<45>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<46>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<47>::Number_Of_Elements); - CHECK_EQUAL(6U, etl::bitset_ext<48>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<49>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<50>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<51>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<52>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<53>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<54>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<55>::Number_Of_Elements); - CHECK_EQUAL(7U, etl::bitset_ext<56>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<57>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<58>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<59>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<60>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<61>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<62>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<63>::Number_Of_Elements); - CHECK_EQUAL(8U, etl::bitset_ext<64>::Number_Of_Elements); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int8_t_element_types_bits) - { - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(8U, (etl::integral_limits::element_type>::bits)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int8_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset_ext<1, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<2, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<3, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<4, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<5, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<6, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<7, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<8, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<9, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<10, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<11, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<12, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<13, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<14, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<15, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<16, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<17, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<18, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<19, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<20, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<21, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<22, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<23, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<24, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<25, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<26, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<27, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<28, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<29, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<30, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<31, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<32, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<33, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<34, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<35, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<36, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<37, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<38, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<39, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(5U, (etl::bitset_ext<40, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<41, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<42, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<43, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<44, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<45, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<46, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<47, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(6U, (etl::bitset_ext<48, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<49, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<50, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<51, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<52, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<53, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<54, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<55, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(7U, (etl::bitset_ext<56, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<57, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<58, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<59, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<60, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<61, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<62, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<63, int8_t>::Number_Of_Elements)); - CHECK_EQUAL(8U, (etl::bitset_ext<64, int8_t>::Number_Of_Elements)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int16_t_element_types_bits) - { - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(16U, (etl::integral_limits::element_type>::bits)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int16_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset_ext<1, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<2, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<3, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<4, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<5, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<6, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<7, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<8, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<9, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<10, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<11, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<12, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<13, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<14, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<15, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<16, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<17, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<18, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<19, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<20, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<21, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<22, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<23, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<24, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<25, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<26, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<27, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<28, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<29, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<30, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<31, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<32, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<33, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<34, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<35, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<36, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<37, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<38, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<39, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<40, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<41, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<42, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<43, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<44, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<45, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<46, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<47, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(3U, (etl::bitset_ext<48, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<49, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<50, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<51, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<52, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<53, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<54, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<55, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<56, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<57, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<58, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<59, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<60, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<61, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<62, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<63, int16_t>::Number_Of_Elements)); - CHECK_EQUAL(4U, (etl::bitset_ext<64, int16_t>::Number_Of_Elements)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int32_t_element_types_bits) - { - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(32U, (etl::integral_limits::element_type>::bits)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int32_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset_ext<1, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<2, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<3, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<4, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<5, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<6, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<7, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<8, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<9, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<10, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<11, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<12, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<13, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<14, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<15, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<16, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<17, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<18, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<19, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<20, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<21, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<22, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<23, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<24, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<25, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<26, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<27, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<28, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<29, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<30, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<31, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<32, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<33, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<34, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<35, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<36, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<37, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<38, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<39, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<40, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<41, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<42, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<43, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<44, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<45, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<46, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<47, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<48, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<49, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<50, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<51, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<52, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<53, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<54, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<55, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<56, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<57, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<58, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<59, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<60, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<61, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<62, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<63, int32_t>::Number_Of_Elements)); - CHECK_EQUAL(2U, (etl::bitset_ext<64, int32_t>::Number_Of_Elements)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int64_t_element_types_bits) - { - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - CHECK_EQUAL(64U, (etl::integral_limits::element_type>::bits)); - } - - //************************************************************************* - TEST(test_default_constructor_explicit_int64_t_element_types_number_of_elements) - { - CHECK_EQUAL(1U, (etl::bitset_ext<1, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<2, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<3, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<4, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<5, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<6, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<7, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<8, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<9, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<10, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<11, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<12, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<13, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<14, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<15, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<16, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<17, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<18, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<19, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<20, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<21, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<22, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<23, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<24, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<25, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<26, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<27, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<28, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<29, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<30, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<31, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<32, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<33, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<34, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<35, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<36, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<37, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<38, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<39, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<40, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<41, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<42, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<43, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<44, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<45, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<46, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<47, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<48, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<49, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<50, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<51, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<52, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<53, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<54, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<55, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<56, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<57, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<58, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<59, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<60, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<61, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<62, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<63, int64_t>::Number_Of_Elements)); - CHECK_EQUAL(1U, (etl::bitset_ext<64, int64_t>::Number_Of_Elements)); - } - //************************************************************************* TEST(test_construct_from_nullptr_buffer) { @@ -777,23 +55,55 @@ namespace CHECK_THROW(BsExt bs1(nullptr), etl::bitset_invalid_buffer); CHECK_THROW(BsExt bs2b(bs2a, nullptr), etl::bitset_invalid_buffer); - CHECK_THROW(BsExt bs3(0ULL, nullptr), etl::bitset_invalid_buffer); - CHECK_THROW(BsExt bs4("0", nullptr), etl::bitset_invalid_buffer); - CHECK_THROW(BsExt bs5(L"0", nullptr), etl::bitset_invalid_buffer); - CHECK_THROW(BsExt bs6(u"0", nullptr), etl::bitset_invalid_buffer); - CHECK_THROW(BsExt bs7(U"0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs3(0ULL, nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs4("0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs5(L"0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs6(u"0", nullptr), etl::bitset_invalid_buffer); + CHECK_THROW(BsExt bs7(U"0", nullptr), etl::bitset_invalid_buffer); + } + + //************************************************************************* + TEST(test_default_constructor_from_array) + { + etl::bitset_ext<64>::element_type buffer[etl::bitset_ext<64>::Number_Of_Elements]; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); + + CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.count(), data.count()); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_default_constructor_from_buffer_type) + { + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); + + CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.count(), data.count()); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } } //************************************************************************* TEST(test_construct_from_value) { - etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<64>::buffer_type buffer1; + std::bitset<64> compare(0x123456731234567ULL); + etl::bitset_ext<64> data(0x123456731234567ULL, buffer1); - std::bitset<60> compare(0x123456731234567ULL); - etl::bitset_ext<60> data(0x123456731234567ULL, buffer); - - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); + CHECK_EQUAL_HEX(compare.to_ullong(), data.to_ullong()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -804,12 +114,11 @@ namespace //************************************************************************* TEST(test_copy_construct) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - - std::bitset<60> compare(0x123456731234567ULL); - etl::bitset_ext<60> data(0x123456731234567ULL, buffer1); - etl::bitset_ext<60> data_copy(data, buffer2); + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + std::bitset<64> compare(0x123456731234567ULL); + etl::bitset_ext<64> data(0x123456731234567ULL, buffer1); + etl::bitset_ext<64> data_copy(data, buffer2); CHECK_EQUAL(compare.size(), data_copy.size()); CHECK_EQUAL(compare.count(), data_copy.count()); @@ -823,12 +132,11 @@ namespace //************************************************************************* TEST(test_construct_from_excess_value) { - etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(0x8765432187654321ULL); + etl::bitset_ext<64> data(0x8765432187654321ULL, buffer); - std::bitset<60> compare(0x8765432187654321ULL); - etl::bitset_ext<60> data(0x8765432187654321ULL, buffer); - - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -840,12 +148,11 @@ namespace //************************************************************************* TEST(test_construct_from_char_string) { - etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data("110001001000110100010101100111001100010010001101000101011001", buffer); - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data("110001001000110100010101100111001100010010001101000101011001", buffer); - - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); for (size_t i = 0UL; i < data.size(); ++i) @@ -857,10 +164,9 @@ namespace //************************************************************************* TEST(test_construct_from_wchar_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(L"110001001000110100010101100111001100010010001101000101011001", buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(L"110001001000110100010101100111001100010010001101000101011001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -874,10 +180,9 @@ namespace //************************************************************************* TEST(test_construct_from_char16_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(u"110001001000110100010101100111001100010010001101000101011001", buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(u"110001001000110100010101100111001100010010001101000101011001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -891,10 +196,9 @@ namespace //************************************************************************* TEST(test_construct_from_char32_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(U"110001001000110100010101100111001100010010001101000101011001", buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(U"110001001000110100010101100111001100010010001101000101011001", buffer); CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); @@ -908,10 +212,9 @@ namespace //************************************************************************* TEST(test_construct_from_nullptr_char_string) { - etl::bitset_ext<60>::buffer_type buffer; - const char* s = nullptr; + etl::bitset_ext<60>::buffer_type buffer; etl::bitset_ext<60> data(s, buffer); CHECK_EQUAL(60, data.size()); @@ -921,10 +224,9 @@ namespace //************************************************************************* TEST(test_construct_from_nullptr_wchar_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - const wchar_t* s = nullptr; + etl::bitset_ext<60>::buffer_type buffer; etl::bitset_ext<60> data(s, buffer); CHECK_EQUAL(60, data.size()); @@ -934,10 +236,9 @@ namespace //************************************************************************* TEST(test_construct_from_nullptr_char16_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - const char16_t* s = nullptr; + etl::bitset_ext<60>::buffer_type buffer; etl::bitset_ext<60> data(s, buffer); CHECK_EQUAL(60, data.size()); @@ -947,10 +248,9 @@ namespace //************************************************************************* TEST(test_construct_from_nullptr_char32_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - const char32_t* s = nullptr; + etl::bitset_ext<60>::buffer_type buffer; etl::bitset_ext<60> data(s, buffer); CHECK_EQUAL(60, data.size()); @@ -960,16 +260,17 @@ namespace //************************************************************************* TEST(test_construct_from_excess_string) { - etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001111100001"); + etl::bitset_ext<64> data("110001001000110100010101100111001100010010001101000101011001111100001", buffer); - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001111100001"); - etl::bitset_ext<60> data("110001001000110100010101100111001100010010001101000101011001111100001", buffer); - - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); + + CHECK_EQUAL_HEX(compare.to_ullong(), data.to_ullong()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -977,22 +278,55 @@ namespace } } - //************************************************************************* + //************************************************************************* TEST(test_set) { - etl::bitset_ext<60>::buffer_type buffer; + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); + compare.set(); + data.set(); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_less_than_full_size) + { + etl::bitset_ext<60>::buffer_type buffer; std::bitset<60> compare; etl::bitset_ext<60> data(buffer); compare.set(); data.set(); - CHECK_EQUAL(compare.size(), data.size()); - CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1003,18 +337,17 @@ namespace //************************************************************************* TEST(test_set_with_char_string) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.set("110001001000110100010101100111001100010010001101000101011001"); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1025,10 +358,9 @@ namespace //************************************************************************* TEST(test_set_with_wchar_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(L"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(L"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.set(L"110001001000110100010101100111001100010010001101000101011001"); @@ -1047,10 +379,9 @@ namespace //************************************************************************* TEST(test_set_with_char16_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(u"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(u"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.set(u"110001001000110100010101100111001100010010001101000101011001"); @@ -1069,10 +400,9 @@ namespace //************************************************************************* TEST(test_set_with_char32_t_string) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(U"110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(U"110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.set(U"110001001000110100010101100111001100010010001101000101011001"); @@ -1093,11 +423,11 @@ namespace { const char* s = nullptr; - etl::bitset_ext<60>::buffer_type buffer; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); data.set(s); - CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(64, data.size()); CHECK_EQUAL(0, data.count()); } @@ -1106,11 +436,11 @@ namespace { const wchar_t* s = nullptr; - etl::bitset_ext<60>::buffer_type buffer; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); data.set(s); - CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(64, data.size()); CHECK_EQUAL(0, data.count()); } @@ -1119,11 +449,11 @@ namespace { const char16_t* s = nullptr; - etl::bitset_ext<60>::buffer_type buffer; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); data.set(s); - CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(64, data.size()); CHECK_EQUAL(0, data.count()); } @@ -1132,21 +462,20 @@ namespace { const char32_t* s = nullptr; - etl::bitset_ext<60>::buffer_type buffer; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); data.set(s); - CHECK_EQUAL(60, data.size()); + CHECK_EQUAL(64, data.size()); CHECK_EQUAL(0, data.count()); } //************************************************************************* TEST(test_from_string_with_char) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.from_string("110001001000110100010101100111001100010010001101000101011001"); @@ -1165,10 +494,9 @@ namespace //************************************************************************* TEST(test_from_string_with_wchar_t) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.from_string(L"110001001000110100010101100111001100010010001101000101011001"); @@ -1185,12 +513,11 @@ namespace } //************************************************************************* - TEST(test_from_char16_t_6string) + TEST(test_from_string_with_char16_t) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.from_string(u"110001001000110100010101100111001100010010001101000101011001"); @@ -1209,10 +536,9 @@ namespace //************************************************************************* TEST(test_from_string_with_char32_t) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare("110001001000110100010101100111001100010010001101000101011001"); - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare("110001001000110100010101100111001100010010001101000101011001"); + etl::bitset_ext<64> data(buffer); data.from_string(U"110001001000110100010101100111001100010010001101000101011001"); @@ -1280,11 +606,50 @@ namespace CHECK_EQUAL(0, data.count()); } + //************************************************************************* + TEST(test_value_u8_min) + { + etl::bitset_ext<8>::buffer_type buffer; + etl::bitset_ext<8> data((unsigned long long)etl::integral_limits::min, buffer); + uint8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_value_u8_max) + { + etl::bitset_ext<8>::buffer_type buffer; + etl::bitset_ext<8> data((unsigned long long)etl::integral_limits::max, buffer); + uint8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + + //************************************************************************* + TEST(test_value_s8_min) + { + etl::bitset_ext<8>::buffer_type buffer; + etl::bitset_ext<8> data((unsigned long long)etl::integral_limits::min, buffer); + uint8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::min(), value); + } + + //************************************************************************* + TEST(test_value_s8_max) + { + etl::bitset_ext<8>::buffer_type buffer; + etl::bitset_ext<8> data((unsigned long long)etl::integral_limits::max, buffer); + uint8_t value = data.value(); + + CHECK_EQUAL(std::numeric_limits::max(), value); + } + //************************************************************************* TEST(test_value_u16_min) { etl::bitset_ext<16>::buffer_type buffer; - etl::bitset_ext<16> data((unsigned long long)etl::integral_limits::min, buffer); uint16_t value = data.value(); @@ -1295,7 +660,6 @@ namespace TEST(test_value_u16_max) { etl::bitset_ext<16>::buffer_type buffer; - etl::bitset_ext<16> data((unsigned long long)etl::integral_limits::max, buffer); uint16_t value = data.value(); @@ -1306,29 +670,26 @@ namespace TEST(test_value_s16_min) { etl::bitset_ext<16>::buffer_type buffer; + etl::bitset_ext<16> data((unsigned long long)etl::integral_limits::min, buffer); + uint16_t value = data.value(); - etl::bitset_ext<16> data((unsigned long long)etl::integral_limits::min, buffer); - int16_t value = data.value(); - - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_s16_max) { etl::bitset_ext<16>::buffer_type buffer; + etl::bitset_ext<16> data((unsigned long long)etl::integral_limits::max, buffer); + uint16_t value = data.value(); - etl::bitset_ext<16> data((unsigned long long)etl::integral_limits::max, buffer); - int16_t value = data.value(); - - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_u32_min) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; - + etl::bitset_ext<32>::buffer_type buffer; etl::bitset_ext<32> data((unsigned long long)etl::integral_limits::min, buffer); uint32_t value = data.value(); @@ -1338,8 +699,7 @@ namespace //************************************************************************* TEST(test_value_u32_max) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; - + etl::bitset_ext<32>::buffer_type buffer; etl::bitset_ext<32> data((unsigned long long)etl::integral_limits::max, buffer); uint32_t value = data.value(); @@ -1349,30 +709,27 @@ namespace //************************************************************************* TEST(test_value_s32_min) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + etl::bitset_ext<32>::buffer_type buffer; + etl::bitset_ext<32> data((unsigned long long)etl::integral_limits::min, buffer); + uint32_t value = data.value(); - etl::bitset_ext<32> data((unsigned long long)etl::integral_limits::min, buffer); - int32_t value = data.value(); - - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_s32_max) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + etl::bitset_ext<32>::buffer_type buffer; + etl::bitset_ext<32> data((unsigned long long)etl::integral_limits::max, buffer); + uint32_t value = data.value(); - etl::bitset_ext<32> data((unsigned long long)etl::integral_limits::max, buffer); - int32_t value = data.value(); - - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_value_u64_min) { - etl::bitset_ext<64>::element_type buffer[etl::bitset_ext<64>::Number_Of_Elements]; - + etl::bitset_ext<64>::buffer_type buffer; etl::bitset_ext<64> data((unsigned long long)etl::integral_limits::min, buffer); uint64_t value = data.value(); @@ -1382,8 +739,7 @@ namespace //************************************************************************* TEST(test_value_u64_max) { - etl::bitset_ext<64>::element_type buffer[etl::bitset_ext<64>::Number_Of_Elements]; - + etl::bitset_ext<64>::buffer_type buffer; etl::bitset_ext<64> data((unsigned long long)etl::integral_limits::max, buffer); uint64_t value = data.value(); @@ -1393,32 +749,29 @@ namespace //************************************************************************* TEST(test_value_s64_min) { - etl::bitset_ext<64>::element_type buffer[etl::bitset_ext<64>::Number_Of_Elements]; + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data((unsigned long long)etl::integral_limits::min, buffer); + uint64_t value = data.value(); - etl::bitset_ext<64> data((unsigned long long)etl::integral_limits::min, buffer); - int64_t value = data.value(); - - CHECK_EQUAL(std::numeric_limits::min(), value); + CHECK_EQUAL(std::numeric_limits::min(), value); } //************************************************************************* TEST(test_value_s64_max) { - etl::bitset_ext<64>::element_type buffer[etl::bitset_ext<64>::Number_Of_Elements]; + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data((unsigned long long)etl::integral_limits::max, buffer); + uint64_t value = data.value(); - etl::bitset_ext<64> data((unsigned long long)etl::integral_limits::max, buffer); - int64_t value = data.value(); - - CHECK_EQUAL(std::numeric_limits::max(), value); + CHECK_EQUAL(std::numeric_limits::max(), value); } //************************************************************************* TEST(test_position_set) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1450,19 +803,18 @@ namespace //************************************************************************* TEST(test_reset) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset_ext<60> data(0xFFFFFFFFFFFFFFFULL, buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); + etl::bitset_ext<64> data(0xFFFFFFFFFFFFFFFULL, buffer); compare.reset(); data.reset(); - - CHECK_EQUAL(compare.size(), data.size()); + + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1473,10 +825,9 @@ namespace //************************************************************************* TEST(test_position_reset) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset_ext<60> data(0xFFFFFFFFFFFFFFFULL, buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); + etl::bitset_ext<64> data(0xFFFFFFFFFFFFFFFULL, buffer); compare.reset(1); compare.reset(3); @@ -1488,11 +839,11 @@ namespace data.reset(7); data.reset(13); - CHECK_EQUAL(compare.size(), data.size()); + CHECK_EQUAL(compare.size(), data.size()); CHECK_EQUAL(compare.count(), data.count()); - CHECK_EQUAL(compare.none(), data.none()); - CHECK_EQUAL(compare.any(), data.any()); - CHECK_EQUAL(compare.all(), data.all()); + CHECK_EQUAL(compare.none(), data.none()); + CHECK_EQUAL(compare.any(), data.any()); + CHECK_EQUAL(compare.all(), data.all()); for (size_t i = 0UL; i < data.size(); ++i) { @@ -1530,10 +881,9 @@ namespace //************************************************************************* TEST(test_index_operator_read) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare(0x3123456731234567ULL); - etl::bitset_ext<60> data(0x3123456731234567ULL, buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare(0x3123456731234567ULL); + etl::bitset_ext<64> data(0x3123456731234567ULL, buffer); bool bc0 = compare[1U]; bool bd0 = data[1U]; @@ -1555,8 +905,8 @@ namespace //************************************************************************* TEST(test_index_operator_write) { - etl::bitset_ext<60>::buffer_type buffer; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); data[1U] = true; data[3U] = true; @@ -1572,15 +922,14 @@ namespace //************************************************************************* TEST(test_any) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer3; - etl::bitset_ext<60>::buffer_type buffer4; - - etl::bitset_ext<60> data1(ull(0x0000000000000000), buffer1); - etl::bitset_ext<60> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<60> data3(ull(0x0000010001000100), buffer3); - etl::bitset_ext<60> data4(ull(0x0FFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; + etl::bitset_ext<64> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<64> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); bool bd1 = data1.any(); bool bd2 = data2.any(); @@ -1596,15 +945,14 @@ namespace //************************************************************************* TEST(test_none) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer3; - etl::bitset_ext<60>::buffer_type buffer4; - - etl::bitset_ext<60> data1(ull(0x0000000000000000), buffer1); - etl::bitset_ext<60> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<60> data3(ull(0x0000010001000100), buffer3); - etl::bitset_ext<60> data4(ull(0x0FFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; + etl::bitset_ext<64> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<64> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); bool bd1 = data1.none(); bool bd2 = data2.none(); @@ -1619,16 +967,84 @@ namespace //************************************************************************* TEST(test_all) + { + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; + etl::bitset_ext<64> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<64> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<64> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<64> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + bool bd1 = data1.all(); + bool bd2 = data2.all(); + bool bd3 = data3.all(); + bool bd4 = data4.all(); + + CHECK_FALSE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_any_with_reduced_active_bits) { etl::bitset_ext<60>::buffer_type buffer1; etl::bitset_ext<60>::buffer_type buffer2; etl::bitset_ext<60>::buffer_type buffer3; etl::bitset_ext<60>::buffer_type buffer4; - etl::bitset_ext<60> data1(ull(0x0000000000000000), buffer1); etl::bitset_ext<60> data2(ull(0x0000010000000000), buffer2); - etl::bitset_ext<60> data3(ull(0x0000010001000100), buffer3); - etl::bitset_ext<60> data4(ull(0x0FFFFFFFFFFFFFFF), buffer4); + etl::bitset_ext<60> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + bool bd1 = data1.any(); + bool bd2 = data2.any(); + bool bd3 = data3.any(); + bool bd4 = data4.any(); + + CHECK_FALSE(bd1); + CHECK_TRUE(bd2); + CHECK_TRUE(bd3); + CHECK_TRUE(bd4); + } + + //************************************************************************* + TEST(test_none_with_reduced_active_bits) + { + etl::bitset_ext<60>::buffer_type buffer1; + etl::bitset_ext<60>::buffer_type buffer2; + etl::bitset_ext<60>::buffer_type buffer3; + etl::bitset_ext<60>::buffer_type buffer4; + etl::bitset_ext<60> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); + + bool bd1 = data1.none(); + bool bd2 = data2.none(); + bool bd3 = data3.none(); + bool bd4 = data4.none(); + + CHECK_TRUE(bd1); + CHECK_FALSE(bd2); + CHECK_FALSE(bd3); + CHECK_FALSE(bd4); + } + + //************************************************************************* + TEST(test_all_with_reduced_active_bits) + { + etl::bitset_ext<60>::buffer_type buffer1; + etl::bitset_ext<60>::buffer_type buffer2; + etl::bitset_ext<60>::buffer_type buffer3; + etl::bitset_ext<60>::buffer_type buffer4; + etl::bitset_ext<60> data1(ull(0x0000000000000000), buffer1); + etl::bitset_ext<60> data2(ull(0x0000010000000000), buffer2); + etl::bitset_ext<60> data3(ull(0x1000010001000100), buffer3); + etl::bitset_ext<60> data4(ull(0xFFFFFFFFFFFFFFFF), buffer4); bool bd1 = data1.all(); bool bd2 = data2.all(); @@ -1644,9 +1060,9 @@ namespace //************************************************************************* TEST(test_flip) { - etl::bitset_ext<60>::buffer_type buffer; - std::bitset<60> compare; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); compare.flip(); data.flip(); @@ -1657,12 +1073,12 @@ namespace } } - //************************************************************************* + //************************************************************************* TEST(test_flip_position) { - etl::bitset_ext<60>::buffer_type buffer; - std::bitset<60> compare; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); compare.flip(1); compare.flip(3); @@ -1683,9 +1099,9 @@ namespace //************************************************************************* TEST(test_flip_reference) { - etl::bitset_ext<60>::buffer_type buffer; - std::bitset<60> compare; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); compare[1].flip(); compare[3].flip(); @@ -1706,10 +1122,9 @@ namespace //************************************************************************* TEST(test_invert_reference) { - etl::bitset_ext<60>::buffer_type buffer; - - std::bitset<60> compare; - etl::bitset_ext<60> data(buffer); + etl::bitset_ext<64>::buffer_type buffer; + std::bitset<64> compare; + etl::bitset_ext<64> data(buffer); bool bc = ~compare[3]; bool bd = ~data[3]; @@ -1717,19 +1132,18 @@ namespace } //************************************************************************* - void test_assignment_operator_helper(etl::bitset_ext<60>& from, etl::bitset_ext<60>& to) + void test_assignment_operator_helper(etl::bitset_ext<64>&from, etl::bitset_ext<64>&to) { to = from; } TEST(test_assignment_operator) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - - std::bitset<60> compare(0xFFFFFFFFFFFFFFFULL); - etl::bitset_ext<60> data1(0xFFFFFFFFFFFFFFFULL, buffer1); - etl::bitset_ext<60> data2(buffer2); + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + std::bitset<64> compare(0xFFFFFFFFFFFFFFFULL); + etl::bitset_ext<64> data1(0xFFFFFFFFFFFFFFFULL, buffer1); + etl::bitset_ext<64> data2(buffer2); test_assignment_operator_helper(data1, data2); @@ -1742,15 +1156,14 @@ namespace //************************************************************************* TEST(test_equality_operator) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64> data1(0x123456781234567ULL, buffer1); + etl::bitset_ext<64> data2(0x123456781234567ULL, buffer2); + etl::bitset_ext<64> data3(buffer3); - etl::bitset_ext<60> data1(0x123456781234567ULL, buffer1); - etl::bitset_ext<60> data2(0x123456781234567ULL, buffer2); - etl::bitset_ext<60> data3(buffer3); - - bool equal = (data1 == data2); + bool equal = (data1 == data2); bool not_equal = !(data1 == data3); CHECK(equal); @@ -1760,13 +1173,12 @@ namespace //************************************************************************* TEST(test_inequality_operator) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer3; - - etl::bitset_ext<60> data1(0x123456781234567ULL, buffer1); - etl::bitset_ext<60> data2(0x123456781234567ULL, buffer2); - etl::bitset_ext<60> data3(buffer3); + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64> data1(0x123456781234567ULL, buffer1); + etl::bitset_ext<64> data2(0x123456781234567ULL, buffer2); + etl::bitset_ext<64> data3(buffer3); bool equal = !(data1 != data2); bool not_equal = (data1 != data3); @@ -1776,9 +1188,9 @@ namespace } //************************************************************************* - TEST(test_shift_left_operator_all_shifts_full_size) + TEST(test_shift_left_operator) { - int64_t value = 0x0123456789ABCDEFULL; + uint64_t value = 0x0123456789ABCDEFULL; uint64_t mask = 0xFFFFFFFFFFFFFFFFULL; etl::bitset_ext<64>::buffer_type buffer1; @@ -1789,40 +1201,31 @@ namespace for (ull shift = 0U; shift < 64U; ++shift) { etl::bitset_ext<64> data(original, buffer2); - CHECK_EQUAL_HEX(((value & mask) << shift), (data <<= shift).value()); + CHECK_EQUAL_HEX(((value & mask) << shift), (data <<= shift).value()); mask >>= 1; } etl::bitset_ext<64> data(original, buffer2); - CHECK_EQUAL_HEX(0ULL, (data <<= 64U).value()); + CHECK_EQUAL_HEX(0ULL, (data <<= 64U).value()); } //************************************************************************* - TEST(test_shift_left_operator_all_shifts_partial_size) + TEST(test_shift_left_operator_overflow) { - int64_t value = 0x0123456789ABCDEFULL; - uint64_t mask = 0x0FFFFFFFFFFFFFFFULL; + etl::bitset_ext<32>::buffer_type buffer1; + etl::bitset_ext<32>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; + etl::bitset_ext<32> data(0xFFFFFFFFULL, buffer1); + data <<= 1U; + etl::bitset_ext<32> shifted(0xFFFFFFFEUL, buffer2); - etl::bitset_ext<60> original(0x0123456789ABCDEFULL, buffer1); - - for (ull shift = 0U; shift < 64U; ++shift) - { - etl::bitset_ext<60> data(original, buffer2); - CHECK_EQUAL_HEX(((value & mask) << shift), (data <<= shift).value()); - mask >>= 1; - } - - etl::bitset_ext<60> data(original, buffer2); - CHECK_EQUAL_HEX(0ULL, (data <<= 64U).value()); + CHECK_EQUAL_HEX(shifted.value(), data.value()); } //************************************************************************* - TEST(test_shift_right_operator_all_shifts_full_size) + TEST(test_shift_right_operator) { - int64_t value = 0x0123456789ABCDEFULL; + uint64_t value = 0x0123456789ABCDEFULL; etl::bitset_ext<64>::buffer_type buffer1; etl::bitset_ext<64>::buffer_type buffer2; @@ -1832,46 +1235,26 @@ namespace for (ull shift = 0U; shift < 64U; ++shift) { etl::bitset_ext<64> data(original, buffer2); - CHECK_EQUAL_HEX((value >> shift), (data >>= shift).value()); + CHECK_EQUAL_HEX((value >> shift), (data >>= shift).value()); } etl::bitset_ext<64> data(original, buffer2); - CHECK_EQUAL_HEX(0ULL, (data >>= 64U).value()); - } - - //************************************************************************* - TEST(test_shift_right_operator_all_shifts_partial_size) - { - int64_t value = 0x0123456789ABCDEFULL; - - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - - etl::bitset_ext<60> original(0x0123456789ABCDEFULL, buffer1); - - for (ull shift = 0U; shift < 64U; ++shift) - { - etl::bitset_ext<60> data(original, buffer2); - CHECK_EQUAL_HEX((value >> shift), (data >>= shift).value()); - } - - etl::bitset_ext<60> data(original, buffer2); - CHECK_EQUAL_HEX(0ULL, (data >>= 64U).value()); + CHECK_EQUAL_HEX(0ULL, (data >>= 64U).value()); } //************************************************************************* TEST(test_and_equals_operator) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer3; - etl::bitset_ext<60>::buffer_type buffer4; + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; - etl::bitset_ext<60> data1(0x12345678UL, buffer1); - etl::bitset_ext<60> data2(0x23456789UL, buffer2); - etl::bitset_ext<60> data3(0x12345678UL & 0x23456789UL, buffer3); - - etl::bitset_ext<60> data4(data1, buffer4); + etl::bitset_ext<64> data1(0x12345678UL, buffer1); + etl::bitset_ext<64> data2(0x23456789UL, buffer2); + etl::bitset_ext<64> data3(0x12345678UL & 0x23456789UL, buffer3); + + etl::bitset_ext<64> data4(data1, buffer4); data4 &= data2; CHECK(data3 == data4); } @@ -1879,16 +1262,16 @@ namespace //************************************************************************* TEST(test_or_equals_operator) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer3; - etl::bitset_ext<60>::buffer_type buffer4; + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; - etl::bitset_ext<60> data1(0x12345678UL, buffer1); - etl::bitset_ext<60> data2(0x23456789UL, buffer2); - etl::bitset_ext<60> data3(0x12345678UL | 0x23456789UL, buffer3); + etl::bitset_ext<64> data1(0x12345678UL, buffer1); + etl::bitset_ext<64> data2(0x23456789UL, buffer2); + etl::bitset_ext<64> data3(0x12345678UL | 0x23456789UL, buffer3); - etl::bitset_ext<60> data4(data1, buffer4); + etl::bitset_ext<64> data4(data1, buffer4); data4 |= data2; CHECK(data3 == data4); } @@ -1896,16 +1279,16 @@ namespace //************************************************************************* TEST(test_xor_equals_operator) { - etl::bitset_ext<60>::buffer_type buffer1; - etl::bitset_ext<60>::buffer_type buffer2; - etl::bitset_ext<60>::buffer_type buffer3; - etl::bitset_ext<60>::buffer_type buffer4; + etl::bitset_ext<64>::buffer_type buffer1; + etl::bitset_ext<64>::buffer_type buffer2; + etl::bitset_ext<64>::buffer_type buffer3; + etl::bitset_ext<64>::buffer_type buffer4; - etl::bitset_ext<60> data1(0x12345678UL, buffer1); - etl::bitset_ext<60> data2(0x23456789UL, buffer2); - etl::bitset_ext<60> data3(0x12345678UL ^ 0x23456789UL, buffer3); + etl::bitset_ext<64> data1(0x12345678UL, buffer1); + etl::bitset_ext<64> data2(0x23456789UL, buffer2); + etl::bitset_ext<64> data3(0x12345678UL ^ 0x23456789UL, buffer3); - etl::bitset_ext<60> data4(data1, buffer4); + etl::bitset_ext<64> data4(data1, buffer4); data4 ^= data2; CHECK(data3 == data4); } @@ -1913,66 +1296,57 @@ namespace //************************************************************************* TEST(test_find_first) { - etl::bitset_ext<9>::element_type buffer1[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer2[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer3[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer4[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer5[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer6[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer7[etl::bitset_ext<9>::Number_Of_Elements]; + etl::bitset_ext<8>::buffer_type buffer; - etl::bitset_ext<9> bs1(ull(0x0000), buffer1); + etl::bitset_ext<8> bs1(ull(0x00), buffer); size_t bs1fff = bs1.find_first(false); size_t bs1fft = bs1.find_first(true); CHECK_EQUAL(0U, bs1fff); CHECK_EQUAL(etl::bitset_ext<>::npos, bs1fft); - etl::bitset_ext<9> bs2(ull(0x01FF), buffer2); + etl::bitset_ext<8> bs2(ull(0xFF), buffer); size_t bs2fff = bs2.find_first(false); size_t bs2fft = bs2.find_first(true); CHECK_EQUAL(etl::bitset_ext<>::npos, bs2fff); CHECK_EQUAL(0U, bs2fft); - etl::bitset_ext<9> bs3(ull(0x0001), buffer3); + etl::bitset_ext<8> bs3(ull(0x01), buffer); size_t bs3fff = bs3.find_first(false); size_t bs3fft = bs3.find_first(true); CHECK_EQUAL(1U, bs3fff); CHECK_EQUAL(0U, bs3fft); - etl::bitset_ext<9> bs4(ull(0x0020), buffer4); + etl::bitset_ext<8> bs4(ull(0x20), buffer); size_t bs4fff = bs4.find_first(false); size_t bs4fft = bs4.find_first(true); CHECK_EQUAL(0U, bs4fff); CHECK_EQUAL(5U, bs4fft); - etl::bitset_ext<9> bs5(ull(0x0021), buffer5); + etl::bitset_ext<8> bs5(ull(0x21), buffer); size_t bs5fff = bs5.find_first(false); size_t bs5fft = bs5.find_first(true); CHECK_EQUAL(1U, bs5fff); CHECK_EQUAL(0U, bs5fft); - etl::bitset_ext<9> bs6(ull(0x000E), buffer6); + etl::bitset_ext<8> bs6(ull(0x0E), buffer); size_t bs6fff = bs6.find_first(false); size_t bs6fft = bs6.find_first(true); CHECK_EQUAL(0U, bs6fff); CHECK_EQUAL(1U, bs6fft); - etl::bitset_ext<9> bs7(ull(0x31), buffer7); + etl::bitset_ext<8> bs7(ull(0x31), buffer); size_t bs7fff = bs7.find_first(false); size_t bs7fft = bs7.find_first(true); CHECK_EQUAL(1U, bs7fff); CHECK_EQUAL(0U, bs7fft); } - + //************************************************************************* TEST(test_find_next) { - etl::bitset_ext<9>::element_type buffer1[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer2[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer3[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer4[etl::bitset_ext<9>::Number_Of_Elements]; + etl::bitset_ext<8>::buffer_type buffer; - etl::bitset_ext<9> bs1(ull(0x0000), buffer1); + etl::bitset_ext<8> bs1(ull(0x00), buffer); size_t bs1fnf0 = bs1.find_next(false, 0); size_t bs1fnf1 = bs1.find_next(false, 1); size_t bs1fnt2 = bs1.find_next(true, 2); @@ -1980,7 +1354,7 @@ namespace CHECK_EQUAL(1U, bs1fnf1); CHECK_EQUAL(etl::bitset_ext<>::npos, bs1fnt2); - etl::bitset_ext<9> bs2(ull(0x1FF), buffer2); + etl::bitset_ext<8> bs2(ull(0xFF), buffer); size_t bs2fnt0 = bs2.find_next(true, 0); size_t bs2fnt1 = bs2.find_next(true, 1); size_t bs2fnf2 = bs2.find_next(false, 2); @@ -1988,7 +1362,7 @@ namespace CHECK_EQUAL(1U, bs2fnt1); CHECK_EQUAL(etl::bitset_ext<>::npos, bs2fnf2); - etl::bitset_ext<9> bs3(ull(0x000E), buffer3); + etl::bitset_ext<8> bs3(ull(0x0E), buffer); size_t bs3fnf0 = bs3.find_next(false, 0); size_t bs3fnt1 = bs3.find_next(true, 1); size_t bs3fnf2 = bs3.find_next(false, 2); @@ -1996,7 +1370,7 @@ namespace CHECK_EQUAL(1U, bs3fnt1); CHECK_EQUAL(4U, bs3fnf2); - etl::bitset_ext<9> bs4(ull(0x0031), buffer4); + etl::bitset_ext<8> bs4(ull(0x31), buffer); size_t bs4fnt0 = bs4.find_next(true, 0); size_t bs4fnf0 = bs4.find_next(false, 0); size_t bs4fnt1 = bs4.find_next(true, 1); @@ -2005,37 +1379,18 @@ namespace CHECK_EQUAL(4U, bs4fnt1); } - //************************************************************************* - TEST(test_find_next_github_issue_617) - { - etl::bitset_ext<64>::element_type buffer1[etl::bitset_ext<64>::Number_Of_Elements]; - etl::bitset_ext<64>::element_type buffer2[etl::bitset_ext<64>::Number_Of_Elements]; - - etl::bitset_ext<64> bs1(ull(0xC000000000000031), buffer1); - size_t bs1fnt1 = bs1.find_next(true, 10); - size_t bs1fnt2 = bs1.find_next(true, 59); - CHECK_EQUAL(62U, bs1fnt1); - CHECK_EQUAL(62U, bs1fnt2); - - etl::bitset_ext<64> bs2(ull(0x3FFFFFFFFFFFFFCE), buffer2); - size_t bs2fnf1 = bs2.find_next(false, 10); - size_t bs2fnf2 = bs2.find_next(false, 59); - CHECK_EQUAL(62U, bs2fnf1); - CHECK_EQUAL(62U, bs2fnf2); - } - //************************************************************************* TEST(test_swap) { - etl::bitset_ext<9>::element_type buffer1[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer2[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer3[etl::bitset_ext<9>::Number_Of_Elements]; - etl::bitset_ext<9>::element_type buffer4[etl::bitset_ext<9>::Number_Of_Elements]; + etl::bitset_ext<16>::buffer_type buffer1; + etl::bitset_ext<16>::buffer_type buffer2; + etl::bitset_ext<16>::buffer_type buffer3; + etl::bitset_ext<16>::buffer_type buffer4; - etl::bitset_ext<9> compare1(0x2A, buffer1); - etl::bitset_ext<9> compare2(0x15, buffer2); - etl::bitset_ext<9> compare1a(0x2A, buffer3); - etl::bitset_ext<9> compare2a(0x15, buffer4); + etl::bitset_ext<16> compare1(0x2A, buffer1); + etl::bitset_ext<16> compare2(0x15, buffer2); + etl::bitset_ext<16> compare1a(0x2A, buffer3); + etl::bitset_ext<16> compare2a(0x15, buffer4); swap(compare1a, compare2a); @@ -2046,55 +1401,83 @@ namespace //************************************************************************* TEST(test_span) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + using bs32 = etl::bitset_ext<32>; + using span_t = bs32::span_type; - using span_t = etl::bitset_ext<32>::span_type; + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); - etl::bitset_ext<32> data(0x12345678UL, buffer); + span_t s = b.span(); - span_t s = data.span(); - CHECK_EQUAL(0x78U, s[0]); - CHECK_EQUAL(0x56U, s[1]); - CHECK_EQUAL(0x34U, s[2]); - CHECK_EQUAL(0x12U, s[3]); + if (etl::endianness::value() == etl::endian::little) + { + CHECK_EQUAL(0x78UL, s[0]); + CHECK_EQUAL(0x56UL, s[1]); + CHECK_EQUAL(0x34UL, s[2]); + CHECK_EQUAL(0x12UL, s[3]); + } + else + { + CHECK_EQUAL(0x78UL, s[3]); + CHECK_EQUAL(0x56UL, s[2]); + CHECK_EQUAL(0x34UL, s[1]); + CHECK_EQUAL(0x12UL, s[0]); + } + + s[2] = 0x9AU; + uint32_t value = b.value(); + CHECK_EQUAL(0x129A5678UL, value); } //************************************************************************* TEST(test_const_span) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + using bs32 = etl::bitset_ext<32>; + using span_t = etl::bitset<32>::const_span_type; - using span_t = etl::bitset_ext<32>::const_span_type; - - const etl::bitset_ext<32> b(0x12345678UL, buffer); + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); span_t s = b.span(); - CHECK_EQUAL(0x78U, s[0]); - CHECK_EQUAL(0x56U, s[1]); - CHECK_EQUAL(0x34U, s[2]); - CHECK_EQUAL(0x12U, s[3]); + if (etl::endianness::value() == etl::endian::little) + { + CHECK_EQUAL(0x78UL, s[0]); + CHECK_EQUAL(0x56UL, s[1]); + CHECK_EQUAL(0x34UL, s[2]); + CHECK_EQUAL(0x12UL, s[3]); + } + else + { + CHECK_EQUAL(0x78UL, s[3]); + CHECK_EQUAL(0x56UL, s[2]); + CHECK_EQUAL(0x34UL, s[1]); + CHECK_EQUAL(0x12UL, s[0]); + } } //************************************************************************* TEST(test_to_string) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + using bs32 = etl::bitset_ext<32>; - etl::bitset_ext<32> b(0x12345678UL, buffer); + bs32::buffer_type buffer; + bs32 data(0x12345678UL, buffer); - etl::string<32> text = b.to_string('.', '*'); - std::string stdtext = b.to_string('.', '*'); + etl::string<32> text = data.to_string('.', '*'); + std::string stdtext = data.to_string('.', '*'); - CHECK_EQUAL("...*..*...**.*...*.*.**..****...", text.c_str()); - CHECK_EQUAL("...*..*...**.*...*.*.**..****...", stdtext.c_str()); + //CHECK_THROW(b.to_string>('.', '*'), etl::bitset_ext_overflow); + CHECK_EQUAL(std::string("...*..*...**.*...*.*.**..****..."), std::string(text.c_str())); + CHECK_EQUAL(std::string("...*..*...**.*...*.*.**..****..."), std::string(stdtext.c_str())); } //************************************************************************* TEST(test_to_wstring) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + using bs32 = etl::bitset_ext<32>; - etl::bitset_ext<32> b(0x12345678UL, buffer); + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); etl::wstring<32> text = b.to_string>(L'.', L'*'); std::wstring stdtext = b.to_string(L'.', L'*'); @@ -2106,9 +1489,10 @@ namespace //************************************************************************* TEST(test_to_u16string) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + using bs32 = etl::bitset_ext<32>; - etl::bitset_ext<32> b(0x12345678UL, buffer); + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); etl::u16string<32> text = b.to_string>(u'.', u'*'); std::u16string stdtext = b.to_string(u'.', u'*'); @@ -2120,9 +1504,10 @@ namespace //************************************************************************* TEST(test_to_u32string) { - etl::bitset_ext<32>::element_type buffer[etl::bitset_ext<32>::Number_Of_Elements]; + using bs32 = etl::bitset_ext<32>; - etl::bitset_ext<32> b(0x12345678UL, buffer); + bs32::buffer_type buffer; + bs32 b(0x12345678UL, buffer); etl::u32string<32> text = b.to_string>(U'.', U'*'); std::u32string stdtext = b.to_string(U'.', U'*'); @@ -2139,16 +1524,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract( 0, 6))); - CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract( 1, 6))); - CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract( 2, 6))); - CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract( 3, 6))); - CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract( 4, 6))); - CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract( 5, 6))); - CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract( 6, 6))); - CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract( 7, 6))); - CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract( 8, 6))); - CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract(0, 6))); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract(1, 6))); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract(4, 6))); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract(5, 6))); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract(7, 6))); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract(9, 6))); CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract(10, 6))); CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract(11, 6))); CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract(12, 6))); @@ -2179,16 +1564,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x38), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x27), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x33), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x0A), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x05), (b.extract())); @@ -2220,16 +1605,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract( 0, 6))); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract( 1, 6))); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract( 2, 6))); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract( 3, 6))); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract( 4, 6))); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract( 5, 6))); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract( 6, 6))); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract( 7, 6))); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract( 8, 6))); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract( 9, 6))); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract(0, 6))); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract(1, 6))); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract(2, 6))); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract(3, 6))); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract(4, 6))); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract(5, 6))); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract(6, 6))); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract(7, 6))); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract(8, 6))); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract(9, 6))); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract(10, 6))); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract(11, 6))); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract(12, 6))); @@ -2248,8 +1633,8 @@ namespace CHECK_EQUAL_HEX(int8_t(0x09), (b.extract(25, 6))); CHECK_EQUAL_HEX(int8_t(0x04), (b.extract(26, 6))); - CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); - CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); + CHECK_THROW(b.extract(26, 7), etl::bitset_overflow); + CHECK_THROW(b.extract(27, 6), etl::bitset_overflow); } //************************************************************************* @@ -2260,16 +1645,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF8), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xFC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x1E), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x0F), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xE7), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xF3), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x19), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEC), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0x16), (b.extract())); + CHECK_EQUAL_HEX(int8_t(0xEB), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x0A), (b.extract())); CHECK_EQUAL_HEX(int8_t(0x05), (b.extract())); @@ -2289,8 +1674,8 @@ namespace CHECK_EQUAL_HEX(int8_t(0x04), (b.extract())); // The lines below should static assert. - //int8_t v1 = b.extract(); - //int8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v1 = b.extract(); } //************************************************************************* @@ -2301,16 +1686,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint8_t(0x78), b.extract( 0, 8)); - CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract( 1, 8)); - CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract( 2, 8)); - CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract( 3, 8)); - CHECK_EQUAL_HEX(uint8_t(0x67), b.extract( 4, 8)); - CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract( 5, 8)); - CHECK_EQUAL_HEX(uint8_t(0x59), b.extract( 6, 8)); - CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract( 7, 8)); - CHECK_EQUAL_HEX(uint8_t(0x56), b.extract( 8, 8)); - CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract( 9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract(0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract(1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract(2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract(3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract(4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract(5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract(6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract(7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract(8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract(9, 8)); CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); @@ -2339,16 +1724,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); - CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); @@ -2378,34 +1763,34 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0x78), b.extract( 0, 8)); - CHECK_EQUAL_HEX(int8_t(0x3C), b.extract( 1, 8)); - CHECK_EQUAL_HEX(int8_t(0x9E), b.extract( 2, 8)); - CHECK_EQUAL_HEX(int8_t(0xCF), b.extract( 3, 8)); - CHECK_EQUAL_HEX(int8_t(0x67), b.extract( 4, 8)); - CHECK_EQUAL_HEX(int8_t(0xB3), b.extract( 5, 8)); - CHECK_EQUAL_HEX(int8_t(0x59), b.extract( 6, 8)); - CHECK_EQUAL_HEX(int8_t(0xAC), b.extract( 7, 8)); - CHECK_EQUAL_HEX(int8_t(0x56), b.extract( 8, 8)); - CHECK_EQUAL_HEX(int8_t(0x2B), b.extract( 9, 8)); - CHECK_EQUAL_HEX(int8_t(0x15), b.extract(10, 8)); - CHECK_EQUAL_HEX(int8_t(0x8A), b.extract(11, 8)); - CHECK_EQUAL_HEX(int8_t(0x45), b.extract(12, 8)); - CHECK_EQUAL_HEX(int8_t(0xA2), b.extract(13, 8)); - CHECK_EQUAL_HEX(int8_t(0xD1), b.extract(14, 8)); - CHECK_EQUAL_HEX(int8_t(0x68), b.extract(15, 8)); - CHECK_EQUAL_HEX(int8_t(0x34), b.extract(16, 8)); - CHECK_EQUAL_HEX(int8_t(0x1A), b.extract(17, 8)); - CHECK_EQUAL_HEX(int8_t(0x8D), b.extract(18, 8)); - CHECK_EQUAL_HEX(int8_t(0x46), b.extract(19, 8)); - CHECK_EQUAL_HEX(int8_t(0x23), b.extract(20, 8)); - CHECK_EQUAL_HEX(int8_t(0x91), b.extract(21, 8)); - CHECK_EQUAL_HEX(int8_t(0x48), b.extract(22, 8)); - CHECK_EQUAL_HEX(int8_t(0x24), b.extract(23, 8)); - CHECK_EQUAL_HEX(int8_t(0x12), b.extract(24, 8)); + CHECK_EQUAL_HEX(uint8_t(0x78), b.extract(0, 8)); + CHECK_EQUAL_HEX(uint8_t(0x3C), b.extract(1, 8)); + CHECK_EQUAL_HEX(uint8_t(0x9E), b.extract(2, 8)); + CHECK_EQUAL_HEX(uint8_t(0xCF), b.extract(3, 8)); + CHECK_EQUAL_HEX(uint8_t(0x67), b.extract(4, 8)); + CHECK_EQUAL_HEX(uint8_t(0xB3), b.extract(5, 8)); + CHECK_EQUAL_HEX(uint8_t(0x59), b.extract(6, 8)); + CHECK_EQUAL_HEX(uint8_t(0xAC), b.extract(7, 8)); + CHECK_EQUAL_HEX(uint8_t(0x56), b.extract(8, 8)); + CHECK_EQUAL_HEX(uint8_t(0x2B), b.extract(9, 8)); + CHECK_EQUAL_HEX(uint8_t(0x15), b.extract(10, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8A), b.extract(11, 8)); + CHECK_EQUAL_HEX(uint8_t(0x45), b.extract(12, 8)); + CHECK_EQUAL_HEX(uint8_t(0xA2), b.extract(13, 8)); + CHECK_EQUAL_HEX(uint8_t(0xD1), b.extract(14, 8)); + CHECK_EQUAL_HEX(uint8_t(0x68), b.extract(15, 8)); + CHECK_EQUAL_HEX(uint8_t(0x34), b.extract(16, 8)); + CHECK_EQUAL_HEX(uint8_t(0x1A), b.extract(17, 8)); + CHECK_EQUAL_HEX(uint8_t(0x8D), b.extract(18, 8)); + CHECK_EQUAL_HEX(uint8_t(0x46), b.extract(19, 8)); + CHECK_EQUAL_HEX(uint8_t(0x23), b.extract(20, 8)); + CHECK_EQUAL_HEX(uint8_t(0x91), b.extract(21, 8)); + CHECK_EQUAL_HEX(uint8_t(0x48), b.extract(22, 8)); + CHECK_EQUAL_HEX(uint8_t(0x24), b.extract(23, 8)); + CHECK_EQUAL_HEX(uint8_t(0x12), b.extract(24, 8)); - CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); - CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); + CHECK_THROW(b.extract(24, 9), etl::bitset_overflow); + CHECK_THROW(b.extract(25, 8), etl::bitset_overflow); } //************************************************************************* @@ -2416,35 +1801,35 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int8_t(0x78), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x3C), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x9E), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xCF), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x67), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xB3), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x59), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xAC), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x56), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x2B), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x15), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x8A), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x45), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xA2), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0xD1), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x68), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x34), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x1A), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x8D), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x46), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x23), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x91), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x48), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x24), (b.extract())); - CHECK_EQUAL_HEX(int8_t(0x12), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x78), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x3C), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x9E), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xCF), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x67), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xB3), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x59), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xAC), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x56), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x2B), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x15), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x45), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xA2), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0xD1), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x68), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x34), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x1A), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x8D), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x46), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x23), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x91), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x48), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x24), (b.extract())); + CHECK_EQUAL_HEX(uint8_t(0x12), (b.extract())); // The lines below should static assert. - //int8_t v1 = b.extract(); - //int8_t v2 = b.extract(); + //uint8_t v1 = b.extract(); + //uint8_t v2 = b.extract(); } //************************************************************************* @@ -2455,16 +1840,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract( 0, 13)); - CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract( 1, 13)); - CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 13)); - CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract( 3, 13)); - CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract( 4, 13)); - CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract( 5, 13)); - CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract( 6, 13)); - CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract( 7, 13)); - CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract( 8, 13)); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1678), b.extract(0, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), b.extract(1, 13)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract(2, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), b.extract(3, 13)); + CHECK_EQUAL_HEX(uint16_t(0x0567), b.extract(4, 13)); + CHECK_EQUAL_HEX(uint16_t(0x02B3), b.extract(5, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1159), b.extract(6, 13)); + CHECK_EQUAL_HEX(uint16_t(0x08AC), b.extract(7, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1456), b.extract(8, 13)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract(9, 13)); CHECK_EQUAL_HEX(uint16_t(0x0D15), b.extract(10, 13)); CHECK_EQUAL_HEX(uint16_t(0x068A), b.extract(11, 13)); CHECK_EQUAL_HEX(uint16_t(0x0345), b.extract(12, 13)); @@ -2488,16 +1873,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x0567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x02B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x08AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x0D15), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x068A), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x0345), (b.extract())); @@ -2522,16 +1907,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract( 0, 16)); - CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract( 1, 16)); - CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract( 2, 16)); - CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract( 3, 16)); - CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract( 4, 16)); - CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract( 5, 16)); - CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract( 6, 16)); - CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract( 7, 16)); - CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract( 8, 16)); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract( 9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract(0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract(1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract(2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract(3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract(4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract(5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract(6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract(7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract(8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract(9, 16)); CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); @@ -2552,16 +1937,16 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); - CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); @@ -2583,26 +1968,26 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int16_t(0x5678), b.extract( 0, 16)); - CHECK_EQUAL_HEX(int16_t(0x2B3C), b.extract( 1, 16)); - CHECK_EQUAL_HEX(int16_t(0x159E), b.extract( 2, 16)); - CHECK_EQUAL_HEX(int16_t(0x8ACF), b.extract( 3, 16)); - CHECK_EQUAL_HEX(int16_t(0x4567), b.extract( 4, 16)); - CHECK_EQUAL_HEX(int16_t(0xA2B3), b.extract( 5, 16)); - CHECK_EQUAL_HEX(int16_t(0xD159), b.extract( 6, 16)); - CHECK_EQUAL_HEX(int16_t(0x68AC), b.extract( 7, 16)); - CHECK_EQUAL_HEX(int16_t(0x3456), b.extract( 8, 16)); - CHECK_EQUAL_HEX(int16_t(0x1A2B), b.extract( 9, 16)); - CHECK_EQUAL_HEX(int16_t(0x8D15), b.extract(10, 16)); - CHECK_EQUAL_HEX(int16_t(0x468A), b.extract(11, 16)); - CHECK_EQUAL_HEX(int16_t(0x2345), b.extract(12, 16)); - CHECK_EQUAL_HEX(int16_t(0x91A2), b.extract(13, 16)); - CHECK_EQUAL_HEX(int16_t(0x48D1), b.extract(14, 16)); - CHECK_EQUAL_HEX(int16_t(0x2468), b.extract(15, 16)); - CHECK_EQUAL_HEX(int16_t(0x1234), b.extract(16, 16)); + CHECK_EQUAL_HEX(uint16_t(0x5678), b.extract(0, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), b.extract(1, 16)); + CHECK_EQUAL_HEX(uint16_t(0x159E), b.extract(2, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), b.extract(3, 16)); + CHECK_EQUAL_HEX(uint16_t(0x4567), b.extract(4, 16)); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), b.extract(5, 16)); + CHECK_EQUAL_HEX(uint16_t(0xD159), b.extract(6, 16)); + CHECK_EQUAL_HEX(uint16_t(0x68AC), b.extract(7, 16)); + CHECK_EQUAL_HEX(uint16_t(0x3456), b.extract(8, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), b.extract(9, 16)); + CHECK_EQUAL_HEX(uint16_t(0x8D15), b.extract(10, 16)); + CHECK_EQUAL_HEX(uint16_t(0x468A), b.extract(11, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2345), b.extract(12, 16)); + CHECK_EQUAL_HEX(uint16_t(0x91A2), b.extract(13, 16)); + CHECK_EQUAL_HEX(uint16_t(0x48D1), b.extract(14, 16)); + CHECK_EQUAL_HEX(uint16_t(0x2468), b.extract(15, 16)); + CHECK_EQUAL_HEX(uint16_t(0x1234), b.extract(16, 16)); - CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); - CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); + CHECK_THROW(b.extract(16, 17), etl::bitset_overflow); + CHECK_THROW(b.extract(17, 16), etl::bitset_overflow); } //************************************************************************* @@ -2613,27 +1998,27 @@ namespace bs32::buffer_type buffer; bs32 b(0x12345678UL, buffer); - CHECK_EQUAL_HEX(int16_t(0x5678), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2B3C), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x159E), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x8ACF), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x4567), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xA2B3), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0xD159), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x68AC), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x3456), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x1A2B), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x8D15), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x468A), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2345), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x91A2), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x48D1), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x2468), (b.extract())); - CHECK_EQUAL_HEX(int16_t(0x1234), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x5678), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2B3C), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x159E), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8ACF), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x4567), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xA2B3), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0xD159), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x68AC), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x3456), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1A2B), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x8D15), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x468A), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2345), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x91A2), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x48D1), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x2468), (b.extract())); + CHECK_EQUAL_HEX(uint16_t(0x1234), (b.extract())); // The lines below should static assert. - //int16_t v1 = b.extract()); - //int16_t v2 = b.extract()); + //uint16_t v1 = b.extract()); + //uint16_t v2 = b.extract()); } }; } 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 cbba1ed4..a26fa6a9 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -106,15 +106,20 @@ namespace etl::bitset_ext<32, uint32_t> data32(buffer32); etl::bitset_ext<64, uint64_t> data64(buffer64); + CHECK_EQUAL(8, data8.Size); + CHECK_EQUAL(16, data16.Size); + CHECK_EQUAL(32, data32.Size); + CHECK_EQUAL(64, data64.Size); + CHECK_EQUAL(1U, data8.Number_Of_Elements); CHECK_EQUAL(1U, data16.Number_Of_Elements); CHECK_EQUAL(1U, data32.Number_Of_Elements); CHECK_EQUAL(1U, data64.Number_Of_Elements); - CHECK_EQUAL(etl::bitset_layout::Single, data8.Element_Layout); - CHECK_EQUAL(etl::bitset_layout::Single, data16.Element_Layout); - CHECK_EQUAL(etl::bitset_layout::Single, data32.Element_Layout); - CHECK_EQUAL(etl::bitset_layout::Single, data64.Element_Layout); + CHECK_EQUAL(etl::bitset_storage_model::Single, data8.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Single, data16.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Single, data32.Storage_Model); + CHECK_EQUAL(etl::bitset_storage_model::Single, data64.Storage_Model); } //************************************************************************* @@ -1581,6 +1586,9 @@ namespace span_t s = data.span(); CHECK_EQUAL(0x12345678UL, s[0]); + + s[0] = 0x87654321UL; + CHECK_EQUAL(0x87654321UL, data.value()); } //************************************************************************* diff --git a/test/vs2022/etl.vcxproj b/test/vs2022/etl.vcxproj index 473d635c..9bf0209f 100644 --- a/test/vs2022/etl.vcxproj +++ b/test/vs2022/etl.vcxproj @@ -7288,6 +7288,7 @@ + diff --git a/test/vs2022/etl.vcxproj.filters b/test/vs2022/etl.vcxproj.filters index 5c457a21..ba98e37f 100644 --- a/test/vs2022/etl.vcxproj.filters +++ b/test/vs2022/etl.vcxproj.filters @@ -3245,9 +3245,6 @@ Tests\Maths - - Tests\Maths - Tests\Strings @@ -3284,6 +3281,12 @@ Tests\CRC + + Tests\Binary + + + Tests\Syntax Checks\Source + From 9bf8da3d26e7325ef1e0d8c9900fd1c40e6f713b Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 4 Jan 2024 00:12:36 +0000 Subject: [PATCH 026/131] Updated Arduino library files --- arduino/library-arduino.json | 2 +- arduino/library-arduino.properties | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arduino/library-arduino.json b/arduino/library-arduino.json index a79a9907..fec95d0c 100644 --- a/arduino/library-arduino.json +++ b/arduino/library-arduino.json @@ -1,5 +1,5 @@ { - "name": "Embedded Template Library - Arduino", + "name": "Embedded Template Library - ETL", "version": "20.38.10", "authors": { "name": "John Wellbelove", diff --git a/arduino/library-arduino.properties b/arduino/library-arduino.properties index 043882bb..c6a8acb8 100644 --- a/arduino/library-arduino.properties +++ b/arduino/library-arduino.properties @@ -1,7 +1,7 @@ -name=Embedded Template Library - Arduino +name=Embedded Template Library - ETL version=20.38.10 -author= John Wellbelove -maintainer=John Wellbelove +author= John Wellbelove +maintainer=John Wellbelove license=MIT sentence=ETL. A C++ template library tailored for embedded systems. paragraph= From ce7ce3bb72ea09c31d92bc66972305cbb76413f8 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 13 Jan 2024 11:44:40 +0000 Subject: [PATCH 027/131] Make binary functor operator() const --- include/etl/binary.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/etl/binary.h b/include/etl/binary.h index 37e6b00f..903d2bca 100644 --- a/include/etl/binary.h +++ b/include/etl/binary.h @@ -2286,7 +2286,7 @@ namespace etl //*********************************** ETL_NODISCARD ETL_CONSTEXPR - T operator ()(T value) ETL_NOEXCEPT + T operator ()(T value) const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); @@ -2311,7 +2311,7 @@ namespace etl //*********************************** ETL_NODISCARD ETL_CONSTEXPR - T operator ()(T value) ETL_NOEXCEPT + T operator ()(T value) const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); @@ -2340,7 +2340,7 @@ namespace etl //*********************************** ETL_NODISCARD ETL_CONSTEXPR - T operator ()(T value) ETL_NOEXCEPT + T operator ()(T value) const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); @@ -2369,7 +2369,7 @@ namespace etl //*********************************** ETL_NODISCARD ETL_CONSTEXPR - T operator ()(T value) ETL_NOEXCEPT + T operator ()(T value) const ETL_NOEXCEPT { ETL_STATIC_ASSERT(etl::is_integral::value, "Not an integral type"); From 8f6055e99bb9d6810807249fe049d4566e0ce668 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 13 Jan 2024 11:44:59 +0000 Subject: [PATCH 028/131] Removed ETL_STATIC_CONSTANT --- include/etl/platform.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/etl/platform.h b/include/etl/platform.h index 294ee7cf..360f9027 100644 --- a/include/etl/platform.h +++ b/include/etl/platform.h @@ -249,7 +249,6 @@ SOFTWARE. #define ETL_CONSTEXPR constexpr #define ETL_CONSTEXPR11 constexpr // Synonym for ETL_CONSTEXPR #define ETL_CONSTANT constexpr - #define ETL_STATIC_CONSTANT constexpr #define ETL_DELETE = delete #define ETL_EXPLICIT explicit #define ETL_OVERRIDE override @@ -271,7 +270,6 @@ SOFTWARE. #define ETL_CONSTEXPR #define ETL_CONSTEXPR11 #define ETL_CONSTANT const - #define ETL_STATIC_CONSTANT static const #define ETL_DELETE #define ETL_EXPLICIT #define ETL_OVERRIDE From 3ca624efb0bfeb365011ae1372525bec75e635cf Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 13 Jan 2024 11:45:38 +0000 Subject: [PATCH 029/131] Changed case of template constants --- include/etl/bloom_filter.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/etl/bloom_filter.h b/include/etl/bloom_filter.h index 711a151b..5d35128c 100644 --- a/include/etl/bloom_filter.h +++ b/include/etl/bloom_filter.h @@ -62,17 +62,17 @@ namespace etl /// An implementation of a bloom filter. /// Allows up to three hashes to be defined. /// Hashes must support the () operator and define 'argument_type'. - ///\tparam DESIRED_WIDTH The desired number of hash results that can be stored. Rounded up to best fit the underlying bitset. + ///\tparam Desired_Width The desired number of hash results that can be stored. Rounded up to best fit the underlying bitset. ///\tparam THash1 The first hash generator class. ///\tparam THash2 The second hash generator class. If omitted, uses the null hash. ///\tparam THash3 The third hash generator class. If omitted, uses the null hash. /// The hash classes must define argument_type. ///\ingroup bloom_filter //*************************************************************************** - template + template class bloom_filter { private: @@ -85,7 +85,7 @@ namespace etl enum { // Make the most efficient use of the bitset. - WIDTH = etl::bitset::ALLOCATED_BITS + WIDTH = etl::bitset::Allocated_Bits }; //*************************************************************************** From 3d3dad84991e531488e6782fbe63cd4567bb963a Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 13 Jan 2024 11:45:57 +0000 Subject: [PATCH 030/131] Work in progress --- include/etl/private/bitset_new.h | 616 ++++++++++++++---- test/test_bitset_new_default_element_type.cpp | 399 ++++++++++++ ...itset_new_explicit_single_element_type.cpp | 399 ++++++++++++ ...st_bitset_new_ext_default_element_type.cpp | 373 +++++++++++ ...t_new_ext_explicit_single_element_type.cpp | 373 +++++++++++ 5 files changed, 2031 insertions(+), 129 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 1f76a448..8c341eba 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -90,9 +90,18 @@ namespace etl //*************************************************************************** struct bitset_storage_model { - static ETL_CONSTANT char Undefined = 0; - static ETL_CONSTANT char Single = 1; - static ETL_CONSTANT char Multi = 2; + enum enum_type + { + Undefined = 0, + Single = 1, + Multi = 2 + }; + + ETL_DECLARE_ENUM_TYPE(bitset_storage_model, char) + ETL_ENUM_TYPE(Undefined, "Undefined") + ETL_ENUM_TYPE(Single, "Single") + ETL_ENUM_TYPE(Multi, "Multi") + ETL_END_ENUM_TYPE }; //*************************************************************************** @@ -151,6 +160,37 @@ namespace etl } }; + //*************************************************************************** + namespace private_bitset + { + template + class bitset_impl_common + { + public: + + typedef TElement element_type; + typedef TElement* pointer; + typedef const TElement* const_pointer; + + static ETL_CONSTANT size_t npos = etl::integral_limits::max; + static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; + static ETL_CONSTANT TElement All_Set_Element = etl::integral_limits::max; + static ETL_CONSTANT TElement All_Clear_Element = element_type(0); + }; + + template + ETL_CONSTANT size_t bitset_impl_common::npos; + + template + ETL_CONSTANT size_t bitset_impl_common::Bits_Per_Element; + + template + ETL_CONSTANT TElement bitset_impl_common::All_Set_Element; + + template + ETL_CONSTANT TElement bitset_impl_common::All_Clear_Element; + } + //************************************************************************* /// Bitset implementation declaration. ///\ingroup bitset @@ -163,19 +203,19 @@ namespace etl ///\ingroup bitset //************************************************************************* template - class bitset_impl + class bitset_impl : public etl::private_bitset::bitset_impl_common { public: - typedef TElement element_type; - typedef element_type* pointer; - typedef const element_type* const_pointer; + using typename etl::private_bitset::bitset_impl_common::element_type; + using typename etl::private_bitset::bitset_impl_common::pointer; + using typename etl::private_bitset::bitset_impl_common::const_pointer; - static ETL_CONSTANT size_t npos = etl::integral_limits::max; + using etl::private_bitset::bitset_impl_common::Bits_Per_Element; + using etl::private_bitset::bitset_impl_common::All_Set_Element; + using etl::private_bitset::bitset_impl_common::All_Clear_Element; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; - static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + using etl::private_bitset::bitset_impl_common::npos; //************************************************************************* /// Set all of the bits. @@ -210,6 +250,47 @@ namespace etl } } + //************************************************************************* + /// Set the bit at the position. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + void set_position(pointer pbuffer, + bool value = true) + { + const element_type mask = element_type(element_type(1) << Position); + + if (value == true) + { + *pbuffer |= mask; + } + else + { + *pbuffer &= ~mask; + } + } + + //************************************************************************* + /// Set the bit at the position. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + void set_position(pointer pbuffer) + { + const element_type mask = element_type(element_type(1) << Position); + + if (Value == true) + { + *pbuffer |= mask; + } + else + { + *pbuffer &= ~mask; + } + } + //************************************************************************* /// Reset all of the bits. //************************************************************************* @@ -771,19 +852,23 @@ namespace etl ///\ingroup bitset //************************************************************************* template - class bitset_impl + class bitset_impl : public etl::private_bitset::bitset_impl_common { + private: + + typedef etl::private_bitset::bitset_impl_common common; + public: - typedef TElement element_type; - typedef element_type* pointer; - typedef const element_type* const_pointer; + using typename etl::private_bitset::bitset_impl_common::element_type; + using typename etl::private_bitset::bitset_impl_common::pointer; + using typename etl::private_bitset::bitset_impl_common::const_pointer; - static ETL_CONSTANT size_t npos = etl::integral_limits::max; + using etl::private_bitset::bitset_impl_common::Bits_Per_Element; + using etl::private_bitset::bitset_impl_common::All_Set_Element; + using etl::private_bitset::bitset_impl_common::All_Clear_Element; - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; - static ETL_CONSTANT element_type All_Clear_Element = element_type(0); + using etl::private_bitset::bitset_impl_common::npos; //************************************************************************* /// Check to see if the requested extract is contained within one element. @@ -924,7 +1009,50 @@ namespace etl size_t index = position >> etl::log2::value; element_type bit = element_type(1) << (position & (Bits_Per_Element - 1)); - if (value) + if (value == true) + { + pbuffer[index] |= bit; + } + else + { + pbuffer[index] &= ~bit; + } + } + + //************************************************************************* + /// Set the bit at the position. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + void set_position(pointer pbuffer, + bool value = true) + { + size_t index = Position >> etl::log2::value; + element_type bit = element_type(1) << (Position & (Bits_Per_Element - 1)); + + if (value == true) + { + pbuffer[index] |= bit; + } + else + { + pbuffer[index] &= ~bit; + } + } + + //************************************************************************* + /// Set the bit at the position. + //************************************************************************* + template + ETL_CONSTEXPR14 + static + void set_position(pointer pbuffer) + { + size_t index = Position >> etl::log2::value; + element_type bit = element_type(1) << (Position & (Bits_Per_Element - 1)); + + if (Value == true) { pbuffer[index] |= bit; } @@ -1674,6 +1802,55 @@ namespace etl } }; + namespace private_bitset + { + //*************************************************************************** + template + class bitset_common : public etl::private_bitset::bitset_impl_common + { + public: + + typedef typename etl::private_bitset::bitset_impl_common::element_type element_type; + + using etl::private_bitset::bitset_impl_common::Bits_Per_Element; + using etl::private_bitset::bitset_impl_common::All_Set_Element; + using etl::private_bitset::bitset_impl_common::All_Clear_Element; + + static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; + static ETL_CONSTANT size_t Size = Active_Bits; + static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; + + static ETL_CONSTANT etl::bitset_storage_model Storage_Model = (Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; + + typedef etl::span span_type; + typedef etl::span const_span_type; + + private: + + static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - ((Number_Of_Elements * Bits_Per_Element) - Active_Bits)) % Bits_Per_Element); + + public: + + static ETL_CONSTANT TElement Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); + }; + + + template + ETL_CONSTANT size_t bitset_common::Number_Of_Elements; + + template + ETL_CONSTANT size_t bitset_common::Size; + + template + ETL_CONSTANT etl::bitset_storage_model bitset_common::Storage_Model; + + template + ETL_CONSTANT size_t bitset_common::Top_Mask_Shift; + + template + ETL_CONSTANT TElement bitset_common::Top_Mask; + } + //*************************************************************************** /// Bitset forward declaration //*************************************************************************** @@ -1685,61 +1862,46 @@ namespace etl /// Specialisation for zero bits. //*************************************************************************** template <> - class bitset<0U, unsigned char> + class bitset<0U, unsigned char> : public etl::private_bitset::bitset_common<0U, unsigned char> { public: - typedef unsigned char element_type; + typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::element_type element_type; + typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::span_type span_type; + typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::const_span_type const_span_type; - typedef element_type* pointer; - typedef const element_type* const_pointer; - - static ETL_CONSTANT size_t Bits_Per_Element = 0U; - static ETL_CONSTANT size_t Number_Of_Elements = 0U; - static ETL_CONSTANT size_t Allocated_Bits = 0U; - static ETL_CONSTANT element_type All_Set_Element = 0U; - static ETL_CONSTANT element_type All_Clear_Element = 0U; - static ETL_CONSTANT size_t Size = 0U; - static ETL_CONSTANT char Storage_Model = etl::bitset_storage_model::Undefined; - - static ETL_CONSTANT size_t npos = etl::integral_limits::max; + using etl::private_bitset::bitset_common<0U, unsigned char>::Bits_Per_Element; + using etl::private_bitset::bitset_common<0U, unsigned char>::All_Set_Element; + using etl::private_bitset::bitset_common<0U, unsigned char>::All_Clear_Element; + using etl::private_bitset::bitset_common<0U, unsigned char>::Number_Of_Elements; + using etl::private_bitset::bitset_common<0U, unsigned char>::Size; + using etl::private_bitset::bitset_common<0U, unsigned char>::Storage_Model; + using etl::private_bitset::bitset_common<0U, unsigned char>::Top_Mask; + using etl::private_bitset::bitset_common<0U, unsigned char>::Allocated_Bits; }; //************************************************************************* /// The bitset top level template. //************************************************************************* template - class bitset + class bitset : public etl::private_bitset::bitset_common { public: ETL_STATIC_ASSERT(etl::is_unsigned::value, "The element type must be unsigned"); - typedef TElement element_type; - typedef element_type* pointer; - typedef const element_type* const_pointer; + typedef typename etl::private_bitset::bitset_common::element_type element_type; + typedef typename etl::private_bitset::bitset_common::span_type span_type; + typedef typename etl::private_bitset::bitset_common::const_span_type const_span_type; - static ETL_CONSTANT size_t npos = etl::integral_limits::max; - - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; - static ETL_CONSTANT element_type All_Clear_Element = element_type(0); - static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; - static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - static ETL_CONSTANT size_t Size = Active_Bits; - static ETL_CONSTANT char Storage_Model = (Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; - - private: - - static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); - static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); - - public: - - static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. - - typedef etl::span span_type; - typedef etl::span const_span_type; + using etl::private_bitset::bitset_common::Bits_Per_Element; + using etl::private_bitset::bitset_common::All_Set_Element; + using etl::private_bitset::bitset_common::All_Clear_Element; + using etl::private_bitset::bitset_common::Number_Of_Elements; + using etl::private_bitset::bitset_common::Size; + using etl::private_bitset::bitset_common::Storage_Model; + using etl::private_bitset::bitset_common::Top_Mask; + using etl::private_bitset::bitset_common::Allocated_Bits; //************************************************************************* /// The reference type returned. @@ -1912,7 +2074,8 @@ namespace etl //************************************************************************* /// Set the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(size_t position, bool value = true) + ETL_CONSTEXPR14 + bitset& set(size_t position, bool value = true) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); @@ -1922,11 +2085,27 @@ namespace etl } //************************************************************************* - /// Set from a string. + /// Set the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 bitset& set(bool value = true) { - implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); + ETL_STATIC_ASSERT(Position < Active_Bits, "Position out of bounds"); + + implementation::template set_position(buffer, value); + + return *this; + } + + //************************************************************************* + /// Set the bit at the position. + //************************************************************************* + template + ETL_CONSTEXPR14 bitset& set() + { + ETL_STATIC_ASSERT(Position < Active_Bits, "Position out of bounds"); + + implementation::template set_position(buffer); return *this; } @@ -1934,7 +2113,10 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const wchar_t* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset&>::type + set(TPString text) ETL_NOEXCEPT { implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); @@ -1942,9 +2124,12 @@ namespace etl } //************************************************************************* - /// Set from a string. + /// Set from a wide string. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char16_t* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset&>::type + set(TPString text) ETL_NOEXCEPT { implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); @@ -1952,9 +2137,25 @@ namespace etl } //************************************************************************* - /// Set from a string. + /// Set from a char16 string. //************************************************************************* - ETL_CONSTEXPR14 bitset& set(const char32_t* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset&>::type + set(TPString text) ETL_NOEXCEPT + { + implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); + + return *this; + } + + //************************************************************************* + /// Set from a char32 string. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset&>::type + set(TPString text) ETL_NOEXCEPT { implementation::from_string(buffer, Number_Of_Elements, Active_Bits, text); @@ -2099,14 +2300,84 @@ namespace etl return implementation::test(buffer, position); } + //************************************************************************* + /// Tests a bit at a position. + /// Positions greater than the number of configured bits will not compile. + //************************************************************************* + template + ETL_CONSTEXPR14 bool test() const + { + ETL_STATIC_ASSERT(Position < Active_Bits, "Position out of bounds"); + + return implementation::test(buffer, Position); + } + //************************************************************************* /// The number of bits in the bitset. //************************************************************************* - ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT + static ETL_CONSTEXPR size_t size() ETL_NOEXCEPT { return Active_Bits; } + //************************************************************************* + /// The number of storage elements in the bitset. + //************************************************************************* + static ETL_CONSTEXPR size_t number_of_elements() ETL_NOEXCEPT + { + return Number_Of_Elements; + } + + //************************************************************************* + /// The value of a set element. + //************************************************************************* + static ETL_CONSTEXPR element_type all_set_element() ETL_NOEXCEPT + { + return All_Set_Element; + } + + //************************************************************************* + /// The value of a clear element. + //************************************************************************* + static ETL_CONSTEXPR element_type all_clear_element() ETL_NOEXCEPT + { + return All_Clear_Element; + } + + //************************************************************************* + /// The number of bits in an element. + //************************************************************************* + static ETL_CONSTEXPR size_t bits_per_element() ETL_NOEXCEPT + { + return Bits_Per_Element; + } + + //************************************************************************* + /// The mask for the msb element. + //************************************************************************* + static ETL_CONSTEXPR element_type top_mask() ETL_NOEXCEPT + { + return Top_Mask; + } + + //************************************************************************* + /// The total number of bits of storage, including unused. + //************************************************************************* + static ETL_CONSTEXPR size_t allocated_bits() ETL_NOEXCEPT + { + return Number_Of_Elements * Bits_Per_Element; + } + + //************************************************************************* + /// The storage model for the bitset. + /// etl::bitset_storage_model::Single + /// etl::bitset_storage_model::Multi + //************************************************************************* + static ETL_CONSTEXPR etl::bitset_storage_model storage_model() ETL_NOEXCEPT + { + return Storage_Model; + } + //************************************************************************* /// Count the number of bits set. //************************************************************************* @@ -2507,62 +2778,48 @@ namespace etl /// Specialisation for zero bits. //*************************************************************************** template <> - class bitset_ext<0U, unsigned char> + class bitset_ext<0U, unsigned char> : public etl::private_bitset::bitset_common<0U, unsigned char> { public: - typedef unsigned char element_type; + typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::element_type element_type; + typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::span_type span_type; + typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::const_span_type const_span_type; - typedef element_type* pointer; - typedef const element_type* const_pointer; - - static ETL_CONSTANT size_t Bits_Per_Element = 0U; - static ETL_CONSTANT size_t Number_Of_Elements = 0U; - static ETL_CONSTANT size_t Allocated_Bits = 0U; - static ETL_CONSTANT element_type All_Set_Element = 0U; - static ETL_CONSTANT element_type All_Clear_Element = 0U; - static ETL_CONSTANT size_t Size = 0U; - static ETL_CONSTANT char Storage_Model = etl::bitset_storage_model::Undefined; - - static ETL_CONSTANT size_t npos = etl::integral_limits::max; + using etl::private_bitset::bitset_common<0U, unsigned char>::Bits_Per_Element; + using etl::private_bitset::bitset_common<0U, unsigned char>::All_Set_Element; + using etl::private_bitset::bitset_common<0U, unsigned char>::All_Clear_Element; + using etl::private_bitset::bitset_common<0U, unsigned char>::Number_Of_Elements; + using etl::private_bitset::bitset_common<0U, unsigned char>::Size; + using etl::private_bitset::bitset_common<0U, unsigned char>::Storage_Model; + using etl::private_bitset::bitset_common<0U, unsigned char>::Top_Mask; + using etl::private_bitset::bitset_common<0U, unsigned char>::Allocated_Bits; }; //************************************************************************* - /// The specialisation that uses an array of the default element type. + /// A bitset that uses externally declared storage. //************************************************************************* template - class bitset_ext + class bitset_ext : public etl::private_bitset::bitset_common { public: ETL_STATIC_ASSERT(etl::is_unsigned::value, "The element type must be unsigned"); - typedef TElement element_type; - typedef element_type* pointer; - typedef const element_type* const_pointer; + typedef typename etl::private_bitset::bitset_common::element_type element_type; + typedef typename etl::private_bitset::bitset_common::span_type span_type; + typedef typename etl::private_bitset::bitset_common::const_span_type const_span_type; + + using etl::private_bitset::bitset_common::Bits_Per_Element; + using etl::private_bitset::bitset_common::All_Set_Element; + using etl::private_bitset::bitset_common::All_Clear_Element; + using etl::private_bitset::bitset_common::Number_Of_Elements; + using etl::private_bitset::bitset_common::Size; + using etl::private_bitset::bitset_common::Storage_Model; + using etl::private_bitset::bitset_common::Top_Mask; + using etl::private_bitset::bitset_common::Allocated_Bits; - static ETL_CONSTANT size_t npos = etl::integral_limits::max; - - static ETL_CONSTANT size_t Bits_Per_Element = etl::integral_limits::bits; - static ETL_CONSTANT element_type All_Set_Element = etl::integral_limits::max; - static ETL_CONSTANT element_type All_Clear_Element = element_type(0); - static ETL_CONSTANT size_t Number_Of_Elements = (Active_Bits % Bits_Per_Element == 0) ? Active_Bits / Bits_Per_Element : Active_Bits / Bits_Per_Element + 1; - static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - static ETL_CONSTANT size_t Size = Active_Bits; - static ETL_CONSTANT char Storage_Model = (Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; - - private: - - static ETL_CONSTANT size_t Top_Mask_Shift = ((Bits_Per_Element - (Allocated_Bits - Active_Bits)) % Bits_Per_Element); - static ETL_CONSTANT element_type Top_Mask = element_type(Top_Mask_Shift == 0 ? All_Set_Element : ~(All_Set_Element << Top_Mask_Shift)); - - public: - - static ETL_CONSTANT size_t ALLOCATED_BITS = Allocated_Bits; ///< For backward compatibility. - - typedef etl::array buffer_type; - typedef etl::span span_type; - typedef etl::span const_span_type; + typedef etl::array buffer_type; //************************************************************************* /// The reference type returned. @@ -2811,21 +3068,38 @@ namespace etl //************************************************************************* /// Set the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(size_t position, bool value = true) + ETL_CONSTEXPR14 + bitset_ext& set(size_t position, bool value = true) { ETL_ASSERT_OR_RETURN_VALUE(position < Active_Bits, ETL_ERROR(bitset_overflow), *this); - + implementation::set_position(pbuffer, position, value); return *this; } //************************************************************************* - /// Set from a string. + /// Set the bit at the position. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 bitset_ext& set(bool value = true) { - implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); + ETL_STATIC_ASSERT(Position < Active_Bits, "Position out of bounds"); + + implementation::template set_position(pbuffer, value); + + return *this; + } + + //************************************************************************* + /// Set the bit at the position. + //************************************************************************* + template + ETL_CONSTEXPR14 bitset_ext& set() + { + ETL_STATIC_ASSERT(Position < Active_Bits, "Position out of bounds"); + + implementation::template set_position(pbuffer); return *this; } @@ -2833,7 +3107,10 @@ namespace etl //************************************************************************* /// Set from a string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const wchar_t* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset_ext&>::type + set(TPString text) ETL_NOEXCEPT { implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); @@ -2841,9 +3118,12 @@ namespace etl } //************************************************************************* - /// Set from a string. + /// Set from a wide string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char16_t* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset_ext&>::type + set(TPString text) ETL_NOEXCEPT { implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); @@ -2851,9 +3131,25 @@ namespace etl } //************************************************************************* - /// Set from a string. + /// Set from a char16 string. //************************************************************************* - ETL_CONSTEXPR14 bitset_ext& set(const char32_t* text) ETL_NOEXCEPT + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset_ext&>::type + set(TPString text) ETL_NOEXCEPT + { + implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); + + return *this; + } + + //************************************************************************* + /// Set from a char32 string. + //************************************************************************* + template + ETL_CONSTEXPR14 + typename etl::enable_if::value, bitset_ext&>::type + set(TPString text) ETL_NOEXCEPT { implementation::from_string(pbuffer, Number_Of_Elements, Active_Bits, text); @@ -2997,14 +3293,84 @@ namespace etl return implementation::test(pbuffer, position); } + //************************************************************************* + /// Tests a bit at a position. + /// Positions greater than the number of configured bits will not compile. + //************************************************************************* + template + ETL_CONSTEXPR14 bool test() const + { + ETL_STATIC_ASSERT(Position < Active_Bits, "Position out of bounds"); + + return implementation::test(pbuffer, Position); + } + //************************************************************************* /// The number of bits in the bitset. //************************************************************************* - ETL_CONSTEXPR14 size_t size() const ETL_NOEXCEPT + static ETL_CONSTEXPR size_t size() ETL_NOEXCEPT { return Active_Bits; } + //************************************************************************* + /// The number of storage elements in the bitset. + //************************************************************************* + static ETL_CONSTEXPR size_t number_of_elements() ETL_NOEXCEPT + { + return Number_Of_Elements; + } + + //************************************************************************* + /// The value of a set element. + //************************************************************************* + static ETL_CONSTEXPR element_type all_set_element() ETL_NOEXCEPT + { + return All_Set_Element; + } + + //************************************************************************* + /// The value of a clear element. + //************************************************************************* + static ETL_CONSTEXPR element_type all_clear_element() ETL_NOEXCEPT + { + return All_Clear_Element; + } + + //************************************************************************* + /// The mask for the msb element. + //************************************************************************* + static ETL_CONSTEXPR element_type top_mask() ETL_NOEXCEPT + { + return Top_Mask; + } + + //************************************************************************* + /// The number of bits in an element. + //************************************************************************* + static ETL_CONSTEXPR size_t bits_per_element() ETL_NOEXCEPT + { + return Bits_Per_Element; + } + + //************************************************************************* + /// The total number of bits of storage, including unused. + //************************************************************************* + static ETL_CONSTEXPR size_t allocated_bits() ETL_NOEXCEPT + { + return Number_Of_Elements * Bits_Per_Element; + } + + //************************************************************************* + /// The storage model for the bitset. + /// etl::bitset_storage_model::Single + /// etl::bitset_storage_model::Multi + //************************************************************************* + static ETL_CONSTEXPR etl::bitset_storage_model storage_model() ETL_NOEXCEPT + { + return Storage_Model; + } + //************************************************************************* /// Count the number of bits set. //************************************************************************* @@ -3234,14 +3600,6 @@ namespace etl private: - ////************************************************************************* - ///// Correct the unused top bits after bit manipulation. - ////************************************************************************* - //ETL_CONSTEXPR14 static void clear_unused_bits_in_msb() ETL_NOEXCEPT - //{ - // pbuffer[Number_Of_Elements - 1U] &= Top_Mask; - //} - // The implementation of the bitset functionality. typedef etl::bitset_impl implementation; diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index 1a38ef2b..4ca19920 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -120,6 +120,77 @@ namespace SUITE(test_bitset_new_default_element_type) { + //************************************************************************* + TEST(test_constants) + { + using bitset_type = etl::bitset<60>; + using element_type = bitset_type::element_type; + + constexpr size_t Size = 60; + constexpr size_t Bits_Per_Element = etl::integral_limits::bits; + constexpr size_t Number_Of_Elements = (Size % Bits_Per_Element == 0) ? Size / Bits_Per_Element : Size / Bits_Per_Element + 1; + constexpr element_type All_Set_Element = etl::integral_limits::max; + constexpr element_type All_Clear_Element = etl::integral_limits::min; + + //******************************* + constexpr size_t Size1 = bitset_type::Size; + constexpr size_t Size2 = bitset_type::size(); + + CHECK_EQUAL(Size, Size1); + CHECK_EQUAL(Size, Size2); + + //******************************* + constexpr size_t Bits_Per_Element1 = bitset_type::Bits_Per_Element; + constexpr size_t Bits_Per_Element2 = bitset_type::bits_per_element(); + + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element1); + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element2); + + //******************************* + constexpr size_t Number_Of_Elements1 = bitset_type::Number_Of_Elements; + constexpr size_t Number_Of_Elements2 = bitset_type::number_of_elements(); + + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements1); + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements2); + + //******************************* + constexpr element_type All_Set_Element1 = bitset_type::All_Set_Element; + constexpr element_type All_Set_Element2 = bitset_type::all_set_element(); + + CHECK_EQUAL(All_Set_Element, All_Set_Element1); + CHECK_EQUAL(All_Set_Element, All_Set_Element2); + + //******************************* + constexpr size_t All_Clear_Element1 = bitset_type::All_Clear_Element; + constexpr size_t All_Clear_Element2 = bitset_type::all_clear_element(); + + CHECK_EQUAL(All_Clear_Element, All_Clear_Element1); + CHECK_EQUAL(All_Clear_Element, All_Clear_Element2); + + //******************************* + constexpr size_t Allocated_Bits = bitset_type::allocated_bits(); + + CHECK_EQUAL(Number_Of_Elements * Bits_Per_Element, Allocated_Bits); + + //******************************* + constexpr char Storage_Model1 = bitset_type::Storage_Model; + constexpr char Storage_Model2 = bitset_type::storage_model(); + + CHECK_EQUAL(etl::bitset_storage_model::Multi, Storage_Model1); + CHECK_EQUAL(etl::bitset_storage_model::Multi, Storage_Model2); + + etl::bitset_storage_model bsm; + + bsm = etl::bitset_storage_model::Undefined; + CHECK_EQUAL(std::string("Undefined"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Single; + CHECK_EQUAL(std::string("Single"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Multi; + CHECK_EQUAL(std::string("Multi"), std::string(bsm.c_str())); + } + //************************************************************************* TEST(test_default_constructor) { @@ -394,6 +465,281 @@ namespace } } + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_set_run_time_position_default_value_helper() + { + etl::bitset<64> data; + + data.set(2); + data.set(3); + data.set(5); + data.set(7); + data.set(11); + data.set(13); + data.set(17); + data.set(19); + data.set(23); + data.set(29); + data.set(31); + + return data; + } + + TEST(test_set_run_time_position_default_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_set_run_time_position_default_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_set_run_time_position_value_helper() + { + etl::bitset<64> data; + + data.set(2, true); + data.set(3, true); + data.set(5, true); + data.set(7, true); + data.set(11, true); + data.set(13, true); + data.set(17, true); + data.set(19, true); + data.set(23, true); + data.set(29, true); + data.set(31, true); + + return data; + } + + TEST(test_set_run_time_position_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_set_run_time_position_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_set_compile_time_position_run_time_default_value_helper() + { + etl::bitset<64> data; + + data.set<2>(); + data.set<3>(); + data.set<5>(); + data.set<7>(); + data.set<11>(); + data.set<13>(); + data.set<17>(); + data.set<19>(); + data.set<23>(); + data.set<29>(); + data.set<31>(); + + return data; + } + + TEST(test_set_compile_time_position_run_time_default_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_set_compile_time_position_run_time_default_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_set_compile_time_position_run_time_value_helper() + { + etl::bitset<64> data; + + data.set<2>(true); + data.set<3>(true); + data.set<5>(true); + data.set<7>(true); + data.set<11>(true); + data.set<13>(true); + data.set<17>(true); + data.set<19>(true); + data.set<23>(true); + data.set<29>(true); + data.set<31>(true); + + return data; + } + + TEST(test_set_compile_time_position_run_time_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_set_compile_time_position_run_time_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64> test_set_compile_time_position_value_helper() + { + etl::bitset<64> data; + + data.set<2, true>(); + data.set<3, true>(); + data.set<5, true>(); + data.set<7, true>(); + data.set<11, true>(); + data.set<13, true>(); + data.set<17, true>(); + data.set<19, true>(); + data.set<23, true>(); + data.set<29, true>(); + data.set<31, true>(); + + return data; + } + + TEST(test_set_compile_time_position_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64> data(test_set_compile_time_position_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + //************************************************************************* TEST(test_set_with_char_string) { @@ -2255,5 +2601,58 @@ namespace //int16_t v1 = b.extract()); //int16_t v2 = b.extract()); } + + //************************************************************************* + bool test_bit(int i) + { + return (0x1234 & (1 << i)) != 0; + } + + TEST(test_test_run_time) + { + ETL_CONSTEXPR14 etl::bitset<16> b(0x1234); + + ETL_CONSTEXPR14 bool t0 = b.test(0); + ETL_CONSTEXPR14 bool t1 = b.test(1); + ETL_CONSTEXPR14 bool t2 = b.test(2); + ETL_CONSTEXPR14 bool t3 = b.test(3); + ETL_CONSTEXPR14 bool t4 = b.test(4); + ETL_CONSTEXPR14 bool t5 = b.test(5); + ETL_CONSTEXPR14 bool t6 = b.test(6); + ETL_CONSTEXPR14 bool t7 = b.test(7); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } + + //************************************************************************* + TEST(test_test_compile_time) + { + ETL_CONSTEXPR14 etl::bitset<16> b(0x1234); + + ETL_CONSTEXPR14 bool t0 = b.test<0>(); + ETL_CONSTEXPR14 bool t1 = b.test<1>(); + ETL_CONSTEXPR14 bool t2 = b.test<2>(); + ETL_CONSTEXPR14 bool t3 = b.test<3>(); + ETL_CONSTEXPR14 bool t4 = b.test<4>(); + ETL_CONSTEXPR14 bool t5 = b.test<5>(); + ETL_CONSTEXPR14 bool t6 = b.test<6>(); + ETL_CONSTEXPR14 bool t7 = b.test<7>(); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } }; } diff --git a/test/test_bitset_new_explicit_single_element_type.cpp b/test/test_bitset_new_explicit_single_element_type.cpp index 0ce70049..91411477 100644 --- a/test/test_bitset_new_explicit_single_element_type.cpp +++ b/test/test_bitset_new_explicit_single_element_type.cpp @@ -119,6 +119,77 @@ namespace SUITE(test_bitset_new_explicit_element_type) { + //************************************************************************* + TEST(test_constants) + { + using bitset_type = etl::bitset<60, uint64_t>; + using element_type = bitset_type::element_type; + + constexpr size_t Size = 60; + constexpr size_t Bits_Per_Element = etl::integral_limits::bits; + constexpr size_t Number_Of_Elements = (Size % Bits_Per_Element == 0) ? Size / Bits_Per_Element : Size / Bits_Per_Element + 1; + constexpr element_type All_Set_Element = etl::integral_limits::max; + constexpr element_type All_Clear_Element = etl::integral_limits::min; + + //******************************* + constexpr size_t Size1 = bitset_type::Size; + constexpr size_t Size2 = bitset_type::size(); + + CHECK_EQUAL(Size, Size1); + CHECK_EQUAL(Size, Size2); + + //******************************* + constexpr size_t Bits_Per_Element1 = bitset_type::Bits_Per_Element; + constexpr size_t Bits_Per_Element2 = bitset_type::bits_per_element(); + + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element1); + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element2); + + //******************************* + constexpr size_t Number_Of_Elements1 = bitset_type::Number_Of_Elements; + constexpr size_t Number_Of_Elements2 = bitset_type::number_of_elements(); + + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements1); + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements2); + + //******************************* + constexpr element_type All_Set_Element1 = bitset_type::All_Set_Element; + constexpr element_type All_Set_Element2 = bitset_type::all_set_element(); + + CHECK_EQUAL(All_Set_Element, All_Set_Element1); + CHECK_EQUAL(All_Set_Element, All_Set_Element2); + + //******************************* + constexpr element_type All_Clear_Element1 = bitset_type::All_Clear_Element; + constexpr element_type All_Clear_Element2 = bitset_type::all_clear_element(); + + CHECK_EQUAL(All_Clear_Element, All_Clear_Element1); + CHECK_EQUAL(All_Clear_Element, All_Clear_Element2); + + //******************************* + constexpr size_t Allocated_Bits = bitset_type::allocated_bits(); + + CHECK_EQUAL(Number_Of_Elements * Bits_Per_Element, Allocated_Bits); + + //******************************* + constexpr char Storage_Model1 = bitset_type::Storage_Model; + constexpr char Storage_Model2 = bitset_type::storage_model(); + + CHECK_EQUAL(etl::bitset_storage_model::Single, Storage_Model1); + CHECK_EQUAL(etl::bitset_storage_model::Single, Storage_Model2); + + etl::bitset_storage_model bsm; + + bsm = etl::bitset_storage_model::Undefined; + CHECK_EQUAL(std::string("Undefined"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Single; + CHECK_EQUAL(std::string("Single"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Multi; + CHECK_EQUAL(std::string("Multi"), std::string(bsm.c_str())); + } + //************************************************************************* TEST(test_default_constructor) { @@ -390,6 +461,281 @@ namespace } } + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_set_run_time_position_default_value_helper() + { + etl::bitset<64, uint64_t> data; + + data.set(2); + data.set(3); + data.set(5); + data.set(7); + data.set(11); + data.set(13); + data.set(17); + data.set(19); + data.set(23); + data.set(29); + data.set(31); + + return data; + } + + TEST(test_set_run_time_position_default_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_set_run_time_position_default_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_set_run_time_position_value_helper() + { + etl::bitset<64, uint64_t> data; + + data.set(2, true); + data.set(3, true); + data.set(5, true); + data.set(7, true); + data.set(11, true); + data.set(13, true); + data.set(17, true); + data.set(19, true); + data.set(23, true); + data.set(29, true); + data.set(31, true); + + return data; + } + + TEST(test_set_run_time_position_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_set_run_time_position_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_set_compile_time_position_run_time_default_value_helper() + { + etl::bitset<64, uint64_t> data; + + data.set<2>(); + data.set<3>(); + data.set<5>(); + data.set<7>(); + data.set<11>(); + data.set<13>(); + data.set<17>(); + data.set<19>(); + data.set<23>(); + data.set<29>(); + data.set<31>(); + + return data; + } + + TEST(test_set_compile_time_position_run_time_default_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_set_compile_time_position_run_time_default_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_set_compile_time_position_run_time_value_helper() + { + etl::bitset<64, uint64_t> data; + + data.set<2>(true); + data.set<3>(true); + data.set<5>(true); + data.set<7>(true); + data.set<11>(true); + data.set<13>(true); + data.set<17>(true); + data.set<19>(true); + data.set<23>(true); + data.set<29>(true); + data.set<31>(true); + + return data; + } + + TEST(test_set_compile_time_position_run_time_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_set_compile_time_position_run_time_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> test_set_compile_time_position_value_helper() + { + etl::bitset<64, uint64_t> data; + + data.set<2, true>(); + data.set<3, true>(); + data.set<5, true>(); + data.set<7, true>(); + data.set<11, true>(); + data.set<13, true>(); + data.set<17, true>(); + data.set<19, true>(); + data.set<23, true>(); + data.set<29, true>(); + data.set<31, true>(); + + return data; + } + + TEST(test_set_compile_time_position_value) + { + std::bitset<64> compare; + ETL_CONSTEXPR14 etl::bitset<64, uint64_t> data(test_set_compile_time_position_value_helper()); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + ETL_CONSTEXPR14 auto size = data.size(); + ETL_CONSTEXPR14 auto count = data.count(); + ETL_CONSTEXPR14 auto none = data.none(); + ETL_CONSTEXPR14 auto any = data.any(); + ETL_CONSTEXPR14 auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + //************************************************************************* TEST(test_set_with_char_string) { @@ -2348,5 +2694,58 @@ namespace //int16_t v1 = b.extract()); //int16_t v2 = b.extract()); } + + //************************************************************************* + bool test_bit(int i) + { + return (0x1234 & (1 << i)) != 0; + } + + TEST(test_test_run_time) + { + ETL_CONSTEXPR14 etl::bitset<16, uint16_t> b(0x1234); + + ETL_CONSTEXPR14 bool t0 = b.test(0); + ETL_CONSTEXPR14 bool t1 = b.test(1); + ETL_CONSTEXPR14 bool t2 = b.test(2); + ETL_CONSTEXPR14 bool t3 = b.test(3); + ETL_CONSTEXPR14 bool t4 = b.test(4); + ETL_CONSTEXPR14 bool t5 = b.test(5); + ETL_CONSTEXPR14 bool t6 = b.test(6); + ETL_CONSTEXPR14 bool t7 = b.test(7); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } + + //************************************************************************* + TEST(test_test_compile_time) + { + ETL_CONSTEXPR14 etl::bitset<16, uint16_t> b(0x1234); + + ETL_CONSTEXPR14 bool t0 = b.test<0>(); + ETL_CONSTEXPR14 bool t1 = b.test<1>(); + ETL_CONSTEXPR14 bool t2 = b.test<2>(); + ETL_CONSTEXPR14 bool t3 = b.test<3>(); + ETL_CONSTEXPR14 bool t4 = b.test<4>(); + ETL_CONSTEXPR14 bool t5 = b.test<5>(); + ETL_CONSTEXPR14 bool t6 = b.test<6>(); + ETL_CONSTEXPR14 bool t7 = b.test<7>(); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } }; } diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index d62d5c42..6945376d 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -45,6 +45,77 @@ namespace SUITE(test_bitset_new_ext_default_element_type) { + //************************************************************************* + TEST(test_constants) + { + using bitset_type = etl::bitset_ext<60>; + using element_type = bitset_type::element_type; + + constexpr size_t Size = 60; + constexpr size_t Bits_Per_Element = etl::integral_limits::bits; + constexpr size_t Number_Of_Elements = (Size % Bits_Per_Element == 0) ? Size / Bits_Per_Element : Size / Bits_Per_Element + 1; + constexpr element_type All_Set_Element = etl::integral_limits::max; + constexpr element_type All_Clear_Element = etl::integral_limits::min; + + //******************************* + constexpr size_t Size1 = bitset_type::Size; + constexpr size_t Size2 = bitset_type::size(); + + CHECK_EQUAL(Size, Size1); + CHECK_EQUAL(Size, Size2); + + //******************************* + constexpr size_t Bits_Per_Element1 = bitset_type::Bits_Per_Element; + constexpr size_t Bits_Per_Element2 = bitset_type::bits_per_element(); + + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element1); + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element2); + + //******************************* + constexpr size_t Number_Of_Elements1 = bitset_type::Number_Of_Elements; + constexpr size_t Number_Of_Elements2 = bitset_type::number_of_elements(); + + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements1); + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements2); + + //******************************* + constexpr element_type All_Set_Element1 = bitset_type::All_Set_Element; + constexpr element_type All_Set_Element2 = bitset_type::all_set_element(); + + CHECK_EQUAL(All_Set_Element, All_Set_Element1); + CHECK_EQUAL(All_Set_Element, All_Set_Element2); + + //******************************* + constexpr element_type All_Clear_Element1 = bitset_type::All_Clear_Element; + constexpr element_type All_Clear_Element2 = bitset_type::all_clear_element(); + + CHECK_EQUAL(All_Clear_Element, All_Clear_Element1); + CHECK_EQUAL(All_Clear_Element, All_Clear_Element2); + + //******************************* + constexpr size_t Allocated_Bits = bitset_type::allocated_bits(); + + CHECK_EQUAL(Number_Of_Elements * Bits_Per_Element, Allocated_Bits); + + //******************************* + constexpr char Storage_Model1 = bitset_type::Storage_Model; + constexpr char Storage_Model2 = bitset_type::storage_model(); + + CHECK_EQUAL(etl::bitset_storage_model::Multi, Storage_Model1); + CHECK_EQUAL(etl::bitset_storage_model::Multi, Storage_Model2); + + etl::bitset_storage_model bsm; + + bsm = etl::bitset_storage_model::Undefined; + CHECK_EQUAL(std::string("Undefined"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Single; + CHECK_EQUAL(std::string("Single"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Multi; + CHECK_EQUAL(std::string("Multi"), std::string(bsm.c_str())); + } + //************************************************************************* TEST(test_construct_from_nullptr_buffer) { @@ -334,6 +405,251 @@ namespace } } + //************************************************************************* + TEST(test_set_run_time_position_default_value) + { + std::bitset<64> compare; + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set(2); + data.set(3); + data.set(5); + data.set(7); + data.set(11); + data.set(13); + data.set(17); + data.set(19); + data.set(23); + data.set(29); + data.set(31); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_run_time_position_value) + { + std::bitset<64> compare; + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set(2, true); + data.set(3, true); + data.set(5, true); + data.set(7, true); + data.set(11, true); + data.set(13, true); + data.set(17, true); + data.set(19, true); + data.set(23, true); + data.set(29, true); + data.set(31, true); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_compile_time_position_run_time_default_value) + { + std::bitset<64> compare; + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set<2>(); + data.set<3>(); + data.set<5>(); + data.set<7>(); + data.set<11>(); + data.set<13>(); + data.set<17>(); + data.set<19>(); + data.set<23>(); + data.set<29>(); + data.set<31>(); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_compile_time_position_run_time_value) + { + std::bitset<64> compare; + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set<2>(true); + data.set<3>(true); + data.set<5>(true); + data.set<7>(true); + data.set<11>(true); + data.set<13>(true); + data.set<17>(true); + data.set<19>(true); + data.set<23>(true); + data.set<29>(true); + data.set<31>(true); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_compile_time_position_value) + { + std::bitset<64> compare; + etl::bitset_ext<64>::buffer_type buffer; + etl::bitset_ext<64> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set<2, true>(); + data.set<3, true>(); + data.set<5, true>(); + data.set<7, true>(); + data.set<11, true>(); + data.set<13, true>(); + data.set<17, true>(); + data.set<19, true>(); + data.set<23, true>(); + data.set<29, true>(); + data.set<31, true>(); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + //************************************************************************* TEST(test_set_with_char_string) { @@ -2020,5 +2336,62 @@ namespace //uint16_t v1 = b.extract()); //uint16_t v2 = b.extract()); } + + //************************************************************************* + bool test_bit(int i) + { + return (0x1234 & (1 << i)) != 0; + } + + TEST(test_test_run_time) + { + etl::bitset_ext<16>::buffer_type buffer; + + etl::bitset_ext<16> b(0x1234, buffer); + + bool t0 = b.test(0); + bool t1 = b.test(1); + bool t2 = b.test(2); + bool t3 = b.test(3); + bool t4 = b.test(4); + bool t5 = b.test(5); + bool t6 = b.test(6); + bool t7 = b.test(7); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } + + //************************************************************************* + TEST(test_test_compile_time) + { + etl::bitset_ext<16>::buffer_type buffer; + + etl::bitset_ext<16> b(0x1234, buffer); + + bool t0 = b.test<0>(); + bool t1 = b.test<1>(); + bool t2 = b.test<2>(); + bool t3 = b.test<3>(); + bool t4 = b.test<4>(); + bool t5 = b.test<5>(); + bool t6 = b.test<6>(); + bool t7 = b.test<7>(); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } }; } 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 a26fa6a9..d98c779d 100644 --- a/test/test_bitset_new_ext_explicit_single_element_type.cpp +++ b/test/test_bitset_new_ext_explicit_single_element_type.cpp @@ -44,6 +44,77 @@ namespace SUITE(test_bitset_new_ext_explicit_element_type) { + //************************************************************************* + TEST(test_constants) + { + using bitset_type = etl::bitset_ext<60, uint64_t>; + using element_type = bitset_type::element_type; + + constexpr size_t Size = 60; + constexpr size_t Bits_Per_Element = etl::integral_limits::bits; + constexpr size_t Number_Of_Elements = (Size % Bits_Per_Element == 0) ? Size / Bits_Per_Element : Size / Bits_Per_Element + 1; + constexpr element_type All_Set_Element = etl::integral_limits::max; + constexpr element_type All_Clear_Element = etl::integral_limits::min; + + //******************************* + constexpr size_t Size1 = bitset_type::Size; + constexpr size_t Size2 = bitset_type::size(); + + CHECK_EQUAL(Size, Size1); + CHECK_EQUAL(Size, Size2); + + //******************************* + constexpr size_t Bits_Per_Element1 = bitset_type::Bits_Per_Element; + constexpr size_t Bits_Per_Element2 = bitset_type::bits_per_element(); + + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element1); + CHECK_EQUAL(Bits_Per_Element, Bits_Per_Element2); + + //******************************* + constexpr size_t Number_Of_Elements1 = bitset_type::Number_Of_Elements; + constexpr size_t Number_Of_Elements2 = bitset_type::number_of_elements(); + + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements1); + CHECK_EQUAL(Number_Of_Elements, Number_Of_Elements2); + + //******************************* + constexpr element_type All_Set_Element1 = bitset_type::All_Set_Element; + constexpr element_type All_Set_Element2 = bitset_type::all_set_element(); + + CHECK_EQUAL(All_Set_Element, All_Set_Element1); + CHECK_EQUAL(All_Set_Element, All_Set_Element2); + + //******************************* + constexpr size_t All_Clear_Element1 = bitset_type::All_Clear_Element; + constexpr size_t All_Clear_Element2 = bitset_type::all_clear_element(); + + CHECK_EQUAL(All_Clear_Element, All_Clear_Element1); + CHECK_EQUAL(All_Clear_Element, All_Clear_Element2); + + //******************************* + constexpr size_t Allocated_Bits = bitset_type::allocated_bits(); + + CHECK_EQUAL(Number_Of_Elements * Bits_Per_Element, Allocated_Bits); + + //******************************* + constexpr char Storage_Model1 = bitset_type::Storage_Model; + constexpr char Storage_Model2 = bitset_type::storage_model(); + + CHECK_EQUAL(etl::bitset_storage_model::Single, Storage_Model1); + CHECK_EQUAL(etl::bitset_storage_model::Single, Storage_Model2); + + etl::bitset_storage_model bsm; + + bsm = etl::bitset_storage_model::Undefined; + CHECK_EQUAL(std::string("Undefined"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Single; + CHECK_EQUAL(std::string("Single"), std::string(bsm.c_str())); + + bsm = etl::bitset_storage_model::Multi; + CHECK_EQUAL(std::string("Multi"), std::string(bsm.c_str())); + } + //************************************************************************* TEST(test_construct_from_nullptr_buffer) { @@ -362,6 +433,251 @@ namespace } } + //************************************************************************* + TEST(test_set_run_time_position_default_value) + { + std::bitset<64> compare; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set(2); + data.set(3); + data.set(5); + data.set(7); + data.set(11); + data.set(13); + data.set(17); + data.set(19); + data.set(23); + data.set(29); + data.set(31); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_run_time_position_value) + { + std::bitset<64> compare; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set(2, true); + data.set(3, true); + data.set(5, true); + data.set(7, true); + data.set(11, true); + data.set(13, true); + data.set(17, true); + data.set(19, true); + data.set(23, true); + data.set(29, true); + data.set(31, true); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_compile_time_position_run_time_default_value) + { + std::bitset<64> compare; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set<2>(); + data.set<3>(); + data.set<5>(); + data.set<7>(); + data.set<11>(); + data.set<13>(); + data.set<17>(); + data.set<19>(); + data.set<23>(); + data.set<29>(); + data.set<31>(); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_compile_time_position_run_time_value) + { + std::bitset<64> compare; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set<2>(true); + data.set<3>(true); + data.set<5>(true); + data.set<7>(true); + data.set<11>(true); + data.set<13>(true); + data.set<17>(true); + data.set<19>(true); + data.set<23>(true); + data.set<29>(true); + data.set<31>(true); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + + //************************************************************************* + TEST(test_set_compile_time_position_value) + { + std::bitset<64> compare; + etl::bitset_ext<64, uint64_t>::buffer_type buffer; + etl::bitset_ext<64, uint64_t> data(buffer); + + compare.set(2); + compare.set(3); + compare.set(5); + compare.set(7); + compare.set(11); + compare.set(13); + compare.set(17); + compare.set(19); + compare.set(23); + compare.set(29); + compare.set(31); + + data.set<2, true>(); + data.set<3, true>(); + data.set<5, true>(); + data.set<7, true>(); + data.set<11, true>(); + data.set<13, true>(); + data.set<17, true>(); + data.set<19, true>(); + data.set<23, true>(); + data.set<29, true>(); + data.set<31, true>(); + + auto size = data.size(); + auto count = data.count(); + auto none = data.none(); + auto any = data.any(); + auto all = data.all(); + + CHECK_EQUAL(compare.size(), size); + CHECK_EQUAL(compare.count(), count); + CHECK_EQUAL(compare.none(), none); + CHECK_EQUAL(compare.any(), any); + CHECK_EQUAL(compare.all(), all); + + for (size_t i = 0UL; i < data.size(); ++i) + { + CHECK_EQUAL(compare.test(i), data.test(i)); + } + } + //************************************************************************* TEST(test_set_with_char_string) { @@ -2168,5 +2484,62 @@ namespace //uint16_t v1 = b.extract()); //uint16_t v2 = b.extract()); } + + //************************************************************************* + bool test_bit(int i) + { + return (0x1234 & (1 << i)) != 0; + } + + TEST(test_test_run_time) + { + etl::bitset_ext<16, uint16_t>::buffer_type buffer; + + etl::bitset_ext<16, uint16_t> b(0x1234, buffer); + + bool t0 = b.test(0); + bool t1 = b.test(1); + bool t2 = b.test(2); + bool t3 = b.test(3); + bool t4 = b.test(4); + bool t5 = b.test(5); + bool t6 = b.test(6); + bool t7 = b.test(7); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } + + //************************************************************************* + TEST(test_test_compile_time) + { + etl::bitset_ext<16, uint16_t>::buffer_type buffer; + + etl::bitset_ext<16, uint16_t> b(0x1234, buffer); + + bool t0 = b.test<0>(); + bool t1 = b.test<1>(); + bool t2 = b.test<2>(); + bool t3 = b.test<3>(); + bool t4 = b.test<4>(); + bool t5 = b.test<5>(); + bool t6 = b.test<6>(); + bool t7 = b.test<7>(); + + CHECK_EQUAL(test_bit(0), t0); + CHECK_EQUAL(test_bit(1), t1); + CHECK_EQUAL(test_bit(2), t2); + CHECK_EQUAL(test_bit(3), t3); + CHECK_EQUAL(test_bit(4), t4); + CHECK_EQUAL(test_bit(5), t5); + CHECK_EQUAL(test_bit(6), t6); + CHECK_EQUAL(test_bit(7), t7); + } }; } From ac4c3e67e6e98cd0cf499525bd693bbba18e1009 Mon Sep 17 00:00:00 2001 From: Drew Rife Date: Sat, 13 Jan 2024 06:48:55 -0500 Subject: [PATCH 031/131] Implement SAE J1850 CRC8 and "Zero" version (#812) * feat: added 8bit j1850 crc parameters * feat: add crc8 j1850 header * feat: add crc j1850 zero header * feat: add the crc j1850 headers to crc.h * test: j1850 4 constructor * build: crc8 j1850 tests * test: crc8 j1850 4 add values * test: crc8 j1850 4 add range * test: crc8 j1850 4 add range via iterator * test: crc8 j1850 4 add range endian * test: crc8 j1850 16 constructor * test: crc8 j1850 16 add values * test: crc8 j1850 16 add range * test: crc8 j1850 16 add range via iterator * test: crc8 j1850 16 add range endian * test: crc8 j1850 156 constructor * test: crc8 j1850 256 add values * test: crc8 j1850 256 add range * test: crc8 j1850 add range via iterator * test: crc8 j1850 256 add range endian * test: initial commit of crc j1850 zero tests * build: crc8 j1850 zero tests * test: crc8 j1850 zero 4 add values * test: crc8 j1850 zero 4 add range * test: crc8 j1850 zero 4 add range via iterator * test: crc8 j1850 zero 4 add range endian * test: crc8 j1850 zero 16 constructor * test: crc8 j1850 zero 16 add values * test: crc8 j1850 zero 16 add range * test: crc8 j1850 zero 16 add range via iterator * test: crc8 j1850 zero 16 add range endian * test: crc8 j1850 zero 256 constructor * test: crc8 j1850 zero 256 add values * test: crc8 j1850 zero 256 add range * test: crc8 j1850 zero 256 add range via iterator * test: crc8 j1850 zero 256 add range endian * fix: header include guards --- include/etl/crc.h | 2 + include/etl/crc8_j1850.h | 79 ++++++++ include/etl/crc8_j1850_zero.h | 79 ++++++++ include/etl/private/crc_parameters.h | 2 + test/CMakeLists.txt | 2 + test/test_crc8_j1850.cpp | 263 +++++++++++++++++++++++++++ test/test_crc8_j1850_zero.cpp | 263 +++++++++++++++++++++++++++ 7 files changed, 690 insertions(+) create mode 100644 include/etl/crc8_j1850.h create mode 100644 include/etl/crc8_j1850_zero.h create mode 100644 test/test_crc8_j1850.cpp create mode 100644 test/test_crc8_j1850_zero.cpp diff --git a/include/etl/crc.h b/include/etl/crc.h index eab6d7bc..78ceb552 100644 --- a/include/etl/crc.h +++ b/include/etl/crc.h @@ -40,6 +40,8 @@ SOFTWARE. #include "crc8_ebu.h" #include "crc8_icode.h" #include "crc8_itu.h" +#include "crc8_j1850_zero.h" +#include "crc8_j1850.h" #include "crc8_maxim.h" #include "crc8_rohc.h" #include "crc8_wcdma.h" diff --git a/include/etl/crc8_j1850.h b/include/etl/crc8_j1850.h new file mode 100644 index 00000000..723a2952 --- /dev/null +++ b/include/etl/crc8_j1850.h @@ -0,0 +1,79 @@ +///\file + +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2021 John Wellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#ifndef ETL_CRC8_J1850_INCLUDED +#define ETL_CRC8_J1850_INCLUDED + +#include "platform.h" +#include "private/crc_implementation.h" + +///\defgroup SAE J1850 8 bit CRC calculation +///\ingroup crc + +namespace etl +{ +#if ETL_USING_CPP11 && !defined(ETL_CRC_FORCE_CPP03_IMPLEMENTATION) + template + using crc8_j1850_t = etl::crc_type; +#else + template + class crc8_j1850_t : public etl::crc_type + { + public: + + //************************************************************************* + /// Default constructor. + //************************************************************************* + crc8_j1850_t() + { + this->reset(); + } + + //************************************************************************* + /// Constructor from range. + /// \param begin Start of the range. + /// \param end End of the range. + //************************************************************************* + template + crc8_j1850_t(TIterator begin, const TIterator end) + { + this->reset(); + this->add(begin, end); + } + }; +#endif + + typedef etl::crc8_j1850_t<256U> crc8_j1850_t256; + typedef etl::crc8_j1850_t<16U> crc8_j1850_t16; + typedef etl::crc8_j1850_t<4U> crc8_j1850_t4; + typedef crc8_j1850_t256 crc8_j1850; +} + +#endif diff --git a/include/etl/crc8_j1850_zero.h b/include/etl/crc8_j1850_zero.h new file mode 100644 index 00000000..04bd7b55 --- /dev/null +++ b/include/etl/crc8_j1850_zero.h @@ -0,0 +1,79 @@ +///\file + +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2021 John Wellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#ifndef ETL_CRC8_J1850_ZERO_INCLUDED +#define ETL_CRC8_J1850_ZERO_INCLUDED + +#include "platform.h" +#include "private/crc_implementation.h" + +///\defgroup SAE J1850 Zero 8 bit CRC calculation +///\ingroup crc + +namespace etl +{ +#if ETL_USING_CPP11 && !defined(ETL_CRC_FORCE_CPP03_IMPLEMENTATION) + template + using crc8_j1850_zero_t = etl::crc_type; +#else + template + class crc8_j1850_zero_t : public etl::crc_type + { + public: + + //************************************************************************* + /// Default constructor. + //************************************************************************* + crc8_j1850_zero_t() + { + this->reset(); + } + + //************************************************************************* + /// Constructor from range. + /// \param begin Start of the range. + /// \param end End of the range. + //************************************************************************* + template + crc8_j1850_zero_t(TIterator begin, const TIterator end) + { + this->reset(); + this->add(begin, end); + } + }; +#endif + + typedef etl::crc8_j1850_zero_t<256U> crc8_j1850_zero_t256; + typedef etl::crc8_j1850_zero_t<16U> crc8_j1850_zero_t16; + typedef etl::crc8_j1850_zero_t<4U> crc8_j1850_zero_t4; + typedef crc8_j1850_zero_t256 crc8_j1850_zero; +} + +#endif diff --git a/include/etl/private/crc_parameters.h b/include/etl/private/crc_parameters.h index 72cd1ef5..705684c0 100644 --- a/include/etl/private/crc_parameters.h +++ b/include/etl/private/crc_parameters.h @@ -79,6 +79,8 @@ namespace etl typedef crc_parameters crc8_itu_parameters; typedef crc_parameters crc8_maxim_parameters; typedef crc_parameters crc8_wcdma_parameters; + typedef crc_parameters crc8_j1850_parameters; + typedef crc_parameters crc8_j1850_zero_parameters; // 16 bit. typedef crc_parameters crc16_parameters; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4869a7c8..e8afb269 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -98,6 +98,8 @@ add_executable(etl_tests test_crc8_ebu.cpp test_crc8_icode.cpp test_crc8_itu.cpp + test_crc8_j1850_zero.cpp + test_crc8_j1850.cpp test_crc8_maxim.cpp test_crc8_rohc.cpp test_crc8_wcdma.cpp diff --git a/test/test_crc8_j1850.cpp b/test/test_crc8_j1850.cpp new file mode 100644 index 00000000..1b50b14a --- /dev/null +++ b/test/test_crc8_j1850.cpp @@ -0,0 +1,263 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2021 John Wellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#include "unit_test_framework.h" + +#include +#include +#include +#include + +#include "etl/crc8_j1850.h" + +//***************************************************************************** +// The results for these tests were created from http://www.sunshine2k.de/coding/javascript/crc/crc_js.html +//***************************************************************************** + +namespace +{ + SUITE(test_crc_crc8_j1850) + { + //************************************************************************* + // Table size 4 + //************************************************************************* + TEST(test_crc8_j1850_4_constructor) + { + std::string data("123456789"); + + uint8_t crc = etl::crc8_j1850_t4(data.begin(), data.end()); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_4_add_values) + { + std::string data("123456789"); + + etl::crc8_j1850_t4 crc_calculator; + + for (size_t i = 0UL; i < data.size(); ++i) + { + crc_calculator.add(data[i]); + } + + uint8_t crc = crc_calculator; + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_4_add_range) + { + std::string data("123456789"); + + etl::crc8_j1850_t4 crc_calculator; + + crc_calculator.add(data.begin(), data.end()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j18_50_4_add_range_via_iterator) + { + std::string data("123456789"); + + etl::crc8_j1850_t4 crc_calculator; + + std::copy(data.begin(), data.end(), crc_calculator.input()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_4_add_range_endian) + { + std::vector data1 = { 0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U, 0x08U }; + std::vector data2 = { 0x04030201UL, 0x08070605UL }; + std::vector data3 = { 0x08U, 0x07U, 0x06U, 0x05U, 0x04U, 0x03U, 0x02U, 0x01U }; + + uint8_t crc1 = etl::crc8_j1850_t4(data1.begin(), data1.end()); + uint8_t crc2 = etl::crc8_j1850_t4((uint8_t*)&data2[0], (uint8_t*)(&data2[0] + data2.size())); + CHECK_EQUAL(int(crc1), int(crc2)); + + uint8_t crc3 = etl::crc8_j1850_t4(data3.rbegin(), data3.rend()); + CHECK_EQUAL(int(crc1), int(crc3)); + } + + //************************************************************************* + // Table size 16 + //************************************************************************* + TEST(test_crc8_j1850_16_constructor) + { + std::string data("123456789"); + + uint8_t crc = etl::crc8_j1850_t16(data.begin(), data.end()); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_16_add_values) + { + std::string data("123456789"); + + etl::crc8_j1850_t16 crc_calculator; + + for (size_t i = 0UL; i < data.size(); ++i) + { + crc_calculator.add(data[i]); + } + + uint8_t crc = crc_calculator; + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_16_add_range) + { + std::string data("123456789"); + + etl::crc8_j1850_t16 crc_calculator; + + crc_calculator.add(data.begin(), data.end()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_16_add_range_via_iterator) + { + std::string data("123456789"); + + etl::crc8_j1850_t16 crc_calculator; + + std::copy(data.begin(), data.end(), crc_calculator.input()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_16_add_range_endian) + { + std::vector data1 = { 0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U, 0x08U }; + std::vector data2 = { 0x04030201UL, 0x08070605UL }; + std::vector data3 = { 0x08U, 0x07U, 0x06U, 0x05U, 0x04U, 0x03U, 0x02U, 0x01U }; + + uint8_t crc1 = etl::crc8_j1850_t16(data1.begin(), data1.end()); + uint8_t crc2 = etl::crc8_j1850_t16((uint8_t*)&data2[0], (uint8_t*)(&data2[0] + data2.size())); + CHECK_EQUAL(int(crc1), int(crc2)); + + uint8_t crc3 = etl::crc8_j1850_t16(data3.rbegin(), data3.rend()); + CHECK_EQUAL(int(crc1), int(crc3)); + } + + //************************************************************************* + // Table size 256 + //************************************************************************* + TEST(test_crc8_j1850_256_constructor) + { + std::string data("123456789"); + + uint8_t crc = etl::crc8_j1850(data.begin(), data.end()); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_256_add_values) + { + std::string data("123456789"); + + etl::crc8_j1850 crc_calculator; + + for (size_t i = 0UL; i < data.size(); ++i) + { + crc_calculator.add(data[i]); + } + + uint8_t crc = crc_calculator; + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_256_add_range) + { + std::string data("123456789"); + + etl::crc8_j1850 crc_calculator; + + crc_calculator.add(data.begin(), data.end()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_256_add_range_via_iterator) + { + std::string data("123456789"); + + etl::crc8_j1850 crc_calculator; + + std::copy(data.begin(), data.end(), crc_calculator.input()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x4BU, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_256_add_range_endian) + { + std::vector data1 = { 0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U, 0x08U }; + std::vector data2 = { 0x04030201UL, 0x08070605UL }; + std::vector data3 = { 0x08U, 0x07U, 0x06U, 0x05U, 0x04U, 0x03U, 0x02U, 0x01U }; + + uint8_t crc1 = etl::crc8_j1850(data1.begin(), data1.end()); + uint8_t crc2 = etl::crc8_j1850((uint8_t*)&data2[0], (uint8_t*)(&data2[0] + data2.size())); + CHECK_EQUAL(int(crc1), int(crc2)); + + uint8_t crc3 = etl::crc8_j1850(data3.rbegin(), data3.rend()); + CHECK_EQUAL(int(crc1), int(crc3)); + } + }; +} + diff --git a/test/test_crc8_j1850_zero.cpp b/test/test_crc8_j1850_zero.cpp new file mode 100644 index 00000000..3ab0bae3 --- /dev/null +++ b/test/test_crc8_j1850_zero.cpp @@ -0,0 +1,263 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2021 John Wellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#include "unit_test_framework.h" + +#include +#include +#include +#include + +#include "etl/crc8_j1850_zero.h" + +//***************************************************************************** +// The results for these tests were created from http://www.sunshine2k.de/coding/javascript/crc/crc_js.html +//***************************************************************************** + +namespace +{ + SUITE(test_crc_crc8_j1850_zero) + { + //************************************************************************* + // Table size 4 + //************************************************************************* + TEST(test_crc8_j1850_zero_4_constructor) + { + std::string data("123456789"); + + uint8_t crc = etl::crc8_j1850_zero_t4(data.begin(), data.end()); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_4_add_values) + { + std::string data("123456789"); + + etl::crc8_j1850_zero_t4 crc_calculator; + + for (size_t i = 0UL; i < data.size(); ++i) + { + crc_calculator.add(data[i]); + } + + uint8_t crc = crc_calculator; + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_4_add_range) + { + std::string data("123456789"); + + etl::crc8_j1850_zero_t4 crc_calculator; + + crc_calculator.add(data.begin(), data.end()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_4_add_range_via_iterator) + { + std::string data("123456789"); + + etl::crc8_j1850_zero_t4 crc_calculator; + + std::copy(data.begin(), data.end(), crc_calculator.input()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_4_add_range_endian) + { + std::vector data1 = { 0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U, 0x08U }; + std::vector data2 = { 0x04030201UL, 0x08070605UL }; + std::vector data3 = { 0x08U, 0x07U, 0x06U, 0x05U, 0x04U, 0x03U, 0x02U, 0x01U }; + + uint8_t crc1 = etl::crc8_j1850_zero_t4(data1.begin(), data1.end()); + uint8_t crc2 = etl::crc8_j1850_zero_t4((uint8_t*)&data2[0], (uint8_t*)(&data2[0] + data2.size())); + CHECK_EQUAL(int(crc1), int(crc2)); + + uint8_t crc3 = etl::crc8_j1850_zero_t4(data3.rbegin(), data3.rend()); + CHECK_EQUAL(int(crc1), int(crc3)); + } + + //************************************************************************* + // Table size 16 + //************************************************************************* + TEST(test_crc8_j1850_zero_16_constructor) + { + std::string data("123456789"); + + uint8_t crc = etl::crc8_j1850_zero_t16(data.begin(), data.end()); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_16_add_values) + { + std::string data("123456789"); + + etl::crc8_j1850_zero_t16 crc_calculator; + + for (size_t i = 0UL; i < data.size(); ++i) + { + crc_calculator.add(data[i]); + } + + uint8_t crc = crc_calculator; + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_16_add_range) + { + std::string data("123456789"); + + etl::crc8_j1850_zero_t16 crc_calculator; + + crc_calculator.add(data.begin(), data.end()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_16_add_range_via_iterator) + { + std::string data("123456789"); + + etl::crc8_j1850_zero_t16 crc_calculator; + + std::copy(data.begin(), data.end(), crc_calculator.input()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_16_add_range_endian) + { + std::vector data1 = { 0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U, 0x08U }; + std::vector data2 = { 0x04030201UL, 0x08070605UL }; + std::vector data3 = { 0x08U, 0x07U, 0x06U, 0x05U, 0x04U, 0x03U, 0x02U, 0x01U }; + + uint8_t crc1 = etl::crc8_j1850_zero_t16(data1.begin(), data1.end()); + uint8_t crc2 = etl::crc8_j1850_zero_t16((uint8_t*)&data2[0], (uint8_t*)(&data2[0] + data2.size())); + CHECK_EQUAL(int(crc1), int(crc2)); + + uint8_t crc3 = etl::crc8_j1850_zero_t16(data3.rbegin(), data3.rend()); + CHECK_EQUAL(int(crc1), int(crc3)); + } + + //************************************************************************* + // Table size 256 + //************************************************************************* + TEST(test_crc8_j1850_zero_256_constructor) + { + std::string data("123456789"); + + uint8_t crc = etl::crc8_j1850_zero(data.begin(), data.end()); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_256_add_values) + { + std::string data("123456789"); + + etl::crc8_j1850_zero crc_calculator; + + for (size_t i = 0UL; i < data.size(); ++i) + { + crc_calculator.add(data[i]); + } + + uint8_t crc = crc_calculator; + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_256_add_range) + { + std::string data("123456789"); + + etl::crc8_j1850_zero crc_calculator; + + crc_calculator.add(data.begin(), data.end()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_256_add_range_via_iterator) + { + std::string data("123456789"); + + etl::crc8_j1850_zero crc_calculator; + + std::copy(data.begin(), data.end(), crc_calculator.input()); + + uint8_t crc = crc_calculator.value(); + + CHECK_EQUAL(0x37U, int(crc)); + } + + //************************************************************************* + TEST(test_crc8_j1850_zero_256_add_range_endian) + { + std::vector data1 = { 0x01U, 0x02U, 0x03U, 0x04U, 0x05U, 0x06U, 0x07U, 0x08U }; + std::vector data2 = { 0x04030201UL, 0x08070605UL }; + std::vector data3 = { 0x08U, 0x07U, 0x06U, 0x05U, 0x04U, 0x03U, 0x02U, 0x01U }; + + uint8_t crc1 = etl::crc8_j1850_zero(data1.begin(), data1.end()); + uint8_t crc2 = etl::crc8_j1850_zero((uint8_t*)&data2[0], (uint8_t*)(&data2[0] + data2.size())); + CHECK_EQUAL(int(crc1), int(crc2)); + + uint8_t crc3 = etl::crc8_j1850_zero(data3.rbegin(), data3.rend()); + CHECK_EQUAL(int(crc1), int(crc3)); + } + }; +} + From 279a59fa5951d5330845cf3f10f717a17986da51 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 18 Jan 2024 08:57:50 +0000 Subject: [PATCH 032/131] Added syntax checks for crc8_j1850 & crc8_j1850_zero --- test/syntax_check/c++03/CMakeLists.txt | 6 +++ test/syntax_check/c++11/CMakeLists.txt | 6 +++ test/syntax_check/c++14/CMakeLists.txt | 6 +++ test/syntax_check/c++17/CMakeLists.txt | 6 +++ test/syntax_check/c++20/CMakeLists.txt | 6 +++ test/syntax_check/crc8_j1850.h.t.cpp | 29 ++++++++++++++ test/syntax_check/crc8_j1850_zero.h.t.cpp | 29 ++++++++++++++ test/vs2022/etl.vcxproj | 32 +++++++++++++++ test/vs2022/etl.vcxproj.filters | 48 ++++++++++++++++++++--- 9 files changed, 162 insertions(+), 6 deletions(-) create mode 100644 test/syntax_check/crc8_j1850.h.t.cpp create mode 100644 test/syntax_check/crc8_j1850_zero.h.t.cpp diff --git a/test/syntax_check/c++03/CMakeLists.txt b/test/syntax_check/c++03/CMakeLists.txt index 0b63c6b2..7a425be1 100644 --- a/test/syntax_check/c++03/CMakeLists.txt +++ b/test/syntax_check/c++03/CMakeLists.txt @@ -38,6 +38,10 @@ set_target_properties(t98 PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ON ) +target_compile_options(t98 + PRIVATE + -fsyntax-only + ) target_sources(t98 PRIVATE etl_profile.h ../absolute.h.t.cpp ../algorithm.h.t.cpp @@ -123,6 +127,8 @@ target_sources(t98 PRIVATE etl_profile.h ../crc8_maxim.h.t.cpp ../crc8_rohc.h.t.cpp ../crc8_wcdma.h.t.cpp + ../crc8_j1850.h.t.cpp + ../crc8_j1850_zero.h.t.cpp ../cyclic_value.h.t.cpp ../debounce.h.t.cpp ../debug_count.h.t.cpp diff --git a/test/syntax_check/c++11/CMakeLists.txt b/test/syntax_check/c++11/CMakeLists.txt index 72900939..29dc304e 100644 --- a/test/syntax_check/c++11/CMakeLists.txt +++ b/test/syntax_check/c++11/CMakeLists.txt @@ -38,6 +38,10 @@ set_target_properties(t11 PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ON ) +target_compile_options(t11 + PRIVATE + -fsyntax-only + ) target_sources(t11 PRIVATE etl_profile.h ../absolute.h.t.cpp ../algorithm.h.t.cpp @@ -123,6 +127,8 @@ target_sources(t11 PRIVATE etl_profile.h ../crc8_maxim.h.t.cpp ../crc8_rohc.h.t.cpp ../crc8_wcdma.h.t.cpp + ../crc8_j1850.h.t.cpp + ../crc8_j1850_zero.h.t.cpp ../cyclic_value.h.t.cpp ../debounce.h.t.cpp ../debug_count.h.t.cpp diff --git a/test/syntax_check/c++14/CMakeLists.txt b/test/syntax_check/c++14/CMakeLists.txt index e9fb7a4e..9df6214c 100644 --- a/test/syntax_check/c++14/CMakeLists.txt +++ b/test/syntax_check/c++14/CMakeLists.txt @@ -38,6 +38,10 @@ set_target_properties(t14 PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ON ) +target_compile_options(t14 + PRIVATE + -fsyntax-only + ) target_sources(t14 PRIVATE etl_profile.h ../absolute.h.t.cpp ../algorithm.h.t.cpp @@ -123,6 +127,8 @@ target_sources(t14 PRIVATE etl_profile.h ../crc8_maxim.h.t.cpp ../crc8_rohc.h.t.cpp ../crc8_wcdma.h.t.cpp + ../crc8_j1850.h.t.cpp + ../crc8_j1850_zero.h.t.cpp ../cyclic_value.h.t.cpp ../debounce.h.t.cpp ../debug_count.h.t.cpp diff --git a/test/syntax_check/c++17/CMakeLists.txt b/test/syntax_check/c++17/CMakeLists.txt index 4ab127ce..6be7bb03 100644 --- a/test/syntax_check/c++17/CMakeLists.txt +++ b/test/syntax_check/c++17/CMakeLists.txt @@ -38,6 +38,10 @@ set_target_properties(t17 PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ON ) +target_compile_options(t17 + PRIVATE + -fsyntax-only + ) target_sources(t17 PRIVATE etl_profile.h ../absolute.h.t.cpp ../algorithm.h.t.cpp @@ -123,6 +127,8 @@ target_sources(t17 PRIVATE etl_profile.h ../crc8_maxim.h.t.cpp ../crc8_rohc.h.t.cpp ../crc8_wcdma.h.t.cpp + ../crc8_j1850.h.t.cpp + ../crc8_j1850_zero.h.t.cpp ../cyclic_value.h.t.cpp ../debounce.h.t.cpp ../debug_count.h.t.cpp diff --git a/test/syntax_check/c++20/CMakeLists.txt b/test/syntax_check/c++20/CMakeLists.txt index f5046f87..6c36b9d5 100644 --- a/test/syntax_check/c++20/CMakeLists.txt +++ b/test/syntax_check/c++20/CMakeLists.txt @@ -38,6 +38,10 @@ set_target_properties(t20 PROPERTIES CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ON ) +target_compile_options(t20 + PRIVATE + -fsyntax-only + ) target_sources(t20 PRIVATE etl_profile.h ../absolute.h.t.cpp ../algorithm.h.t.cpp @@ -123,6 +127,8 @@ target_sources(t20 PRIVATE etl_profile.h ../crc8_maxim.h.t.cpp ../crc8_rohc.h.t.cpp ../crc8_wcdma.h.t.cpp + ../crc8_j1850.h.t.cpp + ../crc8_j1850_zero.h.t.cpp ../cyclic_value.h.t.cpp ../debounce.h.t.cpp ../debug_count.h.t.cpp diff --git a/test/syntax_check/crc8_j1850.h.t.cpp b/test/syntax_check/crc8_j1850.h.t.cpp new file mode 100644 index 00000000..5e16709f --- /dev/null +++ b/test/syntax_check/crc8_j1850.h.t.cpp @@ -0,0 +1,29 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2024 John Wellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#include diff --git a/test/syntax_check/crc8_j1850_zero.h.t.cpp b/test/syntax_check/crc8_j1850_zero.h.t.cpp new file mode 100644 index 00000000..ec892d09 --- /dev/null +++ b/test/syntax_check/crc8_j1850_zero.h.t.cpp @@ -0,0 +1,29 @@ +/****************************************************************************** +The MIT License(MIT) + +Embedded Template Library. +https://github.com/ETLCPP/etl +https://www.etlcpp.com + +Copyright(c) 2024 John Wellbelove + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +******************************************************************************/ + +#include diff --git a/test/vs2022/etl.vcxproj b/test/vs2022/etl.vcxproj index 4c18142c..46b7b05c 100644 --- a/test/vs2022/etl.vcxproj +++ b/test/vs2022/etl.vcxproj @@ -2994,6 +2994,8 @@ + + @@ -4735,6 +4737,34 @@ true true + + true + true + true + true + true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true + true + true + true + true + true true @@ -7354,6 +7384,8 @@ + + diff --git a/test/vs2022/etl.vcxproj.filters b/test/vs2022/etl.vcxproj.filters index 2adfa862..cad865ea 100644 --- a/test/vs2022/etl.vcxproj.filters +++ b/test/vs2022/etl.vcxproj.filters @@ -1389,6 +1389,12 @@ ETL\Maths\CRC + + ETL\Maths\CRC + + + ETL\Maths\CRC + @@ -3284,6 +3290,18 @@ Tests\CRC + + Tests\Syntax Checks\Source + + + Tests\Syntax Checks\Source + + + Tests\CRC + + + Tests\CRC + @@ -3340,12 +3358,6 @@ Resource Files\CI\Appveyor - - Resource Files\CI\Github - - - Resource Files\CI\Github - Resource Files @@ -3412,6 +3424,30 @@ Tests\Scripts + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + + + Resource Files\CI\Github + From 47d3d67a147404f268fd32e5c6cb5829d30aab31 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 18 Jan 2024 09:54:07 +0000 Subject: [PATCH 033/131] Modified definition of bitset::Storage_Type for compatibility with C++03 --- include/etl/private/bitset_new.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 8c341eba..6c6d2443 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -1820,7 +1820,11 @@ namespace etl static ETL_CONSTANT size_t Size = Active_Bits; static ETL_CONSTANT size_t Allocated_Bits = Number_Of_Elements * Bits_Per_Element; - static ETL_CONSTANT etl::bitset_storage_model Storage_Model = (Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; +#if ETL_USING_CPP11 + static ETL_CONSTANT etl::bitset_storage_model Storage_Model = (bitset_common::Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; +#else + static ETL_CONSTANT etl::bitset_storage_model Storage_Model; +#endif typedef etl::span span_type; typedef etl::span const_span_type; @@ -1841,8 +1845,13 @@ namespace etl template ETL_CONSTANT size_t bitset_common::Size; +#if ETL_USING_CPP11 template ETL_CONSTANT etl::bitset_storage_model bitset_common::Storage_Model; +#else + template + ETL_CONSTANT etl::bitset_storage_model bitset_common::Storage_Model = (bitset_common::Number_Of_Elements == 1U) ? etl::bitset_storage_model::Single : etl::bitset_storage_model::Multi; +#endif template ETL_CONSTANT size_t bitset_common::Top_Mask_Shift; From 1825c545705c7af03dd91a5b8303191fcecfe8cf Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 20 Jan 2024 09:44:51 +0000 Subject: [PATCH 034/131] Minor C++ standards compatibility tweaks --- include/etl/private/bitset_new.h | 44 ++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 6c6d2443..6d653298 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -459,7 +459,7 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -484,9 +484,13 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. //************************************************************************* +#if ETL_USING_CPP11 template ::bits> +#else + template +#endif ETL_CONSTEXPR14 static T extract(const_pointer pbuffer) @@ -1309,7 +1313,7 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. /// Run time position and length. //************************************************************************* template @@ -1387,7 +1391,7 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -1409,7 +1413,7 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. //************************************************************************* template ETL_CONSTEXPR14 @@ -1875,9 +1879,9 @@ namespace etl { public: - typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::element_type element_type; - typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::span_type span_type; - typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::const_span_type const_span_type; + typedef etl::private_bitset::bitset_common<0U, unsigned char>::element_type element_type; + typedef etl::private_bitset::bitset_common<0U, unsigned char>::span_type span_type; + typedef etl::private_bitset::bitset_common<0U, unsigned char>::const_span_type const_span_type; using etl::private_bitset::bitset_common<0U, unsigned char>::Bits_Per_Element; using etl::private_bitset::bitset_common<0U, unsigned char>::All_Set_Element; @@ -2226,7 +2230,7 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. /// Run time position and length. //************************************************************************* template @@ -2242,10 +2246,14 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. /// Compile time position and length. //************************************************************************* - template ::bits> +#if ETL_USING_CPP11 + template ::bits> +#else + template +#endif ETL_CONSTEXPR14 T extract() const { @@ -2791,9 +2799,9 @@ namespace etl { public: - typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::element_type element_type; - typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::span_type span_type; - typedef typename etl::private_bitset::bitset_common<0U, unsigned char>::const_span_type const_span_type; + typedef etl::private_bitset::bitset_common<0U, unsigned char>::element_type element_type; + typedef etl::private_bitset::bitset_common<0U, unsigned char>::span_type span_type; + typedef etl::private_bitset::bitset_common<0U, unsigned char>::const_span_type const_span_type; using etl::private_bitset::bitset_common<0U, unsigned char>::Bits_Per_Element; using etl::private_bitset::bitset_common<0U, unsigned char>::All_Set_Element; @@ -3219,7 +3227,7 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. /// Run time position and length. //************************************************************************* template @@ -3235,10 +3243,14 @@ namespace etl } //************************************************************************* - /// Extract an integral value from an arbitary position and length. + /// Extract an integral value from an arbitrary position and length. /// Compile time position and length. //************************************************************************* +#if ETL_USING_CPP11 template ::bits> +#else + template +#endif ETL_CONSTEXPR14 T extract() const { From 83e23b9adf4d17b819262fb707e8c975ac11f039 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 20 Jan 2024 10:08:15 +0000 Subject: [PATCH 035/131] Fix C++ standard syntax compatibility for repair() --- include/etl/circular_buffer.h | 14 +++++--------- include/etl/deque.h | 8 +++----- include/etl/platform.h | 9 +++++++++ include/etl/string.h | 10 ++++++---- include/etl/u16string.h | 10 ++++++---- include/etl/u32string.h | 10 ++++++---- include/etl/u8string.h | 10 ++++++---- include/etl/vector.h | 21 +++++++++++---------- include/etl/wstring.h | 10 ++++++---- 9 files changed, 58 insertions(+), 44 deletions(-) diff --git a/include/etl/circular_buffer.h b/include/etl/circular_buffer.h index a099ca4a..f57d863d 100644 --- a/include/etl/circular_buffer.h +++ b/include/etl/circular_buffer.h @@ -1208,11 +1208,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() -#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - ETL_OVERRIDE #endif { ETL_ASSERT(etl::is_trivially_copyable::value, ETL_ERROR(etl::circular_buffer_incompatible_type)); @@ -1395,11 +1393,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - virtual -#endif - void repair() -#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/deque.h b/include/etl/deque.h index 8a11063e..5586360a 100644 --- a/include/etl/deque.h +++ b/include/etl/deque.h @@ -2483,11 +2483,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_IDEQUE_REPAIR_ENABLE - virtual -#endif - void repair() -#ifdef ETL_IDEQUE_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED diff --git a/include/etl/platform.h b/include/etl/platform.h index 294ee7cf..a9170c6f 100644 --- a/include/etl/platform.h +++ b/include/etl/platform.h @@ -202,6 +202,14 @@ SOFTWARE. #define ETL_HAS_IDEQUE_REPAIR 0 #endif +//************************************* +// Option to enable repair-after-memcpy for icircular_buffer. +#if defined(ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE) +#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 1 +#else +#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 0 +#endif + //************************************* // Indicate if C++ exceptions are enabled. #if defined(ETL_THROW_EXCEPTIONS) @@ -479,6 +487,7 @@ namespace etl static ETL_CONSTANT bool has_string_clear_after_use = (ETL_HAS_STRING_CLEAR_AFTER_USE == 1); static ETL_CONSTANT bool has_istring_repair = (ETL_HAS_ISTRING_REPAIR == 1); static ETL_CONSTANT bool has_ivector_repair = (ETL_HAS_IVECTOR_REPAIR == 1); + static ETL_CONSTANT bool has_icircular_buffer_repair = (ETL_HAS_ICIRCULAR_BUFFER_REPAIR == 1); static ETL_CONSTANT bool has_mutable_array_view = (ETL_HAS_MUTABLE_ARRAY_VIEW == 1); static ETL_CONSTANT bool has_ideque_repair = (ETL_HAS_IDEQUE_REPAIR == 1); static ETL_CONSTANT bool has_virtual_messages = (ETL_HAS_VIRTUAL_MESSAGES == 1); diff --git a/include/etl/string.h b/include/etl/string.h index 5f925337..1fbc19d2 100644 --- a/include/etl/string.h +++ b/include/etl/string.h @@ -246,9 +246,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::istring::repair_buffer(buffer); @@ -434,9 +435,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u16string.h b/include/etl/u16string.h index 2c100c8b..c0fea3a2 100644 --- a/include/etl/u16string.h +++ b/include/etl/u16string.h @@ -230,9 +230,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu16string::repair_buffer(buffer); @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u32string.h b/include/etl/u32string.h index 88d0ed44..766a0cbc 100644 --- a/include/etl/u32string.h +++ b/include/etl/u32string.h @@ -230,9 +230,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu32string::repair_buffer(buffer); @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u8string.h b/include/etl/u8string.h index 9d8b9458..015ef3c1 100644 --- a/include/etl/u8string.h +++ b/include/etl/u8string.h @@ -247,9 +247,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu8string::repair_buffer(buffer); @@ -435,9 +436,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/vector.h b/include/etl/vector.h index af236dc7..4150c443 100644 --- a/include/etl/vector.h +++ b/include/etl/vector.h @@ -1346,11 +1346,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_IVECTOR_REPAIR_ENABLE - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() -#ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE #endif { ETL_ASSERT_OR_RETURN(etl::is_trivially_copyable::value, ETL_ERROR(etl::vector_incompatible_type)); @@ -1527,9 +1525,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } @@ -1649,9 +1648,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::ivector::repair_buffer(buffer); @@ -1806,9 +1806,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::ivector::repair_buffer(this->p_buffer); diff --git a/include/etl/wstring.h b/include/etl/wstring.h index 20ce4ac4..683359de 100644 --- a/include/etl/wstring.h +++ b/include/etl/wstring.h @@ -231,9 +231,10 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #if ETL_HAS_ISTRING_REPAIR - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() +#endif { etl::iwstring::repair_buffer(buffer); } @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } From db878c54c598abc90bc543fd9bb9f3b7641f6875 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 20 Jan 2024 10:08:15 +0000 Subject: [PATCH 036/131] Fix C++ standard syntax compatibility for repair() --- include/etl/circular_buffer.h | 14 +++++--------- include/etl/deque.h | 8 +++----- include/etl/platform.h | 9 +++++++++ include/etl/string.h | 10 ++++++---- include/etl/u16string.h | 10 ++++++---- include/etl/u32string.h | 10 ++++++---- include/etl/u8string.h | 10 ++++++---- include/etl/vector.h | 21 +++++++++++---------- include/etl/wstring.h | 10 ++++++---- 9 files changed, 58 insertions(+), 44 deletions(-) diff --git a/include/etl/circular_buffer.h b/include/etl/circular_buffer.h index a099ca4a..f57d863d 100644 --- a/include/etl/circular_buffer.h +++ b/include/etl/circular_buffer.h @@ -1208,11 +1208,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() -#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - ETL_OVERRIDE #endif { ETL_ASSERT(etl::is_trivially_copyable::value, ETL_ERROR(etl::circular_buffer_incompatible_type)); @@ -1395,11 +1393,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - virtual -#endif - void repair() -#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/deque.h b/include/etl/deque.h index 8a11063e..5586360a 100644 --- a/include/etl/deque.h +++ b/include/etl/deque.h @@ -2483,11 +2483,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_IDEQUE_REPAIR_ENABLE - virtual -#endif - void repair() -#ifdef ETL_IDEQUE_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED diff --git a/include/etl/platform.h b/include/etl/platform.h index 360f9027..17c7961d 100644 --- a/include/etl/platform.h +++ b/include/etl/platform.h @@ -202,6 +202,14 @@ SOFTWARE. #define ETL_HAS_IDEQUE_REPAIR 0 #endif +//************************************* +// Option to enable repair-after-memcpy for icircular_buffer. +#if defined(ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE) +#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 1 +#else +#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 0 +#endif + //************************************* // Indicate if C++ exceptions are enabled. #if defined(ETL_THROW_EXCEPTIONS) @@ -477,6 +485,7 @@ namespace etl static ETL_CONSTANT bool has_string_clear_after_use = (ETL_HAS_STRING_CLEAR_AFTER_USE == 1); static ETL_CONSTANT bool has_istring_repair = (ETL_HAS_ISTRING_REPAIR == 1); static ETL_CONSTANT bool has_ivector_repair = (ETL_HAS_IVECTOR_REPAIR == 1); + static ETL_CONSTANT bool has_icircular_buffer_repair = (ETL_HAS_ICIRCULAR_BUFFER_REPAIR == 1); static ETL_CONSTANT bool has_mutable_array_view = (ETL_HAS_MUTABLE_ARRAY_VIEW == 1); static ETL_CONSTANT bool has_ideque_repair = (ETL_HAS_IDEQUE_REPAIR == 1); static ETL_CONSTANT bool has_virtual_messages = (ETL_HAS_VIRTUAL_MESSAGES == 1); diff --git a/include/etl/string.h b/include/etl/string.h index 5f925337..1fbc19d2 100644 --- a/include/etl/string.h +++ b/include/etl/string.h @@ -246,9 +246,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::istring::repair_buffer(buffer); @@ -434,9 +435,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u16string.h b/include/etl/u16string.h index 2c100c8b..c0fea3a2 100644 --- a/include/etl/u16string.h +++ b/include/etl/u16string.h @@ -230,9 +230,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu16string::repair_buffer(buffer); @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u32string.h b/include/etl/u32string.h index 88d0ed44..766a0cbc 100644 --- a/include/etl/u32string.h +++ b/include/etl/u32string.h @@ -230,9 +230,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu32string::repair_buffer(buffer); @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u8string.h b/include/etl/u8string.h index 9d8b9458..015ef3c1 100644 --- a/include/etl/u8string.h +++ b/include/etl/u8string.h @@ -247,9 +247,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu8string::repair_buffer(buffer); @@ -435,9 +436,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/vector.h b/include/etl/vector.h index af236dc7..4150c443 100644 --- a/include/etl/vector.h +++ b/include/etl/vector.h @@ -1346,11 +1346,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_IVECTOR_REPAIR_ENABLE - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() -#ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE #endif { ETL_ASSERT_OR_RETURN(etl::is_trivially_copyable::value, ETL_ERROR(etl::vector_incompatible_type)); @@ -1527,9 +1525,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } @@ -1649,9 +1648,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::ivector::repair_buffer(buffer); @@ -1806,9 +1806,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::ivector::repair_buffer(this->p_buffer); diff --git a/include/etl/wstring.h b/include/etl/wstring.h index 20ce4ac4..683359de 100644 --- a/include/etl/wstring.h +++ b/include/etl/wstring.h @@ -231,9 +231,10 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #if ETL_HAS_ISTRING_REPAIR - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() +#endif { etl::iwstring::repair_buffer(buffer); } @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } From 94ee20e2fdd1f8e7a117fb6a4acc518782eb380c Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 20 Jan 2024 10:08:15 +0000 Subject: [PATCH 037/131] Fix C++ standard syntax compatibility for repair() --- include/etl/circular_buffer.h | 14 +++++--------- include/etl/deque.h | 8 +++----- include/etl/platform.h | 9 +++++++++ include/etl/private/bitset_new.h | 4 ++-- include/etl/string.h | 10 ++++++---- include/etl/u16string.h | 10 ++++++---- include/etl/u32string.h | 10 ++++++---- include/etl/u8string.h | 10 ++++++---- include/etl/vector.h | 21 +++++++++++---------- include/etl/wstring.h | 10 ++++++---- 10 files changed, 60 insertions(+), 46 deletions(-) diff --git a/include/etl/circular_buffer.h b/include/etl/circular_buffer.h index a099ca4a..f57d863d 100644 --- a/include/etl/circular_buffer.h +++ b/include/etl/circular_buffer.h @@ -1208,11 +1208,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() -#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - ETL_OVERRIDE #endif { ETL_ASSERT(etl::is_trivially_copyable::value, ETL_ERROR(etl::circular_buffer_incompatible_type)); @@ -1395,11 +1393,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - virtual -#endif - void repair() -#ifdef ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/deque.h b/include/etl/deque.h index 8a11063e..5586360a 100644 --- a/include/etl/deque.h +++ b/include/etl/deque.h @@ -2483,11 +2483,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_IDEQUE_REPAIR_ENABLE - virtual -#endif - void repair() -#ifdef ETL_IDEQUE_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { #if ETL_CPP11_TYPE_TRAITS_IS_TRIVIAL_SUPPORTED diff --git a/include/etl/platform.h b/include/etl/platform.h index 360f9027..17c7961d 100644 --- a/include/etl/platform.h +++ b/include/etl/platform.h @@ -202,6 +202,14 @@ SOFTWARE. #define ETL_HAS_IDEQUE_REPAIR 0 #endif +//************************************* +// Option to enable repair-after-memcpy for icircular_buffer. +#if defined(ETL_ICIRCULAR_BUFFER_REPAIR_ENABLE) +#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 1 +#else +#define ETL_HAS_ICIRCULAR_BUFFER_REPAIR 0 +#endif + //************************************* // Indicate if C++ exceptions are enabled. #if defined(ETL_THROW_EXCEPTIONS) @@ -477,6 +485,7 @@ namespace etl static ETL_CONSTANT bool has_string_clear_after_use = (ETL_HAS_STRING_CLEAR_AFTER_USE == 1); static ETL_CONSTANT bool has_istring_repair = (ETL_HAS_ISTRING_REPAIR == 1); static ETL_CONSTANT bool has_ivector_repair = (ETL_HAS_IVECTOR_REPAIR == 1); + static ETL_CONSTANT bool has_icircular_buffer_repair = (ETL_HAS_ICIRCULAR_BUFFER_REPAIR == 1); static ETL_CONSTANT bool has_mutable_array_view = (ETL_HAS_MUTABLE_ARRAY_VIEW == 1); static ETL_CONSTANT bool has_ideque_repair = (ETL_HAS_IDEQUE_REPAIR == 1); static ETL_CONSTANT bool has_virtual_messages = (ETL_HAS_VIRTUAL_MESSAGES == 1); diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index 6d653298..1220ef92 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -492,8 +492,8 @@ namespace etl template #endif ETL_CONSTEXPR14 - static - T extract(const_pointer pbuffer) + static + T extract(const_pointer pbuffer) { typedef typename etl::make_unsigned::type unsigned_t; diff --git a/include/etl/string.h b/include/etl/string.h index 5f925337..1fbc19d2 100644 --- a/include/etl/string.h +++ b/include/etl/string.h @@ -246,9 +246,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::istring::repair_buffer(buffer); @@ -434,9 +435,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u16string.h b/include/etl/u16string.h index 2c100c8b..c0fea3a2 100644 --- a/include/etl/u16string.h +++ b/include/etl/u16string.h @@ -230,9 +230,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu16string::repair_buffer(buffer); @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u32string.h b/include/etl/u32string.h index 88d0ed44..766a0cbc 100644 --- a/include/etl/u32string.h +++ b/include/etl/u32string.h @@ -230,9 +230,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu32string::repair_buffer(buffer); @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/u8string.h b/include/etl/u8string.h index 9d8b9458..015ef3c1 100644 --- a/include/etl/u8string.h +++ b/include/etl/u8string.h @@ -247,9 +247,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::iu8string::repair_buffer(buffer); @@ -435,9 +436,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } diff --git a/include/etl/vector.h b/include/etl/vector.h index af236dc7..4150c443 100644 --- a/include/etl/vector.h +++ b/include/etl/vector.h @@ -1346,11 +1346,9 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #ifdef ETL_IVECTOR_REPAIR_ENABLE - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() -#ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE #endif { ETL_ASSERT_OR_RETURN(etl::is_trivially_copyable::value, ETL_ERROR(etl::vector_incompatible_type)); @@ -1527,9 +1525,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } @@ -1649,9 +1648,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::ivector::repair_buffer(buffer); @@ -1806,9 +1806,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #ifdef ETL_IVECTOR_REPAIR_ENABLE - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { etl::ivector::repair_buffer(this->p_buffer); diff --git a/include/etl/wstring.h b/include/etl/wstring.h index 20ce4ac4..683359de 100644 --- a/include/etl/wstring.h +++ b/include/etl/wstring.h @@ -231,9 +231,10 @@ namespace etl /// Fix the internal pointers after a low level memory copy. //************************************************************************* #if ETL_HAS_ISTRING_REPAIR - virtual -#endif + virtual void repair() ETL_OVERRIDE +#else void repair() +#endif { etl::iwstring::repair_buffer(buffer); } @@ -414,9 +415,10 @@ namespace etl //************************************************************************* /// Fix the internal pointers after a low level memory copy. //************************************************************************* - void repair() #if ETL_HAS_ISTRING_REPAIR - ETL_OVERRIDE + virtual void repair() ETL_OVERRIDE +#else + void repair() #endif { } From 5e78b48b6cda8429b493e5b43b18a982307c5ecb Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 20 Jan 2024 18:35:20 +0000 Subject: [PATCH 038/131] #815 etl::remove_if calls predicate twice for first iterator, where predicate returns true. --- include/etl/algorithm.h | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/include/etl/algorithm.h b/include/etl/algorithm.h index dd01415a..a6c96162 100644 --- a/include/etl/algorithm.h +++ b/include/etl/algorithm.h @@ -2021,9 +2021,7 @@ namespace etl template ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T& value) - { - first = etl::find(first, last, value); - + { if (first != last) { TIterator itr = first; @@ -2051,8 +2049,6 @@ namespace etl ETL_CONSTEXPR14 TIterator remove_if(TIterator first, TIterator last, TUnaryPredicate predicate) { - first = etl::find_if(first, last, predicate); - if (first != last) { TIterator itr = first; From 51b10c498c68afed682bb9bf82c93d77e12c7d0d Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sat, 20 Jan 2024 21:03:17 +0000 Subject: [PATCH 039/131] 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) { From 664bdac4bddd105925f8cc7d4b910af4c72d1151 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sun, 21 Jan 2024 15:02:01 +0000 Subject: [PATCH 040/131] Initial refactor --- include/etl/optional.h | 437 +---------------------------------------- 1 file changed, 1 insertion(+), 436 deletions(-) diff --git a/include/etl/optional.h b/include/etl/optional.h index d85763d2..c638427c 100644 --- a/include/etl/optional.h +++ b/include/etl/optional.h @@ -103,15 +103,8 @@ namespace etl /// See http://en.cppreference.com/w/cpp/utility/optional ///\tparam T The type to store. ///\ingroup utilities - //***************************************************************************** - template ::value> - class optional; - - //***************************************************************************** - /// For non POD types. - //***************************************************************************** template - class optional + class optional { public: @@ -682,434 +675,6 @@ namespace etl storage_type storage; }; - //***************************************************************************** - /// For arithmetic or pointer types. - ///\tparam T The type to store. - ///\ingroup utilities - //***************************************************************************** - template - class optional - { - public: - - typedef T value_type; - - //*************************************************************************** - /// Constructor. - //*************************************************************************** - ETL_CONSTEXPR14 optional() - : valid(false) - , storage() - { - } - - //*************************************************************************** - /// Constructor with nullopt. - //*************************************************************************** - ETL_CONSTEXPR14 optional(etl::nullopt_t) - : valid(false) - , storage() - { - } - - //*************************************************************************** - /// Copy constructor. - //*************************************************************************** - ETL_CONSTEXPR14 optional(const optional& other) - : valid(bool(other)) - , storage(other.storage) - { - } - -#if ETL_USING_CPP11 - //*************************************************************************** - /// Move constructor. - //*************************************************************************** - ETL_CONSTEXPR14 optional(optional&& other) - : valid(bool(other)) - , storage(etl::move(other.storage)) - { - } -#endif - - //*************************************************************************** - /// Constructor from value type. - //*************************************************************************** - ETL_CONSTEXPR14 optional(const T& value_) - : valid(true) - , storage(value_) - { - } - -#if ETL_USING_CPP11 - //*************************************************************************** - /// Constructor from value type. - //*************************************************************************** - ETL_CONSTEXPR14 optional(T&& value_) - : valid(true) - , storage(etl::move(value_)) - { - } -#endif - - //*************************************************************************** - /// Assignment operator from nullopt. - //*************************************************************************** - ETL_CONSTEXPR14 optional& operator =(etl::nullopt_t) - { - valid = false; - return *this; - } - - //*************************************************************************** - /// Assignment operator from optional. - //*************************************************************************** - ETL_CONSTEXPR14 optional& operator =(const optional& other) - { - if (this != &other) - { - storage.value = other.storage.value; - valid = other.valid; - } - - return *this; - } - -#if ETL_USING_CPP11 - //*************************************************************************** - /// Assignment operator from optional. - //*************************************************************************** - ETL_CONSTEXPR14 optional& operator =(optional&& other) - { - if (this != &other) - { - storage.value = etl::move(other.storage.value); - valid = other.valid; - } - - return *this; - } -#endif - - //*************************************************************************** - /// Assignment operator from value type. - //*************************************************************************** - ETL_CONSTEXPR14 optional& operator =(const T& value_) - { - storage.value = value_; - valid = true; - - return *this; - } - -#if ETL_USING_CPP11 - //*************************************************************************** - /// Assignment operator from value type. - //*************************************************************************** - ETL_CONSTEXPR14 optional& operator =(T&& value_) - { - storage.value = etl::move(value_); - valid = true; - - return *this; - } -#endif - - //*************************************************************************** - /// Pointer operator. - //*************************************************************************** - ETL_CONSTEXPR14 T* operator ->() - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return &storage.value; - } - - //*************************************************************************** - /// Pointer operator. - //*************************************************************************** - ETL_CONSTEXPR14 const T* operator ->() const - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return &storage.value; - } - - //*************************************************************************** - /// Dereference operator. - //*************************************************************************** - ETL_CONSTEXPR14 T& operator *() ETL_LVALUE_REF_QUALIFIER - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return storage.value; - } - - //*************************************************************************** - /// Dereference operator. - //*************************************************************************** - ETL_CONSTEXPR14 const T& operator *() const ETL_LVALUE_REF_QUALIFIER - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return storage.value; - } - -#if ETL_USING_CPP11 - //*************************************************************************** - /// Dereference operator. - //*************************************************************************** - ETL_CONSTEXPR14 T&& operator *()&& - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return etl::move(storage.value); - } - - //*************************************************************************** - /// Dereference operator. - //*************************************************************************** - ETL_CONSTEXPR14 const T&& operator *() const&& - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return etl::move(storage.value); - } -#endif - - //*************************************************************************** - /// Bool conversion operator. - //*************************************************************************** - ETL_CONSTEXPR14 - ETL_EXPLICIT operator bool() const - { - return valid; - } - - //*************************************************************************** - // Check whether optional contains value - //*************************************************************************** - ETL_CONSTEXPR14 bool has_value() const ETL_NOEXCEPT - { - return valid; - } - - //*************************************************************************** - /// Get a reference to the value. - //*************************************************************************** - ETL_CONSTEXPR14 T& value() ETL_LVALUE_REF_QUALIFIER - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return storage.value; - } - - //*************************************************************************** - /// Get a const reference to the value. - //*************************************************************************** - ETL_CONSTEXPR14 const T& value() const ETL_LVALUE_REF_QUALIFIER - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return storage.value; - } - - //*************************************************************************** - /// Gets the value or a default if no valid. - //*************************************************************************** - ETL_CONSTEXPR14 T value_or(const T& default_value) const ETL_LVALUE_REF_QUALIFIER - { - return valid ? value() : default_value; - } - -#if ETL_USING_CPP11 - //*************************************************************************** - /// Get an rvalue reference to the value. - //*************************************************************************** - ETL_CONSTEXPR14 T&& value()&& - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return etl::move(storage.value); - } - - //*************************************************************************** - /// Get a const rvalue reference to the value. - //*************************************************************************** - ETL_CONSTEXPR14 const T&& value() const&& - { -#if ETL_IS_DEBUG_BUILD - ETL_ASSERT(valid, ETL_ERROR(optional_invalid)); -#endif - - return etl::move(storage.value); - } - - //*************************************************************************** - /// Gets the value or a default if not valid. - //*************************************************************************** - template - ETL_CONSTEXPR20_STL - etl::enable_if_t::value, T> - value_or(U&& default_value) const& - { - if (has_value()) - { - return value(); - } - else - { - return static_cast(etl::forward(default_value)); - } - } - - //*************************************************************************** - /// Gets the value or a default if not valid. - //*************************************************************************** - template - ETL_CONSTEXPR20_STL - etl::enable_if_t::value, T> - value_or(U&& default_value) && - { - if (has_value()) - { - return etl::move(value()); - } - else - { - return static_cast(etl::forward(default_value)); - } - } -#endif - - //*************************************************************************** - /// Swaps this value with another. - //*************************************************************************** - ETL_CONSTEXPR14 void swap(optional& other) - { - optional temp(*this); - *this = other; - other = temp; - } - - //*************************************************************************** - /// Reset back to invalid. - //*************************************************************************** - ETL_CONSTEXPR14 void reset() - { - valid = false; - } - -#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT && !defined(ETL_OPTIONAL_FORCE_CPP03_IMPLEMENTATION) - //************************************************************************* - /// Emplaces a value. - ///\param args The arguments to construct with. - //************************************************************************* - template - ETL_CONSTEXPR14 void emplace(Args && ... args) - { - storage.value = T(ETL_OR_STD::forward(args)...); - valid = true; - } -#else - //************************************************************************* - /// Emplaces a value. - /// 0 parameters. - //************************************************************************* - void emplace() - { - storage.value = value_type(); - valid = true; - } - - //************************************************************************* - /// Emplaces a value. - /// 1 parameter. - //************************************************************************* - template - void emplace(const T1& value1) - { - storage.value = value1; - valid = true; - } - - //************************************************************************* - /// Emplaces a value. - /// 2 parameters. - //************************************************************************* - template - void emplace(const T1& value1, const T2& value2) - { - storage.value = T(value1, value2); - valid = true; - } - - //************************************************************************* - /// Emplaces a value. - /// 3 parameters. - //************************************************************************* - template - void emplace(const T1& value1, const T2& value2, const T3& value3) - { - storage.value = T(value1, value2, value3); - valid = true; - } - - //************************************************************************* - /// Emplaces a value. - /// 4 parameters. - //************************************************************************* - template - void emplace(const T1& value1, const T2& value2, const T3& value3, const T4& value4) - { - storage.value = T(value1, value2, value3, value4); - valid = true; - } -#endif - - private: - - bool valid; - - struct dummy_t {}; - - union storage_type - { - dummy_t dummy; - T value; - - ETL_CONSTEXPR storage_type() - : dummy() - { - } - - ETL_CONSTEXPR storage_type(const T& v) - : value(v) - { - } - }; - - storage_type storage; - }; - #include "private/diagnostic_uninitialized_push.h" //*************************************************************************** From 1a0036366ddd43a13c8fd71af51e10c89b70241c Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sun, 21 Jan 2024 15:41:50 +0000 Subject: [PATCH 041/131] Added test for #819 --- test/test_optional.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/test_optional.cpp b/test/test_optional.cpp index 8f07862b..a6bbc650 100644 --- a/test/test_optional.cpp +++ b/test/test_optional.cpp @@ -629,6 +629,21 @@ namespace CHECK_EQUAL(42, (*opt).v); } #endif + + //************************************************************************* + TEST(test_optional_issue_819) + { + // The code below should compile without error. + class optional_type + { + public: + + static etl::optional function() + { + return {}; + } + }; + } }; } From d2c7a206e7820fc13c6dd620c7756e34aec4c469 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Tue, 23 Jan 2024 13:43:57 +0000 Subject: [PATCH 042/131] Removed AVR STL implementation from support --- support/avr-stl-1.1.1.zip | Bin 202024 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 support/avr-stl-1.1.1.zip diff --git a/support/avr-stl-1.1.1.zip b/support/avr-stl-1.1.1.zip deleted file mode 100644 index 335f511a109a208dcf383688cfefcd765a462a6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202024 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¬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

@?+K}xtKyMfS#XbxaleG!VXgvDJu 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 From 77513730e09b742a2fc9ad5ecb0ebb7b78b54a7f Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 25 Jan 2024 14:22:26 +0000 Subject: [PATCH 043/131] Fixed shadow warnings in all files #823 Multiple variable shadowing warnings in private/bitset_new.h --- include/etl/basic_string_stream.h | 68 +++---- include/etl/byte_stream.h | 48 ++--- include/etl/frame_check_sequence.h | 2 +- include/etl/fsm.h | 4 +- include/etl/generators/fsm_generator.h | 4 +- .../etl/generators/message_router_generator.h | 12 +- include/etl/message_broker.h | 4 +- include/etl/message_bus.h | 22 +-- include/etl/message_router.h | 12 +- include/etl/multi_range.h | 14 +- include/etl/private/bitset_legacy.h | 2 +- include/etl/private/bitset_new.h | 102 +++++++---- include/etl/queue_spsc_locked.h | 6 +- include/etl/radix.h | 20 +-- include/etl/to_arithmetic.h | 6 +- include/etl/unordered_map.h | 22 +-- include/etl/unordered_multimap.h | 28 +-- include/etl/unordered_multiset.h | 28 +-- include/etl/unordered_set.h | 32 ++-- test/CMakeLists.txt | 2 + test/UnitTest++/CheckMacros.h | 40 ++--- test/UnitTest++/ExecuteTest.h | 8 +- test/run-tests.sh | 2 +- test/test_algorithm.cpp | 6 +- test/test_bitset_new_default_element_type.cpp | 12 +- ...itset_new_explicit_single_element_type.cpp | 12 +- ...st_bitset_new_ext_default_element_type.cpp | 17 +- ...t_new_ext_explicit_single_element_type.cpp | 20 +-- test/test_callback_service.cpp | 24 +-- test/test_callback_timer.cpp | 82 ++++----- test/test_callback_timer_atomic.cpp | 82 ++++----- test/test_callback_timer_interrupt.cpp | 74 ++++---- test/test_callback_timer_locked.cpp | 82 ++++----- test/test_circular_buffer_external_buffer.cpp | 63 ++++++- test/test_circular_iterator.cpp | 40 ++--- test/test_compare.cpp | 18 +- test/test_delegate.cpp | 166 +++++++++--------- test/test_delegate_cpp03.cpp | 106 +++++------ test/test_delegate_service.cpp | 24 +-- test/test_delegate_service_compile_time.cpp | 8 +- test/test_delegate_service_cpp03.cpp | 10 +- test/test_deque.cpp | 133 +++++++------- test/test_fixed_iterator.cpp | 14 +- test/test_function.cpp | 66 +++---- test/test_indirect_vector.cpp | 8 +- test/test_indirect_vector_external_buffer.cpp | 8 +- test/test_intrusive_forward_list.cpp | 58 +++--- test/test_memory.cpp | 38 ++-- test/test_parameter_type.cpp | 18 +- test/test_pool.cpp | 4 +- test/test_pool_external_buffer.cpp | 4 +- test/test_set.cpp | 9 +- test/test_shared_message.cpp | 50 +++--- test/test_type_traits.cpp | 6 +- test/test_vector.cpp | 4 +- test/test_vector_external_buffer.cpp | 4 +- test/test_vector_non_trivial.cpp | 3 - test/vs2022/etl.vcxproj | 24 +-- 58 files changed, 928 insertions(+), 857 deletions(-) diff --git a/include/etl/basic_string_stream.h b/include/etl/basic_string_stream.h index e91ee1fe..2b466055 100644 --- a/include/etl/basic_string_stream.h +++ b/include/etl/basic_string_stream.h @@ -58,28 +58,28 @@ namespace etl } //************************************************************************* - /// Construct from text and format spec. + /// Construct from text and format fmt. //************************************************************************* basic_string_stream(TIString& text_, const TFormat& spec_) : text(text_) - , spec(spec_) + , format(spec_) { } //************************************************************************* - /// Set the format spec. + /// Set the format fmt. //************************************************************************* void set_format(const TFormat& spec_) { - spec = spec_; + format = spec_; } //************************************************************************* - /// Get a const reference to the format spec. + /// Get a const reference to the format fmt. //************************************************************************* const TFormat& get_format() const { - return spec; + return format; } //************************************************************************* @@ -121,27 +121,27 @@ namespace etl //********************************* /// TFormat //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, const TFormat& spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, const TFormat& fmt) { - ss.spec = spec; + ss.format = fmt; return ss; } //********************************* /// etl::base_spec from etl::setbase, etl::bin, etl::oct, etl::dec & etl::hex stream manipulators //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::base_spec spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::base_spec fmt) { - ss.spec.base(spec.base); + ss.format.base(fmt.base); return ss; } //********************************* /// etl::width_spec from etl::setw stream manipulator //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::width_spec spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::width_spec fmt) { - ss.spec.width(spec.width); + ss.format.width(fmt.width); return ss; } @@ -149,63 +149,63 @@ namespace etl /// etl::fill_spec from etl::setfill stream manipulator //********************************* template - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::fill_spec spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::fill_spec fmt) { - ss.spec.fill(spec.fill); + ss.format.fill(fmt.fill); return ss; } //********************************* /// etl::precision_spec from etl::setprecision stream manipulator //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::precision_spec spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::precision_spec fmt) { - ss.spec.precision(spec.precision); + ss.format.precision(fmt.precision); return ss; } //********************************* /// etl::boolalpha_spec from etl::boolalpha & etl::noboolalpha stream manipulators //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::boolalpha_spec spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::boolalpha_spec fmt) { - ss.spec.boolalpha(spec.boolalpha); + ss.format.boolalpha(fmt.boolalpha); return ss; } //********************************* /// etl::uppercase_spec from etl::uppercase & etl::nouppercase stream manipulators //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::uppercase_spec spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::uppercase_spec fmt) { - ss.spec.upper_case(spec.upper_case); + ss.format.upper_case(fmt.upper_case); return ss; } //********************************* /// etl::showbase_spec from etl::showbase & etl::noshowbase stream manipulators //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::showbase_spec spec) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::showbase_spec fmt) { - ss.spec.show_base(spec.show_base); + ss.format.show_base(fmt.show_base); return ss; } //********************************* /// etl::left_spec from etl::left stream manipulator //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::left_spec /*spec*/) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::left_spec /*fmt*/) { - ss.spec.left(); + ss.format.left(); return ss; } //********************************* /// etl::right_spec from etl::left stream manipulator //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::right_spec /*spec*/) + friend basic_string_stream& operator <<(basic_string_stream& ss, etl::private_basic_format_spec::right_spec /*fmt*/) { - ss.spec.right(); + ss.format.right(); return ss; } @@ -214,7 +214,7 @@ namespace etl //********************************* friend basic_string_stream& operator <<(basic_string_stream& ss, TStringView view) { - etl::to_string(view, ss.text, ss.spec, true); + etl::to_string(view, ss.text, ss.format, true); return ss; } @@ -241,9 +241,9 @@ namespace etl //********************************* /// From a string interface //********************************* - friend basic_string_stream& operator <<(basic_string_stream& ss, const TIString& text) + friend basic_string_stream& operator <<(basic_string_stream& ss, const TIString& t) { - etl::to_string(text, ss.text, ss.spec, true); + etl::to_string(t, ss.text, ss.format, true); return ss; } @@ -251,9 +251,9 @@ namespace etl /// From a string //********************************* template