1e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Tencent is pleased to support the open source community by making RapidJSON available. 2e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 3e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved. 4e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 5e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Licensed under the MIT License (the "License"); you may not use this file except 6e462795ff5d4c7359f9e8637c10544bb2de70107tturney// in compliance with the License. You may obtain a copy of the License at 7e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 8e462795ff5d4c7359f9e8637c10544bb2de70107tturney// http://opensource.org/licenses/MIT 9e462795ff5d4c7359f9e8637c10544bb2de70107tturney// 10e462795ff5d4c7359f9e8637c10544bb2de70107tturney// Unless required by applicable law or agreed to in writing, software distributed 11e462795ff5d4c7359f9e8637c10544bb2de70107tturney// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 12e462795ff5d4c7359f9e8637c10544bb2de70107tturney// CONDITIONS OF ANY KIND, either express or implied. See the License for the 13e462795ff5d4c7359f9e8637c10544bb2de70107tturney// specific language governing permissions and limitations under the License. 14e462795ff5d4c7359f9e8637c10544bb2de70107tturney 15e462795ff5d4c7359f9e8637c10544bb2de70107tturney#ifndef RAPIDJSON_MEMORYSTREAM_H_ 16e462795ff5d4c7359f9e8637c10544bb2de70107tturney#define RAPIDJSON_MEMORYSTREAM_H_ 17e462795ff5d4c7359f9e8637c10544bb2de70107tturney 18e462795ff5d4c7359f9e8637c10544bb2de70107tturney#include "rapidjson.h" 19e462795ff5d4c7359f9e8637c10544bb2de70107tturney 20e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_NAMESPACE_BEGIN 21e462795ff5d4c7359f9e8637c10544bb2de70107tturney 22e462795ff5d4c7359f9e8637c10544bb2de70107tturney//! Represents an in-memory input byte stream. 23e462795ff5d4c7359f9e8637c10544bb2de70107tturney/*! 24e462795ff5d4c7359f9e8637c10544bb2de70107tturney This class is mainly for being wrapped by EncodedInputStream or AutoUTFInputStream. 25e462795ff5d4c7359f9e8637c10544bb2de70107tturney 26e462795ff5d4c7359f9e8637c10544bb2de70107tturney It is similar to FileReadBuffer but the source is an in-memory buffer instead of a file. 27e462795ff5d4c7359f9e8637c10544bb2de70107tturney 28e462795ff5d4c7359f9e8637c10544bb2de70107tturney Differences between MemoryStream and StringStream: 29e462795ff5d4c7359f9e8637c10544bb2de70107tturney 1. StringStream has encoding but MemoryStream is a byte stream. 30e462795ff5d4c7359f9e8637c10544bb2de70107tturney 2. MemoryStream needs size of the source buffer and the buffer don't need to be null terminated. StringStream assume null-terminated string as source. 31e462795ff5d4c7359f9e8637c10544bb2de70107tturney 3. MemoryStream supports Peek4() for encoding detection. StringStream is specified with an encoding so it should not have Peek4(). 32e462795ff5d4c7359f9e8637c10544bb2de70107tturney \note implements Stream concept 33e462795ff5d4c7359f9e8637c10544bb2de70107tturney*/ 34e462795ff5d4c7359f9e8637c10544bb2de70107tturneystruct MemoryStream { 35e462795ff5d4c7359f9e8637c10544bb2de70107tturney typedef char Ch; // byte 36e462795ff5d4c7359f9e8637c10544bb2de70107tturney 37e462795ff5d4c7359f9e8637c10544bb2de70107tturney MemoryStream(const Ch *src, size_t size) : src_(src), begin_(src), end_(src + size), size_(size) {} 38e462795ff5d4c7359f9e8637c10544bb2de70107tturney 39e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch Peek() const { return (src_ == end_) ? '\0' : *src_; } 40e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch Take() { return (src_ == end_) ? '\0' : *src_++; } 41e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t Tell() const { return static_cast<size_t>(src_ - begin_); } 42e462795ff5d4c7359f9e8637c10544bb2de70107tturney 43e462795ff5d4c7359f9e8637c10544bb2de70107tturney Ch* PutBegin() { RAPIDJSON_ASSERT(false); return 0; } 44e462795ff5d4c7359f9e8637c10544bb2de70107tturney void Put(Ch) { RAPIDJSON_ASSERT(false); } 45e462795ff5d4c7359f9e8637c10544bb2de70107tturney void Flush() { RAPIDJSON_ASSERT(false); } 46e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t PutEnd(Ch*) { RAPIDJSON_ASSERT(false); return 0; } 47e462795ff5d4c7359f9e8637c10544bb2de70107tturney 48e462795ff5d4c7359f9e8637c10544bb2de70107tturney // For encoding detection only. 49e462795ff5d4c7359f9e8637c10544bb2de70107tturney const Ch* Peek4() const { 50e462795ff5d4c7359f9e8637c10544bb2de70107tturney return Tell() + 4 <= size_ ? src_ : 0; 51e462795ff5d4c7359f9e8637c10544bb2de70107tturney } 52e462795ff5d4c7359f9e8637c10544bb2de70107tturney 53e462795ff5d4c7359f9e8637c10544bb2de70107tturney const Ch* src_; //!< Current read position. 54e462795ff5d4c7359f9e8637c10544bb2de70107tturney const Ch* begin_; //!< Original head of the string. 55e462795ff5d4c7359f9e8637c10544bb2de70107tturney const Ch* end_; //!< End of stream. 56e462795ff5d4c7359f9e8637c10544bb2de70107tturney size_t size_; //!< Size of the stream. 57e462795ff5d4c7359f9e8637c10544bb2de70107tturney}; 58e462795ff5d4c7359f9e8637c10544bb2de70107tturney 59e462795ff5d4c7359f9e8637c10544bb2de70107tturneyRAPIDJSON_NAMESPACE_END 60e462795ff5d4c7359f9e8637c10544bb2de70107tturney 61e462795ff5d4c7359f9e8637c10544bb2de70107tturney#endif // RAPIDJSON_MEMORYBUFFER_H_ 62