#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
template<class BiDirIt, class Compare = std::less<>>
void merge_sort(BiDirIt first, BiDirIt last, Compare cmp = Compare{})
{
auto const N = std::distance(first, last);
if (N <= 1) return;
auto const middle = std::next(first, N / 2);
merge_sort(first, middle, cmp); // assert(std::is_sorted(first, middle, cmp));
merge_sort(middle, last, cmp); // assert(std::is_sorted(middle, last, cmp));
std::inplace_merge(first, middle, last, cmp); // assert(std::is_sorted(first, last, cmp));
}
class int_buffer {
public:
explicit int_buffer(size_t size); // size_t is defined in cstdlib
int_buffer(const int* source, size_t size);
int_buffer(const int_buffer& rhs); // copy construct
int_buffer(int_buffer&& rhs); // move construct
int_buffer & operator=(const int_buffer& rhs); // copy assign
int_buffer & operator=(int_buffer&& rhs); // move assign
size_t size() const;
int* begin();
int* end();
const int* begin() const;
const int* end() const;
~int_buffer();
private:
int* buffer;
size_t bufferSize;
};
int_buffer::int_buffer(size_t size) :buffer(new int[size]), bufferSize(size) {
}
int_buffer::int_buffer(const int* source, size_t size) : buffer(new int[size]), bufferSize(size) {
for (int i = 0; i < size; i++) {
buffer[i] = source[i];
}
}
int_buffer::int_buffer(const int_buffer& rhs) :buffer(new int[rhs.size()]), bufferSize(rhs.size()) {
std::copy(rhs.begin(), rhs.end(), begin());
}
int_buffer::int_buffer(int_buffer&& rhs) {
buffer = rhs.buffer;
bufferSize = rhs.size();
rhs.buffer = nullptr;
}
int_buffer& int_buffer::operator=(const int_buffer& rhs) {
if (buffer == rhs.begin()) {
return *this;
}
else if (bufferSize == rhs.size()) {
std::copy(rhs.begin(), rhs.end(), begin());
return *this;
}
else {
delete[]buffer;
buffer = new int[rhs.size()];
bufferSize = rhs.size();
std::copy(rhs.begin(), rhs.end(), begin());
return *this;
}
return *this;
}
int_buffer& int_buffer::operator=(int_buffer&& rhs) {
if (this != &rhs) {
delete[]buffer;
this->buffer = rhs.buffer;
rhs.buffer = nullptr;
}
return *this;
}
size_t int_buffer::size() const {
return bufferSize;
}
int* int_buffer::begin() {
return buffer;
}
int* int_buffer::end() {
return buffer + bufferSize;
}
const int* int_buffer::begin() const {
return buffer;
}
const int* int_buffer::end() const {
return buffer + bufferSize;
}
int_buffer::~int_buffer() {
delete[]buffer;
}
using namespace std;
void fill(int_buffer &buffer);
int main(int argc, const char * argv[]) {
int_buffer buffer(10);
fill(buffer);
merge_sort(buffer.begin(), buffer.end());
std::cout << "\n";
std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<int>(std::cout, " "));
return 0;
}
void fill(int_buffer &buffer) {
int value = 0;
for (int *i = buffer.begin(); i != buffer.end(); i++) {
value = rand() % 10;
*i = value;
}
for (const int* i = buffer.begin(); i != buffer.end(); i++) {
std::cout << *i << std::endl;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGl0ZXJhdG9yPgoKdGVtcGxhdGU8Y2xhc3MgQmlEaXJJdCwgY2xhc3MgQ29tcGFyZSA9IHN0ZDo6bGVzczw+Pgp2b2lkIG1lcmdlX3NvcnQoQmlEaXJJdCBmaXJzdCwgQmlEaXJJdCBsYXN0LCBDb21wYXJlIGNtcCA9IENvbXBhcmV7fSkKewogICAgYXV0byBjb25zdCBOID0gc3RkOjpkaXN0YW5jZShmaXJzdCwgbGFzdCk7CiAgICBpZiAoTiA8PSAxKSByZXR1cm47CiAgICBhdXRvIGNvbnN0IG1pZGRsZSA9IHN0ZDo6bmV4dChmaXJzdCwgTiAvIDIpOwogICAgbWVyZ2Vfc29ydChmaXJzdCwgbWlkZGxlLCBjbXApOyAvLyBhc3NlcnQoc3RkOjppc19zb3J0ZWQoZmlyc3QsIG1pZGRsZSwgY21wKSk7CiAgICBtZXJnZV9zb3J0KG1pZGRsZSwgbGFzdCwgY21wKTsgIC8vIGFzc2VydChzdGQ6OmlzX3NvcnRlZChtaWRkbGUsIGxhc3QsIGNtcCkpOwogICAgc3RkOjppbnBsYWNlX21lcmdlKGZpcnN0LCBtaWRkbGUsIGxhc3QsIGNtcCk7IC8vIGFzc2VydChzdGQ6OmlzX3NvcnRlZChmaXJzdCwgbGFzdCwgY21wKSk7Cn0KCmNsYXNzIGludF9idWZmZXIgewpwdWJsaWM6CiAgICBleHBsaWNpdCBpbnRfYnVmZmVyKHNpemVfdCBzaXplKTsgLy8gc2l6ZV90IGlzIGRlZmluZWQgaW4gY3N0ZGxpYgogICAgaW50X2J1ZmZlcihjb25zdCBpbnQqIHNvdXJjZSwgc2l6ZV90IHNpemUpOwogICAgaW50X2J1ZmZlcihjb25zdCBpbnRfYnVmZmVyJiByaHMpOyAvLyBjb3B5IGNvbnN0cnVjdAogICAgaW50X2J1ZmZlcihpbnRfYnVmZmVyJiYgcmhzKTsgLy8gbW92ZSBjb25zdHJ1Y3QKICAgIGludF9idWZmZXIgJiBvcGVyYXRvcj0oY29uc3QgaW50X2J1ZmZlciYgcmhzKTsgLy8gY29weSBhc3NpZ24KICAgIGludF9idWZmZXIgJiBvcGVyYXRvcj0oaW50X2J1ZmZlciYmIHJocyk7IC8vIG1vdmUgYXNzaWduCiAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwogICAgaW50KiBiZWdpbigpOwogICAgaW50KiBlbmQoKTsKICAgIGNvbnN0IGludCogYmVnaW4oKSBjb25zdDsKICAgIGNvbnN0IGludCogZW5kKCkgY29uc3Q7CiAgICB+aW50X2J1ZmZlcigpOwpwcml2YXRlOgogICAgaW50KiBidWZmZXI7CiAgICBzaXplX3QgYnVmZmVyU2l6ZTsKfTsKCmludF9idWZmZXI6OmludF9idWZmZXIoc2l6ZV90IHNpemUpIDpidWZmZXIobmV3IGludFtzaXplXSksIGJ1ZmZlclNpemUoc2l6ZSkgewp9CgppbnRfYnVmZmVyOjppbnRfYnVmZmVyKGNvbnN0IGludCogc291cmNlLCBzaXplX3Qgc2l6ZSkgOiBidWZmZXIobmV3IGludFtzaXplXSksIGJ1ZmZlclNpemUoc2l6ZSkgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICBidWZmZXJbaV0gPSBzb3VyY2VbaV07CiAgICB9Cn0KCmludF9idWZmZXI6OmludF9idWZmZXIoY29uc3QgaW50X2J1ZmZlciYgcmhzKSA6YnVmZmVyKG5ldyBpbnRbcmhzLnNpemUoKV0pLCBidWZmZXJTaXplKHJocy5zaXplKCkpIHsKICAgIHN0ZDo6Y29weShyaHMuYmVnaW4oKSwgcmhzLmVuZCgpLCBiZWdpbigpKTsKfQoKaW50X2J1ZmZlcjo6aW50X2J1ZmZlcihpbnRfYnVmZmVyJiYgcmhzKSB7CiAgICBidWZmZXIgPSByaHMuYnVmZmVyOwogICAgYnVmZmVyU2l6ZSA9IHJocy5zaXplKCk7CiAgICByaHMuYnVmZmVyID0gbnVsbHB0cjsKfQoKaW50X2J1ZmZlciYgaW50X2J1ZmZlcjo6b3BlcmF0b3I9KGNvbnN0IGludF9idWZmZXImIHJocykgewogICAgaWYgKGJ1ZmZlciA9PSByaHMuYmVnaW4oKSkgewogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIGVsc2UgaWYgKGJ1ZmZlclNpemUgPT0gcmhzLnNpemUoKSkgewogICAgICAgIHN0ZDo6Y29weShyaHMuYmVnaW4oKSwgcmhzLmVuZCgpLCBiZWdpbigpKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBkZWxldGVbXWJ1ZmZlcjsKICAgICAgICBidWZmZXIgPSBuZXcgaW50W3Jocy5zaXplKCldOwogICAgICAgIGJ1ZmZlclNpemUgPSByaHMuc2l6ZSgpOwogICAgICAgIHN0ZDo6Y29weShyaHMuYmVnaW4oKSwgcmhzLmVuZCgpLCBiZWdpbigpKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICByZXR1cm4gKnRoaXM7Cn0KCmludF9idWZmZXImIGludF9idWZmZXI6Om9wZXJhdG9yPShpbnRfYnVmZmVyJiYgcmhzKSB7CiAgICBpZiAodGhpcyAhPSAmcmhzKSB7CiAgICAgICAgZGVsZXRlW11idWZmZXI7CiAgICAgICAgdGhpcy0+YnVmZmVyID0gcmhzLmJ1ZmZlcjsKICAgICAgICByaHMuYnVmZmVyID0gbnVsbHB0cjsKICAgIH0KICAgIHJldHVybiAqdGhpczsKfQoKCnNpemVfdCBpbnRfYnVmZmVyOjpzaXplKCkgY29uc3QgewogICAgcmV0dXJuIGJ1ZmZlclNpemU7Cn0KCmludCogaW50X2J1ZmZlcjo6YmVnaW4oKSB7CiAgICByZXR1cm4gYnVmZmVyOwp9CgppbnQqIGludF9idWZmZXI6OmVuZCgpIHsKICAgIHJldHVybiBidWZmZXIgKyBidWZmZXJTaXplOwp9Cgpjb25zdCBpbnQqIGludF9idWZmZXI6OmJlZ2luKCkgY29uc3QgewogICAgcmV0dXJuIGJ1ZmZlcjsKfQoKY29uc3QgaW50KiBpbnRfYnVmZmVyOjplbmQoKSBjb25zdCB7CiAgICByZXR1cm4gYnVmZmVyICsgYnVmZmVyU2l6ZTsKfQoKaW50X2J1ZmZlcjo6fmludF9idWZmZXIoKSB7CiAgICBkZWxldGVbXWJ1ZmZlcjsKfQoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdm9pZCBmaWxsKGludF9idWZmZXIgJmJ1ZmZlcik7CgppbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3ZbXSkgewogICAgaW50X2J1ZmZlciBidWZmZXIoMTApOwogICAgZmlsbChidWZmZXIpOwogICAgbWVyZ2Vfc29ydChidWZmZXIuYmVnaW4oKSwgYnVmZmVyLmVuZCgpKTsKICAgIHN0ZDo6Y291dCA8PCAiXG4iOwogICAgc3RkOjpjb3B5KGJ1ZmZlci5iZWdpbigpLCBidWZmZXIuZW5kKCksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+KHN0ZDo6Y291dCwgIiAiKSk7CgogICAgcmV0dXJuIDA7Cn0KCnZvaWQgZmlsbChpbnRfYnVmZmVyICZidWZmZXIpIHsKICAgIGludCB2YWx1ZSA9IDA7CiAgICBmb3IgKGludCAqaSA9IGJ1ZmZlci5iZWdpbigpOyBpICE9IGJ1ZmZlci5lbmQoKTsgaSsrKSB7CiAgICAgICAgdmFsdWUgPSByYW5kKCkgJSAxMDsKICAgICAgICAqaSA9IHZhbHVlOwogICAgfQoKICAgIGZvciAoY29uc3QgaW50KiBpID0gYnVmZmVyLmJlZ2luKCk7IGkgIT0gYnVmZmVyLmVuZCgpOyBpKyspIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgKmkgPDwgc3RkOjplbmRsOwogICAgfQp9Cg==