#include <type_traits>
#include <algorithm>
#include <cassert>
#include <iostream>
#include <utility>
#include <vector>
#define FORWARD(arg) static_cast<decltype(arg)&&>(arg)
template <class T>
typename std::conditional
<
std::is_same<typename std::decay<T>::type&&, T&&>{},
T&&,
typename std::decay<T>::type
>::type make_copy(T&& t)
{
using underlying_type = typename std::remove_reference<T>::type;
static_assert(
!std::is_array<underlying_type>{} && !std::is_function<underlying_type>{},
"the argument does not designate a non-array object");
return FORWARD(t);
}
template <class Stream, class Container>
void print_sorted(Stream &stream, Container&& container)
{
auto&& sorted_container = ::make_copy(FORWARD(container));
std::sort(sorted_container.begin(), sorted_container.end());
for (const auto& elem : sorted_container)
stream << elem << '\n';
stream << '\n';
}
int main()
{
std::vector<int> v{3, 4, 1, 5, 2};
const std::vector<int> cv = v;
::print_sorted(std::cout, v);
::print_sorted(std::cout, cv);
::print_sorted(std::cout, std::move(cv));
assert(v == cv);
::print_sorted(std::cout, std::move(v));
assert(v != cv);
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHZlY3Rvcj4KCiNkZWZpbmUgRk9SV0FSRChhcmcpIHN0YXRpY19jYXN0PGRlY2x0eXBlKGFyZykmJj4oYXJnKQoKdGVtcGxhdGUgPGNsYXNzIFQ+CnR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWwKPAogICAgc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUmJiwgVCYmPnt9LAogICAgVCYmLAogICAgdHlwZW5hbWUgc3RkOjpkZWNheTxUPjo6dHlwZQo+Ojp0eXBlIG1ha2VfY29weShUJiYgdCkKewogICAgdXNpbmcgdW5kZXJseWluZ190eXBlID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlOwogICAgc3RhdGljX2Fzc2VydCgKICAgICAgICAhc3RkOjppc19hcnJheTx1bmRlcmx5aW5nX3R5cGU+e30gJiYgIXN0ZDo6aXNfZnVuY3Rpb248dW5kZXJseWluZ190eXBlPnt9LAogICAgICAgICJ0aGUgYXJndW1lbnQgZG9lcyBub3QgZGVzaWduYXRlIGEgbm9uLWFycmF5IG9iamVjdCIpOwogICAgcmV0dXJuIEZPUldBUkQodCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBTdHJlYW0sIGNsYXNzIENvbnRhaW5lcj4Kdm9pZCBwcmludF9zb3J0ZWQoU3RyZWFtICZzdHJlYW0sIENvbnRhaW5lciYmIGNvbnRhaW5lcikKewogICAgYXV0byYmIHNvcnRlZF9jb250YWluZXIgPSA6Om1ha2VfY29weShGT1JXQVJEKGNvbnRhaW5lcikpOwogICAgc3RkOjpzb3J0KHNvcnRlZF9jb250YWluZXIuYmVnaW4oKSwgc29ydGVkX2NvbnRhaW5lci5lbmQoKSk7CiAgICBmb3IgKGNvbnN0IGF1dG8mIGVsZW0gOiBzb3J0ZWRfY29udGFpbmVyKQogICAgICAgIHN0cmVhbSA8PCBlbGVtIDw8ICdcbic7CiAgICBzdHJlYW0gPDwgJ1xuJzsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZ7MywgNCwgMSwgNSwgMn07CiAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+IGN2ID0gdjsKCiAgICA6OnByaW50X3NvcnRlZChzdGQ6OmNvdXQsIHYpOwogICAgOjpwcmludF9zb3J0ZWQoc3RkOjpjb3V0LCBjdik7CiAgICA6OnByaW50X3NvcnRlZChzdGQ6OmNvdXQsIHN0ZDo6bW92ZShjdikpOwogICAgYXNzZXJ0KHYgPT0gY3YpOwoKICAgIDo6cHJpbnRfc29ydGVkKHN0ZDo6Y291dCwgc3RkOjptb3ZlKHYpKTsKICAgIGFzc2VydCh2ICE9IGN2KTsKfQ==