123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- //===----------------------------------------------------------------------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is dual licensed under the MIT and the University of Illinois Open
- // Source Licenses. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- // <algorithm>
- // template<BidirectionalIterator Iter, Predicate<auto, Iter::value_type> Pred>
- // requires ShuffleIterator<Iter>
- // && CopyConstructible<Pred>
- // Iter
- // stable_partition(Iter first, Iter last, Pred pred);
- #include <algorithm>
- #include <cassert>
- #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- #include <memory>
- #endif
- #include "test_iterators.h"
- struct is_odd
- {
- bool operator()(const int& i) const {return i & 1;}
- };
- struct odd_first
- {
- bool operator()(const std::pair<int,int>& p) const
- {return p.first & 1;}
- };
- template <class Iter>
- void
- test()
- {
- { // check mixed
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(0, 1),
- P(0, 2),
- P(1, 1),
- P(1, 2),
- P(2, 1),
- P(2, 2),
- P(3, 1),
- P(3, 2),
- P(4, 1),
- P(4, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array + 4);
- assert(array[0] == P(1, 1));
- assert(array[1] == P(1, 2));
- assert(array[2] == P(3, 1));
- assert(array[3] == P(3, 2));
- assert(array[4] == P(0, 1));
- assert(array[5] == P(0, 2));
- assert(array[6] == P(2, 1));
- assert(array[7] == P(2, 2));
- assert(array[8] == P(4, 1));
- assert(array[9] == P(4, 2));
- }
- {
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(0, 1),
- P(0, 2),
- P(1, 1),
- P(1, 2),
- P(2, 1),
- P(2, 2),
- P(3, 1),
- P(3, 2),
- P(4, 1),
- P(4, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array + 4);
- assert(array[0] == P(1, 1));
- assert(array[1] == P(1, 2));
- assert(array[2] == P(3, 1));
- assert(array[3] == P(3, 2));
- assert(array[4] == P(0, 1));
- assert(array[5] == P(0, 2));
- assert(array[6] == P(2, 1));
- assert(array[7] == P(2, 2));
- assert(array[8] == P(4, 1));
- assert(array[9] == P(4, 2));
- // check empty
- r = std::stable_partition(Iter(array), Iter(array), odd_first());
- assert(base(r) == array);
- // check one true
- r = std::stable_partition(Iter(array), Iter(array+1), odd_first());
- assert(base(r) == array+1);
- assert(array[0] == P(1, 1));
- // check one false
- r = std::stable_partition(Iter(array+4), Iter(array+5), odd_first());
- assert(base(r) == array+4);
- assert(array[4] == P(0, 1));
- }
- { // check all false
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(0, 1),
- P(0, 2),
- P(2, 1),
- P(2, 2),
- P(4, 1),
- P(4, 2),
- P(6, 1),
- P(6, 2),
- P(8, 1),
- P(8, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array);
- assert(array[0] == P(0, 1));
- assert(array[1] == P(0, 2));
- assert(array[2] == P(2, 1));
- assert(array[3] == P(2, 2));
- assert(array[4] == P(4, 1));
- assert(array[5] == P(4, 2));
- assert(array[6] == P(6, 1));
- assert(array[7] == P(6, 2));
- assert(array[8] == P(8, 1));
- assert(array[9] == P(8, 2));
- }
- { // check all true
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(1, 1),
- P(1, 2),
- P(3, 1),
- P(3, 2),
- P(5, 1),
- P(5, 2),
- P(7, 1),
- P(7, 2),
- P(9, 1),
- P(9, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array + size);
- assert(array[0] == P(1, 1));
- assert(array[1] == P(1, 2));
- assert(array[2] == P(3, 1));
- assert(array[3] == P(3, 2));
- assert(array[4] == P(5, 1));
- assert(array[5] == P(5, 2));
- assert(array[6] == P(7, 1));
- assert(array[7] == P(7, 2));
- assert(array[8] == P(9, 1));
- assert(array[9] == P(9, 2));
- }
- { // check all false but first true
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(1, 1),
- P(0, 2),
- P(2, 1),
- P(2, 2),
- P(4, 1),
- P(4, 2),
- P(6, 1),
- P(6, 2),
- P(8, 1),
- P(8, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array + 1);
- assert(array[0] == P(1, 1));
- assert(array[1] == P(0, 2));
- assert(array[2] == P(2, 1));
- assert(array[3] == P(2, 2));
- assert(array[4] == P(4, 1));
- assert(array[5] == P(4, 2));
- assert(array[6] == P(6, 1));
- assert(array[7] == P(6, 2));
- assert(array[8] == P(8, 1));
- assert(array[9] == P(8, 2));
- }
- { // check all false but last true
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(0, 1),
- P(0, 2),
- P(2, 1),
- P(2, 2),
- P(4, 1),
- P(4, 2),
- P(6, 1),
- P(6, 2),
- P(8, 1),
- P(1, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array + 1);
- assert(array[0] == P(1, 2));
- assert(array[1] == P(0, 1));
- assert(array[2] == P(0, 2));
- assert(array[3] == P(2, 1));
- assert(array[4] == P(2, 2));
- assert(array[5] == P(4, 1));
- assert(array[6] == P(4, 2));
- assert(array[7] == P(6, 1));
- assert(array[8] == P(6, 2));
- assert(array[9] == P(8, 1));
- }
- { // check all true but first false
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(0, 1),
- P(1, 2),
- P(3, 1),
- P(3, 2),
- P(5, 1),
- P(5, 2),
- P(7, 1),
- P(7, 2),
- P(9, 1),
- P(9, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array + size-1);
- assert(array[0] == P(1, 2));
- assert(array[1] == P(3, 1));
- assert(array[2] == P(3, 2));
- assert(array[3] == P(5, 1));
- assert(array[4] == P(5, 2));
- assert(array[5] == P(7, 1));
- assert(array[6] == P(7, 2));
- assert(array[7] == P(9, 1));
- assert(array[8] == P(9, 2));
- assert(array[9] == P(0, 1));
- }
- { // check all true but last false
- typedef std::pair<int,int> P;
- P array[] =
- {
- P(1, 1),
- P(1, 2),
- P(3, 1),
- P(3, 2),
- P(5, 1),
- P(5, 2),
- P(7, 1),
- P(7, 2),
- P(9, 1),
- P(0, 2)
- };
- const unsigned size = sizeof(array)/sizeof(array[0]);
- Iter r = std::stable_partition(Iter(array), Iter(array+size), odd_first());
- assert(base(r) == array + size-1);
- assert(array[0] == P(1, 1));
- assert(array[1] == P(1, 2));
- assert(array[2] == P(3, 1));
- assert(array[3] == P(3, 2));
- assert(array[4] == P(5, 1));
- assert(array[5] == P(5, 2));
- assert(array[6] == P(7, 1));
- assert(array[7] == P(7, 2));
- assert(array[8] == P(9, 1));
- assert(array[9] == P(0, 2));
- }
- }
- #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- struct is_null
- {
- template <class P>
- bool operator()(const P& p) {return p == 0;}
- };
- template <class Iter>
- void
- test1()
- {
- const unsigned size = 5;
- std::unique_ptr<int> array[size];
- Iter r = std::stable_partition(Iter(array), Iter(array+size), is_null());
- }
- #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
- int main()
- {
- test<bidirectional_iterator<std::pair<int,int>*> >();
- test<random_access_iterator<std::pair<int,int>*> >();
- test<std::pair<int,int>*>();
- #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
- test1<bidirectional_iterator<std::unique_ptr<int>*> >();
- #endif
- }
|