package it.cavallium.dbengine.database.collections; import io.netty.buffer.api.Buffer; import io.netty.buffer.api.BufferAllocator; import io.netty.buffer.api.Send; 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, Send> { private final BufferAllocator allocator; private final Serializer> keySuffixSerializer; private final Serializer> valueSerializer; ValueWithHashSerializer(BufferAllocator allocator, Serializer> keySuffixSerializer, Serializer> valueSerializer) { this.allocator = allocator; this.keySuffixSerializer = keySuffixSerializer; this.valueSerializer = valueSerializer; } @Override public @NotNull Entry deserialize(@NotNull Send serializedToReceive) throws SerializationException { try (var serialized = serializedToReceive.receive()) { X deserializedKey = keySuffixSerializer.deserialize(serialized.copy().send()); Y deserializedValue = valueSerializer.deserialize(serialized.send()); return Map.entry(deserializedKey, deserializedValue); } } @Override public @NotNull Send serialize(@NotNull Entry deserialized) throws SerializationException { try (Buffer keySuffix = keySuffixSerializer.serialize(deserialized.getKey()).receive()) { try (Buffer value = valueSerializer.serialize(deserialized.getValue()).receive()) { return LLUtils.compositeBuffer(allocator, keySuffix.send(), value.send()); } } } }