8 #ifndef INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP 9 #define INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP 11 #include "orcus/json_parser_thread.hpp" 12 #include "orcus/json_parser_base.hpp" 13 #include "orcus/detail/thread.hpp" 19 template<
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;
75 template<
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) {}
80 template<
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) {}
85 template<
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))
99 template<
typename _Handler>
102 return m_parser_thread.get_stats();
105 template<
typename _Handler>
108 m_parser_thread.swap_string_pool(pool);
111 template<
typename _Handler>
112 void threaded_json_parser<_Handler>::thread_parse()
115 m_parser_thread.start();
118 template<
typename _Handler>
119 void 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(t.numeric_value);
156 case json::parse_token_t::object_key:
157 m_handler.object_key(t.string_value.p, t.string_value.len,
false);
159 case json::parse_token_t::string:
160 m_handler.string(t.string_value.p, t.string_value.len,
false);
162 case json::parse_token_t::parse_error:
163 throw json::parse_error(std::string(t.error_value.p, t.error_value.len), t.error_value.offset);
164 case json::parse_token_t::unknown:
166 throw general_error(
"unknown token type encountered.");
void parse()
Definition: threaded_json_parser.hpp:86
Definition: threaded_json_parser.hpp:20
json::parser_stats get_stats() const
Definition: threaded_json_parser.hpp:100
Definition: thread.hpp:15
threaded_json_parser(const char *p, size_t n, handler_type &hdl, size_t min_token_size)
Definition: threaded_json_parser.hpp:76
Definition: json_parser_thread.hpp:88
Definition: tokens.hpp:21
Definition: string_pool.hpp:22
Definition: json_parser_thread.hpp:23
Definition: base64.hpp:15