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 ReadProperty(ref FastStream fs) { var slice = fs.Slice(2); var type = slice[0]; //var anyType = slice[1]; switch (type) { case 0: fs.Push(null !); break; case 1: fs.PushOp(Op.ReadBool); break; case 2: fs.PushOp(Op.ReadDouble); break; case 3: fs.PushOp(Op.ReadString); break; case 4: fs.PushOp(Op.ReadList); break; case 5: fs.PushOp(Op.ReadDictionary); break; } }
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 ReadDictionary(ref FastStream fs) { var length = (int)BitConverter.ToUInt32(fs.Slice(sizeof(uint))); fs.PushOp(Op.PushInt, (Op)length, Op.FinishReadDictionary); for (int i = 0; i < length; i++) { fs.PushOp(Op.ReadProperty); fs.PushOp(Op.ReadString); } }
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); }