int main(int argc, char ** argv) { generate_test_case(atoi(argv[1]), argv[2]); }
void test(size_t n) { std::vector<int> keys(n); std::vector<int> values(n, 1); std::cout << "generating test case for n = " << n << "... " << std::flush; generate_test_case(keys.begin(), keys.end(), values.begin()); std::cout << "done." << std::endl; // silence for large n if(n < 100) { std::clog.rdbuf((n < 100) ? std::clog.rdbuf() : 0); std::clog << "test(): keys : "; std::copy(keys.begin(), keys.end(), std::ostream_iterator<int>(std::clog, " ")); std::clog << std::endl; std::clog << "test(): tail_flags: "; auto flags = make_tail_flags(keys.begin(), keys.end()); std::copy(flags.begin(), flags.end(), std::ostream_iterator<int>(std::clog, " ")); std::clog << std::endl; std::clog << "test(): values: "; std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::clog, " ")); std::clog << std::endl; } std::vector<int> keys_result(n); std::vector<int> values_result(n, 13); auto ends = experimental::reduce_by_key(keys.begin(), keys.end(), values.begin(), keys_result.begin(), values_result.begin(), thrust::equal_to<int>(), thrust::plus<int>()); keys_result.erase(ends.first, keys_result.end()); values_result.erase(ends.second, values_result.end()); if(n < 100) { std::clog << "test(): keys_result: "; std::copy(keys_result.begin(), keys_result.end(), std::ostream_iterator<int>(std::clog, " ")); std::clog << std::endl; std::clog << "test(): values_result: "; std::copy(values_result.begin(), values_result.end(), std::ostream_iterator<int>(std::clog, " ")); std::clog << std::endl; } std::vector<int> keys_result_reference(n); std::vector<int> values_result_reference(n); auto ends1 = thrust::reduce_by_key(keys.begin(), keys.end(), values.begin(), keys_result_reference.begin(), values_result_reference.begin()); keys_result_reference.erase(ends1.first, keys_result_reference.end()); values_result_reference.erase(ends1.second, values_result_reference.end()); if(n < 100) { std::clog << "test(): keys_result_reference: "; std::copy(keys_result_reference.begin(), keys_result_reference.end(), std::ostream_iterator<int>(std::clog, " ")); std::clog << std::endl; std::clog << "test(): values_result_reference: "; std::copy(values_result_reference.begin(), values_result_reference.end(), std::ostream_iterator<int>(std::clog, " ")); std::clog << std::endl; } assert(keys_result_reference == keys_result); assert(values_result_reference == values_result); std::cout << "test passed." << std::endl; }