#include <cstddef>
#include <cstdint>
#include <iostream>
template<size_t bytesLeft>
void doXor(void *p1, void *p2) {
*reinterpret_cast<uint64_t*>(p1) ^= *reinterpret_cast<uint64_t*>(p2);
doXor<bytesLeft - 8>(reinterpret_cast<uint8_t*>(p1) + 8, reinterpret_cast<uint8_t*>(p2) + 8);
}
template<>
void doXor<0>(void*, void*) {}
template<>
void doXor<1>(void *p1, void *p2) {
*reinterpret_cast<uint8_t*>(p1) ^= *reinterpret_cast<uint8_t*>(p2);
}
template<>
void doXor<2>(void *p1, void *p2) {
*reinterpret_cast<uint8_t*>(p1) ^= *reinterpret_cast<uint8_t*>(p2);
*(reinterpret_cast<uint8_t*>(p1) + 1) ^= *(reinterpret_cast<uint8_t*>(p2) + 1);
}
template<>
void doXor<3>(void *p1, void *p2) {
*reinterpret_cast<uint8_t*>(p1) ^= *reinterpret_cast<uint8_t*>(p2);
*(reinterpret_cast<uint8_t*>(p1) + 1) ^= *(reinterpret_cast<uint8_t*>(p2) + 1);
*(reinterpret_cast<uint8_t*>(p1) + 2) ^= *(reinterpret_cast<uint8_t*>(p2) + 2);
}
template<>
void doXor<4>(void *p1, void *p2) {
*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2);
}
template<>
void doXor<5>(void *p1, void *p2) {
*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2);
doXor<1>(reinterpret_cast<uint8_t*>(p1) + 4, reinterpret_cast<uint8_t*>(p2) + 4);
}
template<>
void doXor<6>(void *p1, void *p2) {
*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2);
doXor<2>(reinterpret_cast<uint8_t*>(p1) + 4, reinterpret_cast<uint8_t*>(p2) + 4);
}
template<>
void doXor<7>(void *p1, void *p2) {
*reinterpret_cast<uint32_t*>(p1) ^= *reinterpret_cast<uint32_t*>(p2);
doXor<3>(reinterpret_cast<uint8_t*>(p1) + 4, reinterpret_cast<uint8_t*>(p2) + 4);
}
template<typename T>
T& operator^=(T& a, T& b) {
doXor<sizeof(T)>(&a, &b);
return a;
}
struct A {
uint64_t a;
uint64_t b;
uint64_t c;
uint64_t d;
};
int main() {
A a{1,2,3,4};
A b{5,6,7,8};
std::cout << a.a << " " << a.b << " " << a.c << " " << a.d << std::endl;
std::cout << b.a << " " << b.b << " " << b.c << " " << b.d << std::endl;
a ^= b;
b ^= a;
a ^= b;
std::cout << a.a << " " << a.b << " " << a.c << " " << a.d << std::endl;
std::cout << b.a << " " << b.b << " " << b.c << " " << b.d << std::endl;
}
I2luY2x1ZGUgPGNzdGRkZWY+CiNpbmNsdWRlIDxjc3RkaW50PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTxzaXplX3QgYnl0ZXNMZWZ0Pgp2b2lkIGRvWG9yKHZvaWQgKnAxLCB2b2lkICpwMikgewoJKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihwMSkgXj0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDY0X3QqPihwMik7Cglkb1hvcjxieXRlc0xlZnQgLSA4PihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgKyA4LCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyA4KTsKfQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8MD4odm9pZCosIHZvaWQqKSB7fQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8MT4odm9pZCAqcDEsIHZvaWQgKnAyKSB7CgkqcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpIF49ICpyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMik7Cn0KdGVtcGxhdGU8Pgp2b2lkIGRvWG9yPDI+KHZvaWQgKnAxLCB2b2lkICpwMikgewoJKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAxKSBePSAqcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDIpOwoJKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgKyAxKSBePSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAyKSArIDEpOwp9CnRlbXBsYXRlPD4Kdm9pZCBkb1hvcjwzPih2b2lkICpwMSwgdm9pZCAqcDIpIHsKCSpyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgXj0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAyKTsKCSoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpICsgMSkgXj0gKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyAxKTsKCSoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpICsgMikgXj0gKihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyAyKTsKfQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8ND4odm9pZCAqcDEsIHZvaWQgKnAyKSB7CgkqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAxKSBePSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAyKTsKfQp0ZW1wbGF0ZTw+CnZvaWQgZG9Yb3I8NT4odm9pZCAqcDEsIHZvaWQgKnAyKSB7CgkqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAxKSBePSAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHAyKTsKCWRvWG9yPDE+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAxKSArIDQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHAyKSArIDQpOwp9CnRlbXBsYXRlPD4Kdm9pZCBkb1hvcjw2Pih2b2lkICpwMSwgdm9pZCAqcDIpIHsKCSpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4ocDEpIF49ICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4ocDIpOwoJZG9Yb3I8Mj4ocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDEpICsgNCwgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocDIpICsgNCk7Cn0KdGVtcGxhdGU8Pgp2b2lkIGRvWG9yPDc+KHZvaWQgKnAxLCB2b2lkICpwMikgewoJKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihwMSkgXj0gKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihwMik7Cglkb1hvcjwzPihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMSkgKyA0LCByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwMikgKyA0KTsKfQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KVCYgb3BlcmF0b3JePShUJiBhLCBUJiBiKSB7Cglkb1hvcjxzaXplb2YoVCk+KCZhLCAmYik7CglyZXR1cm4gYTsKfQoKc3RydWN0IEEgewoJdWludDY0X3QgYTsKCXVpbnQ2NF90IGI7Cgl1aW50NjRfdCBjOwoJdWludDY0X3QgZDsKfTsKCmludCBtYWluKCkgewoJQSBhezEsMiwzLDR9OwoJQSBiezUsNiw3LDh9OwoJCglzdGQ6OmNvdXQgPDwgYS5hIDw8ICIgIiA8PCBhLmIgPDwgIiAiIDw8IGEuYyA8PCAiICIgPDwgYS5kIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBiLmEgPDwgIiAiIDw8IGIuYiA8PCAiICIgPDwgYi5jIDw8ICIgIiA8PCBiLmQgPDwgc3RkOjplbmRsOwoKCWEgXj0gYjsKCWIgXj0gYTsKCWEgXj0gYjsKCQoJc3RkOjpjb3V0IDw8IGEuYSA8PCAiICIgPDwgYS5iIDw8ICIgIiA8PCBhLmMgPDwgIiAiIDw8IGEuZCA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgYi5hIDw8ICIgIiA8PCBiLmIgPDwgIiAiIDw8IGIuYyA8PCAiICIgPDwgYi5kIDw8IHN0ZDo6ZW5kbDsKfQ==