diff --git a/src/forward_list.h b/src/forward_list.h index c791f36e..cc2053d4 100644 --- a/src/forward_list.h +++ b/src/forward_list.h @@ -451,7 +451,7 @@ namespace etl const_pointer operator &() const { - return iforward_list::data_cast(p_node)->value; + return &(iforward_list::data_cast(p_node)->value); } const_pointer operator ->() const @@ -980,7 +980,7 @@ namespace etl ++p_left; --left_size; } - else if (compare(*p_left, *p_right)) + else if (!compare(*p_right, *p_left)) { // First node of left is lower or same. The node must come from left. p_node = p_left; diff --git a/src/intrusive_forward_list.h b/src/intrusive_forward_list.h index 00019df8..552949e7 100644 --- a/src/intrusive_forward_list.h +++ b/src/intrusive_forward_list.h @@ -687,7 +687,7 @@ namespace etl ++i_left; --left_size; } - else if (compare(*i_left, *i_right)) + else if (!compare(*i_right, *i_left)) { // First link of left is lower or same. The link must come from left. i_link = i_left; diff --git a/src/intrusive_list.h b/src/intrusive_list.h index 4d72abe2..ebf56f72 100644 --- a/src/intrusive_list.h +++ b/src/intrusive_list.h @@ -702,7 +702,7 @@ namespace etl i_node = i_left++; --left_size; } - else if (compare(*i_left, *i_right)) + else if (!compare(*i_right, *i_left)) { // First node of left is lower or same. The node must come from left. i_node = i_left++; diff --git a/src/list.h b/src/list.h index a1990aa2..7ac53515 100644 --- a/src/list.h +++ b/src/list.h @@ -558,12 +558,12 @@ namespace etl const_pointer operator &() const { - return ilist::data_cast(p_node)->value; + return &(ilist::data_cast(p_node)->value); } - const data_node_t* operator ->() const + const_pointer operator ->() const { - return p_node; + return &(ilist::data_cast(p_node)->value); } friend bool operator == (const const_iterator& lhs, const const_iterator& rhs) @@ -1186,7 +1186,7 @@ namespace etl i_node = i_left++; --left_size; } - else if (compare(*i_left, *i_right)) + else if (!compare(*i_right, *i_left)) { // First node of left is lower or same. The node must come from left. i_node = i_left++; diff --git a/test/data.h b/test/data.h index 15c10dd4..ed2ede64 100644 --- a/test/data.h +++ b/test/data.h @@ -40,12 +40,14 @@ class TestDataDC public: TestDataDC() - : value(T()) + : value(T()), + index(0) { } - TestDataDC(const T& value) - : value(value) + TestDataDC(const T& value, int index = 0) + : value(value), + index(index) { } @@ -59,7 +61,8 @@ public: return value > other.value; } - T value; + T value; + int index; }; template @@ -89,8 +92,9 @@ class TestDataNDC { public: - TestDataNDC(const T& value) - : value(value) + TestDataNDC(const T& value, int index = 0) + : value(value), + index(index) {} bool operator < (const TestDataNDC& other) const @@ -104,6 +108,7 @@ public: } T value; + int index; }; template diff --git a/test/test_forward_list.cpp b/test/test_forward_list.cpp index 2f911aa6..cd733421 100644 --- a/test/test_forward_list.cpp +++ b/test/test_forward_list.cpp @@ -38,6 +38,7 @@ SOFTWARE. #include #include #include +#include namespace { @@ -56,6 +57,7 @@ namespace typedef std::forward_list CompareDataNDC; typedef std::vector InitialDataNDC; + InitialDataNDC stable_sort_data; InitialDataNDC unsorted_data; InitialDataNDC sorted_data; InitialDataNDC non_unique_data; @@ -68,10 +70,11 @@ namespace { SetupFixture() { - unsorted_data = { ItemNDC("1"), ItemNDC("0"), ItemNDC("3"), ItemNDC("2"), ItemNDC("5"), ItemNDC("4"), ItemNDC("7"), ItemNDC("6"), ItemNDC("9"), ItemNDC("8") }; - sorted_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5"), ItemNDC("6"), ItemNDC("7"), ItemNDC("8"), ItemNDC("9") }; - non_unique_data = { ItemNDC("0"), ItemNDC("0"), ItemNDC("1"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("3"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; - small_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; + stable_sort_data = { ItemNDC("1", 1), ItemNDC("2", 2), ItemNDC("3", 3), ItemNDC("2", 4), ItemNDC("0", 5), ItemNDC("2", 6), ItemNDC("7", 7), ItemNDC("4", 8), ItemNDC("4", 9), ItemNDC("8", 10) }; + unsorted_data = { ItemNDC("1"), ItemNDC("0"), ItemNDC("3"), ItemNDC("2"), ItemNDC("5"), ItemNDC("4"), ItemNDC("7"), ItemNDC("6"), ItemNDC("9"), ItemNDC("8") }; + sorted_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5"), ItemNDC("6"), ItemNDC("7"), ItemNDC("8"), ItemNDC("9") }; + non_unique_data = { ItemNDC("0"), ItemNDC("0"), ItemNDC("1"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("3"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; + small_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; } }; @@ -260,7 +263,7 @@ namespace data.assign(compare_data.begin(), compare_data.end()); data.assign(compare_data.begin(), compare_data.end()); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -279,7 +282,7 @@ namespace data.assign(INITIAL_SIZE, VALUE); data.assign(INITIAL_SIZE, VALUE); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -316,7 +319,7 @@ namespace data.insert_after(i_data, INSERT_VALUE); compare_data.insert_after(i_compare_data, INSERT_VALUE); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -332,7 +335,7 @@ namespace data.insert_after(i_data, INSERT_VALUE); compare_data.insert_after(i_compare_data, INSERT_VALUE); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -359,7 +362,7 @@ namespace data.insert_after(i_data, 2, INSERT_VALUE); compare_data.insert_after(i_compare_data, 2, INSERT_VALUE); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -375,7 +378,7 @@ namespace data.insert_after(i_data, 2, INSERT_VALUE); compare_data.insert_after(i_compare_data, 2, INSERT_VALUE); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -393,7 +396,7 @@ namespace compare_data.insert_after(compare_data.before_begin(), test2.begin(), test2.end()); data.insert_after(data.before_begin(), test2.begin(), test2.end()); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -410,7 +413,7 @@ namespace compare_data.insert_after(icd, test2.begin(), test2.end()); data.insert_after(id, test2.begin(), test2.end()); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -439,7 +442,7 @@ namespace CHECK_EQUAL(6U, data.size()); CHECK_EQUAL(6, std::distance(data.begin(), data.end())); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -566,7 +569,7 @@ namespace i_compare_data = compare_data.erase_after(i_compare_data); i_data = data.erase_after(i_data); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -575,7 +578,7 @@ namespace i_compare_data = compare_data.erase_after(compare_data.begin()); i_data = data.erase_after(data.begin()); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -592,7 +595,7 @@ namespace //std::advance(i_data, data.size() - 1); i_data = data.erase_after(i_data); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); @@ -625,7 +628,7 @@ namespace CHECK_EQUAL(*i_compare_result, *i_result); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -649,7 +652,7 @@ namespace CHECK(i_result == data.end()); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -728,7 +731,7 @@ namespace compare_data.unique(); data.unique(); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -743,7 +746,7 @@ namespace compare_data.unique(); data.unique(); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -758,7 +761,7 @@ namespace compare_data.remove(ItemNDC("7")); data.remove(ItemNDC("7")); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -773,7 +776,7 @@ namespace compare_data.remove_if(std::bind2nd(std::equal_to(), ItemNDC("7"))); data.remove_if(std::bind2nd(std::equal_to(), ItemNDC("7"))); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -791,7 +794,7 @@ namespace CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); CHECK_EQUAL(data.size(), size_t(std::distance(data.begin(), data.end()))); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -819,12 +822,35 @@ namespace compare_data.sort(); data.sort(); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_stable_sort) + { + std::list compare_data(stable_sort_data.begin(), stable_sort_data.end()); + DataNDC data(stable_sort_data.begin(), stable_sort_data.end()); + + compare_data.sort(); + data.sort(); + + std::list::const_iterator citr = compare_data.begin(); + DataNDC::const_iterator ditr = data.begin(); + + while (ditr != data.end()) + { + const ItemNDC& v = *ditr; + + CHECK_EQUAL(citr->index, ditr->index); + + ++citr; + ++ditr; + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_sort_empty) { @@ -834,7 +860,7 @@ namespace compare_data.sort(); data.sort(); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -865,7 +891,7 @@ namespace compare_data.splice_after(i_compare_to_before, compare_data, i_compare_from_before); data.move_after(i_from_before, i_to_before); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -886,7 +912,7 @@ namespace compare_data.splice_after(i_compare_to_before, compare_data, i_compare_from_before); data.move_after(i_from_before, i_to_before); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -907,7 +933,7 @@ namespace compare_data.splice_after(i_compare_to_before, compare_data, i_compare_from_before); data.move_after(i_from_before, i_to_before); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -928,7 +954,7 @@ namespace compare_data.splice_after(i_compare_to_before, compare_data, i_compare_from_before); data.move_after(i_from_before, i_to_before); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); @@ -967,7 +993,7 @@ namespace compare_data.splice_after(i_compare_to_before, compare_data, i_compare_first_before, i_compare_last); data.move_after(i_first_before, i_last, i_to_before); - CHECK_EQUAL(std::distance(compare_data.begin(), compare_data.end()), data.size()); + CHECK_EQUAL(size_t(std::distance(compare_data.begin(), compare_data.end())), data.size()); are_equal = std::equal(data.begin(), data.end(), compare_data.begin()); CHECK(are_equal); diff --git a/test/test_intrusive_forward_list.cpp b/test/test_intrusive_forward_list.cpp index e630b965..587d4e9e 100644 --- a/test/test_intrusive_forward_list.cpp +++ b/test/test_intrusive_forward_list.cpp @@ -53,8 +53,8 @@ namespace { public: - ItemDCNode(const std::string& text) - : data(text) + ItemDCNode(const std::string& text, int index = 0) + : data(text, index) { } @@ -66,8 +66,8 @@ namespace { public: - ItemNDCNode(const std::string& text) - : data(text) + ItemNDCNode(const std::string& text, int index = 0) + : data(text, index) { } @@ -127,6 +127,7 @@ namespace { SUITE(test_forward_list) { + InitialDataNDC stable_sort_data; InitialDataNDC unsorted_data; InitialDataNDC sorted_data; InitialDataNDC sorted_data2; @@ -146,12 +147,13 @@ namespace { SetupFixture() { - unsorted_data = { ItemNDCNode("1"), ItemNDCNode("0"), ItemNDCNode("3"), ItemNDCNode("2"), ItemNDCNode("5"), ItemNDCNode("4"), ItemNDCNode("7"), ItemNDCNode("6"), ItemNDCNode("9"), ItemNDCNode("8") }; - sorted_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; - sorted_data2 = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; - non_unique_data = { ItemNDCNode("0"), ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; - unique_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; - small_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; + stable_sort_data = { ItemNDCNode("1", 1), ItemNDCNode("2", 2), ItemNDCNode("3", 3), ItemNDCNode("2", 4), ItemNDCNode("0", 5), ItemNDCNode("2", 6), ItemNDCNode("7", 7), ItemNDCNode("4", 8), ItemNDCNode("4", 9), ItemNDCNode("8", 10) }; + unsorted_data = { ItemNDCNode("1"), ItemNDCNode("0"), ItemNDCNode("3"), ItemNDCNode("2"), ItemNDCNode("5"), ItemNDCNode("4"), ItemNDCNode("7"), ItemNDCNode("6"), ItemNDCNode("9"), ItemNDCNode("8") }; + sorted_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; + sorted_data2 = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; + non_unique_data = { ItemNDCNode("0"), ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; + unique_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; + small_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; merge_data0 = { ItemNDCNode("1"), ItemNDCNode("1"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("5"), ItemNDCNode("7"), ItemNDCNode("8") }; merge_data1 = { ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("6"), ItemNDCNode("9"), ItemNDCNode("9") }; @@ -743,6 +745,29 @@ namespace CHECK(are_equal); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_stable_sort) + { + std::list compare_data(stable_sort_data.begin(), stable_sort_data.end()); + DataNDC0 data(stable_sort_data.begin(), stable_sort_data.end()); + + compare_data.sort(); + data.sort(); + + std::list::const_iterator citr = compare_data.begin(); + DataNDC0::const_iterator ditr = data.begin(); + + while (ditr != data.end()) + { + const ItemNDC& v = ditr->data; + + CHECK_EQUAL(citr->data.index, ditr->data.index); + + ++citr; + ++ditr; + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_sort_compare) { diff --git a/test/test_intrusive_list.cpp b/test/test_intrusive_list.cpp index 2387da30..b3325f15 100644 --- a/test/test_intrusive_list.cpp +++ b/test/test_intrusive_list.cpp @@ -65,8 +65,8 @@ namespace { public: - ItemNDCNode(const std::string& text) - : data(text) + ItemNDCNode(const std::string& text, int index = 0) + : data(text, index) { } @@ -140,6 +140,7 @@ namespace { SUITE(test_intrusive_list) { + InitialDataNDC stable_sort_data; InitialDataNDC unsorted_data; InitialDataNDC sorted_data; InitialDataNDC sorted_data2; @@ -157,12 +158,13 @@ namespace { SetupFixture() { - unsorted_data = { ItemNDCNode("1"), ItemNDCNode("0"), ItemNDCNode("3"), ItemNDCNode("2"), ItemNDCNode("5"), ItemNDCNode("4"), ItemNDCNode("7"), ItemNDCNode("6"), ItemNDCNode("9"), ItemNDCNode("8") }; - sorted_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; - sorted_data2 = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; - non_unique_data = { ItemNDCNode("0"), ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; - unique_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; - small_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; + stable_sort_data = { ItemNDCNode("1", 1), ItemNDCNode("2", 2), ItemNDCNode("3", 3), ItemNDCNode("2", 4), ItemNDCNode("0", 5), ItemNDCNode("2", 6), ItemNDCNode("7", 7), ItemNDCNode("4", 8), ItemNDCNode("4", 9), ItemNDCNode("8", 10) }; + unsorted_data = { ItemNDCNode("1"), ItemNDCNode("0"), ItemNDCNode("3"), ItemNDCNode("2"), ItemNDCNode("5"), ItemNDCNode("4"), ItemNDCNode("7"), ItemNDCNode("6"), ItemNDCNode("9"), ItemNDCNode("8") }; + sorted_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; + sorted_data2 = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5"), ItemNDCNode("6"), ItemNDCNode("7"), ItemNDCNode("8"), ItemNDCNode("9") }; + non_unique_data = { ItemNDCNode("0"), ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; + unique_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; + small_data = { ItemNDCNode("0"), ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("4"), ItemNDCNode("5") }; merge_data0 = { ItemNDCNode("1"), ItemNDCNode("1"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("5"), ItemNDCNode("7"), ItemNDCNode("8") }; merge_data1 = { ItemNDCNode("1"), ItemNDCNode("2"), ItemNDCNode("3"), ItemNDCNode("3"), ItemNDCNode("6"), ItemNDCNode("9"), ItemNDCNode("9") }; @@ -787,6 +789,29 @@ namespace CHECK(are_equal); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_stable_sort) + { + std::list compare_data(stable_sort_data.begin(), stable_sort_data.end()); + DataNDC0 data(stable_sort_data.begin(), stable_sort_data.end()); + + compare_data.sort(); + data.sort(); + + std::list::const_iterator citr = compare_data.begin(); + DataNDC0::const_iterator ditr = data.begin(); + + while (ditr != data.end()) + { + const ItemNDC& v = ditr->data; + + CHECK_EQUAL(citr->data.index, ditr->data.index); + + ++citr; + ++ditr; + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_sort_compare) { diff --git a/test/test_list.cpp b/test/test_list.cpp index 96a50288..a39bb24f 100644 --- a/test/test_list.cpp +++ b/test/test_list.cpp @@ -55,6 +55,7 @@ namespace typedef std::list CompareData; typedef std::vector InitialData; + InitialData stable_sort_data; InitialData unsorted_data; InitialData sorted_data; InitialData non_unique_data; @@ -73,10 +74,11 @@ namespace { SetupFixture() { - unsorted_data = { ItemNDC("1"), ItemNDC("0"), ItemNDC("3"), ItemNDC("2"), ItemNDC("5"), ItemNDC("4"), ItemNDC("7"), ItemNDC("6"), ItemNDC("9"), ItemNDC("8") }; - sorted_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5"), ItemNDC("6"), ItemNDC("7"), ItemNDC("8"), ItemNDC("9") }; - non_unique_data = { ItemNDC("0"), ItemNDC("0"), ItemNDC("1"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("3"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; - small_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; + stable_sort_data = { ItemNDC("1", 1), ItemNDC("2", 2), ItemNDC("3", 3), ItemNDC("2", 4), ItemNDC("0", 5), ItemNDC("2", 6), ItemNDC("7", 7), ItemNDC("4", 8), ItemNDC("4", 9), ItemNDC("8", 10) }; + unsorted_data = { ItemNDC("1"), ItemNDC("0"), ItemNDC("3"), ItemNDC("2"), ItemNDC("5"), ItemNDC("4"), ItemNDC("7"), ItemNDC("6"), ItemNDC("9"), ItemNDC("8") }; + sorted_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5"), ItemNDC("6"), ItemNDC("7"), ItemNDC("8"), ItemNDC("9") }; + non_unique_data = { ItemNDC("0"), ItemNDC("0"), ItemNDC("1"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("3"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; + small_data = { ItemNDC("0"), ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("4"), ItemNDC("5") }; merge_data0 = { ItemNDC("1"), ItemNDC("1"), ItemNDC("3"), ItemNDC("3"), ItemNDC("5"), ItemNDC("7"), ItemNDC("8") }; merge_data1 = { ItemNDC("1"), ItemNDC("2"), ItemNDC("3"), ItemNDC("3"), ItemNDC("6"), ItemNDC("9"), ItemNDC("9") }; @@ -874,6 +876,27 @@ namespace CHECK(are_equal); } + //************************************************************************* + TEST_FIXTURE(SetupFixture, test_sort_is_stable) + { + CompareData compare_data(stable_sort_data.begin(), stable_sort_data.end()); + DataNDC data(stable_sort_data.begin(), stable_sort_data.end()); + + compare_data.sort(); + data.sort(); + + CompareData::const_iterator citr = compare_data.begin(); + DataNDC::const_iterator ditr = data.begin(); + + while (ditr != data.end()) + { + CHECK_EQUAL(citr->index, ditr->index); + + ++citr; + ++ditr; + } + } + //************************************************************************* TEST_FIXTURE(SetupFixture, test_sort_trivial) {