#include <iostream>
#include <vector>
using namespace std;
struct Object
{
virtual size_t usedMemory () = 0;
};
template <typename T>
struct Singleton : public Object
{
virtual size_t usedMemory () {return sizeof(T);}
static T * Get () {return instance ? instance : (instance = new T);}
static void Destroy () {delete instance;}
static T * instance; // = nullptr;
};
template <typename T> T * Singleton<T>::instance = nullptr;
struct Simple : public Singleton<Simple>
{
int x, y, z;
};
struct Complex : public Singleton<Complex>
{
virtual size_t usedMemory () {return sizeof(*this) + v.size() * sizeof(int);}
Complex () : v (42) {}
vector<int> v;
};
int main() {
// your code goes here
cout << Simple::Get()->usedMemory() << endl;
cout << Complex::Get()->usedMemory() << endl;
Complex::Destroy();
Simple::Destroy();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IE9iamVjdAp7Cgl2aXJ0dWFsIHNpemVfdCB1c2VkTWVtb3J5ICgpID0gMDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgU2luZ2xldG9uIDogcHVibGljIE9iamVjdAp7Cgl2aXJ0dWFsIHNpemVfdCB1c2VkTWVtb3J5ICgpIHtyZXR1cm4gc2l6ZW9mKFQpO30KCQoJc3RhdGljIFQgKiBHZXQgKCkge3JldHVybiBpbnN0YW5jZSA/IGluc3RhbmNlIDogKGluc3RhbmNlID0gbmV3IFQpO30KCXN0YXRpYyB2b2lkIERlc3Ryb3kgKCkge2RlbGV0ZSBpbnN0YW5jZTt9CgkKCXN0YXRpYyBUICogaW5zdGFuY2U7CS8vID0gbnVsbHB0cjsKfTsKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgKiBTaW5nbGV0b248VD46Omluc3RhbmNlID0gbnVsbHB0cjsKCnN0cnVjdCBTaW1wbGUgOiBwdWJsaWMgU2luZ2xldG9uPFNpbXBsZT4KewoJaW50IHgsIHksIHo7Cn07CgpzdHJ1Y3QgQ29tcGxleCA6IHB1YmxpYyBTaW5nbGV0b248Q29tcGxleD4KewoJdmlydHVhbCBzaXplX3QgdXNlZE1lbW9yeSAoKSB7cmV0dXJuIHNpemVvZigqdGhpcykgKyB2LnNpemUoKSAqIHNpemVvZihpbnQpO30KCQoJQ29tcGxleCAoKSA6IHYgKDQyKSB7fQoKCXZlY3RvcjxpbnQ+IHY7Cn07CgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCWNvdXQgPDwgU2ltcGxlOjpHZXQoKS0+dXNlZE1lbW9yeSgpIDw8IGVuZGw7Cgljb3V0IDw8IENvbXBsZXg6OkdldCgpLT51c2VkTWVtb3J5KCkgPDwgZW5kbDsKCglDb21wbGV4OjpEZXN0cm95KCk7CglTaW1wbGU6OkRlc3Ryb3koKTsJCglyZXR1cm4gMDsKfQ==