Revision: 24840
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at March 12, 2010 08:21 by svendiego
Initial Code
/** simple encapsulated memory buffer
memory is freed on destructing.
can be resized, with options copydata and zerofill
( no extra reserve space is kept , unlike in std::vector)
copies forbidden
*/
struct mem_buffer
{ char * p;
size_t sz;
enum { copydata = 1, zerofill = 2 };
mem_buffer() : p(0) , sz(0) {}
explicit mem_buffer(size_t s, int opts) : p(0) , sz(0)
{ resize(s,opts); }
~mem_buffer() { free(); }
size_t size() const { return sz; }
void * ptr() const { return p; }
void resize(size_t nsz, int opts)
{ if(nsz == sz) return;
char * np = (char *) malloc(nsz);
int msz = sz<nsz?sz:nsz;
if(opts & copydata) memcpy(np,p,msz);
if(opts & zerofill)
if(!(opts & copydata))
memset(np,0,nsz);
else if(nsz>sz) memset(np+sz,0,nsz-sz);
sz = nsz;
if(p) ::free(p);
p = np;
}
void growto(size_t nsz, int opts)
{ if(size()<nsz) resize(nsz,opts); }
void growto2(size_t nsz, int opts)
{ if(size()<nsz) resize( nsz>2*size()?nsz:2*size() ,opts); }
void free()
{ if(p) ::free(p); sz=0; }
private:
mem_buffer(const mem_buffer & m) {}
void operator = (const mem_buffer & m) {}
};
Initial URL
Initial Description
Initial Title
simple encapsulated memory buffer
Initial Tags
Initial Language
C++