StreamCodec.java

net.minecraft.network.codec.StreamCodec

信息

  • 全限定名:net.minecraft.network.codec.StreamCodec
  • 类型:public interface
  • 包:net.minecraft.network.codec
  • 源码路径:src/main/java/net/minecraft/network/codec/StreamCodec.java
  • 起始行号:L21
  • 继承:StreamEncoder<B,V>, StreamDecoder<B,V>
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.network.codec.StreamCodec.CodecOperation
    • 类型: interface
    • 修饰符: public
    • 源码定位: L638
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

static <B,V> StreamCodec<B,V> of(StreamEncoder<B,V> encoder, StreamDecoder<B,V> decoder) @ L22

  • 方法名:of
  • 源码定位:L22
  • 返回类型:<B,V> StreamCodec<B,V>
  • 修饰符:static

参数:

  • encoder: StreamEncoder<B,V>
  • decoder: StreamDecoder<B,V>

说明:

TODO

static <B,V> StreamCodec<B,V> ofMember(StreamMemberEncoder<B,V> encoder, StreamDecoder<B,V> decoder) @ L36

  • 方法名:ofMember
  • 源码定位:L36
  • 返回类型:<B,V> StreamCodec<B,V>
  • 修饰符:static

参数:

  • encoder: StreamMemberEncoder<B,V>
  • decoder: StreamDecoder<B,V>

说明:

TODO

static <B,V> StreamCodec<B,V> unit(V instance) @ L50

  • 方法名:unit
  • 源码定位:L50
  • 返回类型:<B,V> StreamCodec<B,V>
  • 修饰符:static

参数:

  • instance: V

说明:

TODO

default <O> StreamCodec<B,O> apply(StreamCodec.CodecOperation<B,V,O> operation) @ L66

  • 方法名:apply
  • 源码定位:L66
  • 返回类型: StreamCodec<B,O>
  • 修饰符:default

参数:

  • operation: StreamCodec.CodecOperation<B,V,O>

说明:

TODO

default <O> StreamCodec<B,O> map(Function<?super V,?extends O> to, Function<?super O,?extends V> from) @ L70

  • 方法名:map
  • 源码定位:L70
  • 返回类型: StreamCodec<B,O>
  • 修饰符:default

参数:

  • to: Function<?super V,?extends O>
  • from: Function<?super O,?extends V>

说明:

TODO

default <O extends ByteBuf> StreamCodec<O,V> mapStream(Function<O,?extends B> operation) @ L88

  • 方法名:mapStream
  • 源码定位:L88
  • 返回类型: StreamCodec<O,V>
  • 修饰符:default

参数:

  • operation: Function<O,?extends B>

说明:

TODO

default <U> StreamCodec<B,U> dispatch(Function<?super U,?extends V> type, Function<?super V,?extends StreamCodec<?super B,?extends U>> codec) @ L106

  • 方法名:dispatch
  • 源码定位:L106
  • 返回类型: StreamCodec<B,U>
  • 修饰符:default

参数:

  • type: Function<?super U,?extends V>
  • codec: Function<?super V,?extends StreamCodec<?super B,?extends U>>

说明:

TODO

static <B,C,T1> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, Function<T1,C> constructor) @ L129

  • 方法名:composite
  • 源码定位:L129
  • 返回类型:<B,C,T1> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • constructor: Function<T1,C>

说明:

TODO

static <B,C,T1,T2> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, BiFunction<T1,T2,C> constructor) @ L144

  • 方法名:composite
  • 源码定位:L144
  • 返回类型:<B,C,T1,T2> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • constructor: BiFunction<T1,T2,C>

说明:

TODO

static <B,C,T1,T2,T3> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, Function3<T1,T2,T3,C> constructor) @ L167

  • 方法名:composite
  • 源码定位:L167
  • 返回类型:<B,C,T1,T2,T3> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • constructor: Function3<T1,T2,T3,C>

说明:

TODO

