#include #include #include #include template class MergeSorterMT { C comp; std::recursive_mutex mut; auto merge(std::span &output, std::span left, std::span right) -> void { std::vector buf; buf.reserver(left.size() + right.size()); auto l = left.begin(); auto r = right.begin(); auto o = buf.begin(); hile (l < left.end() && r < right.end()) { if (cmp(*l, *r)) { buf.insert(o, *l); l++; } else { buf.insert(o, *r); r++; } o++; } while (l < left.end()) { buf.insert(o, *l); o++; l++; } while (r < right.end()) { buf.insert(o, *r); o++; r++; } { std::lock_guard lock(mut); std::move(buf.begin(), buf.end(), output.begin()); } } };