1 #ifndef ZSERIO_JSON_TOKENIZER_H_INC
2 #define ZSERIO_JSON_TOKENIZER_H_INC
58 template <
typename ALLOC = std::allocator<u
int8_t>>
74 m_decoderResult(0, allocator),
75 m_content(readContent(allocator)),
129 return m_tokenColumnNumber;
136 bool skipWhitespaces();
138 template <
typename T>
139 void setToken(
JsonToken token, T&& value);
142 void setPosition(
size_t newPos,
size_t newColumnNumber);
143 void setTokenValue();
145 static constexpr
size_t BUFFER_SIZE = 64 * 1024;
146 std::array<char, BUFFER_SIZE> m_buffer;
152 size_t m_lineNumber = 1;
153 size_t m_columnNumber = 1;
154 size_t m_tokenColumnNumber = 1;
160 template <
typename ALLOC>
163 while (!decodeNext())
166 if (newContent.empty())
170 m_tokenColumnNumber = m_columnNumber;
181 m_content = m_content.substr(m_pos) + newContent;
188 template <
typename ALLOC>
191 const size_t count =
static_cast<size_t>(m_in.rdbuf()->sgetn(m_buffer.data(), BUFFER_SIZE));
196 template <
typename ALLOC>
197 bool BasicJsonTokenizer<ALLOC>::decodeNext()
199 if (!skipWhitespaces())
204 m_tokenColumnNumber = m_columnNumber;
206 const char nextChar = m_content[m_pos];
211 setPosition(m_pos + 1, m_columnNumber + 1);
215 setPosition(m_pos + 1, m_columnNumber + 1);
219 setPosition(m_pos + 1, m_columnNumber + 1);
223 setPosition(m_pos + 1, m_columnNumber + 1);
227 setPosition(m_pos + 1, m_columnNumber + 1);
231 setPosition(m_pos + 1, m_columnNumber + 1);
234 m_decoderResult = m_decoder.decodeValue(std::string_view(m_content.data()).substr(m_pos));
235 if (m_pos + m_decoderResult.numReadChars >= m_content.size())
247 template <
typename ALLOC>
248 bool BasicJsonTokenizer<ALLOC>::skipWhitespaces()
252 if (m_pos >= m_content.size())
258 const char nextChar = m_content[m_pos];
263 setPosition(m_pos + 1, m_columnNumber + 1);
267 setPosition(m_pos + 1, 1);
270 if (m_pos + 1 >= m_content.size())
276 setPosition(m_pos + (m_content[m_pos + 1] ==
'\n' ? 2 : 1), 1);
284 template <
typename ALLOC>
285 template <
typename T>
286 void BasicJsonTokenizer<ALLOC>::setToken(
JsonToken token, T&& value)
289 m_value.set(std::forward<T>(value));
292 template <
typename ALLOC>
293 void BasicJsonTokenizer<ALLOC>::setToken(
JsonToken token, BasicAny<ALLOC>&& value)
296 m_value = std::move(value);
299 template <
typename ALLOC>
300 void BasicJsonTokenizer<ALLOC>::setToken(
JsonToken token)
306 template <
typename ALLOC>
307 void BasicJsonTokenizer<ALLOC>::setPosition(
size_t newPos,
size_t newColumnNumber)
310 m_columnNumber = newColumnNumber;
313 template <
typename ALLOC>
314 void BasicJsonTokenizer<ALLOC>::setTokenValue()
316 if (!m_decoderResult.value.hasValue())
318 throw JsonParserException(
"JsonTokenizer:")
319 << m_lineNumber <<
":" << m_tokenColumnNumber <<
": "
320 << (m_decoderResult.integerOverflow ?
"Value is outside of the 64-bit integer range!"
325 setPosition(m_pos + m_decoderResult.numReadChars, m_columnNumber + m_decoderResult.numReadChars);
const BasicAny< ALLOC > & getValue() const
JsonToken getToken() const
BasicJsonTokenizer(std::istream &in, const ALLOC &allocator)
CppRuntimeException(const char *message="")
~JsonParserException() override
std::basic_string< char, std::char_traits< char >, ALLOC > BasicString
CppRuntimeException & operator<<(CppRuntimeException &exception, const BasicBitBuffer< ALLOC > &bitBuffer)