public void WriteTo(ref WriteContext ctx, FieldCodec <T> codec) { if (count == 0) { return; } var writer = codec.ValueWriter; var tag = codec.Tag; if (codec.PackedRepeatedField) { // Packed primitive type int size = CalculatePackedDataSize(codec); ctx.WriteTag(tag); ctx.WriteLength(size); for (int i = 0; i < count; i++) { writer(ref ctx, array[i]); } } else { // Not packed: a simple tag/value pair for each value. // Can't use codec.WriteTagAndValue, as that omits default values. for (int i = 0; i < count; i++) { ctx.WriteTag(tag); writer(ref ctx, array[i]); if (codec.EndTag != 0) { ctx.WriteTag(codec.EndTag); } } } }