CavalliumDBEngine/src/main/java/it/cavallium/dbengine/database/collections/ValuesSetSerializer.java

59 lines
1.7 KiB
Java
Raw Normal View History

2021-05-08 03:09:00 +02:00
package it.cavallium.dbengine.database.collections;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import it.cavallium.dbengine.database.serialization.Serializer;
import it.unimi.dsi.fastutil.objects.ObjectArraySet;
2021-07-13 22:58:08 +02:00
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
2021-05-19 22:51:55 +02:00
import it.unimi.dsi.fastutil.objects.ObjectSets;
2021-07-13 22:58:08 +02:00
import java.util.ArrayList;
import java.util.Collections;
2021-05-19 22:51:55 +02:00
import java.util.HashSet;
2021-05-08 03:09:00 +02:00
import java.util.Set;
import org.jetbrains.annotations.NotNull;
2021-07-13 22:58:08 +02:00
class ValuesSetSerializer<X> implements Serializer<ObjectArraySet<X>, ByteBuf> {
2021-05-08 03:09:00 +02:00
private final ByteBufAllocator allocator;
private final Serializer<X, ByteBuf> entrySerializer;
ValuesSetSerializer(ByteBufAllocator allocator, Serializer<X, ByteBuf> entrySerializer) {
this.allocator = allocator;
this.entrySerializer = entrySerializer;
}
@Override
2021-07-13 22:58:08 +02:00
public @NotNull ObjectArraySet<X> deserialize(@NotNull ByteBuf serialized) {
2021-05-08 03:09:00 +02:00
try {
int entriesLength = serialized.readInt();
2021-07-13 22:58:08 +02:00
ArrayList<X> deserializedElements = new ArrayList<>(entriesLength);
2021-05-08 03:09:00 +02:00
for (int i = 0; i < entriesLength; i++) {
X entry = entrySerializer.deserialize(serialized.retain());
2021-07-13 22:58:08 +02:00
deserializedElements.add(entry);
2021-05-08 03:09:00 +02:00
}
2021-07-13 22:58:08 +02:00
return new ObjectArraySet<>(deserializedElements);
2021-05-08 03:09:00 +02:00
} finally {
serialized.release();
}
}
@Override
2021-07-13 22:58:08 +02:00
public @NotNull ByteBuf serialize(@NotNull ObjectArraySet<X> deserialized) {
2021-05-08 03:09:00 +02:00
ByteBuf output = allocator.buffer();
try {
output.writeInt(deserialized.size());
deserialized.forEach((entry) -> {
ByteBuf serialized = entrySerializer.serialize(entry);
try {
output.writeBytes(serialized);
} finally {
serialized.release();
}
});
return output.retain();
} finally {
output.release();
}
}
}