#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
namespace thing {
struct thing {
int dummy;
operator int ( void ) const {
return dummy;
}
thing ( int value) : dummy ( value) { }
thing ( thing const & other) : dummy ( other.dummy ) {
cout << "copy " << this << " from " << & other << endl;
}
thing & operator= ( thing const & other) {
dummy = other.dummy ;
cout << "assign " << this << " from " << & other << endl;
}
void swap ( thing & other) {
cout << "ms " << this << " and " << & other << endl;
internal_swap ( other) ;
}
void internal_swap ( thing & other) {
auto temp = dummy;
dummy = other.dummy ;
other.dummy = dummy;
}
} ;
void swap ( thing & lhs, thing & rhs) {
cout << "fs " << & lhs << " and " << & rhs << endl;
lhs.internal_swap ( rhs) ;
}
}
int main( ) {
vector< thing:: thing > data = { 1 , 21 , 42 } ;
cout << "sorting now" << endl;
sort ( begin ( data) , end ( data) , greater< int > { } ) ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKbmFtZXNwYWNlIHRoaW5nIHsKc3RydWN0IHRoaW5nIHsKIGludCBkdW1teTsKIG9wZXJhdG9yIGludCAodm9pZCkgY29uc3QgewogIHJldHVybiBkdW1teTsKIH0KIHRoaW5nIChpbnQgdmFsdWUpIDogZHVtbXkgKHZhbHVlKSB7fQogdGhpbmcgKHRoaW5nIGNvbnN0ICYgb3RoZXIpIDogZHVtbXkgKG90aGVyLmR1bW15KSB7CiAgY291dCA8PCAiY29weSAgICIgPDwgdGhpcyA8PCAiIGZyb20gIiA8PCAmb3RoZXIgPDwgZW5kbDsKIH0KIHRoaW5nICYgb3BlcmF0b3I9KHRoaW5nIGNvbnN0ICYgb3RoZXIpIHsKICBkdW1teSA9IG90aGVyLmR1bW15OwogIGNvdXQgPDwgImFzc2lnbiAiIDw8IHRoaXMgPDwgIiBmcm9tICIgPDwgJm90aGVyIDw8IGVuZGw7CiB9CiB2b2lkIHN3YXAgKHRoaW5nICYgb3RoZXIpIHsKICBjb3V0IDw8ICJtcyAiIDw8IHRoaXMgPDwgIiBhbmQgIiA8PCAmb3RoZXIgPDwgZW5kbDsKICBpbnRlcm5hbF9zd2FwIChvdGhlcik7CiB9CiB2b2lkIGludGVybmFsX3N3YXAgKHRoaW5nICYgb3RoZXIpIHsKICBhdXRvIHRlbXAgPSBkdW1teTsKICBkdW1teSA9IG90aGVyLmR1bW15OwogIG90aGVyLmR1bW15ID0gZHVtbXk7CiB9Cn07Cgp2b2lkIHN3YXAgKHRoaW5nICYgbGhzLCB0aGluZyAmIHJocykgewogY291dCA8PCAiZnMgIiA8PCAmbGhzIDw8ICIgYW5kICIgPDwgJnJocyA8PCBlbmRsOwogbGhzLmludGVybmFsX3N3YXAocmhzKTsKfQp9CgppbnQgbWFpbigpIHsKIHZlY3Rvcjx0aGluZzo6IHRoaW5nPiBkYXRhICA9IHsxLCAyMSwgNDJ9OwogY291dCA8PCAic29ydGluZyBub3ciIDw8IGVuZGw7CiBzb3J0IChiZWdpbiAoZGF0YSksIGVuZCAoZGF0YSksIGdyZWF0ZXI8aW50Pnt9KTsKIHJldHVybiAwOwp9