129 return m_tokenColumnNumber;
136 bool skipWhitespaces();
138 template <
typename T>
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;
160template <
typename ALLOC>
163 while (!decodeNext())
170 m_tokenColumnNumber = m_columnNumber;
181 m_content = m_content.substr(m_pos) +
newContent;
188template <
typename ALLOC>
191 const size_t count =
static_cast<size_t>(m_in.rdbuf()->sgetn(m_buffer.data(), BUFFER_SIZE));
196template <
typename ALLOC>
197bool 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())
247template <
typename ALLOC>
248bool 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);
284template <
typename ALLOC>
286void BasicJsonTokenizer<ALLOC>::setToken(
JsonToken token, T&& value)
289 m_value.set(std::forward<T>(value));
292template <
typename ALLOC>
293void BasicJsonTokenizer<ALLOC>::setToken(
JsonToken token, BasicAny<ALLOC>&& value)
296 m_value = std::move(value);
299template <
typename ALLOC>
300void BasicJsonTokenizer<ALLOC>::setToken(
JsonToken token)
306template <
typename ALLOC>
307void BasicJsonTokenizer<ALLOC>::setPosition(
size_t newPos,
size_t newColumnNumber)
310 m_columnNumber = newColumnNumber;
313template <
typename ALLOC>
314void 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);