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())); + } }; }