#include "stdio.h"
namespace A {
template <typename T>
struct Key {
T value;
};
template <typename T>
bool operator==(const Key<T> &a, const Key<T> &b) {
return a.value == b.value;
}
}
namespace B {
template <typename KT, typename VT>
struct MappedVal {
VT value;
A::Key<KT> key;
};
template <typename KT, typename VT>
bool operator==(const MappedVal<KT, VT> &a, const MappedVal<KT, VT> &b) {
return (a.key == b.key && a.value == b.value);
}
}
int main() {
A::Key<short> key1, key2;
key1.value = 1;
key2.value = 1;
B::MappedVal<short, double> val1, val2;
val1.key = key1;
val1.value = 12.41;
val2.key = key1;
val2.value = 12.41;
bool test1 = (key1 == key2);
bool test2 = (val1 == val2);
printf("key1 == key2: %s", (test1 ? "true" : "false"));
printf("val1 == val2: %s", (test2 ? "true" : "false"));
return 0;
}
I2luY2x1ZGUgInN0ZGlvLmgiCgpuYW1lc3BhY2UgQSB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBLZXkgewogICAgICBUIHZhbHVlOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXk8VD4gJmEsIGNvbnN0IEtleTxUPiAmYikgewogICAgICByZXR1cm4gYS52YWx1ZSA9PSBiLnZhbHVlOwogICAgfQp9Cm5hbWVzcGFjZSBCIHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLVCwgdHlwZW5hbWUgVlQ+CiAgICBzdHJ1Y3QgTWFwcGVkVmFsIHsKICAgICAgVlQgdmFsdWU7CiAgICAgIEE6OktleTxLVD4ga2V5OwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS1QsIHR5cGVuYW1lIFZUPgogICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hcHBlZFZhbDxLVCwgVlQ+ICZhLCBjb25zdCBNYXBwZWRWYWw8S1QsIFZUPiAmYikgewogICAgICByZXR1cm4gKGEua2V5ID09IGIua2V5ICYmIGEudmFsdWUgPT0gYi52YWx1ZSk7CiAgICB9Cn0KCmludCBtYWluKCkgewogIEE6OktleTxzaG9ydD4ga2V5MSwga2V5MjsKICBrZXkxLnZhbHVlID0gMTsKICBrZXkyLnZhbHVlID0gMTsKCiAgQjo6TWFwcGVkVmFsPHNob3J0LCBkb3VibGU+IHZhbDEsIHZhbDI7CiAgdmFsMS5rZXkgPSBrZXkxOwogIHZhbDEudmFsdWUgPSAxMi40MTsKCiAgdmFsMi5rZXkgPSBrZXkxOwogIHZhbDIudmFsdWUgPSAxMi40MTsKCiAgYm9vbCB0ZXN0MSA9IChrZXkxID09IGtleTIpOwogIGJvb2wgdGVzdDIgPSAodmFsMSA9PSB2YWwyKTsKCiAgcHJpbnRmKCJrZXkxID09IGtleTI6ICVzIiwgKHRlc3QxID8gInRydWUiIDogImZhbHNlIikpOwogIHByaW50ZigidmFsMSA9PSB2YWwyOiAlcyIsICh0ZXN0MiA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKCiAgcmV0dXJuIDA7Cn0=