blob: 505ec0dab4319014b9e9f6eb5da493d39fc6cac5 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
namespace Apache.Fory;
internal sealed class BoolArraySerializer : Serializer<bool[]>
{
public override bool[] DefaultValue => null!;
public override void WriteData(WriteContext context, in bool[] value, bool hasGenerics)
{
_ = hasGenerics;
bool[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)safe.Length);
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteUInt8(safe[i] ? (byte)1 : (byte)0);
}
}
public override bool[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
bool[] values = new bool[payloadSize];
for (int i = 0; i < payloadSize; i++)
{
values[i] = context.Reader.ReadUInt8() != 0;
}
return values;
}
}
internal sealed class Int8ArraySerializer : Serializer<sbyte[]>
{
public override sbyte[] DefaultValue => null!;
public override void WriteData(WriteContext context, in sbyte[] value, bool hasGenerics)
{
_ = hasGenerics;
sbyte[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)safe.Length);
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteInt8(safe[i]);
}
}
public override sbyte[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
sbyte[] values = new sbyte[payloadSize];
for (int i = 0; i < payloadSize; i++)
{
values[i] = context.Reader.ReadInt8();
}
return values;
}
}
internal sealed class Int16ArraySerializer : Serializer<short[]>
{
public override short[] DefaultValue => null!;
public override void WriteData(WriteContext context, in short[] value, bool hasGenerics)
{
_ = hasGenerics;
short[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 2));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteInt16(safe[i]);
}
}
public override short[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 1) != 0)
{
throw new InvalidDataException("int16 array payload size mismatch");
}
short[] values = new short[payloadSize / 2];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadInt16();
}
return values;
}
}
internal sealed class Int32ArraySerializer : Serializer<int[]>
{
public override int[] DefaultValue => null!;
public override void WriteData(WriteContext context, in int[] value, bool hasGenerics)
{
_ = hasGenerics;
int[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 4));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteInt32(safe[i]);
}
}
public override int[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 3) != 0)
{
throw new InvalidDataException("int32 array payload size mismatch");
}
int[] values = new int[payloadSize / 4];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadInt32();
}
return values;
}
}
internal sealed class Int64ArraySerializer : Serializer<long[]>
{
public override long[] DefaultValue => null!;
public override void WriteData(WriteContext context, in long[] value, bool hasGenerics)
{
_ = hasGenerics;
long[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 8));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteInt64(safe[i]);
}
}
public override long[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 7) != 0)
{
throw new InvalidDataException("int64 array payload size mismatch");
}
long[] values = new long[payloadSize / 8];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadInt64();
}
return values;
}
}
internal sealed class UInt16ArraySerializer : Serializer<ushort[]>
{
public override ushort[] DefaultValue => null!;
public override void WriteData(WriteContext context, in ushort[] value, bool hasGenerics)
{
_ = hasGenerics;
ushort[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 2));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteUInt16(safe[i]);
}
}
public override ushort[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 1) != 0)
{
throw new InvalidDataException("uint16 array payload size mismatch");
}
ushort[] values = new ushort[payloadSize / 2];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadUInt16();
}
return values;
}
}
internal sealed class UInt32ArraySerializer : Serializer<uint[]>
{
public override uint[] DefaultValue => null!;
public override void WriteData(WriteContext context, in uint[] value, bool hasGenerics)
{
_ = hasGenerics;
uint[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 4));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteUInt32(safe[i]);
}
}
public override uint[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 3) != 0)
{
throw new InvalidDataException("uint32 array payload size mismatch");
}
uint[] values = new uint[payloadSize / 4];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadUInt32();
}
return values;
}
}
internal sealed class UInt64ArraySerializer : Serializer<ulong[]>
{
public override ulong[] DefaultValue => null!;
public override void WriteData(WriteContext context, in ulong[] value, bool hasGenerics)
{
_ = hasGenerics;
ulong[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 8));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteUInt64(safe[i]);
}
}
public override ulong[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 7) != 0)
{
throw new InvalidDataException("uint64 array payload size mismatch");
}
ulong[] values = new ulong[payloadSize / 8];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadUInt64();
}
return values;
}
}
internal sealed class Float32ArraySerializer : Serializer<float[]>
{
public override float[] DefaultValue => null!;
public override void WriteData(WriteContext context, in float[] value, bool hasGenerics)
{
_ = hasGenerics;
float[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 4));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteFloat32(safe[i]);
}
}
public override float[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 3) != 0)
{
throw new InvalidDataException("float32 array payload size mismatch");
}
float[] values = new float[payloadSize / 4];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadFloat32();
}
return values;
}
}
internal sealed class Float64ArraySerializer : Serializer<double[]>
{
public override double[] DefaultValue => null!;
public override void WriteData(WriteContext context, in double[] value, bool hasGenerics)
{
_ = hasGenerics;
double[] safe = value ?? [];
context.Writer.WriteVarUInt32((uint)(safe.Length * 8));
for (int i = 0; i < safe.Length; i++)
{
context.Writer.WriteFloat64(safe[i]);
}
}
public override double[] ReadData(ReadContext context)
{
int payloadSize = checked((int)context.Reader.ReadVarUInt32());
if ((payloadSize & 7) != 0)
{
throw new InvalidDataException("float64 array payload size mismatch");
}
double[] values = new double[payloadSize / 8];
for (int i = 0; i < values.Length; i++)
{
values[i] = context.Reader.ReadFloat64();
}
return values;
}
}