#include <iostream>
#include <list>
#include <cstring>
#define CHECK std::cout << *reinterpret_cast<int*>(array) << '|' << *array << '\n';
class bytearray
{
int8_t *array;
size_t size;
public:
bytearray():
array(0),//wegen ideone 0
size(0) {}
explicit bytearray(size_t s):
array(new int8_t[s]()),
size(s) {}
bytearray(bytearray&& b):
array(b.array),
size(b.size)
{}
bytearray(bytearray const& a):
array(new int8_t[a.size]),
size(a.size)
{
memcpy(array, a.array, size);
}
template<class T>
explicit bytearray(T const& val):
array(0)//auch wegen ideone...
{
set<T>(val);
}
template<class T>
T get()
{
return *reinterpret_cast<T*>(array);
}
template<class T>
void set(T const& val)
{
if(array)
delete array;
array = new int8_t[size = sizeof val];
std::memcpy(array, &val, size);
}
template<class T>
T* get_ptr()
{
return reinterpret_cast<T*>(array);
}
~bytearray()
{
size = 0;
delete array;
}
};
class _memory_manager
{
std::list<bytearray> ARRAY;
public:
template<class type>
type* allocate(type const& = type());
} memory_manager;
template<class type>
type* _memory_manager::allocate(type const& val)
{
ARRAY.push_back(bytearray());
ARRAY.back().set<type>(val);
return ARRAY.back().get_ptr<type>();
}
struct A
{
int i;
double *db;
A():
i(3),
db(memory_manager.allocate<double>(9)) {}
};
int main()
{
int *i = memory_manager.allocate<int>(5);
A* a = memory_manager.allocate<A>();
std::cout << *i << '\n';
std::cout << *a->db << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPGNzdHJpbmc+CgojZGVmaW5lIENIRUNLIHN0ZDo6Y291dCA8PCAqcmVpbnRlcnByZXRfY2FzdDxpbnQqPihhcnJheSkgPDwgJ3wnIDw8ICphcnJheSA8PCAnXG4nOwoKY2xhc3MgYnl0ZWFycmF5CnsKICAgICAgaW50OF90ICphcnJheTsKICAgICAgc2l6ZV90IHNpemU7CgpwdWJsaWM6CgogICAgICBieXRlYXJyYXkoKToKICAgICAgYXJyYXkoMCksLy93ZWdlbiBpZGVvbmUgMAogICAgICBzaXplKDApIHt9CgogICAgICBleHBsaWNpdCBieXRlYXJyYXkoc2l6ZV90IHMpOgogICAgICBhcnJheShuZXcgaW50OF90W3NdKCkpLAogICAgICBzaXplKHMpIHt9CgogICAgICBieXRlYXJyYXkoYnl0ZWFycmF5JiYgYik6CiAgICAgIGFycmF5KGIuYXJyYXkpLAogICAgICBzaXplKGIuc2l6ZSkKICAgICAge30KCiAgICAgIGJ5dGVhcnJheShieXRlYXJyYXkgY29uc3QmIGEpOgogICAgICBhcnJheShuZXcgaW50OF90W2Euc2l6ZV0pLAogICAgICBzaXplKGEuc2l6ZSkKICAgICAgewogICAgICAgICAgICBtZW1jcHkoYXJyYXksIGEuYXJyYXksIHNpemUpOwogICAgICB9CgogICAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgICBleHBsaWNpdCBieXRlYXJyYXkoVCBjb25zdCYgdmFsKToKICAgICAgYXJyYXkoMCkvL2F1Y2ggd2VnZW4gaWRlb25lLi4uCiAgICAgIHsKICAgICAgICAgICAgc2V0PFQ+KHZhbCk7CiAgICAgIH0KCiAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgIFQgZ2V0KCkKICAgICAgewogICAgICAgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGFycmF5KTsKICAgICAgfQoKICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICAgdm9pZCBzZXQoVCBjb25zdCYgdmFsKQogICAgICB7CiAgICAgICAgICAgIGlmKGFycmF5KQogICAgICAgICAgICAgICAgICBkZWxldGUgYXJyYXk7CiAgICAgICAgICAgIGFycmF5ID0gbmV3IGludDhfdFtzaXplID0gc2l6ZW9mIHZhbF07CiAgICAgICAgICAgIHN0ZDo6bWVtY3B5KGFycmF5LCAmdmFsLCBzaXplKTsKICAgICAgfQoKICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICAgVCogZ2V0X3B0cigpCiAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGFycmF5KTsKICAgICAgfQoKICAgICAgfmJ5dGVhcnJheSgpCiAgICAgIHsKICAgICAgICAgICAgc2l6ZSA9IDA7CiAgICAgICAgICAgIGRlbGV0ZSBhcnJheTsKICAgICAgfQp9OwoKY2xhc3MgX21lbW9yeV9tYW5hZ2VyCnsKICAgICAgc3RkOjpsaXN0PGJ5dGVhcnJheT4gQVJSQVk7CgpwdWJsaWM6CgogICAgICB0ZW1wbGF0ZTxjbGFzcyB0eXBlPgogICAgICB0eXBlKiBhbGxvY2F0ZSh0eXBlIGNvbnN0JiAgPSB0eXBlKCkpOwoKfSBtZW1vcnlfbWFuYWdlcjsKCnRlbXBsYXRlPGNsYXNzIHR5cGU+CnR5cGUqIF9tZW1vcnlfbWFuYWdlcjo6YWxsb2NhdGUodHlwZSBjb25zdCYgdmFsKQp7CiAgICAgIEFSUkFZLnB1c2hfYmFjayhieXRlYXJyYXkoKSk7CiAgICAgIEFSUkFZLmJhY2soKS5zZXQ8dHlwZT4odmFsKTsKICAgICAgcmV0dXJuIEFSUkFZLmJhY2soKS5nZXRfcHRyPHR5cGU+KCk7Cn0KCnN0cnVjdCBBCnsKICAgICAgaW50IGk7CiAgICAgIGRvdWJsZSAqZGI7CgogICAgICBBKCk6CiAgICAgIGkoMyksCiAgICAgIGRiKG1lbW9yeV9tYW5hZ2VyLmFsbG9jYXRlPGRvdWJsZT4oOSkpIHt9Cn07CgppbnQgbWFpbigpCnsKICAgICAgaW50ICppID0gbWVtb3J5X21hbmFnZXIuYWxsb2NhdGU8aW50Pig1KTsKICAgICAgQSogYSA9IG1lbW9yeV9tYW5hZ2VyLmFsbG9jYXRlPEE+KCk7CiAgICAgIHN0ZDo6Y291dCA8PCAqaSA8PCAnXG4nOwogICAgICBzdGQ6OmNvdXQgPDwgKmEtPmRiIDw8ICdcbic7Cn0=