[libcxx-commits] [libcxx] r358541 - Add tests for stability to list::sort and forward_list::sort. Thanks to Jonathan Wakely for the notice

Marshall Clow via libcxx-commits libcxx-commits at lists.llvm.org
Tue Apr 16 17:11:00 PDT 2019


Author: marshall
Date: Tue Apr 16 17:11:00 2019
New Revision: 358541

URL: http://llvm.org/viewvc/llvm-project?rev=358541&view=rev
Log:
Add tests for stability to list::sort and forward_list::sort. Thanks to Jonathan Wakely for the notice

Modified:
    libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort.pass.cpp
    libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort_pred.pass.cpp
    libcxx/trunk/test/std/containers/sequences/list/list.ops/sort.pass.cpp
    libcxx/trunk/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp

Modified: libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort.pass.cpp?rev=358541&r1=358540&r2=358541&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort.pass.cpp Tue Apr 16 17:11:00 2019
@@ -38,6 +38,46 @@ void test(int N)
         assert(*j == i);
 }
 
+struct Payload
+{
+    int val;
+    int side;
+    Payload(int v) : val(v), side(0) {}
+    Payload(int v, int s) : val(v), side(s) {}
+    bool operator< (const Payload &rhs) const { return val <  rhs.val;}
+//     bool operator==(const Payload &rhs) const { return val == rhs.val;}
+};
+
+void test_stable(int N)
+{
+    typedef Payload T;
+    typedef std::forward_list<T> C;
+    typedef std::vector<T> V;
+    V v;
+    for (int i = 0; i < N; ++i)
+        v.push_back(Payload(i/2));
+    std::shuffle(v.begin(), v.end(), randomness);
+    for (int i = 0; i < N; ++i)
+        v[i].side = i;
+
+    C c(v.begin(), v.end());
+    c.sort();
+    assert(distance(c.begin(), c.end()) == N);
+
+//  Are we sorted?
+    typename C::const_iterator j = c.begin();
+    for (int i = 0; i < N; ++i, ++j)
+        assert(j->val == i/2);
+
+//  Are we stable?
+    for (C::const_iterator it = c.begin(); it != c.end(); ++it)
+    {
+        C::const_iterator next = std::next(it);
+        if (next != c.end() && it->val == next->val)
+            assert(it->side < next->side);
+    }
+}
+
 int main(int, char**)
 {
     for (int i = 0; i < 40; ++i)
@@ -47,5 +87,8 @@ int main(int, char**)
         test<std::forward_list<int, min_allocator<int>> >(i);
 #endif
 
+    for (int i = 0; i < 40; ++i)
+        test_stable(i);
+
   return 0;
 }

Modified: libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort_pred.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort_pred.pass.cpp?rev=358541&r1=358540&r2=358541&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort_pred.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/forwardlist/forwardlist.ops/sort_pred.pass.cpp Tue Apr 16 17:11:00 2019
@@ -17,11 +17,53 @@
 #include <functional>
 #include <random>
 #include <cassert>
+#include <iostream>
 
 #include "min_allocator.h"
 
 std::mt19937 randomness;
 
+struct Payload
+{
+    int val;
+    int side;
+    Payload(int v) : val(v), side(0) {}
+    Payload(int v, int s) : val(v), side(s) {}
+    bool operator< (const Payload &rhs) const { return val <  rhs.val;}
+};
+
+bool greater(const Payload &lhs, const Payload &rhs) { return lhs.val >  rhs.val; }
+
+void test_stable(int N)
+{
+    typedef Payload T;
+    typedef std::forward_list<T> C;
+    typedef std::vector<T> V;
+    V v;
+    for (int i = 0; i < N; ++i)
+        v.push_back(Payload(i/2));
+    std::shuffle(v.begin(), v.end(), randomness);
+    for (int i = 0; i < N; ++i)
+        v[i].side = i;
+
+    C c(v.begin(), v.end());
+    c.sort(greater);
+    assert(distance(c.begin(), c.end()) == N);
+
+//  Are we sorted?
+    typename C::const_iterator j = c.begin();
+    for (int i = 0; i < N; ++i, ++j)
+        assert(j->val == (N-1-i)/2);
+
+//  Are we stable?
+    for (C::const_iterator it = c.begin(); it != c.end(); ++it)
+    {
+        C::const_iterator next = std::next(it);
+        if (next != c.end() && it->val == next->val)
+            assert(it->side < next->side);
+    }
+}
+
 template <class C>
 void test(int N)
 {
@@ -48,5 +90,8 @@ int main(int, char**)
         test<std::forward_list<int, min_allocator<int>> >(i);
 #endif
 
+    for (int i = 0; i < 40; ++i)
+        test_stable(i);
+
   return 0;
 }

