Fixed sort() so that it is now 'stable'.

Fixed return value type for const_iterator::operator->() in etl::list
This commit is contained in:
John Wellbelove 2017-06-14 23:35:56 +01:00
parent e12cef864f
commit 3f07a785f4
9 changed files with 170 additions and 66 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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++;

View File

@ -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++;

View File

@ -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 <typename T>
@ -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 <typename T>

View File

@ -38,6 +38,7 @@ SOFTWARE.
#include <forward_list>
#include <vector>
#include <string>
#include <list>
namespace
{
@ -56,6 +57,7 @@ namespace
typedef std::forward_list<ItemNDC> CompareDataNDC;
typedef std::vector<ItemNDC> 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>(), ItemNDC("7")));
data.remove_if(std::bind2nd(std::equal_to<ItemNDC>(), 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<ItemNDC> 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<ItemNDC>::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);

View File

@ -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<ItemNDCNode> 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<ItemNDCNode>::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)
{

View File

@ -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<ItemNDCNode> 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<ItemNDCNode>::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)
{

View File

@ -55,6 +55,7 @@ namespace
typedef std::list<ItemNDC> CompareData;
typedef std::vector<ItemNDC> 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)
{