diff options
Diffstat (limited to 'contrib/libstdc++/tests/tlist.cc')
-rw-r--r-- | contrib/libstdc++/tests/tlist.cc | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/contrib/libstdc++/tests/tlist.cc b/contrib/libstdc++/tests/tlist.cc new file mode 100644 index 0000000..a37c999 --- /dev/null +++ b/contrib/libstdc++/tests/tlist.cc @@ -0,0 +1,151 @@ +// test/demo of generic lists + +#include <assert.h> + +#define tassert(ex) {if ((ex)) cerr << #ex << "\n"; \ + else _assert(#ex, __FILE__,__LINE__); } + +#include <iostream.h> +#include <list.h> +#include <algo.h> + +bool int_compare(int a, int b) +{ + return a < b; +} + +int inc(int x) +{ + return x + 1; +} + +void print(list<int>& l) +{ + for (list<int>::iterator it = l.begin(); it != l.end(); it++) + cout << *it << " "; + cout << "\n"; +} + +int is_odd(int x) +{ + return x & 1; +} + +int is_even(int x) +{ + return (x & 1) == 0; +} + +void sequence(list<int>& a, int lo, int hi) +{ + back_insert_iterator<list<int> > it(a); + while (lo <= hi) + *it++ = lo++; +} + +int old_rand = 9999; + +int get_rand() +{ + old_rand = ((long)old_rand * (long)1243) % (long)971; + return old_rand; +} + +void randseq(list<int>& a, int n) +{ + back_insert_iterator<list<int> > it(a); + while (--n >= 0) + *it++ = get_rand() % 50; +} + +int array1 [] = { 9, 16, 36 }; +int array2 [] = { 1, 4 }; + +int test_splice () +{ + list<int> l1 (array1, array1 + 3); + list<int> l2 (array2, array2 + 2); + list<int>::iterator i1 = l1.begin (); + l1.splice (i1, l2); + list<int>::iterator i2 = l1.begin (); + while (i2 != l1.end ()) + cout << *i2++ << endl; + return 0; +} + +main() +{ + list<int> a; int i; + list<int>::iterator it, bit; + sequence(a, 1, 20); + cout << "\nlist<int> a = sequence(1, 20);\n"; print(a); + for (it = a.begin (), i = 0; it != a.end (); it++, i++) + assert (*it == i + 1); + list<int> b; + randseq(b, 20); + cout << "\nlist<int> b = randseq(20);\n"; print(b); + list<int> c; + c.insert (c.end(), a.begin(), a.end()); + c.insert (c.end(), b.begin(), b.end()); + cout << "\nlist<int> c = a and b;\n"; print(c); + + list<int> d; + for (it = a.begin(); it != a.end(); it++) + d.insert(d.end (), inc(*it)); + cout << "\nlist<int> d = map(inc, a);\n"; print(d); + + list<int> e; + back_insert_iterator<list<int> > e_insertor (e); + reverse_copy (a.begin(), a.end (), e_insertor); + cout << "\nlist<int> e = reverse(a);\n"; print(e); + + list<int> f; + for (it = a.begin(); it != a.end(); it++) + if (is_odd (*it)) + f.insert(f.end (), *it); + cout << "\nlist<int> f = select(is_odd, a);\n"; print(f); + list<int> ff; + for (it = f.begin(); it != f.end(); it++) + if (is_even (*it)) + ff.insert(ff.end (), *it); + assert(ff.empty()); + + int red = 0; + for (it = a.begin(); it != a.end(); it++) + red += *it; + cout << "\nint red = a.reduce(plus, 0);\n"; cout << red; + it = a.begin(); ++it; ++it; + int second = *it; + cout << "\nint second = a[2];\n"; cout << second; + list<int> g; + for (it = a.begin(), bit = b.begin(); it != a.end () && bit != b.end (); ) + g.insert (g.end (), *it++ + *bit++); + cout << "\nlist<int> g = combine(plus, a, b);\n"; print(g); + g.remove_if (is_odd); + cout << "\ng.del(is_odd);\n"; print(g); + + ff.erase (ff.begin (), ff.end()); + for (it = g.begin(); it != g.end(); it++) + if (is_odd (*it)) + ff.insert (ff.end (), *it); + assert(ff.empty()); + + b.sort(); + for (it = b.begin(); bit = it++, it != b.end (); ) assert (*it >= *bit); + cout << "\nb.sort(int_compare);\n"; print(b); + + list<int> h; + back_insert_iterator<list<int> > h_insertor (h); + merge (a.begin (), a.end (), b.begin (), b.end (), h_insertor, int_compare); + cout << "\nlist<int> h = merge(a, b, int_compare);\n"; print(h); + for (it = h.begin(); bit = it++, it != h.end (); ) assert (*it >= *bit); + + cout << "\nh via iterator:\n"; + for (it = h.begin(); it != h.end (); it++) + cout << *it << ", "; + cout << "\n"; + + test_splice (); + + cout << "\ndone\n"; +} |