
io.activej.serializer.stream.StreamCodec Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of activej-serializer Show documentation
Show all versions of activej-serializer Show documentation
Extremely fast and space-efficient serializers. Implemented using bytecode engineering.
package io.activej.serializer.stream;
import io.activej.common.tuple.*;
import io.activej.serializer.BinarySerializer;
import java.io.IOException;
import java.util.List;
import java.util.function.Function;
public interface StreamCodec extends StreamEncoder, StreamDecoder {
static StreamCodec of(StreamEncoder super T> encoder, StreamDecoder extends T> decoder) {
return new StreamCodec<>() {
@Override
public void encode(StreamOutput output, T item) throws IOException {
encoder.encode(output, item);
}
@Override
public T decode(StreamInput input) throws IOException {
return decoder.decode(input);
}
};
}
static StreamCodec ofBinarySerializer(BinarySerializer binarySerializer) {
return ofBinarySerializer(binarySerializer, 1);
}
static StreamCodec ofBinarySerializer(BinarySerializer binarySerializer, int estimatedSize) {
return new StreamCodecs.OfBinarySerializer<>(binarySerializer, estimatedSize);
}
static StreamCodec create(TupleConstructor0 constructor0) {
return StreamCodec.of((output, item) -> {}, $ -> constructor0.create());
}
static StreamCodec create(
TupleConstructor1 constructor1,
Function getter1, StreamCodec codec1
) {
return StreamCodec.of(
(output, item) -> codec1.encode(output, getter1.apply(item)),
input -> constructor1.create(codec1.decode(input))
);
}
static StreamCodec create(
TupleConstructor2 constructor2,
Function getter1, StreamCodec codec1,
Function getter2, StreamCodec codec2
) {
return StreamCodec.of(
(output, item) -> {
codec1.encode(output, getter1.apply(item));
codec2.encode(output, getter2.apply(item));
},
input -> constructor2.create(
codec1.decode(input),
codec2.decode(input)
)
);
}
static StreamCodec create(
TupleConstructor3 constructor3,
Function getter1, StreamCodec codec1,
Function getter2, StreamCodec codec2,
Function getter3, StreamCodec codec3
) {
return StreamCodec.of(
(output, item) -> {
codec1.encode(output, getter1.apply(item));
codec2.encode(output, getter2.apply(item));
codec3.encode(output, getter3.apply(item));
},
input -> constructor3.create(
codec1.decode(input),
codec2.decode(input),
codec3.decode(input)
)
);
}
static StreamCodec create(
TupleConstructor4 constructor4,
Function getter1, StreamCodec codec1,
Function getter2, StreamCodec codec2,
Function getter3, StreamCodec codec3,
Function getter4, StreamCodec codec4
) {
return StreamCodec.of(
(output, item) -> {
codec1.encode(output, getter1.apply(item));
codec2.encode(output, getter2.apply(item));
codec3.encode(output, getter3.apply(item));
codec4.encode(output, getter4.apply(item));
},
input -> constructor4.create(
codec1.decode(input),
codec2.decode(input),
codec3.decode(input),
codec4.decode(input)
)
);
}
static StreamCodec create(
TupleConstructor5 constructor5,
Function getter1, StreamCodec codec1,
Function getter2, StreamCodec codec2,
Function getter3, StreamCodec codec3,
Function getter4, StreamCodec codec4,
Function getter5, StreamCodec codec5
) {
return StreamCodec.of(
(output, item) -> {
codec1.encode(output, getter1.apply(item));
codec2.encode(output, getter2.apply(item));
codec3.encode(output, getter3.apply(item));
codec4.encode(output, getter4.apply(item));
codec5.encode(output, getter5.apply(item));
},
input -> constructor5.create(
codec1.decode(input),
codec2.decode(input),
codec3.decode(input),
codec4.decode(input),
codec5.decode(input)
)
);
}
static StreamCodec create(
TupleConstructor6 constructor6,
Function getter1, StreamCodec codec1,
Function getter2, StreamCodec codec2,
Function getter3, StreamCodec codec3,
Function getter4, StreamCodec codec4,
Function getter5, StreamCodec codec5,
Function getter6, StreamCodec codec6
) {
return StreamCodec.of(
(output, item) -> {
codec1.encode(output, getter1.apply(item));
codec2.encode(output, getter2.apply(item));
codec3.encode(output, getter3.apply(item));
codec4.encode(output, getter4.apply(item));
codec5.encode(output, getter5.apply(item));
codec6.encode(output, getter6.apply(item));
},
input -> constructor6.create(
codec1.decode(input),
codec2.decode(input),
codec3.decode(input),
codec4.decode(input),
codec5.decode(input),
codec6.decode(input)
)
);
}
static StreamCodec create(TupleConstructorN constructorN, List> codecsAndGetters) {
//noinspection unchecked
CodecAndGetter[] codecsAndGettersArray = codecsAndGetters.toArray(CodecAndGetter[]::new);
return StreamCodec.of(
(output, item) -> {
for (CodecAndGetter codecsAndGetter : codecsAndGettersArray) {
codecsAndGetter.codec.encode(output, codecsAndGetter.getter.apply(item));
}
},
input -> {
Object[] args = new Object[codecsAndGettersArray.length];
for (int i = 0; i < codecsAndGettersArray.length; i++) {
args[i] = codecsAndGettersArray[i].codec.decode(input);
}
return constructorN.create(args);
}
);
}
record CodecAndGetter(StreamCodec codec, Function getter) {
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy