#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct test {
int const value;
test (int v) : value (v) {
cout << "construct " << this << " (" << value << ")"<< endl;
}
test (test const & other) : value (other. value){
cout << "copy construct " << this << " (" << value << ")"<< " from " << (& other) << " (" << value << ")"<< endl;
}
~test () {
cout << "destruct " << this << " (" << value << ")" << endl;
}
};
template<typename T>
union ac {
T thing;
ac & operator=(ac<T> const & other) {
thing. ~T();
new (& thing) T(other. thing);
}
ac(T && t) : thing (std:: forward<T>(t))
{}
ac(ac<T> const & other) : thing (other. thing) {}
~ac() {
thing. ~T();
}
};
int main() {
cout << "-------------" << endl;
ac<test> one {test {1}};
cout << "-------------" << endl;
ac<test> two {test {2}};
cout << "-------------" << endl;
ac<test> also_one {one};
cout << "-------------" << endl;
also_one = two;
cout << "-------------" << endl;
cout << " a vector with them" << endl;
vector<ac<test>> v {test {3}, one, two};
cout << "gets sorted" << endl;
sort (v. begin (), v. end (), [] (auto const & lhs, auto const & rhs) { return lhs.thing.value < rhs.thing.value; });
for (auto const & e : v) {
cout << e. thing. value << " ";
}
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IHRlc3QgewogaW50IGNvbnN0IHZhbHVlOwogdGVzdCAoaW50IHYpICA6IHZhbHVlICh2KSB7CiAgY291dCA8PCAiY29uc3RydWN0ICIgPDwgdGhpcyA8PCAiICgiIDw8IHZhbHVlIDw8ICIpIjw8IGVuZGw7CiB9CiB0ZXN0ICh0ZXN0IGNvbnN0ICYgb3RoZXIpIDogdmFsdWUgKG90aGVyLiB2YWx1ZSl7CiAgY291dCA8PCAiY29weSBjb25zdHJ1Y3QgIiA8PCB0aGlzIDw8ICIgKCIgPDwgdmFsdWUgPDwgIikiPDwgIiBmcm9tICIgPDwgKCYgb3RoZXIpIDw8ICIgKCIgPDwgdmFsdWUgPDwgIikiPDwgZW5kbDsKIH0KIH50ZXN0ICgpIHsKICBjb3V0IDw8ICJkZXN0cnVjdCAiIDw8IHRoaXMgPDwgIiAoIiA8PCB2YWx1ZSA8PCAiKSIgPDwgZW5kbDsKIH0KfTsKIAoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnVuaW9uIGFjIHsKIFQgdGhpbmc7CiBhYyAmIG9wZXJhdG9yPShhYzxUPiBjb25zdCAmIG90aGVyKSB7CiAgdGhpbmcuIH5UKCk7CiAgbmV3ICgmIHRoaW5nKSBUKG90aGVyLiB0aGluZyk7CiB9CiBhYyhUICYmIHQpIDogdGhpbmcgKHN0ZDo6IGZvcndhcmQ8VD4odCkpCiB7fQogYWMoYWM8VD4gY29uc3QgJiBvdGhlcikgOiB0aGluZyAob3RoZXIuIHRoaW5nKSB7fQogfmFjKCkgewogIHRoaW5nLiB+VCgpOwogfQp9OwoKCmludCBtYWluKCkgewogY291dCA8PCAiLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKIGFjPHRlc3Q+IG9uZSB7dGVzdCB7MX19OwogY291dCA8PCAiLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKIGFjPHRlc3Q+IHR3byB7dGVzdCB7Mn19OwogY291dCA8PCAiLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKIGFjPHRlc3Q+IGFsc29fb25lIHtvbmV9OwogY291dCA8PCAiLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKIGFsc29fb25lID0gdHdvOwogY291dCA8PCAiLS0tLS0tLS0tLS0tLSIgPDwgZW5kbDsKIGNvdXQgPDwgIiBhIHZlY3RvciB3aXRoIHRoZW0iIDw8IGVuZGw7CiB2ZWN0b3I8YWM8dGVzdD4+IHYge3Rlc3QgezN9LCBvbmUsIHR3b307CiBjb3V0IDw8ICJnZXRzIHNvcnRlZCIgPDwgZW5kbDsKIHNvcnQgKHYuIGJlZ2luICgpLCB2LiBlbmQgKCksIFtdIChhdXRvIGNvbnN0ICYgbGhzLCBhdXRvIGNvbnN0ICYgcmhzKSB7IHJldHVybiBsaHMudGhpbmcudmFsdWUgPCByaHMudGhpbmcudmFsdWU7IH0pOwogZm9yIChhdXRvIGNvbnN0ICYgZSA6IHYpIHsKICBjb3V0IDw8IGUuIHRoaW5nLiB2YWx1ZSA8PCAiICI7CiB9CiBjb3V0IDw8IGVuZGw7CiByZXR1cm4gMDsKfQ==