#include #include #include #include #include "test_framework/generic_test.h" #include "test_framework/test_failure.h" #include "test_framework/timed_executor.h" using std::swap; using std::vector; void EvenOdd(vector* A_ptr) { vector& A = *A_ptr; int next_even = 0, next_odd = size(A) - 1; while (next_even < next_odd) { if (A[next_even] % 2 == 0) { ++next_even; } else { swap(A[next_even], A[next_odd--]); } } } void EvenOddWrapper(TimedExecutor& executor, vector A) { std::multiset before(begin(A), end(A)); executor.Run([&] { EvenOdd(&A); }); bool in_odd = false; for (int a : A) { if (a % 2 == 0) { if (in_odd) { throw TestFailure("Even elements appear in odd part"); } } else { in_odd = true; } } std::multiset after(begin(A), end(A)); if (before != after) { throw TestFailure("Elements mismatch"); } } int main(int argc, char* argv[]) { std::vector args{argv + 1, argv + argc}; std::vector param_names{"executor", "A"}; return GenericTestMain(args, "even_odd_array.cc", "even_odd_array.tsv", &EvenOddWrapper, DefaultComparator{}, param_names); }