static <B,C,T1,T2,T3,T4> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, Function4<T1,T2,T3,T4,C> constructor) @ L194

  • 方法名:composite
  • 源码定位:L194
  • 返回类型:<B,C,T1,T2,T3,T4> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • constructor: Function4<T1,T2,T3,T4,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, Function5<T1,T2,T3,T4,T5,C> constructor) @ L225

  • 方法名:composite
  • 源码定位:L225
  • 返回类型:<B,C,T1,T2,T3,T4,T5> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • constructor: Function5<T1,T2,T3,T4,T5,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5,T6> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, StreamCodec<?super B,T6> codec6, Function<C,T6> getter6, Function6<T1,T2,T3,T4,T5,T6,C> constructor) @ L260

  • 方法名:composite
  • 源码定位:L260
  • 返回类型:<B,C,T1,T2,T3,T4,T5,T6> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • codec6: StreamCodec<?super B,T6>
  • getter6: Function<C,T6>
  • constructor: Function6<T1,T2,T3,T4,T5,T6,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5,T6,T7> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, StreamCodec<?super B,T6> codec6, Function<C,T6> getter6, StreamCodec<?super B,T7> codec7, Function<C,T7> getter7, Function7<T1,T2,T3,T4,T5,T6,T7,C> constructor) @ L299

  • 方法名:composite
  • 源码定位:L299
  • 返回类型:<B,C,T1,T2,T3,T4,T5,T6,T7> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • codec6: StreamCodec<?super B,T6>
  • getter6: Function<C,T6>
  • codec7: StreamCodec<?super B,T7>
  • getter7: Function<C,T7>
  • constructor: Function7<T1,T2,T3,T4,T5,T6,T7,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5,T6,T7,T8> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, StreamCodec<?super B,T6> codec6, Function<C,T6> getter6, StreamCodec<?super B,T7> codec7, Function<C,T7> getter7, StreamCodec<?super B,T8> codec8, Function<C,T8> getter8, Function8<T1,T2,T3,T4,T5,T6,T7,T8,C> constructor) @ L342

  • 方法名:composite
  • 源码定位:L342
  • 返回类型:<B,C,T1,T2,T3,T4,T5,T6,T7,T8> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • codec6: StreamCodec<?super B,T6>
  • getter6: Function<C,T6>
  • codec7: StreamCodec<?super B,T7>
  • getter7: Function<C,T7>
  • codec8: StreamCodec<?super B,T8>
  • getter8: Function<C,T8>
  • constructor: Function8<T1,T2,T3,T4,T5,T6,T7,T8,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, StreamCodec<?super B,T6> codec6, Function<C,T6> getter6, StreamCodec<?super B,T7> codec7, Function<C,T7> getter7, StreamCodec<?super B,T8> codec8, Function<C,T8> getter8, StreamCodec<?super B,T9> codec9, Function<C,T9> getter9, Function9<T1,T2,T3,T4,T5,T6,T7,T8,T9,C> constructor) @ L389

  • 方法名:composite
  • 源码定位:L389
  • 返回类型:<B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • codec6: StreamCodec<?super B,T6>
  • getter6: Function<C,T6>
  • codec7: StreamCodec<?super B,T7>
  • getter7: Function<C,T7>
  • codec8: StreamCodec<?super B,T8>
  • getter8: Function<C,T8>
  • codec9: StreamCodec<?super B,T9>
  • getter9: Function<C,T9>
  • constructor: Function9<T1,T2,T3,T4,T5,T6,T7,T8,T9,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, StreamCodec<?super B,T6> codec6, Function<C,T6> getter6, StreamCodec<?super B,T7> codec7, Function<C,T7> getter7, StreamCodec<?super B,T8> codec8, Function<C,T8> getter8, StreamCodec<?super B,T9> codec9, Function<C,T9> getter9, StreamCodec<?super B,T10> codec10, Function<C,T10> getter10, Function10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,C> constructor) @ L440

  • 方法名:composite
  • 源码定位:L440
  • 返回类型:<B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • codec6: StreamCodec<?super B,T6>
  • getter6: Function<C,T6>
  • codec7: StreamCodec<?super B,T7>
  • getter7: Function<C,T7>
  • codec8: StreamCodec<?super B,T8>
  • getter8: Function<C,T8>
  • codec9: StreamCodec<?super B,T9>
  • getter9: Function<C,T9>
  • codec10: StreamCodec<?super B,T10>
  • getter10: Function<C,T10>
  • constructor: Function10<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, StreamCodec<?super B,T6> codec6, Function<C,T6> getter6, StreamCodec<?super B,T7> codec7, Function<C,T7> getter7, StreamCodec<?super B,T8> codec8, Function<C,T8> getter8, StreamCodec<?super B,T9> codec9, Function<C,T9> getter9, StreamCodec<?super B,T10> codec10, Function<C,T10> getter10, StreamCodec<?super B,T11> codec11, Function<C,T11> getter11, Function11<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,C> constructor) @ L495

  • 方法名:composite
  • 源码定位:L495
  • 返回类型:<B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • codec6: StreamCodec<?super B,T6>
  • getter6: Function<C,T6>
  • codec7: StreamCodec<?super B,T7>
  • getter7: Function<C,T7>
  • codec8: StreamCodec<?super B,T8>
  • getter8: Function<C,T8>
  • codec9: StreamCodec<?super B,T9>
  • getter9: Function<C,T9>
  • codec10: StreamCodec<?super B,T10>
  • getter10: Function<C,T10>
  • codec11: StreamCodec<?super B,T11>
  • getter11: Function<C,T11>
  • constructor: Function11<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,C>

说明:

TODO

static <B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> StreamCodec<B,C> composite(StreamCodec<?super B,T1> codec1, Function<C,T1> getter1, StreamCodec<?super B,T2> codec2, Function<C,T2> getter2, StreamCodec<?super B,T3> codec3, Function<C,T3> getter3, StreamCodec<?super B,T4> codec4, Function<C,T4> getter4, StreamCodec<?super B,T5> codec5, Function<C,T5> getter5, StreamCodec<?super B,T6> codec6, Function<C,T6> getter6, StreamCodec<?super B,T7> codec7, Function<C,T7> getter7, StreamCodec<?super B,T8> codec8, Function<C,T8> getter8, StreamCodec<?super B,T9> codec9, Function<C,T9> getter9, StreamCodec<?super B,T10> codec10, Function<C,T10> getter10, StreamCodec<?super B,T11> codec11, Function<C,T11> getter11, StreamCodec<?super B,T12> codec12, Function<C,T12> getter12, Function12<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,C> constructor) @ L554

  • 方法名:composite
  • 源码定位:L554
  • 返回类型:<B,C,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12> StreamCodec<B,C>
  • 修饰符:static

参数:

  • codec1: StreamCodec<?super B,T1>
  • getter1: Function<C,T1>
  • codec2: StreamCodec<?super B,T2>
  • getter2: Function<C,T2>
  • codec3: StreamCodec<?super B,T3>
  • getter3: Function<C,T3>
  • codec4: StreamCodec<?super B,T4>
  • getter4: Function<C,T4>
  • codec5: StreamCodec<?super B,T5>
  • getter5: Function<C,T5>
  • codec6: StreamCodec<?super B,T6>
  • getter6: Function<C,T6>
  • codec7: StreamCodec<?super B,T7>
  • getter7: Function<C,T7>
  • codec8: StreamCodec<?super B,T8>
  • getter8: Function<C,T8>
  • codec9: StreamCodec<?super B,T9>
  • getter9: Function<C,T9>
  • codec10: StreamCodec<?super B,T10>
  • getter10: Function<C,T10>
  • codec11: StreamCodec<?super B,T11>
  • getter11: Function<C,T11>
  • codec12: StreamCodec<?super B,T12>
  • getter12: Function<C,T12>
  • constructor: Function12<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,C>

说明:

TODO

