public override uint Encode()

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;
         }
      }