#include "stdio.h"
namespace A {
template <typename T>
struct Key {
T value;
};
template <
typename T,
template<typename> class KeyType
>
bool operator==(const KeyType<T> &a, const KeyType<T> &b) {
return a.value == b.value;
}
}
namespace B {
template <typename KT, typename VT>
struct MappedVal {
VT value;
KT key;
};
template <
typename KT,
typename VT,
template<typename,typename> class MappedType
>
bool operator==(const MappedType<KT, VT> &a, const MappedType<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<A::Key<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\n", (test1 ? "true" : "false"));
printf("val1 == val2: %s\n", (test2 ? "true" : "false"));
return 0;
}
I2luY2x1ZGUgInN0ZGlvLmgiCgpuYW1lc3BhY2UgQSB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBLZXkgewogICAgICBUIHZhbHVlOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8CiAgICAgICAgdHlwZW5hbWUgVCwKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4gY2xhc3MgS2V5VHlwZQogICAgPgogICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleVR5cGU8VD4gJmEsIGNvbnN0IEtleVR5cGU8VD4gJmIpIHsKICAgICAgcmV0dXJuIGEudmFsdWUgPT0gYi52YWx1ZTsKICAgIH0KfQpuYW1lc3BhY2UgQiB7CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS1QsIHR5cGVuYW1lIFZUPgogICAgc3RydWN0IE1hcHBlZFZhbCB7CiAgICAgIFZUIHZhbHVlOwogICAgICBLVCBrZXk7CiAgICB9OwoKICAgIHRlbXBsYXRlIDwKICAgICAgICB0eXBlbmFtZSBLVCwKICAgICAgICB0eXBlbmFtZSBWVCwKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSx0eXBlbmFtZT4gY2xhc3MgTWFwcGVkVHlwZQogICAgPgogICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hcHBlZFR5cGU8S1QsIFZUPiAmYSwgY29uc3QgTWFwcGVkVHlwZTxLVCwgVlQ+ICZiKSB7CiAgICAgIHJldHVybiAoYS5rZXkgPT0gYi5rZXkgJiYgYS52YWx1ZSA9PSBiLnZhbHVlKTsKICAgIH0KfQoKaW50IG1haW4oKSB7CiAgQTo6S2V5PHNob3J0PiBrZXkxLCBrZXkyOwogIGtleTEudmFsdWUgPSAxOwogIGtleTIudmFsdWUgPSAxOwoKICBCOjpNYXBwZWRWYWw8QTo6S2V5PHNob3J0PiwgZG91YmxlPiB2YWwxLCB2YWwyOwogIHZhbDEua2V5ID0ga2V5MTsKICB2YWwxLnZhbHVlID0gMTIuNDE7CgogIHZhbDIua2V5ID0ga2V5MTsKICB2YWwyLnZhbHVlID0gMTIuNDE7CgogIGJvb2wgdGVzdDEgPSAoa2V5MSA9PSBrZXkyKTsKICBib29sIHRlc3QyID0gKHZhbDEgPT0gdmFsMik7CgogIHByaW50Zigia2V5MSA9PSBrZXkyOiAlc1xuIiwgKHRlc3QxID8gInRydWUiIDogImZhbHNlIikpOwogIHByaW50ZigidmFsMSA9PSB2YWwyOiAlc1xuIiwgKHRlc3QyID8gInRydWUiIDogImZhbHNlIikpOwoKICByZXR1cm4gMDsKfQo=