import java.util.*;
import java.lang.*;
class Main
{
{
System.
out.
println("Hello...");
//////////////////////////////////////////////////////////
Something st1 = new Something(1,2.3);
Something st2 = new Something(4,5.6);
st1.print();
st2.print();
//st1.swap(st2);
swap(st1, st2);
st1.print();
st2.print();
//////////////////////////////////////////////////////////
System.
out.
println("i1: " + i1
+ "\r\ni2: " + i2
+ "\r\n");
// when we do swap intensive-code:
Variable<Integer> v1 = new Variable(i1);
Variable<Integer> v2 = new Variable(i2);
swap(v1, v2);
swap(v1, v2);
swap(v1, v2);
// ...
i1 = v1.getValue();
i2 = v2.getValue();
// end of swap-intensive-code: "unbox" the Veriable<T>s into the original Ts
System.
out.
println("i1: " + i1
+ "\r\ni2: " + i2
+ "\r\n"); }
private static <T extends Swappable> void swap(T a, T b)
{
a.swap(b);
}
}
interface Swappable<T extends Swappable>
{
public void swap(T other);
}
class Something implements Swappable<Something>
{
private int i;
private double d;
public Something(int _i, double _d)
{
this.i = _i;
this.d = _d;
}
public void print()
{
System.
out.
println("i: " + i
+ "\r\nd: " + d
+ "\r\n"); }
public void swap(Something other)
{
int _i = other.i;
double _d = other.d;
other.i = this.i;
other.d = this.d;
this.i = _i;
this.d = _d;
}
}
class Variable<T> implements Swappable<Variable<T>>
{
T value;
public Variable(T _value)
{
this.value = _value;
} // Variable(T)
public void setValue(T newvalue)
{
this.value = newvalue;
} // setValue(T)
public T getValue()
{
return this.value;
} // getValue()
public void swap(Variable<T> other)
{
T tmp = this.value;
this.setValue(other.getValue());
other.setValue(tmp);
} // swap(Variable<T> other)
} // class Variable<T>
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CgpjbGFzcyBNYWluCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCVN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8uLi4iKTsKCQkKCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkJCgkJU29tZXRoaW5nIHN0MSA9IG5ldyBTb21ldGhpbmcoMSwyLjMpOwoJCVNvbWV0aGluZyBzdDIgPSBuZXcgU29tZXRoaW5nKDQsNS42KTsKCQkKCQlzdDEucHJpbnQoKTsKCQlzdDIucHJpbnQoKTsKCQkKCQkvL3N0MS5zd2FwKHN0Mik7CgkJc3dhcChzdDEsIHN0Mik7CgkJCgkJc3QxLnByaW50KCk7CgkJc3QyLnByaW50KCk7CgkJCgkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCQoJCUludGVnZXIgaTEgPSA1OwoJCUludGVnZXIgaTIgPSAxMDsKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oImkxOiAiICsgaTEgKyAiXHJcbmkyOiAiICsgaTIgKyAiXHJcbiIpOwoJCQoJCS8vIHdoZW4gd2UgZG8gc3dhcCBpbnRlbnNpdmUtY29kZToKCQkKCQlWYXJpYWJsZTxJbnRlZ2VyPiB2MSA9IG5ldyBWYXJpYWJsZShpMSk7CgkJVmFyaWFibGU8SW50ZWdlcj4gdjIgPSBuZXcgVmFyaWFibGUoaTIpOwoJCQoJCXN3YXAodjEsIHYyKTsKCQlzd2FwKHYxLCB2Mik7CgkJc3dhcCh2MSwgdjIpOwoJCS8vIC4uLgoJCQoJCWkxID0gdjEuZ2V0VmFsdWUoKTsKCQlpMiA9IHYyLmdldFZhbHVlKCk7CgkJCgkJLy8gZW5kIG9mIHN3YXAtaW50ZW5zaXZlLWNvZGU6ICJ1bmJveCIgdGhlIFZlcmlhYmxlPFQ+cyBpbnRvIHRoZSBvcmlnaW5hbCBUcwoJCQoJCVN5c3RlbS5vdXQucHJpbnRsbigiaTE6ICIgKyBpMSArICJcclxuaTI6ICIgKyBpMiArICJcclxuIik7Cgl9CgkKCXByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgU3dhcHBhYmxlPiB2b2lkIHN3YXAoVCBhLCBUIGIpCgl7CgkJYS5zd2FwKGIpOwoJfQp9CgppbnRlcmZhY2UgU3dhcHBhYmxlPFQgZXh0ZW5kcyBTd2FwcGFibGU+CnsKCXB1YmxpYyB2b2lkIHN3YXAoVCBvdGhlcik7Cn0KCmNsYXNzIFNvbWV0aGluZyBpbXBsZW1lbnRzIFN3YXBwYWJsZTxTb21ldGhpbmc+CnsKCXByaXZhdGUgaW50IGk7Cglwcml2YXRlIGRvdWJsZSBkOwoJCglwdWJsaWMgU29tZXRoaW5nKGludCBfaSwgZG91YmxlIF9kKQoJewoJCXRoaXMuaSA9IF9pOwoJCXRoaXMuZCA9IF9kOwoJfQoJCglwdWJsaWMgdm9pZCBwcmludCgpCgl7CgkJU3lzdGVtLm91dC5wcmludGxuKCJpOiAiICsgaSArICJcclxuZDogIiArIGQgKyAiXHJcbiIpOwoJfQoJCglwdWJsaWMgdm9pZCBzd2FwKFNvbWV0aGluZyBvdGhlcikKCXsKCQlpbnQgX2kgPSBvdGhlci5pOwoJCWRvdWJsZSBfZCA9IG90aGVyLmQ7CgkJCgkJb3RoZXIuaSA9IHRoaXMuaTsKCQlvdGhlci5kID0gdGhpcy5kOwoJCQoJCXRoaXMuaSA9IF9pOwoJCXRoaXMuZCA9IF9kOwoJfQp9CgpjbGFzcyBWYXJpYWJsZTxUPiBpbXBsZW1lbnRzIFN3YXBwYWJsZTxWYXJpYWJsZTxUPj4KewoJVCB2YWx1ZTsKCQoJcHVibGljIFZhcmlhYmxlKFQgX3ZhbHVlKQoJewoJCXRoaXMudmFsdWUgPSBfdmFsdWU7Cgl9IC8vIFZhcmlhYmxlKFQpCgkKCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgbmV3dmFsdWUpCgl7CgkJdGhpcy52YWx1ZSA9IG5ld3ZhbHVlOwoJfSAvLyBzZXRWYWx1ZShUKQoJCglwdWJsaWMgVCBnZXRWYWx1ZSgpCgl7CgkJcmV0dXJuIHRoaXMudmFsdWU7Cgl9IC8vIGdldFZhbHVlKCkKCQoJcHVibGljIHZvaWQgc3dhcChWYXJpYWJsZTxUPiBvdGhlcikKCXsKCQlUIHRtcCA9IHRoaXMudmFsdWU7CgkJdGhpcy5zZXRWYWx1ZShvdGhlci5nZXRWYWx1ZSgpKTsKCQlvdGhlci5zZXRWYWx1ZSh0bXApOwoJfSAvLyBzd2FwKFZhcmlhYmxlPFQ+IG90aGVyKQp9IC8vIGNsYXNzIFZhcmlhYmxlPFQ+