8#ifndef INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP
9#define INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP
11#include "json_parser_thread.hpp"
12#include "json_parser_base.hpp"
13#include "detail/thread.hpp"
19template<
typename _Handler>
24 typedef _Handler handler_type;
35 const char* p,
size_t n, handler_type& hdl,
size_t min_token_size);
47 const char* p,
size_t n, handler_type& hdl,
size_t min_token_size,
48 size_t max_token_size);
68 void process_tokens(json::parse_tokens_t&
tokens);
72 handler_type& m_handler;
75template<
typename _Handler>
77 const char* p,
size_t n, handler_type& hdl,
size_t min_token_size) :
78 m_parser_thread(p, n, min_token_size), m_handler(hdl) {}
80template<
typename _Handler>
82 const char* p,
size_t n, handler_type& hdl,
size_t min_token_size,
size_t max_token_size) :
83 m_parser_thread(p, n, min_token_size, max_token_size), m_handler(hdl) {}
85template<
typename _Handler>
88 std::thread t(&threaded_json_parser::thread_parse,
this);
91 json::parse_tokens_t
tokens;
93 while (m_parser_thread.next_tokens(
tokens))
99template<
typename _Handler>
102 return m_parser_thread.get_stats();
105template<
typename _Handler>
108 m_parser_thread.swap_string_pool(pool);
111template<
typename _Handler>
112void threaded_json_parser<_Handler>::thread_parse()
115 m_parser_thread.start();
118template<
typename _Handler>
119void threaded_json_parser<_Handler>::process_tokens(json::parse_tokens_t& tokens)
121 std::for_each(tokens.begin(), tokens.end(),
122 [
this](
const json::parse_token& t)
126 case json::parse_token_t::begin_array:
127 m_handler.begin_array();
129 case json::parse_token_t::begin_object:
130 m_handler.begin_object();
132 case json::parse_token_t::begin_parse:
133 m_handler.begin_parse();
135 case json::parse_token_t::boolean_false:
136 m_handler.boolean_false();
138 case json::parse_token_t::boolean_true:
139 m_handler.boolean_true();
141 case json::parse_token_t::end_array:
142 m_handler.end_array();
144 case json::parse_token_t::end_object:
145 m_handler.end_object();
147 case json::parse_token_t::end_parse:
148 m_handler.end_parse();
150 case json::parse_token_t::null:
153 case json::parse_token_t::number:
154 m_handler.number(std::get<double>(t.value));
156 case json::parse_token_t::object_key:
158 auto s = std::get<std::string_view>(t.value);
159 m_handler.object_key(s.data(), s.size(), false);
162 case json::parse_token_t::string:
164 auto s = std::get<std::string_view>(t.value);
165 m_handler.string(s.data(), s.size(), false);
168 case json::parse_token_t::parse_error:
170 auto v = std::get<parse_error_value_t>(t.value);
171 throw parse_error(std::string{v.str}, v.offset);
173 case json::parse_token_t::unknown:
175 throw general_error(
"unknown token type encountered.");
Definition: thread.hpp:16
Definition: json_parser_thread.hpp:74
Definition: string_pool.hpp:26
Definition: threaded_json_parser.hpp:21
void parse()
Definition: threaded_json_parser.hpp:86
json::parser_stats get_stats() const
Definition: threaded_json_parser.hpp:100
threaded_json_parser(const char *p, size_t n, handler_type &hdl, size_t min_token_size)
Definition: threaded_json_parser.hpp:76
Definition: tokens.hpp:30
Definition: json_parser_thread.hpp:26