Boolean heap::insert(voidPtr elm) { if ( buf_sz() < content_sz() + 2*sizeof(voidPtr) ) buffer::expand_chunk(2*buf_sz()) ; long x = long(elm); buffer::put(x); v_updated = true; return true; }
int buffer::expand_chunk(const int newsz) { if ( v_allocated == 0 ) throw(stringException("expand a buffer with reference memory")); int cursz = buf_sz(); if ( newsz <= cursz ) { v_bufsz = newsz; return 0; } int void_ptr_size = sizeof(voidPtr); //MESSAGE(cerr, "real expand"); //char* x = (char*)malloc(void_ptr_size+newsz); char* x = ::new char [void_ptr_size+newsz]; int delta = int(void_ptr_size - long(x) % void_ptr_size); x += delta ; memcpy(x, v_base, cursz); memset(x+cursz, char(0), newsz - cursz); v_aptr -= long(v_base); v_eptr -= long(v_base); //free((char*)(v_base-v_align_offset)); delete (char*)(v_base-v_align_offset); v_align_offset = delta; v_base = x; v_aptr += long(v_base); v_eptr += long(v_base); v_bufsz = newsz; return 0; }
void_ptr_array::void_ptr_array(int exp_sz) : buffer(exp_sz * sizeof(voidPtr)), v_elmts(0) { memset(get_base(), (char)0, buf_sz()); }