static <B,T> StreamCodec<B,T> recursive(UnaryOperator<StreamCodec<B,T>> factory) @ L617

  • 方法名:recursive
  • 源码定位:L617
  • 返回类型:<B,T> StreamCodec<B,T>
  • 修饰符:static

参数:

  • factory: UnaryOperator<StreamCodec<B,T>>

说明:

TODO

default <S extends B> StreamCodec<S,V> cast() @ L633

  • 方法名:cast
  • 源码定位:L633
  • 返回类型: StreamCodec<S,V>
  • 修饰符:default

参数:

说明:

TODO

代码

public interface StreamCodec<B, V> extends StreamEncoder<B, V>, StreamDecoder<B, V> {
    static <B, V> StreamCodec<B, V> of(StreamEncoder<B, V> encoder, StreamDecoder<B, V> decoder) {
        return new StreamCodec<B, V>() {
            @Override
            public V decode(B input) {
                return decoder.decode(input);
            }
 
            @Override
            public void encode(B output, V value) {
                encoder.encode(output, value);
            }
        };
    }
 
    static <B, V> StreamCodec<B, V> ofMember(StreamMemberEncoder<B, V> encoder, StreamDecoder<B, V> decoder) {
        return new StreamCodec<B, V>() {
            @Override
            public V decode(B input) {
                return decoder.decode(input);
            }
 
            @Override
            public void encode(B output, V value) {
                encoder.encode(value, output);
            }
        };
    }
 
    static <B, V> StreamCodec<B, V> unit(V instance) {
        return new StreamCodec<B, V>() {
            @Override
            public V decode(B input) {
                return instance;
            }
 
            @Override
            public void encode(B output, V value) {
                if (!value.equals(instance)) {
                    throw new IllegalStateException("Can't encode '" + value + "', expected '" + instance + "'");
                }
            }
        };
    }
 
    default <O> StreamCodec<B, O> apply(StreamCodec.CodecOperation<B, V, O> operation) {
        return operation.apply(this);
    }
 
    default <O> StreamCodec<B, O> map(Function<? super V, ? extends O> to, Function<? super O, ? extends V> from) {
        return new StreamCodec<B, O>() {
            {
                Objects.requireNonNull(StreamCodec.this);
            }
 
            @Override
            public O decode(B input) {
                return (O)to.apply(StreamCodec.this.decode(input));
            }
 
            @Override
            public void encode(B output, O value) {
                StreamCodec.this.encode(output, (V)from.apply(value));
            }
        };
    }
 
    default <O extends ByteBuf> StreamCodec<O, V> mapStream(Function<O, ? extends B> operation) {
        return new StreamCodec<O, V>() {
            {
                Objects.requireNonNull(StreamCodec.this);
            }
 
            public V decode(O input) {
                B wrappedStream = (B)operation.apply(input);
                return StreamCodec.this.decode(wrappedStream);
            }
 
            public void encode(O output, V value) {
                B wrappedStream = (B)operation.apply(output);
                StreamCodec.this.encode(wrappedStream, value);
            }
        };
    }
 
    default <U> StreamCodec<B, U> dispatch(Function<? super U, ? extends V> type, Function<? super V, ? extends StreamCodec<? super B, ? extends U>> codec) {
        return new StreamCodec<B, U>() {
            {
                Objects.requireNonNull(StreamCodec.this);
            }
 
            @Override
            public U decode(B input) {
                V key = StreamCodec.this.decode(input);
                StreamCodec<? super B, ? extends U> valueCodec = (StreamCodec<? super B, ? extends U>)codec.apply(key);
                return (U)valueCodec.decode(input);
            }
 
            @Override
            public void encode(B output, U value) {
                V key = (V)type.apply(value);
                StreamCodec<B, U> valueCodec = (StreamCodec<B, U>)codec.apply(key);
                StreamCodec.this.encode(output, key);
                valueCodec.encode(output, value);
            }
        };
    }
 
