package it.cavallium.dbengine.database.collections; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import it.cavallium.dbengine.database.LLUtils; import it.cavallium.dbengine.database.serialization.SerializationException; import it.cavallium.dbengine.database.serialization.Serializer; import java.util.Map; import java.util.Map.Entry; import org.jetbrains.annotations.NotNull; class ValueWithHashSerializer implements Serializer, ByteBuf> { private final ByteBufAllocator allocator; private final Serializer keySuffixSerializer; private final Serializer valueSerializer; ValueWithHashSerializer(ByteBufAllocator allocator, Serializer keySuffixSerializer, Serializer valueSerializer) { this.allocator = allocator; this.keySuffixSerializer = keySuffixSerializer; this.valueSerializer = valueSerializer; } @Override public @NotNull Entry deserialize(@NotNull ByteBuf serialized) throws SerializationException { try { X deserializedKey = keySuffixSerializer.deserialize(serialized.retain()); Y deserializedValue = valueSerializer.deserialize(serialized.retain()); return Map.entry(deserializedKey, deserializedValue); } finally { serialized.release(); } } @Override public @NotNull ByteBuf serialize(@NotNull Entry deserialized) throws SerializationException { ByteBuf keySuffix = keySuffixSerializer.serialize(deserialized.getKey()); try { ByteBuf value = valueSerializer.serialize(deserialized.getValue()); try { return LLUtils.compositeBuffer(allocator, keySuffix.retain(), value.retain()); } finally { value.release(); } } finally { keySuffix.release(); } } }