From 7eaf3e13a7765c231360dc188c60ce6d0ca3f7c6 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 17 Feb 2021 09:02:04 +0000 Subject: [PATCH 1/8] Interface for C string handling. --- include/etl/basic_string.h | 29 ++++++--- test/test_string_char.cpp | 50 +++++++++++++-- test/test_string_char_external_buffer.cpp | 66 ++++++++++++++++---- test/test_string_u16.cpp | 50 +++++++++++++-- test/test_string_u16_external_buffer.cpp | 66 ++++++++++++++++---- test/test_string_u32.cpp | 50 +++++++++++++-- test/test_string_u32_external_buffer.cpp | 66 ++++++++++++++++---- test/test_string_wchar_t.cpp | 50 +++++++++++++-- test/test_string_wchar_t_external_buffer.cpp | 66 ++++++++++++++++---- 9 files changed, 411 insertions(+), 82 deletions(-) diff --git a/include/etl/basic_string.h b/include/etl/basic_string.h index d3358699..7e6d61ec 100644 --- a/include/etl/basic_string.h +++ b/include/etl/basic_string.h @@ -2185,20 +2185,29 @@ namespace etl #endif //********************************************************************* - /// Update the size to the distnace to the first null, or max size. + /// Clears the free space to string terminator value. //********************************************************************* - void update_size() + void initialize_free_space() { - p_buffer[max_size()] = 0; // Ensure a terminating null. +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(false); +#endif + etl::fill(&p_buffer[current_size], &p_buffer[CAPACITY + 1U], T(0)); + } - size_t i = 0U; + //********************************************************************* + /// Trim the size to the distance to the first null terminator. + /// If the last buffer position has a non-null value then the truncated + /// flag will be set. + //********************************************************************* + void trim() + { +#if ETL_STRING_TRUNCATION_CHECKS_ENABLED + set_truncated(p_buffer[CAPACITY] != T(0)); +#endif - while ((i != max_size()) && (p_buffer[i] != 0)) - { - ++i; - } - - current_size = i; + p_buffer[CAPACITY] = T(0); // Ensure a terminating null. + current_size = etl::strlen(p_buffer); } protected: diff --git a/test/test_string_char.cpp b/test/test_string_char.cpp index 6492bb67..3acb1e56 100644 --- a/test/test_string_char.cpp +++ b/test/test_string_char.cpp @@ -4158,15 +4158,51 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + Text empty; + Text text; + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + Text empty; + Text initial = STR("ABC"); + Text text(initial); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } @@ -4175,10 +4211,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } @@ -4187,10 +4224,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; diff --git a/test/test_string_char_external_buffer.cpp b/test/test_string_char_external_buffer.cpp index 4cba90bb..336faebe 100644 --- a/test/test_string_char_external_buffer.cpp +++ b/test/test_string_char_external_buffer.cpp @@ -4520,42 +4520,84 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text text(buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text initial(STR("ABC"), buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + Text text(initial, buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_shorter_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_greater_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; diff --git a/test/test_string_u16.cpp b/test/test_string_u16.cpp index aeaab84b..0677bba8 100644 --- a/test/test_string_u16.cpp +++ b/test/test_string_u16.cpp @@ -4158,15 +4158,51 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + Text empty; + Text text; + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + Text empty; + Text initial = STR("ABC"); + Text text(initial); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } @@ -4175,10 +4211,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } @@ -4187,10 +4224,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; diff --git a/test/test_string_u16_external_buffer.cpp b/test/test_string_u16_external_buffer.cpp index 04ebef90..755e2130 100644 --- a/test/test_string_u16_external_buffer.cpp +++ b/test/test_string_u16_external_buffer.cpp @@ -4520,42 +4520,84 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text text(buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text initial(STR("ABC"), buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + Text text(initial, buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_shorter_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_greater_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; diff --git a/test/test_string_u32.cpp b/test/test_string_u32.cpp index 9efa1362..95fe3d18 100644 --- a/test/test_string_u32.cpp +++ b/test/test_string_u32.cpp @@ -4158,15 +4158,51 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + Text empty; + Text text; + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + Text empty; + Text initial = STR("ABC"); + Text text(initial); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } @@ -4175,10 +4211,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } @@ -4187,10 +4224,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; diff --git a/test/test_string_u32_external_buffer.cpp b/test/test_string_u32_external_buffer.cpp index 67b17c01..78eea17a 100644 --- a/test/test_string_u32_external_buffer.cpp +++ b/test/test_string_u32_external_buffer.cpp @@ -4503,42 +4503,84 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text text(buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text initial(STR("ABC"), buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + Text text(initial, buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_shorter_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_greater_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; diff --git a/test/test_string_wchar_t.cpp b/test/test_string_wchar_t.cpp index 0293bb85..de1375a1 100644 --- a/test/test_string_wchar_t.cpp +++ b/test/test_string_wchar_t.cpp @@ -4158,15 +4158,51 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + Text empty; + Text text; + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + Text empty; + Text initial = STR("ABC"); + Text text(initial); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } @@ -4175,10 +4211,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } @@ -4187,10 +4224,11 @@ namespace { Text text; - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; diff --git a/test/test_string_wchar_t_external_buffer.cpp b/test/test_string_wchar_t_external_buffer.cpp index ecb138df..08cc2798 100644 --- a/test/test_string_wchar_t_external_buffer.cpp +++ b/test/test_string_wchar_t_external_buffer.cpp @@ -4503,42 +4503,84 @@ namespace } #endif + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_empty_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text text(buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text.empty()); + CHECK(text == empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_initialize_free_space_part_filled_string) + { + TextBuffer buffer1; + TextBuffer buffer2; + Text initial(STR("ABC"), buffer1.data(), buffer1.size()); + Text empty(buffer2.data(), buffer2.size()); + Text text(initial, buffer2.data(), buffer2.size()); + + text.initialize_free_space(); + + CHECK(text == initial); + CHECK(text != empty); + + for (size_t i = text.size(); i < text.max_size(); ++i) + { + CHECK_EQUAL(0, text[i]); + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_max_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_shorter_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.update_size(); + text.trim(); + CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); } //************************************************************************* TEST_FIXTURE(SetupFixture, test_update_after_c_string_greater_size) { - TextBuffer buffer; - Text text(buffer.data(), buffer.size()); + TextBuffer buffer1; + Text text(buffer1.data(), buffer1.size()); - text.resize(text.max_size()); + text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.update_size(); + text.trim(); + CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); } }; From 580d9848dc9f02b4ad61003896747033d3b424b9 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 17 Feb 2021 11:26:14 +0000 Subject: [PATCH 2/8] Fixed indexing error in find_next for etl::bitset. Added some enum tests for type_traits --- include/etl/bitset.h | 4 ++-- test/test_bitset.cpp | 18 ++++++++++++++++++ test/test_type_traits.cpp | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/include/etl/bitset.h b/include/etl/bitset.h index 9d59243d..b5a28d5a 100644 --- a/include/etl/bitset.h +++ b/include/etl/bitset.h @@ -589,7 +589,7 @@ namespace etl // Needs checking? if ((state && (value != ALL_CLEAR)) || - (!state && (value != ALL_SET))) + (!state && (value != ALL_SET))) { // For each bit in the element... while ((bit < BITS_PER_ELEMENT) && (position < NBITS)) @@ -608,7 +608,7 @@ namespace etl } else { - position += BITS_PER_ELEMENT; + position += BITS_PER_ELEMENT - bit; } // Start at the beginning for all other elements. diff --git a/test/test_bitset.cpp b/test/test_bitset.cpp index ab961254..aad8331c 100644 --- a/test/test_bitset.cpp +++ b/test/test_bitset.cpp @@ -1012,6 +1012,24 @@ namespace CHECK_EQUAL(4U, data.find_next(true, 1)); } + //************************************************************************* + TEST(test_find_next_github_issue_336) + { + etl::bitset<16> bits16; + bits16.set(12); + + etl::bitset<24> bits24; + bits24.set(12); + + CHECK_EQUAL(12, bits16.find_first(true)); + CHECK_EQUAL(12, bits16.find_next(true, 4)); + CHECK_EQUAL(16, bits16.find_next(true, 13)); + + CHECK_EQUAL(12, bits24.find_first(true)); + CHECK_EQUAL(12, bits24.find_next(true, 4)); + CHECK_EQUAL(24, bits16.find_next(true, 13)); + } + //************************************************************************* TEST(test_swap) { diff --git a/test/test_type_traits.cpp b/test/test_type_traits.cpp index 73098722..9fd73520 100644 --- a/test/test_type_traits.cpp +++ b/test/test_type_traits.cpp @@ -456,6 +456,22 @@ namespace CHECK((etl::is_same::type, std::make_signed::type>::value)); CHECK((etl::is_same::type, std::make_signed::type>::value)); CHECK((etl::is_same::type, std::make_signed::type>::value)); + + enum class ue : uint8_t + { + One, + Two + }; + + CHECK((etl::is_same::type, std::make_signed::type>::value)); + + enum class se : int8_t + { + One, + Two + }; + + CHECK((etl::is_same::type, std::make_signed::type>::value)); } //************************************************************************* @@ -482,6 +498,22 @@ namespace CHECK((etl::is_same::type, std::make_unsigned::type>::value)); CHECK((etl::is_same::type, std::make_unsigned::type>::value)); CHECK((etl::is_same::type, std::make_unsigned::type>::value)); + + enum class ue : uint8_t + { + One, + Two + }; + + CHECK((etl::is_same::type, std::make_unsigned::type>::value)); + + enum class se : int8_t + { + One, + Two + }; + + CHECK((etl::is_same::type, std::make_unsigned::type>::value)); } //************************************************************************* From c6bb73d7d08e3d5b145dea7345782762cef963df Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 17 Feb 2021 13:47:46 +0000 Subject: [PATCH 3/8] Updated version --- include/etl/version.h | 2 +- library.json | 2 +- library.properties | 2 +- support/Release notes.txt | 4 ++++ test/test_bitset.cpp | 19 +++++++++++++++++-- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/include/etl/version.h b/include/etl/version.h index 2f2d0ad0..deb45761 100644 --- a/include/etl/version.h +++ b/include/etl/version.h @@ -39,7 +39,7 @@ SOFTWARE. #define ETL_VERSION_MAJOR 20 #define ETL_VERSION_MINOR 2 -#define ETL_VERSION_PATCH 2 +#define ETL_VERSION_PATCH 3 #define ETL_VERSION ETL_STRINGIFY(ETL_VERSION_MAJOR) "." ETL_STRINGIFY(ETL_VERSION_MINOR) "." ETL_STRINGIFY(ETL_VERSION_PATCH) #define ETL_VERSION_W ETL_STRINGIFY(ETL_VERSION_MAJOR) L"." ETL_STRINGIFY(ETL_VERSION_MINOR) L"." ETL_STRINGIFY(ETL_VERSION_PATCH) #define ETL_VERSION_U16 ETL_STRINGIFY(ETL_VERSION_MAJOR) u"." ETL_STRINGIFY(ETL_VERSION_MINOR) u"." ETL_STRINGIFY(ETL_VERSION_PATCH) diff --git a/library.json b/library.json index 433b7e98..ab12e219 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "ETL Embedded Template Library", - "version": "20.2.2", + "version": "20.2.3", "author s": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" diff --git a/library.properties b/library.properties index 6f1928e6..cfce3281 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Embedded Template Library ETL -version=20.2.2 +version=20.2.3 author= John Wellbelove maintainer=John Wellbelove license=MIT diff --git a/support/Release notes.txt b/support/Release notes.txt index 02b32c02..0a397dc1 100644 --- a/support/Release notes.txt +++ b/support/Release notes.txt @@ -1,3 +1,7 @@ +=============================================================================== +20.2.3 +Fixed indexing error in find_next for etl::bitset. + =============================================================================== 20.2.2 Added non-const get_message() member funtions in shared message framework. diff --git a/test/test_bitset.cpp b/test/test_bitset.cpp index aad8331c..49767ca4 100644 --- a/test/test_bitset.cpp +++ b/test/test_bitset.cpp @@ -1023,11 +1023,26 @@ namespace CHECK_EQUAL(12, bits16.find_first(true)); CHECK_EQUAL(12, bits16.find_next(true, 4)); - CHECK_EQUAL(16, bits16.find_next(true, 13)); + CHECK_EQUAL(etl::ibitset::npos, bits16.find_next(true, 13)); CHECK_EQUAL(12, bits24.find_first(true)); CHECK_EQUAL(12, bits24.find_next(true, 4)); - CHECK_EQUAL(24, bits16.find_next(true, 13)); + CHECK_EQUAL(etl::ibitset::npos, bits24.find_next(true, 13)); + } + + //************************************************************************* + TEST(test_find_next_multi_byte_bitset_github_issue_336) + { + etl::bitset<16> data; + data.set(12); + data.set(22); + CHECK_EQUAL(12U, data.find_next(true, 3)); + CHECK_EQUAL(12U, data.find_next(true, 10)); + + // set first ten bytes + data.set("1111111111"); + CHECK_EQUAL(10U, data.find_next(false, 3)); + CHECK_EQUAL(10U, data.find_next(false, 9)); } //************************************************************************* From 557f881d6c0ca37b7ccbf72b2474e45e80600f1d Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 17 Feb 2021 14:15:01 +0000 Subject: [PATCH 4/8] Merge branch 'hotfix/bitset-iteration-error' into development --- include/etl/bitset.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/etl/bitset.h b/include/etl/bitset.h index b5a28d5a..e918df76 100644 --- a/include/etl/bitset.h +++ b/include/etl/bitset.h @@ -608,7 +608,7 @@ namespace etl } else { - position += BITS_PER_ELEMENT - bit; + position += (BITS_PER_ELEMENT - bit); } // Start at the beginning for all other elements. From f5534fefdff275966246da8a4d0f14f833dbbbf8 Mon Sep 17 00:00:00 2001 From: Chiraffollo Date: Wed, 17 Feb 2021 14:55:49 +0100 Subject: [PATCH 5/8] fix bug in ibitset find_next method (#338) Co-authored-by: John Wellbelove --- test/test_bitset.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/test_bitset.cpp b/test/test_bitset.cpp index 49767ca4..1d217351 100644 --- a/test/test_bitset.cpp +++ b/test/test_bitset.cpp @@ -1013,6 +1013,20 @@ namespace } //************************************************************************* + TEST(test_find_next_multi_byte_bitset_github_issue_336) + { + etl::bitset<24> data; + data.set(12); + data.set(22); + CHECK_EQUAL(12U, data.find_next(true, 3)); + CHECK_EQUAL(12U, data.find_next(true, 10)); + + // set first ten bytes + data.set("1111111111"); + CHECK_EQUAL(10U, data.find_next(false, 3)); + CHECK_EQUAL(10U, data.find_next(false, 9)); + } + TEST(test_find_next_github_issue_336) { etl::bitset<16> bits16; From 03f7b49ca949405b4950febe0113da3d9f64b8cc Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 17 Feb 2021 15:04:29 +0000 Subject: [PATCH 6/8] Merge branch 'hotfix/Chiraffollo-fix-find_next' into development --- test/test_bitset.cpp | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/test/test_bitset.cpp b/test/test_bitset.cpp index 1d217351..b4186970 100644 --- a/test/test_bitset.cpp +++ b/test/test_bitset.cpp @@ -1027,6 +1027,7 @@ namespace CHECK_EQUAL(10U, data.find_next(false, 9)); } + //************************************************************************* TEST(test_find_next_github_issue_336) { etl::bitset<16> bits16; @@ -1044,21 +1045,6 @@ namespace CHECK_EQUAL(etl::ibitset::npos, bits24.find_next(true, 13)); } - //************************************************************************* - TEST(test_find_next_multi_byte_bitset_github_issue_336) - { - etl::bitset<16> data; - data.set(12); - data.set(22); - CHECK_EQUAL(12U, data.find_next(true, 3)); - CHECK_EQUAL(12U, data.find_next(true, 10)); - - // set first ten bytes - data.set("1111111111"); - CHECK_EQUAL(10U, data.find_next(false, 3)); - CHECK_EQUAL(10U, data.find_next(false, 9)); - } - //************************************************************************* TEST(test_swap) { From da4e7f33ec0defdf18b3e411b57bc44f928028d2 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Wed, 17 Feb 2021 17:48:48 +0000 Subject: [PATCH 7/8] Updated version --- support/Release notes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/support/Release notes.txt b/support/Release notes.txt index 0a397dc1..72ac6b91 100644 --- a/support/Release notes.txt +++ b/support/Release notes.txt @@ -1,6 +1,6 @@ =============================================================================== 20.2.3 -Fixed indexing error in find_next for etl::bitset. +Fixed indexing error in find_next() for etl::bitset. =============================================================================== 20.2.2 From 99c3bead5a74d4c6b2810b3ce7a9b7a954fc2036 Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Thu, 18 Feb 2021 12:40:31 +0000 Subject: [PATCH 8/8] Added data_end() and renamed trim() to trim_to_terminator() --- include/etl/basic_string.h | 20 +++++++++++++++++++- test/test_string_char.cpp | 10 +++++----- test/test_string_char_external_buffer.cpp | 6 +++--- test/test_string_u16.cpp | 6 +++--- test/test_string_u16_external_buffer.cpp | 6 +++--- test/test_string_u32.cpp | 6 +++--- test/test_string_u32_external_buffer.cpp | 6 +++--- test/test_string_wchar_t.cpp | 6 +++--- test/test_string_wchar_t_external_buffer.cpp | 6 +++--- 9 files changed, 45 insertions(+), 27 deletions(-) diff --git a/include/etl/basic_string.h b/include/etl/basic_string.h index 7e6d61ec..5857ccd3 100644 --- a/include/etl/basic_string.h +++ b/include/etl/basic_string.h @@ -582,6 +582,24 @@ namespace etl return p_buffer; } + //********************************************************************* + /// Returns a pointer to the beginning of the string data. + ///\return A pointer to the beginning of the string data. + //********************************************************************* + pointer data_end() + { + return p_buffer + current_size; + } + + //********************************************************************* + /// Returns a const pointer to the beginning of the string data. + ///\return A const pointer to the beginning of the string data. + //********************************************************************* + const_pointer data_end() const + { + return p_buffer + current_size; + } + //********************************************************************* /// Assigns values to the string. /// Truncates if the string does not have enough free space. @@ -2200,7 +2218,7 @@ namespace etl /// If the last buffer position has a non-null value then the truncated /// flag will be set. //********************************************************************* - void trim() + void trim_to_terminator() { #if ETL_STRING_TRUNCATION_CHECKS_ENABLED set_truncated(p_buffer[CAPACITY] != T(0)); diff --git a/test/test_string_char.cpp b/test/test_string_char.cpp index 3acb1e56..91d02fa8 100644 --- a/test/test_string_char.cpp +++ b/test/test_string_char.cpp @@ -874,7 +874,7 @@ namespace Text text(compare_text.begin(), compare_text.end()); bool is_equal = std::equal(text.data(), - text.data() + text.size(), + text.data_end(), compare_text.begin()); CHECK(is_equal); @@ -891,7 +891,7 @@ namespace const Text text(compare_text.begin(), compare_text.end()); bool is_equal = std::equal(text.data(), - text.data() + text.size(), + text.data_end(), compare_text.begin()); CHECK(is_equal); @@ -4200,7 +4200,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4213,7 +4213,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4226,7 +4226,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); diff --git a/test/test_string_char_external_buffer.cpp b/test/test_string_char_external_buffer.cpp index 336faebe..46c29643 100644 --- a/test/test_string_char_external_buffer.cpp +++ b/test/test_string_char_external_buffer.cpp @@ -4567,7 +4567,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4581,7 +4581,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4595,7 +4595,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); diff --git a/test/test_string_u16.cpp b/test/test_string_u16.cpp index 0677bba8..477014be 100644 --- a/test/test_string_u16.cpp +++ b/test/test_string_u16.cpp @@ -4200,7 +4200,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4213,7 +4213,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4226,7 +4226,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); diff --git a/test/test_string_u16_external_buffer.cpp b/test/test_string_u16_external_buffer.cpp index 755e2130..9098efb7 100644 --- a/test/test_string_u16_external_buffer.cpp +++ b/test/test_string_u16_external_buffer.cpp @@ -4567,7 +4567,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4581,7 +4581,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4595,7 +4595,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); diff --git a/test/test_string_u32.cpp b/test/test_string_u32.cpp index 95fe3d18..b52aa8b3 100644 --- a/test/test_string_u32.cpp +++ b/test/test_string_u32.cpp @@ -4200,7 +4200,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4213,7 +4213,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4226,7 +4226,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); diff --git a/test/test_string_u32_external_buffer.cpp b/test/test_string_u32_external_buffer.cpp index 78eea17a..6e3a3b90 100644 --- a/test/test_string_u32_external_buffer.cpp +++ b/test/test_string_u32_external_buffer.cpp @@ -4550,7 +4550,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4564,7 +4564,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4578,7 +4578,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); diff --git a/test/test_string_wchar_t.cpp b/test/test_string_wchar_t.cpp index de1375a1..d8b7853f 100644 --- a/test/test_string_wchar_t.cpp +++ b/test/test_string_wchar_t.cpp @@ -4200,7 +4200,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4213,7 +4213,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4226,7 +4226,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); diff --git a/test/test_string_wchar_t_external_buffer.cpp b/test/test_string_wchar_t_external_buffer.cpp index 08cc2798..4202ea21 100644 --- a/test/test_string_wchar_t_external_buffer.cpp +++ b/test/test_string_wchar_t_external_buffer.cpp @@ -4550,7 +4550,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size(), STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size()); @@ -4564,7 +4564,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() - 1, STR('A')); - text.trim(); + text.trim_to_terminator(); CHECK(!text.is_truncated()); CHECK_EQUAL(text.max_size() - 1, text.size()); @@ -4578,7 +4578,7 @@ namespace text.initialize_free_space(); std::fill(text.data(), text.data() + text.max_size() + 1, STR('A')); // Overwrites to terminating null. - text.trim(); + text.trim_to_terminator(); CHECK(text.is_truncated()); CHECK_EQUAL(text.max_size(), text.size());