#include <iostream>
#include <boost/unordered_map.hpp>
using namespace std;
#define PEERS_KEY
class peer_key_c
{
public:
peer_key_c(int host, int uid)
{
host_ = host;
#ifdef PEERS_KEY
uid_ = uid;
#else
(void)uid;
#endif
}
bool operator==(peer_key_c v) const
{
#ifdef PEERS_KEY
return host_ == v.host_ && uid_ == v.uid_;
#else
return host_ == v.host_;
#endif
}
bool operator<(peer_key_c v) const
{
#ifdef PEERS_KEY
return host_ < v.host_ || host_ == v.host_ && uid_ < v.uid_;
#else
return host_ < v.host_;
#endif
}
friend std::size_t hash_value(const peer_key_c& v)
{
std::size_t seed = boost::hash_value(v.host_);
#ifdef PEERS_KEY
boost::hash_combine(seed, v.uid_);
#endif
return seed;
}
int host_;
#ifdef PEERS_KEY
int uid_;
#endif
};
struct t_peer
{
long long downloaded;
long long uploaded;
time_t mtime = 0;
int uid;
short port;
bool left;
std::array<char, 20> peer_id;
};
typedef boost::unordered_map<peer_key_c, t_peer> t_peers;
int main() {
std::cout << "sizeof(t_peer) = " << sizeof(t_peer) << " bytes, total data size: " << sizeof(t_peer) * 10000 << " bytes" << std::endl;
std::cout << "sizeof(peer_key_c) = " << sizeof(peer_key_c) << " bytes, total data size: " << sizeof(peer_key_c) * 10000 << " bytes" << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Ym9vc3QvdW5vcmRlcmVkX21hcC5ocHA+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBQRUVSU19LRVkKCmNsYXNzIHBlZXJfa2V5X2MKewpwdWJsaWM6CiAgICAgICAgcGVlcl9rZXlfYyhpbnQgaG9zdCwgaW50IHVpZCkKICAgICAgICB7CiAgICAgICAgICAgICAgICBob3N0XyA9IGhvc3Q7CiNpZmRlZiBQRUVSU19LRVkKICAgICAgICAgICAgICAgIHVpZF8gPSB1aWQ7CiNlbHNlCiAgICAgICAgICAgICAgICAodm9pZCl1aWQ7CiNlbmRpZgogICAgICAgIH0KCiAgICAgICAgYm9vbCBvcGVyYXRvcj09KHBlZXJfa2V5X2MgdikgY29uc3QKICAgICAgICB7CiNpZmRlZiBQRUVSU19LRVkKICAgICAgICAgICAgICAgIHJldHVybiBob3N0XyA9PSB2Lmhvc3RfICYmIHVpZF8gPT0gdi51aWRfOwojZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGhvc3RfID09IHYuaG9zdF87CiNlbmRpZgogICAgICAgIH0KCiAgICAgICAgYm9vbCBvcGVyYXRvcjwocGVlcl9rZXlfYyB2KSBjb25zdAogICAgICAgIHsKI2lmZGVmIFBFRVJTX0tFWQogICAgICAgICAgICAgICAgcmV0dXJuIGhvc3RfIDwgdi5ob3N0XyB8fCBob3N0XyA9PSB2Lmhvc3RfICYmIHVpZF8gPCB2LnVpZF87CiNlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gaG9zdF8gPCB2Lmhvc3RfOwojZW5kaWYKICAgICAgICB9CgogICAgICAgIGZyaWVuZCBzdGQ6OnNpemVfdCBoYXNoX3ZhbHVlKGNvbnN0IHBlZXJfa2V5X2MmIHYpCiAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgc2VlZCA9IGJvb3N0OjpoYXNoX3ZhbHVlKHYuaG9zdF8pOwojaWZkZWYgUEVFUlNfS0VZCiAgICAgICAgICAgICAgICBib29zdDo6aGFzaF9jb21iaW5lKHNlZWQsIHYudWlkXyk7CiNlbmRpZgogICAgICAgICAgICAgICAgcmV0dXJuIHNlZWQ7CiAgICAgICAgfQoKICAgICAgICBpbnQgaG9zdF87CiNpZmRlZiBQRUVSU19LRVkKICAgICAgICBpbnQgdWlkXzsKI2VuZGlmCn07CgpzdHJ1Y3QgdF9wZWVyCnsKICAgICAgICBsb25nIGxvbmcgZG93bmxvYWRlZDsKICAgICAgICBsb25nIGxvbmcgdXBsb2FkZWQ7CiAgICAgICAgdGltZV90IG10aW1lID0gMDsKICAgICAgICBpbnQgdWlkOwogICAgICAgIHNob3J0IHBvcnQ7CiAgICAgICAgYm9vbCBsZWZ0OwogICAgICAgIHN0ZDo6YXJyYXk8Y2hhciwgMjA+IHBlZXJfaWQ7Cn07Cgp0eXBlZGVmIGJvb3N0Ojp1bm9yZGVyZWRfbWFwPHBlZXJfa2V5X2MsIHRfcGVlcj4gdF9wZWVyczsKCmludCBtYWluKCkgewoJc3RkOjpjb3V0IDw8ICJzaXplb2YodF9wZWVyKSA9ICIgPDwgc2l6ZW9mKHRfcGVlcikgPDwgIiBieXRlcywgdG90YWwgZGF0YSBzaXplOiAiIDw8IHNpemVvZih0X3BlZXIpICogMTAwMDAgPDwgIiBieXRlcyIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJzaXplb2YocGVlcl9rZXlfYykgPSAiIDw8IHNpemVvZihwZWVyX2tleV9jKSA8PCAiIGJ5dGVzLCB0b3RhbCBkYXRhIHNpemU6ICIgPDwgc2l6ZW9mKHBlZXJfa2V5X2MpICogMTAwMDAgPDwgIiBieXRlcyIgPDwgc3RkOjplbmRsOwoJCglyZXR1cm4gMDsKfQ==