getTupleEncoder function

Encoder<List<Object?>> getTupleEncoder(
  1. List<Encoder<Object?>> items, {
  2. String? description,
})

Returns an encoder for tuples (fixed-length lists with heterogeneous item encoders).

Each item in the tuple is encoded sequentially using its corresponding encoder from items.

Implementation

Encoder<List<Object?>> getTupleEncoder(
  List<Encoder<Object?>> items, {
  String? description,
}) {
  final fixedSize = sumCodecSizes(items.map(getFixedSize).toList());
  final maxSize = sumCodecSizes(items.map(getMaxSize).toList());

  int writeImpl(List<Object?> value, Uint8List bytes, int currentOffset) {
    var offset = currentOffset;
    assertValidNumberOfItemsForCodec(
      description ?? 'tuple',
      items.length,
      value.length,
    );
    for (var i = 0; i < items.length; i++) {
      offset = items[i].write(value[i], bytes, offset);
    }
    return offset;
  }

  if (fixedSize != null) {
    return FixedSizeEncoder<List<Object?>>(
      fixedSize: fixedSize,
      write: writeImpl,
    );
  }

  return VariableSizeEncoder<List<Object?>>(
    getSizeFromValue: (value) {
      var total = 0;
      for (var i = 0; i < items.length; i++) {
        total += getEncodedSize(value[i], items[i]);
      }
      return total;
    },
    write: writeImpl,
    maxSize: maxSize,
  );
}