Modified: libcxx/trunk/test/std/containers/sequences/list/list.ops/sort.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/list/list.ops/sort.pass.cpp?rev=358541&r1=358540&r2=358541&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/list/list.ops/sort.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/list/list.ops/sort.pass.cpp Tue Apr 16 17:11:00 2019
@@ -11,10 +11,55 @@
 // void sort();
 
 #include <list>
+#include <random>
+#include <vector>
 #include <cassert>
 
 #include "min_allocator.h"
 
+std::mt19937 randomness;
+
+struct Payload
+{
+    int val;
+    int side;
+    Payload(int v) : val(v), side(0) {}
+    Payload(int v, int s) : val(v), side(s) {}
+    bool operator< (const Payload &rhs) const { return val <  rhs.val;}
+//     bool operator==(const Payload &rhs) const { return val == rhs.val;}
+};
+
+void test_stable(int N)
+{
+    typedef Payload T;
+    typedef std::list<T> C;
+    typedef std::vector<T> V;
+    V v;
+    for (int i = 0; i < N; ++i)
+        v.push_back(Payload(i/2));
+    std::shuffle(v.begin(), v.end(), randomness);
+    for (int i = 0; i < N; ++i)
+        v[i].side = i;
+
+    C c(v.begin(), v.end());
+    c.sort();
+    assert(distance(c.begin(), c.end()) == N);
+
+//  Are we sorted?
+    typename C::const_iterator j = c.begin();
+    for (int i = 0; i < N; ++i, ++j)
+        assert(j->val == i/2);
+
+//  Are we stable?
+    for (C::const_iterator it = c.begin(); it != c.end(); ++it)
+    {
+        C::const_iterator next = std::next(it);
+        if (next != c.end() && it->val == next->val)
+            assert(it->side < next->side);
+    }
+}
+
+
 int main(int, char**)
 {
     {
@@ -34,5 +79,8 @@ int main(int, char**)
     }
 #endif
 
+    for (int i = 0; i < 40; ++i)
+        test_stable(i);
+
   return 0;
 }

Modified: libcxx/trunk/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp?rev=358541&r1=358540&r2=358541&view=diff
==============================================================================
--- libcxx/trunk/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp (original)
+++ libcxx/trunk/test/std/containers/sequences/list/list.ops/sort_comp.pass.cpp Tue Apr 16 17:11:00 2019
@@ -13,10 +13,13 @@
 #include <list>
 #include <functional>
 #include <algorithm>  // for is_permutation
+#include <random>
+#include <vector>
 #include <cassert>
 
 #include "min_allocator.h"
 
+std::mt19937 randomness;
 
 #ifndef TEST_HAS_NO_EXCEPTIONS
 template <typename T>
@@ -35,6 +38,48 @@ struct throwingLess {
 #endif
 
 
+struct Payload
+{
+    int val;
+    int side;
+    Payload(int v) : val(v), side(0) {}
+    Payload(int v, int s) : val(v), side(s) {}
+    bool operator< (const Payload &rhs) const { return val <  rhs.val;}
+};
+
+bool greater(const Payload &lhs, const Payload &rhs) { return lhs.val >  rhs.val; }
+
+void test_stable(int N)
+{
+    typedef Payload T;
+    typedef std::list<T> C;
+    typedef std::vector<T> V;
+    V v;
+    for (int i = 0; i < N; ++i)
+        v.push_back(Payload(i/2));
+    std::shuffle(v.begin(), v.end(), randomness);
+    for (int i = 0; i < N; ++i)
+        v[i].side = i;
+
+    C c(v.begin(), v.end());
+    c.sort(greater);
+    assert(distance(c.begin(), c.end()) == N);
+
+//  Are we sorted?
+    typename C::const_iterator j = c.begin();
+    for (int i = 0; i < N; ++i, ++j)
+        assert(j->val == (N-1-i)/2);
+
+//  Are we stable?
+    for (C::const_iterator it = c.begin(); it != c.end(); ++it)
+    {
+        C::const_iterator next = std::next(it);
+        if (next != c.end() && it->val == next->val)
+            assert(it->side < next->side);
+    }
+}
+
+
 int main(int, char**)
 {
     {
@@ -76,5 +121,8 @@ int main(int, char**)
     }
 #endif
 
+    for (int i = 0; i < 40; ++i)
+        test_stable(i);
+
   return 0;
 }




More information about the libcxx-commits mailing list