// FIXME: implement w/o redundant memory copies
List<byte[]> compressedKeys = compress(keys);
ReusableBuffer keyBuf = varLenKeys ? serializeVarLenPageBuf(compressedKeys)
: serializeFixedLenPage(keys);
ReusableBuffer valBuf = varLenVals ? serializeVarLenPage(values) : serializeFixedLenPage(values);
int entries = keys.size();
int keysOffset = CompressedBlockReader.PREFIX_OFFSET + this.prefix.length;
int valsOffset = keysOffset + keyBuf.limit();
ByteBuffer returnBuf = ByteBuffer.wrap(new byte[valsOffset + valBuf.limit()]);
/*
* the header consist of 4 : ptr to vals 4 : ptr to keys 4 : number of
* entries 4 : -1 => variable keys, or n => length of fixed size keys 4
* : -1 => variable values, or n => length of fixed size values k :
* prefix ... start of keys
*/
returnBuf.putInt(valsOffset);
returnBuf.putInt(keysOffset);
returnBuf.putInt(entries);
returnBuf.putInt(varLenKeys ? -1 : entries == 0 ? 0 : (keyBuf.limit() / entries));
returnBuf.putInt(varLenVals ? -1 : entries == 0 ? 0 : (valBuf.limit() / entries));
if (this.prefix.length > 0)
returnBuf.put(this.prefix);
returnBuf.put(keyBuf.getBuffer());
returnBuf.put(valBuf.getBuffer());
BufferPool.free(keyBuf);
BufferPool.free(valBuf);
returnBuf.position(0);