コード例 #1
0
ファイル: SpanWriter.cs プロジェクト: lanicon/BTDB
        public void WriteUInt8(byte value)
        {
            if (Buf.IsEmpty)
            {
                Resize(1);
            }

            PackUnpack.UnsafeGetAndAdvance(ref Buf, 1) = value;
        }
コード例 #2
0
ファイル: SpanWriter.cs プロジェクト: lanicon/BTDB
        public void WriteInt8Ordered(sbyte value)
        {
            if (Buf.IsEmpty)
            {
                Resize(1);
            }

            PackUnpack.UnsafeGetAndAdvance(ref Buf, 1) = (byte)(value + 128);
        }
コード例 #3
0
ファイル: SpanWriter.cs プロジェクト: lanicon/BTDB
        public void WriteByteZero()
        {
            if (Buf.IsEmpty)
            {
                Resize(1);
            }

            PackUnpack.UnsafeGetAndAdvance(ref Buf, 1) = 0;
        }
コード例 #4
0
ファイル: SpanWriter.cs プロジェクト: lanicon/BTDB
        public unsafe void WriteBool(bool value)
        {
            if (Buf.IsEmpty)
            {
                Resize(1);
            }

            PackUnpack.UnsafeGetAndAdvance(ref Buf, 1) = *(byte *)&value;
        }
コード例 #5
0
        public void WriteInt8(sbyte value)
        {
            if (_buf.IsEmpty)
            {
                Resize(1);
            }

            PackUnpack.UnsafeGetAndAdvance(ref _buf, 1) = (byte)value;
        }
コード例 #6
0
        public void WriteInt32LE(int value)
        {
            if ((uint)_buf.Length < 4u)
            {
                Resize(4);
            }

            Unsafe.As <byte, uint>(ref PackUnpack.UnsafeGetAndAdvance(ref _buf, 4)) =
                PackUnpack.AsLittleEndian((uint)value);
        }
コード例 #7
0
        public void WriteInt64(long value)
        {
            if ((uint)_buf.Length < 8u)
            {
                Resize(8);
            }

            Unsafe.As <byte, ulong>(ref PackUnpack.UnsafeGetAndAdvance(ref _buf, 8)) =
                PackUnpack.AsBigEndian((ulong)value);
        }
コード例 #8
0
        public unsafe void WriteString(string?value)
        {
            if (value == null)
            {
                WriteByteZero();
                return;
            }

            var l = value.Length;

            if (l == 0)
            {
                WriteUInt8(1);
                return;
            }

            fixed(char *strPtrStart = value)
            {
                var strPtr    = strPtrStart;
                var strPtrEnd = strPtrStart + l;
                var toEncode  = (uint)(l + 1);

doEncode:
                WriteVUInt32(toEncode);
                while (strPtr != strPtrEnd)
                {
                    var c = *strPtr++;
                    if (c < 0x80)
                    {
                        if (_buf.IsEmpty)
                        {
                            Resize(1);
                        }

                        PackUnpack.UnsafeGetAndAdvance(ref _buf, 1) = (byte)c;
                    }
                    else
                    {
                        if (char.IsHighSurrogate(c) && strPtr != strPtrEnd)
                        {
                            var c2 = *strPtr;
                            if (char.IsLowSurrogate(c2))
                            {
                                toEncode = (uint)((c - 0xD800) * 0x400 + (c2 - 0xDC00) + 0x10000);
                                strPtr++;
                                goto doEncode;
                            }
                        }

                        toEncode = c;
                        goto doEncode;
                    }
                }
            }
        }
コード例 #9
0
        public void WriteVUInt64(ulong value)
        {
            var len = PackUnpack.LengthVUInt(value);

            if ((uint)_buf.Length < (uint)len)
            {
                Resize(len);
            }

            PackUnpack.UnsafePackVUInt(ref PackUnpack.UnsafeGetAndAdvance(ref _buf, len), value, len);
        }
コード例 #10
0
                public bool ReadBlock(ref SpanReader spanReader, ref byte buffer, uint length)
                {
                    while (length > 0)
                    {
                        if (FillBufAndCheckForEof(ref spanReader))
                        {
                            return(true);
                        }
                        var lenTillEnd = (uint)Math.Min(length, spanReader.Buf.Length);
                        Unsafe.CopyBlockUnaligned(ref buffer,
                                                  ref PackUnpack.UnsafeGetAndAdvance(ref spanReader.Buf, (int)lenTillEnd), lenTillEnd);
                        length -= lenTillEnd;
                    }

                    return(false);
                }
コード例 #11
0
                public bool ReadBlock(ref SpanReader spanReader, ref byte buffer, uint length)
                {
                    if (length < BufLength)
                    {
                        if (FillBufAndCheckForEof(ref spanReader) || length > (uint)spanReader.Buf.Length)
                        {
                            return(true);
                        }
                        Unsafe.CopyBlockUnaligned(ref buffer,
                                                  ref PackUnpack.UnsafeGetAndAdvance(ref spanReader.Buf, (int)length), length);
                        return(false);
                    }

                    var read = PlatformMethods.Instance.PRead(_owner._handle,
                                                              MemoryMarshal.CreateSpan(ref buffer, (int)length), _ofs);

                    _ofs += read;
                    return(read < length);
                }