in src/Proton.TestPeer/Codec/Impl/ArrayElement.cs [207:369]
public override uint Encode(Stream stream)
{
uint size = GetSize();
uint count = Count;
if (stream.IsWritable())
{
if (!IsElementOfArray())
{
if (size > 257 || count > 255)
{
stream.WriteByte(0xf0);
stream.WriteUnsignedInt(size - 5);
stream.WriteUnsignedInt(count);
}
else
{
stream.WriteByte(0xe0);
stream.WriteByte((byte)(size - 2));
stream.WriteByte((byte)count);
}
}
else
{
ArrayElement parent = (ArrayElement)Parent;
if (parent.ConstructorType == ConstructorType.Tiny)
{
stream.WriteByte((byte)(size - 1));
stream.WriteByte((byte)count);
}
else
{
stream.WriteUnsignedInt(size - 4);
stream.WriteUnsignedInt(count);
}
}
IElement element = first;
if (IsDescribed)
{
stream.WriteByte(0);
if (element == null)
{
stream.WriteByte(0x40);
}
else
{
element.Encode(stream);
element = element.Next;
}
}
switch (arrayType)
{
case DataType.Null:
stream.WriteByte(0x40);
break;
case DataType.Bool:
stream.WriteByte(0x56);
break;
case DataType.UByte:
stream.WriteByte(0x50);
break;
case DataType.Byte:
stream.WriteByte(0x51);
break;
case DataType.UShort:
stream.WriteByte(0x60);
break;
case DataType.Short:
stream.WriteByte(0x61);
break;
case DataType.UInt:
switch (ConstructorType)
{
case ConstructorType.Tiny:
stream.WriteByte(0x43);
break;
case ConstructorType.Small:
stream.WriteByte(0x52);
break;
case ConstructorType.Large:
stream.WriteByte(0x70);
break;
}
break;
case DataType.Int:
stream.WriteByte(ConstructorType == ConstructorType.Small ? (byte)0x54 : (byte)0x71);
break;
case DataType.Char:
stream.WriteByte(0x73);
break;
case DataType.ULong:
switch (ConstructorType)
{
case ConstructorType.Tiny:
stream.WriteByte(0x44);
break;
case ConstructorType.Small:
stream.WriteByte(0x53);
break;
case ConstructorType.Large:
stream.WriteByte(0x80);
break;
}
break;
case DataType.Long:
stream.WriteByte(ConstructorType == ConstructorType.Small ? (byte)0x55 : (byte)0x81);
break;
case DataType.Timestamp:
stream.WriteByte(0x83);
break;
case DataType.Float:
stream.WriteByte(0x72);
break;
case DataType.Double:
stream.WriteByte(0x82);
break;
case DataType.Decimal32:
stream.WriteByte(0x74);
break;
case DataType.Decimal64:
stream.WriteByte(0x84);
break;
case DataType.Decimal128:
stream.WriteByte(0x94);
break;
case DataType.Uuid:
stream.WriteByte(0x98);
break;
case DataType.Binary:
stream.WriteByte(ConstructorType == ConstructorType.Small ? (byte)0xa0 : (byte)0xb0);
break;
case DataType.String:
stream.WriteByte(ConstructorType == ConstructorType.Small ? (byte)0xa1 : (byte)0xb1);
break;
case DataType.Symbol:
stream.WriteByte(ConstructorType == ConstructorType.Small ? (byte)0xa3 : (byte)0xb3);
break;
case DataType.Array:
stream.WriteByte(ConstructorType == ConstructorType.Small ? (byte)0xe0 : (byte)0xf0);
break;
case DataType.List:
stream.WriteByte(ConstructorType == ConstructorType.Tiny ? (byte)0x45 : ConstructorType == ConstructorType.Small ? (byte)0xc0 : (byte)0xd0);
break;
case DataType.Map:
stream.WriteByte(ConstructorType == ConstructorType.Small ? (byte)0xc1 : (byte)0xd1);
break;
case DataType.Described:
break;
default:
break;
}
while (element != null)
{
element.Encode(stream);
element = element.Next;
}
return size;
}
else
{
return 0;
}
}