#include <iostream>
#include <vector>
#include <set>
#include <array>
using namespace std;
template<typename T>
size_t metaSizeOf(const T& t)
{
return sizeof(T);
}
// Pre-declarations, otherwise some resolutions could be missing
template<typename T, typename Alloc, template <typename, typename> class V>
size_t metaSizeOf(const V<T, Alloc>& v);
template<typename T, typename Compare, typename Alloc, template <typename, typename, typename> class V>
size_t metaSizeOf(const V<T, Compare, Alloc>& v);
template<typename Key, typename Val, typename Compare, typename Alloc, template <typename, typename, typename, typename> class V>
size_t metaSizeOf(const V<Key, Val, Compare, Alloc>& v);
template<typename T, std::size_t N, template <typename, std::size_t> class V>
size_t metaSizeOf(const V<T, N>& v);
template<typename T, std::size_t N>
size_t metaSizeOf(const std::array<T, N>&);
// Implementation for std::vector, std::list, std::deque, etc.
template<typename T, typename Alloc, template <typename, typename> class V>
size_t metaSizeOf(const V<T, Alloc>& v)
{
size_t bytes = sizeof(V<T, Alloc>);
for(const auto& t: v) bytes += metaSizeOf(t);
return bytes;
}
// Implementation for std::set, std::multiset, etc.
template<typename T, typename Compare, typename Alloc, template <typename, typename, typename> class V>
size_t metaSizeOf(const V<T, Compare, Alloc>& v)
{
size_t bytes = sizeof(V<T, Compare, Alloc>);
for(const auto& t: v) bytes += metaSizeOf(t);
return bytes;
}
// Implementation for std::map, std::multimap, etc.
template<typename Key, typename Val, typename Compare, typename Alloc, template <typename, typename, typename, typename> class V>
size_t metaSizeOf(const V<Key, Val, Compare, Alloc>& v)
{
size_t bytes = sizeof(V<Key, Val, Compare, Alloc>);
for(const auto& t: v) bytes += metaSizeOf(t);
return bytes;
}
// Implementation for std::array-like containers
template<typename T, std::size_t N, template <typename, std::size_t> class V>
size_t metaSizeOf(const V<T, N>& v)
{
size_t bytes = sizeof(V<T, N>);
for(const auto& t: v) bytes += metaSizeOf(t);
return bytes;
}
// Implementation for std::array only
template<typename T, std::size_t N>
size_t metaSizeOf(const std::array<T, N>&)
{
return sizeof(std::array<T, N>) + N * sizeof(T);
}
int main() {
std::vector<std::set<std::array<int, 10>>> v;
// populate v
std::array<int, 10> a;
std::set<std::array<int, 10>> s;
s.insert(a);
v.push_back(s);
v.push_back(s);
std::size_t bytes = sizeof(v);
for(auto& s : v)
{
bytes += sizeof(s);
for(auto& a : s)
{
bytes += sizeof(a) + sizeof(int) * 10;
}
}
cout << "The size from for loop is " << bytes << endl;
cout << "The size from metaSizeOf is " << metaSizeOf(v) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YXJyYXk+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzaXplX3QgbWV0YVNpemVPZihjb25zdCBUJiB0KQp7CglyZXR1cm4gc2l6ZW9mKFQpOwp9CgovLyBQcmUtZGVjbGFyYXRpb25zLCBvdGhlcndpc2Ugc29tZSByZXNvbHV0aW9ucyBjb3VsZCBiZSBtaXNzaW5nCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jLCB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBWPgpzaXplX3QgbWV0YVNpemVPZihjb25zdCBWPFQsIEFsbG9jPiYgdik7CnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmUsIHR5cGVuYW1lIEFsbG9jLCB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgVj4Kc2l6ZV90IG1ldGFTaXplT2YoY29uc3QgVjxULCBDb21wYXJlLCBBbGxvYz4mIHYpOwp0ZW1wbGF0ZTx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbCwgdHlwZW5hbWUgQ29tcGFyZSwgdHlwZW5hbWUgQWxsb2MsIHRlbXBsYXRlIDx0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgVj4Kc2l6ZV90IG1ldGFTaXplT2YoY29uc3QgVjxLZXksIFZhbCwgQ29tcGFyZSwgQWxsb2M+JiB2KTsKdGVtcGxhdGU8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTiwgdGVtcGxhdGUgPHR5cGVuYW1lLCBzdGQ6OnNpemVfdD4gY2xhc3MgVj4Kc2l6ZV90IG1ldGFTaXplT2YoY29uc3QgVjxULCBOPiYgdik7CnRlbXBsYXRlPHR5cGVuYW1lIFQsIHN0ZDo6c2l6ZV90IE4+CnNpemVfdCBtZXRhU2l6ZU9mKGNvbnN0IHN0ZDo6YXJyYXk8VCwgTj4mKTsKCgovLyBJbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3IsIHN0ZDo6bGlzdCwgc3RkOjpkZXF1ZSwgZXRjLgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvYywgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgVj4Kc2l6ZV90IG1ldGFTaXplT2YoY29uc3QgVjxULCBBbGxvYz4mIHYpCnsKCXNpemVfdCBieXRlcyA9IHNpemVvZihWPFQsIEFsbG9jPik7Cglmb3IoY29uc3QgYXV0byYgdDogdikgYnl0ZXMgKz0gbWV0YVNpemVPZih0KTsKCXJldHVybiBieXRlczsKfQoKLy8gSW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6c2V0LCBzdGQ6Om11bHRpc2V0LCBldGMuCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmUsIHR5cGVuYW1lIEFsbG9jLCB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHR5cGVuYW1lLCB0eXBlbmFtZT4gY2xhc3MgVj4Kc2l6ZV90IG1ldGFTaXplT2YoY29uc3QgVjxULCBDb21wYXJlLCBBbGxvYz4mIHYpCnsKCXNpemVfdCBieXRlcyA9IHNpemVvZihWPFQsIENvbXBhcmUsIEFsbG9jPik7Cglmb3IoY29uc3QgYXV0byYgdDogdikgYnl0ZXMgKz0gbWV0YVNpemVPZih0KTsKCXJldHVybiBieXRlczsKfQoKLy8gSW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6bWFwLCBzdGQ6Om11bHRpbWFwLCBldGMuCnRlbXBsYXRlPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVmFsLCB0eXBlbmFtZSBDb21wYXJlLCB0eXBlbmFtZSBBbGxvYywgdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZSwgdHlwZW5hbWUsIHR5cGVuYW1lPiBjbGFzcyBWPgpzaXplX3QgbWV0YVNpemVPZihjb25zdCBWPEtleSwgVmFsLCBDb21wYXJlLCBBbGxvYz4mIHYpCnsKCXNpemVfdCBieXRlcyA9IHNpemVvZihWPEtleSwgVmFsLCBDb21wYXJlLCBBbGxvYz4pOwoJZm9yKGNvbnN0IGF1dG8mIHQ6IHYpIGJ5dGVzICs9IG1ldGFTaXplT2YodCk7CglyZXR1cm4gYnl0ZXM7Cn0KCi8vIEltcGxlbWVudGF0aW9uIGZvciBzdGQ6OmFycmF5LWxpa2UgY29udGFpbmVycwp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOLCB0ZW1wbGF0ZSA8dHlwZW5hbWUsIHN0ZDo6c2l6ZV90PiBjbGFzcyBWPgpzaXplX3QgbWV0YVNpemVPZihjb25zdCBWPFQsIE4+JiB2KQp7CglzaXplX3QgYnl0ZXMgPSBzaXplb2YoVjxULCBOPik7Cglmb3IoY29uc3QgYXV0byYgdDogdikgYnl0ZXMgKz0gbWV0YVNpemVPZih0KTsKCXJldHVybiBieXRlczsKfQoKLy8gSW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6YXJyYXkgb25seQp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPgpzaXplX3QgbWV0YVNpemVPZihjb25zdCBzdGQ6OmFycmF5PFQsIE4+JikKewoJcmV0dXJuIHNpemVvZihzdGQ6OmFycmF5PFQsIE4+KSArIE4gKiBzaXplb2YoVCk7Cn0KCgppbnQgbWFpbigpIHsKCXN0ZDo6dmVjdG9yPHN0ZDo6c2V0PHN0ZDo6YXJyYXk8aW50LCAxMD4+PiB2OwoJLy8gcG9wdWxhdGUgdgoJc3RkOjphcnJheTxpbnQsIDEwPiBhOwoJc3RkOjpzZXQ8c3RkOjphcnJheTxpbnQsIDEwPj4gczsKCXMuaW5zZXJ0KGEpOwoJdi5wdXNoX2JhY2socyk7Cgl2LnB1c2hfYmFjayhzKTsKCQoJc3RkOjpzaXplX3QgYnl0ZXMgPSBzaXplb2Yodik7Cglmb3IoYXV0byYgcyA6IHYpCgl7CgkgICAgYnl0ZXMgKz0gc2l6ZW9mKHMpOwoJCgkgICAgZm9yKGF1dG8mIGEgOiBzKQoJICAgIHsKCSAgICAgICAgYnl0ZXMgKz0gc2l6ZW9mKGEpICsgc2l6ZW9mKGludCkgKiAxMDsKCSAgICB9Cgl9CgkKCWNvdXQgPDwgIlRoZSBzaXplIGZyb20gZm9yIGxvb3AgaXMgIiA8PCBieXRlcyA8PCBlbmRsOwoJY291dCA8PCAiVGhlIHNpemUgZnJvbSBtZXRhU2l6ZU9mIGlzICIgPDwgbWV0YVNpemVPZih2KSA8PCBlbmRsOwoKCXJldHVybiAwOwp9