#include <iostream>
struct Node {
Node* next;
Node* side;
int size;
bool free;
};
struct MemoryManager
{
Node* root;
char* mem_block;
MemoryManager(int blockSize):
root(0),mem_block(new char[blockSize+sizeof(Node)*2])
{
root = reinterpret_cast<Node*>(mem_block);
Node* tail = reinterpret_cast<Node*>((&mem_block[0])+blockSize+sizeof(Node));
root->next = tail;
tail->next = 0;
root->side = 0;
tail->side = 0;
root->size = blockSize;
tail->size = 0;
root->free = true;
tail->free = false;
}
void dump() {
Node* current = root;
int block_num = 1;
while(true) {
if (!current)
std::cout << "nullptr current is bad\n";
std::cout << "Block " << block_num << "{" << current << "}:" << current->size << " bytes ";
std::cout << "(" << (current->free?"free":"used") << ")\n";
if (!current->next)
std::cout << "nullptr current->next is bad\n";
if (!current->next->next)
break;
else
current = current->next;
}
}
};
int main() {
MemoryManager manager(1000);
manager.dump();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE5vZGUgewogICAgTm9kZSogbmV4dDsKICAgIE5vZGUqIHNpZGU7CglpbnQgc2l6ZTsKCWJvb2wgZnJlZTsKfTsKCnN0cnVjdCBNZW1vcnlNYW5hZ2VyIAp7CglOb2RlKiByb290OwoJY2hhciogbWVtX2Jsb2NrOwoJTWVtb3J5TWFuYWdlcihpbnQgYmxvY2tTaXplKToKCQlyb290KDApLG1lbV9ibG9jayhuZXcgY2hhcltibG9ja1NpemUrc2l6ZW9mKE5vZGUpKjJdKQoJewoJCXJvb3QgPSByZWludGVycHJldF9jYXN0PE5vZGUqPihtZW1fYmxvY2spOwoJCU5vZGUqIHRhaWwgPSByZWludGVycHJldF9jYXN0PE5vZGUqPigoJm1lbV9ibG9ja1swXSkrYmxvY2tTaXplK3NpemVvZihOb2RlKSk7CgkJcm9vdC0+bmV4dCA9IHRhaWw7CgkJdGFpbC0+bmV4dCA9IDA7CgkJcm9vdC0+c2lkZSA9IDA7CgkJdGFpbC0+c2lkZSA9IDA7CgkJcm9vdC0+c2l6ZSA9IGJsb2NrU2l6ZTsKCQl0YWlsLT5zaXplID0gMDsKCQlyb290LT5mcmVlID0gdHJ1ZTsKCQl0YWlsLT5mcmVlID0gZmFsc2U7Cgl9CgoJdm9pZCBkdW1wKCkgewoJCU5vZGUqIGN1cnJlbnQgPSByb290OwoJCWludCBibG9ja19udW0gPSAxOwoJCXdoaWxlKHRydWUpIHsKCQkJaWYgKCFjdXJyZW50KQoJCQkJc3RkOjpjb3V0IDw8ICJudWxscHRyIGN1cnJlbnQgaXMgYmFkXG4iOwoJCQlzdGQ6OmNvdXQgPDwgIkJsb2NrICIgPDwgYmxvY2tfbnVtIDw8ICJ7IiA8PCBjdXJyZW50IDw8ICJ9OiIgPDwgY3VycmVudC0+c2l6ZSA8PCAiIGJ5dGVzICI7CgkJCXN0ZDo6Y291dCA8PCAiKCIgPDwgKGN1cnJlbnQtPmZyZWU/ImZyZWUiOiJ1c2VkIikgPDwgIilcbiI7CgoJCQlpZiAoIWN1cnJlbnQtPm5leHQpCgkJCQlzdGQ6OmNvdXQgPDwgIm51bGxwdHIgY3VycmVudC0+bmV4dCBpcyBiYWRcbiI7CgoJCQlpZiAoIWN1cnJlbnQtPm5leHQtPm5leHQpCgkJCQlicmVhazsKCQkJZWxzZQoJCQkJY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CgkJfQoJfQp9OwoKaW50IG1haW4oKSB7CglNZW1vcnlNYW5hZ2VyIG1hbmFnZXIoMTAwMCk7CgltYW5hZ2VyLmR1bXAoKTsKfQo=