    static <B, C, T1> StreamCodec<B, C> composite(StreamCodec<? super B, T1> codec1, Function<C, T1> getter1, Function<T1, C> constructor) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                return constructor.apply(v1);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        BiFunction<T1, T2, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                return constructor.apply(v1, v2);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        Function3<T1, T2, T3, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                return constructor.apply(v1, v2, v3);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        Function4<T1, T2, T3, T4, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                return constructor.apply(v1, v2, v3, v4);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        Function5<T1, T2, T3, T4, T5, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5, T6> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        StreamCodec<? super B, T6> codec6,
        Function<C, T6> getter6,
        Function6<T1, T2, T3, T4, T5, T6, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                T6 v6 = codec6.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5, v6);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
                codec6.encode(output, getter6.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5, T6, T7> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        StreamCodec<? super B, T6> codec6,
        Function<C, T6> getter6,
        StreamCodec<? super B, T7> codec7,
        Function<C, T7> getter7,
        Function7<T1, T2, T3, T4, T5, T6, T7, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                T6 v6 = codec6.decode(input);
                T7 v7 = codec7.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5, v6, v7);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
                codec6.encode(output, getter6.apply(value));
                codec7.encode(output, getter7.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5, T6, T7, T8> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        StreamCodec<? super B, T6> codec6,
        Function<C, T6> getter6,
        StreamCodec<? super B, T7> codec7,
        Function<C, T7> getter7,
        StreamCodec<? super B, T8> codec8,
        Function<C, T8> getter8,
        Function8<T1, T2, T3, T4, T5, T6, T7, T8, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                T6 v6 = codec6.decode(input);
                T7 v7 = codec7.decode(input);
                T8 v8 = codec8.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5, v6, v7, v8);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
                codec6.encode(output, getter6.apply(value));
                codec7.encode(output, getter7.apply(value));
                codec8.encode(output, getter8.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5, T6, T7, T8, T9> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        StreamCodec<? super B, T6> codec6,
        Function<C, T6> getter6,
        StreamCodec<? super B, T7> codec7,
        Function<C, T7> getter7,
        StreamCodec<? super B, T8> codec8,
        Function<C, T8> getter8,
        StreamCodec<? super B, T9> codec9,
        Function<C, T9> getter9,
        Function9<T1, T2, T3, T4, T5, T6, T7, T8, T9, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                T6 v6 = codec6.decode(input);
                T7 v7 = codec7.decode(input);
                T8 v8 = codec8.decode(input);
                T9 v9 = codec9.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5, v6, v7, v8, v9);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
                codec6.encode(output, getter6.apply(value));
                codec7.encode(output, getter7.apply(value));
                codec8.encode(output, getter8.apply(value));
                codec9.encode(output, getter9.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        StreamCodec<? super B, T6> codec6,
        Function<C, T6> getter6,
        StreamCodec<? super B, T7> codec7,
        Function<C, T7> getter7,
        StreamCodec<? super B, T8> codec8,
        Function<C, T8> getter8,
        StreamCodec<? super B, T9> codec9,
        Function<C, T9> getter9,
        StreamCodec<? super B, T10> codec10,
        Function<C, T10> getter10,
        Function10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                T6 v6 = codec6.decode(input);
                T7 v7 = codec7.decode(input);
                T8 v8 = codec8.decode(input);
                T9 v9 = codec9.decode(input);
                T10 v10 = codec10.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
                codec6.encode(output, getter6.apply(value));
                codec7.encode(output, getter7.apply(value));
                codec8.encode(output, getter8.apply(value));
                codec9.encode(output, getter9.apply(value));
                codec10.encode(output, getter10.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        StreamCodec<? super B, T6> codec6,
        Function<C, T6> getter6,
        StreamCodec<? super B, T7> codec7,
        Function<C, T7> getter7,
        StreamCodec<? super B, T8> codec8,
        Function<C, T8> getter8,
        StreamCodec<? super B, T9> codec9,
        Function<C, T9> getter9,
        StreamCodec<? super B, T10> codec10,
        Function<C, T10> getter10,
        StreamCodec<? super B, T11> codec11,
        Function<C, T11> getter11,
        Function11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                T6 v6 = codec6.decode(input);
                T7 v7 = codec7.decode(input);
                T8 v8 = codec8.decode(input);
                T9 v9 = codec9.decode(input);
                T10 v10 = codec10.decode(input);
                T11 v11 = codec11.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
                codec6.encode(output, getter6.apply(value));
                codec7.encode(output, getter7.apply(value));
                codec8.encode(output, getter8.apply(value));
                codec9.encode(output, getter9.apply(value));
                codec10.encode(output, getter10.apply(value));
                codec11.encode(output, getter11.apply(value));
            }
        };
    }
 
    static <B, C, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> StreamCodec<B, C> composite(
        StreamCodec<? super B, T1> codec1,
        Function<C, T1> getter1,
        StreamCodec<? super B, T2> codec2,
        Function<C, T2> getter2,
        StreamCodec<? super B, T3> codec3,
        Function<C, T3> getter3,
        StreamCodec<? super B, T4> codec4,
        Function<C, T4> getter4,
        StreamCodec<? super B, T5> codec5,
        Function<C, T5> getter5,
        StreamCodec<? super B, T6> codec6,
        Function<C, T6> getter6,
        StreamCodec<? super B, T7> codec7,
        Function<C, T7> getter7,
        StreamCodec<? super B, T8> codec8,
        Function<C, T8> getter8,
        StreamCodec<? super B, T9> codec9,
        Function<C, T9> getter9,
        StreamCodec<? super B, T10> codec10,
        Function<C, T10> getter10,
        StreamCodec<? super B, T11> codec11,
        Function<C, T11> getter11,
        StreamCodec<? super B, T12> codec12,
        Function<C, T12> getter12,
        Function12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, C> constructor
    ) {
        return new StreamCodec<B, C>() {
            @Override
            public C decode(B input) {
                T1 v1 = codec1.decode(input);
                T2 v2 = codec2.decode(input);
                T3 v3 = codec3.decode(input);
                T4 v4 = codec4.decode(input);
                T5 v5 = codec5.decode(input);
                T6 v6 = codec6.decode(input);
                T7 v7 = codec7.decode(input);
                T8 v8 = codec8.decode(input);
                T9 v9 = codec9.decode(input);
                T10 v10 = codec10.decode(input);
                T11 v11 = codec11.decode(input);
                T12 v12 = codec12.decode(input);
                return constructor.apply(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
            }
 
            @Override
            public void encode(B output, C value) {
                codec1.encode(output, getter1.apply(value));
                codec2.encode(output, getter2.apply(value));
                codec3.encode(output, getter3.apply(value));
                codec4.encode(output, getter4.apply(value));
                codec5.encode(output, getter5.apply(value));
                codec6.encode(output, getter6.apply(value));
                codec7.encode(output, getter7.apply(value));
                codec8.encode(output, getter8.apply(value));
                codec9.encode(output, getter9.apply(value));
                codec10.encode(output, getter10.apply(value));
                codec11.encode(output, getter11.apply(value));
                codec12.encode(output, getter12.apply(value));
            }
        };
    }
 
    static <B, T> StreamCodec<B, T> recursive(UnaryOperator<StreamCodec<B, T>> factory) {
        return new StreamCodec<B, T>() {
            private final Supplier<StreamCodec<B, T>> inner = Suppliers.memoize(() -> factory.apply(this));
 
            @Override
            public T decode(B input) {
                return this.inner.get().decode(input);
            }
 
            @Override
            public void encode(B output, T value) {
                this.inner.get().encode(output, value);
            }
        };
    }
 
    default <S extends B> StreamCodec<S, V> cast() {
        return (StreamCodec<S, V>)this;
    }
 
    @FunctionalInterface
    public interface CodecOperation<B, S, T> {
        StreamCodec<B, T> apply(StreamCodec<B, S> original);
    }
}

引用的其他类