package it.cavallium.dbengine.database.collections; import io.net5.buffer.api.Buffer; import io.net5.buffer.api.BufferAllocator; import io.net5.buffer.api.CompositeBuffer; import io.net5.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 java.util.Objects; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; class ValueWithHashSerializer implements Serializer> { 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 DeserializationResult> deserialize(@Nullable Send serializedToReceive) throws SerializationException { Objects.requireNonNull(serializedToReceive); try (var serialized = serializedToReceive.receive()) { DeserializationResult deserializedKey = keySuffixSerializer.deserialize(serialized.copy().send()); DeserializationResult deserializedValue = valueSerializer.deserialize(serialized .copy(serialized.readerOffset() + deserializedKey.bytesRead(), serialized.readableBytes() - deserializedKey.bytesRead() ) .send()); return new DeserializationResult<>(Map.entry(deserializedKey.deserializedData(), deserializedValue.deserializedData()), deserializedKey.bytesRead() + deserializedValue.bytesRead()); } } @Override public @NotNull Send serialize(@NotNull Entry deserialized) throws SerializationException { var keySuffix = keySuffixSerializer.serialize(deserialized.getKey()); var value = valueSerializer.serialize(deserialized.getValue()); return LLUtils.compositeBuffer(allocator, keySuffix, value).send(); } }