//: C07:Mem.cpp {O}
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
#include "Mem.h"
#include <cstring>
using namespace std;

Mem::Mem() { mem = 0; size = 0; }

Mem::Mem(int sz)
{

mem = 0;
size = 0;
ensureMinSize(sz); 

}

Mem::~Mem() { delete []mem; }

int Mem::msize() { return size; }

/* Il metodo "ensure" crea lo spazio per la nuova parola in memoria perdendo il riferimento alla precedente memorizzata solo se quella nuova è costituita da più caratteri rispetto alla vecchia; infatti, prima confronta se la lunghezza della parola precedentemente memorizzata è minore di quella nuova */

void Mem::ensureMinSize(int minSize)
{

if(size < minSize)
{

byte* newmem = new byte[minSize];
memset(newmem + size, 0, minSize - size);
memcpy(newmem, mem, size);
delete []mem;
mem = newmem;
size = minSize;

}

}

byte* Mem::pointer() { return mem; }

byte* Mem::pointer(int minSize)
{

ensureMinSize(minSize);
return mem; 

} ///:~