stringbuffer.h Source File

stringbuffer.h Source File#

Composable Kernel: stringbuffer.h Source File
stringbuffer.h
Go to the documentation of this file.
1// Tencent is pleased to support the open source community by making RapidJSON available.
2//
3// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip.
4//
5// Licensed under the MIT License (the "License"); you may not use this file except
6// in compliance with the License. You may obtain a copy of the License at
7//
8// http://opensource.org/licenses/MIT
9//
10// Unless required by applicable law or agreed to in writing, software distributed
11// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12// CONDITIONS OF ANY KIND, either express or implied. See the License for the
13// specific language governing permissions and limitations under the License.
14
15#ifndef RAPIDJSON_STRINGBUFFER_H_
16#define RAPIDJSON_STRINGBUFFER_H_
17
18#include "stream.h"
19#include "internal/stack.h"
20
21#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
22#include <utility> // std::move
23#endif
24
25#include "internal/stack.h"
26
27#if defined(__clang__)
28RAPIDJSON_DIAG_PUSH
29RAPIDJSON_DIAG_OFF(c++ 98 - compat)
30#endif
31
33
35
40template <typename Encoding, typename Allocator = CrtAllocator>
42{
43 public:
44 typedef typename Encoding::Ch Ch;
45
46 GenericStringBuffer(Allocator* allocator = 0, size_t capacity = kDefaultCapacity)
47 : stack_(allocator, capacity)
48 {
49 }
50
51#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
54 {
55 if(&rhs != this)
56 stack_ = std::move(rhs.stack_);
57 return *this;
58 }
59#endif
60
61 void Put(Ch c) { *stack_.template Push<Ch>() = c; }
62 void PutUnsafe(Ch c) { *stack_.template PushUnsafe<Ch>() = c; }
63 void Flush() {}
64
65 void Clear() { stack_.Clear(); }
67 {
68 // Push and pop a null terminator. This is safe.
69 *stack_.template Push<Ch>() = '\0';
70 stack_.ShrinkToFit();
71 stack_.template Pop<Ch>(1);
72 }
73
74 void Reserve(size_t count) { stack_.template Reserve<Ch>(count); }
75 Ch* Push(size_t count) { return stack_.template Push<Ch>(count); }
76 Ch* PushUnsafe(size_t count) { return stack_.template PushUnsafe<Ch>(count); }
77 void Pop(size_t count) { stack_.template Pop<Ch>(count); }
78
79 const Ch* GetString() const
80 {
81 // Push and pop a null terminator. This is safe.
82 *stack_.template Push<Ch>() = '\0';
83 stack_.template Pop<Ch>(1);
84
85 return stack_.template Bottom<Ch>();
86 }
87
89 size_t GetSize() const { return stack_.GetSize(); }
90
92 size_t GetLength() const { return stack_.GetSize() / sizeof(Ch); }
93
94 static const size_t kDefaultCapacity = 256;
96
97 private:
98 // Prohibit copy constructor & assignment operator.
100 GenericStringBuffer& operator=(const GenericStringBuffer&);
101};
102
105
106template <typename Encoding, typename Allocator>
107inline void PutReserve(GenericStringBuffer<Encoding, Allocator>& stream, size_t count)
108{
109 stream.Reserve(count);
110}
111
112template <typename Encoding, typename Allocator>
113inline void PutUnsafe(GenericStringBuffer<Encoding, Allocator>& stream, typename Encoding::Ch c)
114{
115 stream.PutUnsafe(c);
116}
117
119template <>
120inline void PutN(GenericStringBuffer<UTF8<>>& stream, char c, size_t n)
121{
122 std::memset(stream.stack_.Push<char>(n), c, n * sizeof(c));
123}
124
126
127#if defined(__clang__)
128RAPIDJSON_DIAG_POP
129#endif
130
131#endif // RAPIDJSON_STRINGBUFFER_H_
Represents an in-memory output stream.
Definition stringbuffer.h:42
void Pop(size_t count)
Definition stringbuffer.h:77
void ShrinkToFit()
Definition stringbuffer.h:66
void Flush()
Definition stringbuffer.h:63
const Ch * GetString() const
Definition stringbuffer.h:79
void Clear()
Definition stringbuffer.h:65
void Reserve(size_t count)
Definition stringbuffer.h:74
GenericStringBuffer(Allocator *allocator=0, size_t capacity=kDefaultCapacity)
Definition stringbuffer.h:46
Ch * PushUnsafe(size_t count)
Definition stringbuffer.h:76
size_t GetSize() const
Get the size of string in bytes in the string buffer.
Definition stringbuffer.h:89
UTF8< char >::Ch Ch
Definition stringbuffer.h:44
Ch * Push(size_t count)
Definition stringbuffer.h:75
void Put(Ch c)
Definition stringbuffer.h:61
void PutUnsafe(Ch c)
Definition stringbuffer.h:62
internal::Stack< CrtAllocator > stack_
Definition stringbuffer.h:95
size_t GetLength() const
Get the length of string in Ch in the string buffer.
Definition stringbuffer.h:92
static const size_t kDefaultCapacity
Definition stringbuffer.h:94
A type-unsafe stack for storing different types of data.
Definition stack.h:38
Concept for allocating, resizing and freeing memory block.
GenericStringBuffer< UTF8< char >, CrtAllocator > StringBuffer
Definition fwd.h:70
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
Definition rapidjson.h:121
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
Definition rapidjson.h:124
STL namespace.
void PutUnsafe(GenericStringBuffer< Encoding, Allocator > &stream, typename Encoding::Ch c)
Definition stringbuffer.h:113
void PutN(GenericStringBuffer< UTF8<> > &stream, char c, size_t n)
Implement specialized version of PutN() with memset() for better performance.
Definition stringbuffer.h:120
void PutReserve(GenericStringBuffer< Encoding, Allocator > &stream, size_t count)
Definition stringbuffer.h:107
UTF-8 encoding.
Definition encodings.h:98