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