virtual unsigned getn(void *dst, unsigned n) { if (!compressed) return getBytes(dst, size*n)/size; byte *d = (byte *)dst; byte *e = d+(size*n); byte *p = (byte *)prev; unsigned ret = 0; while (d!=e) { if (first) { if (getBytes(d, size)!=size) break; first = false; } else { if (remaining()<maxcompsize) refill(); if (remaining()==0) break; ptr += DiffExpand(ptr,d,p,size); } p = d; d += size; ret++; } if (ret) // we got at least 1 so copy to prev memcpy(prev,e-size,size); return ret; }
size32_t diffExpand(byte const * src, RowBuffer const & prev) { if(isVar) { thisrowsize = *reinterpret_cast<size32_t const *>(src); unsigned maxrowsize; if(thisrowsize > prev.thisrowsize) { maxrowsize = thisrowsize; memset(prev.row + prev.thisrowsize, 0, thisrowsize - prev.thisrowsize); } else maxrowsize = prev.thisrowsize; return (sizeof(size32_t) + DiffExpand(src + sizeof(size32_t), buffer, prev.buffer, maxrowsize + sizeof(offset_t))); } else { return DiffExpand(src, buffer, prev.buffer, buffsize); } }