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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
        }