コード例 #1
0
        /// <summary>Writes an Int64 at the end, and advance the cursor</summary>
        /// <param name="writer">Target buffer</param>
        /// <param name="value">Signed QWORD, 64 bits, High Endian</param>
        public static void WriteInt64(ref SliceWriter writer, long value)
        {
            if (value <= 255)
            {
                if (value == 0)
                {                 // zero
                    writer.WriteByte(FdbTupleTypes.IntZero);
                    return;
                }

                if (value > 0)
                {                 // 1..255: frequent for array index
                    writer.WriteByte2(FdbTupleTypes.IntPos1, (byte)value);
                    return;
                }

                if (value > -256)
                {                 // -255..-1
                    writer.WriteByte2(FdbTupleTypes.IntNeg1, (byte)(255 + value));
                    return;
                }
            }

            WriteInt64Slow(ref writer, value);
        }
コード例 #2
0
        /// <summary>Writes a char array encoded in UTF-8</summary>
        internal static unsafe void WriteChars(ref SliceWriter writer, char[] value, int offset, int count)
        {
            Contract.Requires(offset >= 0 && count >= 0);

            if (count == 0)
            {
                if (value == null)
                {                 // "00"
                    writer.WriteByte(FdbTupleTypes.Nil);
                }
                else
                {                 // "02 00"
                    writer.WriteByte2(FdbTupleTypes.Utf8, 0x00);
                }
            }
            else
            {
                fixed(char *chars = value)
                {
                    if (TryWriteUnescapedUtf8String(ref writer, chars + offset, count))
                    {
                        return;
                    }
                }

                // the string contains \0 chars, we need to do it the hard way
                WriteNulEscapedBytes(ref writer, FdbTupleTypes.Utf8, Encoding.UTF8.GetBytes(value, 0, count));
            }
        }
コード例 #3
0
 /// <summary>Writes an UInt8 at the end, and advance the cursor</summary>
 /// <param name="writer">Target buffer</param>
 /// <param name="value">Unsigned BYTE, 32 bits</param>
 public static void WriteInt8(ref SliceWriter writer, byte value)
 {
     if (value == 0)
     {             // zero
         writer.WriteByte(FdbTupleTypes.IntZero);
     }
     else
     {             // 1..255: frequent for array index
         writer.WriteByte2(FdbTupleTypes.IntPos1, value);
     }
 }
コード例 #4
0
 /// <summary>Writes an UInt64 at the end, and advance the cursor</summary>
 /// <param name="writer">Target buffer</param>
 /// <param name="value">Signed QWORD, 64 bits, High Endian</param>
 public static void WriteUInt64(ref SliceWriter writer, ulong value)
 {
     if (value <= 255)
     {
         if (value == 0)
         {                 // 0
             writer.WriteByte(FdbTupleTypes.IntZero);
         }
         else
         {                 // 1..255
             writer.WriteByte2(FdbTupleTypes.IntPos1, (byte)value);
         }
     }
     else
     {             // >= 256
         WriteUInt64Slow(ref writer, value);
     }
 }
コード例 #5
0
 /// <summary>Writes a string encoded in UTF-8</summary>
 public static unsafe void WriteString(ref SliceWriter writer, string value)
 {
     if (value == null)
     {             // "00"
         writer.WriteByte(FdbTupleTypes.Nil);
     }
     else if (value.Length == 0)
     {             // "02 00"
         writer.WriteByte2(FdbTupleTypes.Utf8, 0x00);
     }
     else
     {
         fixed(char *chars = value)
         {
             if (!TryWriteUnescapedUtf8String(ref writer, chars, value.Length))
             {                     // the string contains \0 chars, we need to do it the hard way
                 WriteNulEscapedBytes(ref writer, FdbTupleTypes.Utf8, Encoding.UTF8.GetBytes(value));
             }
         }
     }
 }