private unsafe void ReadJsonValue <TWriteStrategy>() where TWriteStrategy : IWriteStrategy { int start; JsonParserToken current = _state.CurrentTokenType; if (current == JsonParserToken.String) { BlittableJsonToken stringToken; if (typeof(TWriteStrategy) == typeof(WriteNone)) { start = _writer.WriteValue(_state.StringBuffer, _state.StringSize, _state.EscapePositions, out stringToken, _mode, _state.CompressedSize); } else // WriteFull { if (_state.EscapePositions.Count == 0 && _state.CompressedSize == null && (_mode & UsageMode.CompressSmallStrings) == 0 && _state.StringSize < 128) { start = _writer.WriteValue(_state.StringBuffer, _state.StringSize); stringToken = BlittableJsonToken.String; } else { start = _writer.WriteValue(_state.StringBuffer, _state.StringSize, _state.EscapePositions, out stringToken, _mode, _state.CompressedSize); } } _state.CompressedSize = null; _writeToken = new WriteToken(start, stringToken); } else if (current == JsonParserToken.Integer) { start = _writer.WriteValue(_state.Long); _writeToken = new WriteToken(start, BlittableJsonToken.Integer); } else if (current == JsonParserToken.StartObject) { _modifier?.StartObject(); _continuationState.Push(new BuildingState(ContinuationState.ReadObject)); } else if (current == JsonParserToken.Blob) { start = _writer.WriteValue(_state.StringBuffer, _state.StringSize); _writeToken = new WriteToken(start, BlittableJsonToken.RawBlob); } else if (current != JsonParserToken.EndObject) { ReadJsonValueUnlikely <TWriteStrategy>(current); } }
public void WriteValue(bool value) { var currentState = _continuationState.Pop(); var valuePos = _writer.WriteValue(value); _writeToken = new WriteToken //todo: figure out if we really need those WriteTokens { ValuePos = valuePos, WrittenToken = BlittableJsonToken.Boolean }; if (currentState.FirstWrite == -1) { currentState.FirstWrite = valuePos; } currentState = FinishWritingScalarValue(currentState); _continuationState.Push(currentState); }
private unsafe void ReadJsonValue() { int start; switch (_state.CurrentTokenType) { case JsonParserToken.StartObject: _continuationState.Push(new BuildingState { State = ContinuationState.ReadObject }); return; case JsonParserToken.StartArray: _continuationState.Push(new BuildingState { State = ContinuationState.ReadArray }); return; case JsonParserToken.Integer: start = _writer.WriteValue(_state.Long); _writeToken = new WriteToken { ValuePos = start, WrittenToken = BlittableJsonToken.Integer }; return; case JsonParserToken.Float: if ((_mode & UsageMode.ValidateDouble) == UsageMode.ValidateDouble) { _reader.ValidateFloat(); } BlittableJsonToken ignored; start = _writer.WriteValue(_state.StringBuffer, _state.StringSize, out ignored, _mode, _state.CompressedSize); _state.CompressedSize = null; _writeToken = new WriteToken { ValuePos = start, WrittenToken = BlittableJsonToken.Float }; return; case JsonParserToken.String: BlittableJsonToken stringToken; start = _writer.WriteValue(_state.StringBuffer, _state.StringSize, _state.EscapePositions, out stringToken, _mode, _state.CompressedSize); _state.CompressedSize = null; _writeToken = new WriteToken { ValuePos = start, WrittenToken = stringToken }; return; case JsonParserToken.True: case JsonParserToken.False: start = _writer.WriteValue(_state.CurrentTokenType == JsonParserToken.True ? (byte)1 : (byte)0); _writeToken = new WriteToken { ValuePos = start, WrittenToken = BlittableJsonToken.Boolean }; return; case JsonParserToken.Null: start = _writer.WriteValue((byte)0); _writeToken = new WriteToken // nothing to do here, we handle that with the token { WrittenToken = BlittableJsonToken.Null, ValuePos = start }; return; default: throw new InvalidDataException("Expected a value, but got " + _state.CurrentTokenType); } }
public void WriteValue(bool value) { var currentState = _continuationState.Pop(); var valuePos = _writer.WriteValue(value); _writeToken = new WriteToken { ValuePos = valuePos, WrittenToken = BlittableJsonToken.Boolean }; if (currentState.FirstWrite == -1) currentState.FirstWrite = valuePos; currentState = FinishWritingScalarValue(currentState); _continuationState.Push(currentState); }