From 60b04b55f600c136ea300cd5d439ef3e00c7be2a Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Tue, 22 Jun 2021 11:00:42 +0100 Subject: [PATCH] Fixed copy and move assignment bug --- include/etl/circular_buffer.h | 11 +++++-- test/test_circular_buffer.cpp | 31 +++++++++++++++++-- test/test_circular_buffer_external_buffer.cpp | 31 +++++++++++++++++-- 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/include/etl/circular_buffer.h b/include/etl/circular_buffer.h index d2470d83..ebd3a634 100644 --- a/include/etl/circular_buffer.h +++ b/include/etl/circular_buffer.h @@ -1088,6 +1088,7 @@ namespace etl { if (this != &other) { + this->clear(); this->push(other.begin(), other.end()); } @@ -1119,8 +1120,10 @@ namespace etl { if (this != &other) { + this->clear(); + for (typename etl::icircular_buffer::const_iterator itr = other.begin(); itr != other.end(); ++itr) - { + { this->push(etl::move(*itr)); } } @@ -1203,8 +1206,10 @@ namespace etl //************************************************************************* circular_buffer_ext& operator =(const circular_buffer_ext& other) { + if (this != &other) { + this->clear(); this->push(other.begin(), other.end()); } @@ -1236,8 +1241,10 @@ namespace etl { if (this != &other) { + this->clear(); + for (typename etl::icircular_buffer::iterator itr = other.begin(); itr != other.end(); ++itr) - { + { this->push(etl::move(*itr)); } } diff --git a/test/test_circular_buffer.cpp b/test/test_circular_buffer.cpp index 30ee06ff..536dfe78 100644 --- a/test/test_circular_buffer.cpp +++ b/test/test_circular_buffer.cpp @@ -746,13 +746,14 @@ namespace //************************************************************************* TEST(test_assignment) { - Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; - Compare input2{ Ndc("9"), Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; + Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8") }; + Compare input2{ Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; Data data1; data1.push(input1.begin(), input1.end()); // Copy construct from data1 Data data2; + data2.push(Ndc("0")); data2 = data1; @@ -768,6 +769,32 @@ namespace CHECK(isEqual); } + //************************************************************************* + TEST(test_move_assignment) + { + Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8") }; + Compare input2{ Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; + Data data1; + data1.push(input1.begin(), input1.end()); + + // Copy construct from data1 + Data data2; + data2.push(Ndc("0")); + + data2 = etl::move(data1); + + // Now change data1 + data1.clear(); + data1.push(input2.begin(), input2.end()); + + CHECK(data2.begin() != data2.end()); + CHECK(data2.cbegin() != data2.cend()); + CHECK_EQUAL(input1.size(), data2.size()); + + bool isEqual = std::equal(input1.begin(), input1.end(), data2.begin()); + CHECK(isEqual); + } + //************************************************************************* TEST(test_swap_iterator) { diff --git a/test/test_circular_buffer_external_buffer.cpp b/test/test_circular_buffer_external_buffer.cpp index eb9cc43e..44fb267c 100644 --- a/test/test_circular_buffer_external_buffer.cpp +++ b/test/test_circular_buffer_external_buffer.cpp @@ -755,13 +755,14 @@ namespace //************************************************************************* TEST(test_assignment) { - Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8"), Ndc("9") }; - Compare input2{ Ndc("9"), Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; + Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8") }; + Compare input2{ Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; Data data1(buffer1.raw, SIZE); data1.push(input1.begin(), input1.end()); // Copy construct from data1 Data data2(buffer2.raw, SIZE); + data2.push(Ndc("0")); data2 = data1; @@ -777,6 +778,32 @@ namespace CHECK(isEqual); } + //************************************************************************* + TEST(test_move_assignment) + { + Compare input1{ Ndc("0"), Ndc("1"), Ndc("2"), Ndc("3"), Ndc("4"), Ndc("5"), Ndc("6"), Ndc("7"), Ndc("8") }; + Compare input2{ Ndc("8"), Ndc("7"), Ndc("6"), Ndc("5"), Ndc("4"), Ndc("3"), Ndc("2"), Ndc("1"), Ndc("0") }; + Data data1(buffer1.raw, SIZE); + data1.push(input1.begin(), input1.end()); + + // Copy construct from data1 + Data data2(buffer2.raw, SIZE); + data2.push(Ndc("0")); + + data2 = etl::move(data1); + + // Now change data1 + data1.clear(); + data1.push(input2.begin(), input2.end()); + + CHECK(data2.begin() != data2.end()); + CHECK(data2.cbegin() != data2.cend()); + CHECK_EQUAL(input1.size(), data2.size()); + + bool isEqual = std::equal(input1.begin(), input1.end(), data2.begin()); + CHECK(isEqual); + } + //************************************************************************* TEST(test_swap_iterator) {