All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.activej.serializer.stream.StreamCodec Maven / Gradle / Ivy

Go to download

Extremely fast and space-efficient serializers. Implemented using bytecode engineering.

There is a newer version: 6.0-rc2
Show newest version
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 encoder, StreamDecoder 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