#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <malloc.h>
using namespace std;
typedef void* voidptr;
typedef bool* byteptr;
#ifdef _WIN64
#define BSMARTHEAP_SIZEINFOBLOCK 16
#define SIZET_BYTES 8
#else
#define BSMARTHEAP_SIZEINFOBLOCK 8
#define SIZET_BYTES 4
#endif
template<class T>
T* move_pointer_right(voidptr ptr, size_t bytes)
{
byteptr pointer = (byteptr)ptr;
pointer += bytes;
return (T*)pointer;
}
template<class T>
T* move_pointer_left(voidptr ptr, size_t bytes)
{
byteptr pointer = (byteptr)ptr;
pointer -= bytes;
return (T*)pointer;
}
class Bsmartheap
{
private:
vector<voidptr>infoheap;
public:
// size(8bytes) links(8bytes) data
voidptr allocate_memory(size_t SizeBytes);
void free_memory(voidptr _Block);
voidptr reallocate_block(voidptr _Block, size_t NewSize);
size_t size_block(voidptr _Block);
size_t pointers_to_block(voidptr _Block);
};
size_t Bsmartheap::size_block(voidptr _Block)
{
const size_t sizevec = infoheap.size();
for (size_t x = 0; x < sizevec; x++)
{
if (&infoheap[x] == _Block)
{
cout << infoheap[x] << endl;
cout << move_pointer_left<size_t>(infoheap[x], BSMARTHEAP_SIZEINFOBLOCK) << endl;
return move_pointer_left<size_t>(infoheap[x], BSMARTHEAP_SIZEINFOBLOCK)[0];
}
}
return 0;
}
size_t Bsmartheap::pointers_to_block(voidptr _Block)
{
const size_t sizevec = infoheap.size();
for (size_t x = 0; x < sizevec; x++)
{
if (&infoheap[x] == _Block)
{
return move_pointer_left<size_t>(infoheap[x], BSMARTHEAP_SIZEINFOBLOCK)[1];
}
}
return 0;
}
voidptr Bsmartheap::reallocate_block(voidptr _Block, size_t NewSize)
{
if (NewSize == 0)
{
free_memory(_Block);
return nullptr;
}
const size_t vecsize = infoheap.size();
for (size_t x = 0; x < vecsize; x++)
{
if (&infoheap[x] == _Block)
{
size_t* infoblock = move_pointer_left<size_t>(infoheap[x], BSMARTHEAP_SIZEINFOBLOCK);
size_t Countpointers = infoblock[1];
voidptr tmpptr = realloc(move_pointer_left<void>(infoheap[x], BSMARTHEAP_SIZEINFOBLOCK), BSMARTHEAP_SIZEINFOBLOCK + NewSize);
if (tmpptr == nullptr)
{
throw "realloc return a nullptr";
return nullptr;
}
size_t* setinfoblock = (size_t*)tmpptr;
setinfoblock[0] = NewSize;
setinfoblock[1] = Countpointers;
tmpptr = move_pointer_right<void>(tmpptr, BSMARTHEAP_SIZEINFOBLOCK);
infoheap[x] = tmpptr;
return &infoheap[x];
}
}
return nullptr;
}
void Bsmartheap::free_memory(voidptr _Block)
{
cout << hex << "Free memory receive " << _Block << endl;
const size_t sizevec = infoheap.size();
for (size_t x = 0; x < sizevec; x++)
{
if (&infoheap[x] == _Block)
{
free(move_pointer_left<void>(infoheap[x], BSMARTHEAP_SIZEINFOBLOCK));
infoheap.erase(infoheap.begin() + x);
return;
}
}
}
voidptr Bsmartheap::allocate_memory(size_t Sizebytes)
{
if (Sizebytes == 0)
{
throw "Size is null";
return nullptr;
}
voidptr _Ptr = malloc(BSMARTHEAP_SIZEINFOBLOCK + Sizebytes);
cout << hex << "Malloc return " << _Ptr << endl;
if (_Ptr == nullptr)
{
throw "malloc return a nullptr";
return nullptr;
}
size_t* infoblock = (size_t*)_Ptr;
infoblock[0] = Sizebytes;
infoblock[1] = 0;
_Ptr = move_pointer_right<void>(_Ptr, BSMARTHEAP_SIZEINFOBLOCK);
cout << hex << "_Ptr is " << _Ptr << endl;
infoheap.push_back(_Ptr);
return &infoheap[infoheap.size() - 1];
}
static Bsmartheap heap;
int main()
{
char* ptr = (char*)heap.allocate_memory(6);
cout << hex << "Allocate_memory return " << voidptr(ptr) << endl;
const char* str = "Hello";
for (size_t x = 0; x < 6; x++)
{
ptr[x] = str[x];
}
cout << ptr << endl;
cout << heap.size_block(ptr) << endl;
cout << heap.pointers_to_block(ptr) << endl;
heap.free_memory(ptr);
return 1;
}