示例#1
0
                static void ReadString(ref FastStream fs)
                {
                    var isEmpty = fs.Slice(1)[0] == 1;

                    if (isEmpty)
                    {
                        fs.Push(String.Empty);
                        return;
                    }
                    var length = (int)fs.Slice(1)[0];

                    if (length == 255)
                    {
                        length = BitConverter.ToInt32(fs.Slice(sizeof(int)));
                    }
                    Span <char> str   = stackalloc char[length];
                    var         slice = str;
                    var         diff  = fs._ptr + length - fs._read;

                    while (diff > 0)
                    {
                        length = diff;
                        Utf8.ToUtf16(fs._span.Slice(fs._ptr), slice, out _, out var written);
                        slice = slice.Slice(written);
                        fs.HotSwap();
                        diff = fs._ptr + length - fs._read;
                    }

                    {
                        Utf8.ToUtf16(fs.Slice(length), slice, out _, out var written);
                        fs.Push(new string(str));
                    }
                }
示例#2
0
                static void ReadVersion(ref FastStream fs)
                {
                    var slice    = fs.Slice(8);
                    var major    = BitConverter.ToUInt16(slice.Slice(0, 2));
                    var minor    = BitConverter.ToUInt16(slice.Slice(2, 2));
                    var build    = BitConverter.ToUInt16(slice.Slice(4, 2));
                    var revision = BitConverter.ToUInt16(slice.Slice(6, 2));

                    fs.Push(new Version(major, minor, build, revision));
                }
示例#3
0
                static void FinishReadDictionary(ref FastStream fs)
                {
                    var length = (int)fs.Pop();

                    if (length == 0)
                    {
                        fs.Push(new Dictionary <string, object>());
                        return;
                    }
                    var firstObject = fs.Pop();
                    var firstName   = (string)fs.Pop();

                    if (firstName == string.Empty)
                    {
                        var result = new object[length];
                        result[0] = firstObject;
                        for (int i = length - 1; i >= 1; i--)
                        {
                            result[i] = fs.Pop();
                            fs.Pop();
                        }
                        fs.Push(result);
                    }
                    else
                    {
                        var result = new Dictionary <string, object>(length);
                        result.Add(firstName, firstObject);
                        for (int i = length - 1; i >= 1; i--)
                        {
                            var value = fs.Pop();
                            var key   = (string)fs.Pop();
                            result.Add(key, value);
                        }
                        fs.Push(result);
                    }
                }
示例#4
0
 static private void ReadDouble(ref FastStream fs)
 {
     fs.Push(BitConverter.ToDouble(fs.Slice(sizeof(double))));
 }
示例#5
0
 static private void ReadBool(ref FastStream fs)
 {
     fs.Push(fs.Slice(1)[0] == 1);
 }
示例#6
0
 static void PushInt(ref FastStream fs)
 {
     fs.Push((int)fs.PopOp());
 }