template struct sorter { thread_pool pool; std::list do_sort(std::list& chunk_data) { if (chunk_data.empty()) { return chunk_data; } std::list result; result.splice(result.begin(), chunk_data, chunk_data.begin()); T const& partition_val = *result.begin(); typename std::list::iterator divide_point = std::partition(chunk_data.begin(), chunk_data.end(), [&](T const& val) { return val < partition_val; }); std::list new_lower_chunk; new_lower_chunk.splice( new_lower_chunk.end(), chunk_data, chunk_data.begin(), divide_point); thread_pool::task_handle> new_lower = pool.submit( std::bind(&sorter::do_sort, this, std::move(new_lower_chunk))); std::list new_higher(do_sort(chunk_data)); result.splice(result.end(), new_higher); while (!new_lower.is_ready()) { pool.run_pending_task(); } result.splice(result.begin(), new_lower.get()); return result; } }; template std::list parallel_quick_sort(std::list input) { if (input.empty()) { return input; } sorter s; return s.do_sort(input); }