diff --git a/include/etl/deque.h b/include/etl/deque.h index b829da5d..f44389e2 100644 --- a/include/etl/deque.h +++ b/include/etl/deque.h @@ -49,7 +49,6 @@ SOFTWARE. #include "debug_count.h" #include "algorithm.h" #include "type_traits.h" -#include "parameter_type.h" #if ETL_CPP11_SUPPORTED && !defined(ETL_STLPORT) && !defined(ETL_NO_STL) #include @@ -1948,6 +1947,29 @@ namespace etl return *this; } +#if ETL_CPP11_SUPPORTED + //************************************************************************* + /// Move assignment operator. + //************************************************************************* + ideque& operator =(ideque&& rhs) + { + if (&rhs != this) + { + clear(); + iterator itr = rhs.begin(); + while (itr != rhs.end()) + { + push_back(std::move(*itr)); + ++itr; + } + + rhs.initialise(); + } + + return *this; + } +#endif + #ifdef ETL_IDEQUE_REPAIR_ENABLE //************************************************************************* /// Fix the internal pointers after a low level memory copy. diff --git a/test/test_deque.cpp b/test/test_deque.cpp index 5c1a21f3..44cdcf84 100644 --- a/test/test_deque.cpp +++ b/test/test_deque.cpp @@ -240,6 +240,40 @@ namespace CHECK(std::equal(deque1.begin(), deque1.end(), deque2.begin())); } + //************************************************************************* + TEST(test_move_assignment_interface) + { + const size_t SIZE = 10U; + typedef etl::deque, SIZE> Data; + typedef etl::ideque> IData; + + std::unique_ptr p1(new uint32_t(1U)); + std::unique_ptr p2(new uint32_t(2U)); + std::unique_ptr p3(new uint32_t(3U)); + std::unique_ptr p4(new uint32_t(4U)); + + Data deque1; + deque1.push_back(std::move(p1)); + deque1.push_back(std::move(p2)); + deque1.push_back(std::move(p3)); + deque1.push_back(std::move(p4)); + + Data deque2; + + IData& ideque1 = deque1; + IData& ideque2 = deque2; + + ideque2 = std::move(ideque1); + + CHECK_EQUAL(0U, deque1.size()); + CHECK_EQUAL(4U, deque2.size()); + + CHECK_EQUAL(1U, *deque2[0]); + CHECK_EQUAL(2U, *deque2[1]); + CHECK_EQUAL(3U, *deque2[2]); + CHECK_EQUAL(4U, *deque2[3]); + } + //************************************************************************* TEST(test_self_assignment) {