private long writeElement(long address, ByteBuffer element) { storage.writeLong(address + ELEMENT_HEADER_SEQUENCE_OFFSET, nextSequenceNumber++); storage.writeInt(address + ELEMENT_HEADER_LENGTH_OFFSET, element.remaining()); storage.writeBuffer(address + ELEMENT_HEADER_SIZE, element.duplicate()); return address; }
private Long createAttachedChain(ByteBuffer keyBuffer, int hash, ByteBuffer elemBuffer) { long chain = storage.allocate(keyBuffer.remaining() + elemBuffer.remaining() + this.totalChainHeaderSize + ELEMENT_HEADER_SIZE); if (chain < 0) { return null; } int keySize = keyBuffer.remaining(); storage.writeInt(chain + CHAIN_HEADER_KEY_HASH_OFFSET, hash); storage.writeInt(chain + CHAIN_HEADER_KEY_LENGTH_OFFSET, Integer.MIN_VALUE | keySize); storage.writeBuffer(chain + this.totalChainHeaderSize + ELEMENT_HEADER_SIZE + elemBuffer.remaining(), keyBuffer); if (extendedChainHeaderSize > 0) { storage.writeBuffer(chain + CHAIN_HEADER_SIZE, emptyExtendedChainHeader.duplicate()); } long element = chain + this.totalChainHeaderSize; writeElement(element, elemBuffer); storage.writeLong(element + ELEMENT_HEADER_NEXT_OFFSET, chain); storage.writeLong(chain + CHAIN_HEADER_TAIL_OFFSET, element); return chain; }
storage.writeInt(chain + CHAIN_HEADER_KEY_HASH_OFFSET, hash); storage.writeInt(chain + CHAIN_HEADER_KEY_LENGTH_OFFSET, Integer.MIN_VALUE | keySize); storage.writeBuffer(keyLocation, binaryKey); storage.writeBuffer(firstElementLocation, firstElementWithHeader); storage.writeLong(currentLocation + ELEMENT_HEADER_NEXT_OFFSET, nextLocation); storage.writeInt(currentLocation + ELEMENT_HEADER_LENGTH_OFFSET, adjustedLength); currentLocation = nextLocation; storage.writeInt(currentLocation + ELEMENT_HEADER_LENGTH_OFFSET, adjustedLength); storage.writeLong(chain + CHAIN_HEADER_TAIL_OFFSET, currentLocation);
private void writeToExtendedArea(long chainAddress, int hash, ByteBuffer keyBuffer, ByteBuffer valueBuffer) { ExtendedHeaderForTest hdr = createAtExtensionAddress(chainAddress); long address = hdr.getAddress(); if (address != NULL_ENCODING) { // free previous extendedArea.free(address); } else { chainAddresses.add(chainAddress); } int size = (2 * Integer.BYTES) + keyBuffer.remaining() + valueBuffer.remaining(); address = extendedArea.allocate(size); hdr.setAddress(address); hdr.setHashAndSize(hash, size); extendedArea.writeInt(address + STORAGE_KEY_LENGTH_OFFSET, keyBuffer.remaining()); extendedArea.writeInt(address + STORAGE_VALUE_LENGTH_OFFSET, valueBuffer.remaining()); extendedArea.writeBuffer(address + STORAGE_HEADER_OFFSET, keyBuffer.duplicate()); extendedArea.writeBuffer(address + STORAGE_HEADER_OFFSET + keyBuffer.remaining(), valueBuffer.duplicate()); }
private void backward(int p, int value) { storage.writeInt(p + 12, value); }
private void backward(int p, int value) { storage.writeInt(p + 12, value); }
private void index(long p, int value) { storage.writeInt(p + (7 * SIZE_T_SIZE), value); }
private void head(int p, int value) { storage.writeInt(p + 4, value); }
private void prevFoot(int p, int value) { storage.writeInt(p, value); }
private void forward(int p, int value) { storage.writeInt(p + 8, value); }
private void index(long p, int value) { storage.writeInt(p + (7 * SIZE_T_SIZE), value); }
private void prevFoot(int p, int value) { storage.writeInt(p, value); }
private void child(int p, int index, int value) { storage.writeInt(p + 16 + (4 * index), value); }
private void index(int p, int value) { storage.writeInt(p + 28, value); }
private void child(int p, int index, int value) { storage.writeInt(p + 16 + (4 * index), value); }
private void parent(int p, int value) { storage.writeInt(p + 24, value); }
private void index(int p, int value) { storage.writeInt(p + 28, value); }
@Override protected Integer writeBuffer(ByteBuffer buffer, int hash) { int length = buffer.remaining(); int address = (int) storageArea.allocate(length + HEADER_LENGTH); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + LENGTH_OFFSET, length); storageArea.writeBuffer(address + DATA_OFFSET, buffer); return address; } else { return null; } }
@Override protected Integer writeBuffer(ByteBuffer buffer, int hash) { int length = buffer.remaining(); int address = (int) storageArea.allocate(length + HEADER_LENGTH); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + LENGTH_OFFSET, length); storageArea.writeBuffer(address + DATA_OFFSET, buffer); return address; } else { return null; } }
@Override protected Long writeMappingBuffersGathering(ByteBuffer[] keyBuffers, ByteBuffer[] valueBuffers, int hash) { int keyLength = totalLength(keyBuffers); int valueLength = totalLength(valueBuffers); long address = storageArea.allocate(keyLength + valueLength + HEADER_SIZE); if (address >= 0) { storageArea.writeInt(address + KEY_HASH_OFFSET, hash); storageArea.writeInt(address + KEY_LENGTH_OFFSET, keyLength); storageArea.writeInt(address + VALUE_LENGTH_OFFSET, valueLength); storageArea.writeBuffers(address + DATA_OFFSET, keyBuffers); storageArea.writeBuffers(address + DATA_OFFSET + keyLength, valueBuffers); return address; } else { return null; } }