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)); } }
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)); }
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); } }
static private void ReadDouble(ref FastStream fs) { fs.Push(BitConverter.ToDouble(fs.Slice(sizeof(double)))); }
static private void ReadBool(ref FastStream fs) { fs.Push(fs.Slice(1)[0] == 1); }
static void PushInt(ref FastStream fs) { fs.Push((int)fs.PopOp()); }