#include <iostream>
#include <vector>
class A;
class B;
// a buffer contains array of A followed by B
// | A[N - 1]...A[0] | B |
class A
{
size_t index;
int a[4];
public:
A(size_t index) : index(index) {}
const B* getB() const { return reinterpret_cast<const B*>(this + index + 1); }
void print() const { std::cout << "A[" << index << "]\n"; }
};
class B
{
size_t a_count;
int b[16];
public:
virtual ~B() {}
B(size_t a_count) : a_count(a_count) {}
const A* getA(size_t i) const { return reinterpret_cast<const A*>(this) - i - 1; }
void print() const
{
std::cout << "B has " << a_count << " As\n";
for(auto i = 0; i < a_count; ++i)
{
getA(i)->print();
}
}
};
B* make_record(size_t a_count)
{
char* buf = new char[a_count*sizeof(A) + sizeof(B)];
for(auto i = 0; i < a_count; ++i)
{
new(buf) A(a_count - i - 1);
buf += sizeof(A);
}
return new(buf) B(a_count);
}
int main()
{
std::vector<B*> vec;
vec.push_back(make_record(2));
vec.push_back(make_record(4));
vec.push_back(make_record(8));
for(auto b : vec)
b->print();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgQTsKY2xhc3MgQjsKCi8vIGEgYnVmZmVyIGNvbnRhaW5zIGFycmF5IG9mIEEgZm9sbG93ZWQgYnkgQgovLyB8IEFbTiAtIDFdLi4uQVswXSB8IEIgfAoKY2xhc3MgQQp7CglzaXplX3QgaW5kZXg7CglpbnQgYVs0XTsKcHVibGljOgogICAgQShzaXplX3QgaW5kZXgpIDogaW5kZXgoaW5kZXgpIHt9CiAgICBjb25zdCBCKiBnZXRCKCkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCKj4odGhpcyArIGluZGV4ICsgMSk7IH0KICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7IHN0ZDo6Y291dCA8PCAiQVsiIDw8IGluZGV4IDw8ICJdXG4iOyB9Cn07CgpjbGFzcyBCCnsKCXNpemVfdCBhX2NvdW50OwoJaW50IGJbMTZdOwpwdWJsaWM6Cgl2aXJ0dWFsIH5CKCkge30KCUIoc2l6ZV90IGFfY291bnQpIDogYV9jb3VudChhX2NvdW50KSB7fQoJY29uc3QgQSogZ2V0QShzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBBKj4odGhpcykgLSBpIC0gMTsgfQoJdm9pZCBwcmludCgpIGNvbnN0Cgl7CgkJc3RkOjpjb3V0IDw8ICJCIGhhcyAiIDw8IGFfY291bnQgPDwgIiBBc1xuIjsKCQlmb3IoYXV0byBpID0gMDsgaSA8IGFfY291bnQ7ICsraSkKCQl7CgkJCWdldEEoaSktPnByaW50KCk7CgkJfQoJfQp9OwoKQiogbWFrZV9yZWNvcmQoc2l6ZV90IGFfY291bnQpCnsKCWNoYXIqIGJ1ZiA9IG5ldyBjaGFyW2FfY291bnQqc2l6ZW9mKEEpICsgc2l6ZW9mKEIpXTsKCWZvcihhdXRvIGkgPSAwOyBpIDwgYV9jb3VudDsgKytpKQoJewoJCW5ldyhidWYpIEEoYV9jb3VudCAtIGkgLSAxKTsKCQlidWYgKz0gc2l6ZW9mKEEpOwoJfQoJcmV0dXJuIG5ldyhidWYpIEIoYV9jb3VudCk7Cn0KCmludCBtYWluKCkgCnsKCXN0ZDo6dmVjdG9yPEIqPiB2ZWM7Cgl2ZWMucHVzaF9iYWNrKG1ha2VfcmVjb3JkKDIpKTsKCXZlYy5wdXNoX2JhY2sobWFrZV9yZWNvcmQoNCkpOwoJdmVjLnB1c2hfYmFjayhtYWtlX3JlY29yZCg4KSk7CgkKCWZvcihhdXRvIGIgOiB2ZWMpCgkJYi0+cHJpbnQoKTsKfQo=