Orcus
threaded_json_parser.hpp
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 */
7
8#ifndef INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP
9#define INCLUDED_ORCUS_THREADED_JSON_PARSER_HPP
10
11#include "json_parser_thread.hpp"
12#include "json_parser_base.hpp"
13#include "detail/thread.hpp"
14
15#include <algorithm>
16
17namespace orcus {
18
19template<typename _Handler>
21{
22public:
23
24 typedef _Handler handler_type;
25
35 const char* p, size_t n, handler_type& hdl, size_t min_token_size);
36
47 const char* p, size_t n, handler_type& hdl, size_t min_token_size,
48 size_t max_token_size);
49
53 void parse();
54
62
63 void swap_string_pool(string_pool& pool);
64
65private:
66 void thread_parse();
67
68 void process_tokens(json::parse_tokens_t& tokens);
69
70private:
71 json::parser_thread m_parser_thread;
72 handler_type& m_handler;
73};
74
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) {}
79
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) {}
84
85template<typename _Handler>
87{
88 std::thread t(&threaded_json_parser::thread_parse, this);
89 detail::thread::scoped_guard guard(std::move(t));
90
91 json::parse_tokens_t tokens;
92
93 while (m_parser_thread.next_tokens(tokens))
94 process_tokens(tokens);
95
96 process_tokens(tokens);
97}
98
99template<typename _Handler>
101{
102 return m_parser_thread.get_stats();
103}
104
105template<typename _Handler>
107{
108 m_parser_thread.swap_string_pool(pool);
109}
110
111template<typename _Handler>
112void threaded_json_parser<_Handler>::thread_parse()
113{
114 // Start parsing.
115 m_parser_thread.start();
116}
117
118template<typename _Handler>
119void threaded_json_parser<_Handler>::process_tokens(json::parse_tokens_t& tokens)
120{
121 std::for_each(tokens.begin(), tokens.end(),
122 [this](const json::parse_token& t)
123 {
124 switch (t.type)
125 {
126 case json::parse_token_t::begin_array:
127 m_handler.begin_array();
128 break;
129 case json::parse_token_t::begin_object:
130 m_handler.begin_object();
131 break;
132 case json::parse_token_t::begin_parse:
133 m_handler.begin_parse();
134 break;
135 case json::parse_token_t::boolean_false:
136 m_handler.boolean_false();
137 break;
138 case json::parse_token_t::boolean_true:
139 m_handler.boolean_true();
140 break;
141 case json::parse_token_t::end_array:
142 m_handler.end_array();
143 break;
144 case json::parse_token_t::end_object:
145 m_handler.end_object();
146 break;
147 case json::parse_token_t::end_parse:
148 m_handler.end_parse();
149 break;
150 case json::parse_token_t::null:
151 m_handler.null();
152 break;
153 case json::parse_token_t::number:
154 m_handler.number(std::get<double>(t.value));
155 break;
156 case json::parse_token_t::object_key:
157 {
158 auto s = std::get<std::string_view>(t.value);
159 m_handler.object_key(s.data(), s.size(), false);
160 break;
161 }
162 case json::parse_token_t::string:
163 {
164 auto s = std::get<std::string_view>(t.value);
165 m_handler.string(s.data(), s.size(), false);
166 break;
167 }
168 case json::parse_token_t::parse_error:
169 {
170 auto v = std::get<parse_error_value_t>(t.value);
171 throw parse_error(std::string{v.str}, v.offset);
172 }
173 case json::parse_token_t::unknown:
174 default:
175 throw general_error("unknown token type encountered.");
176 }
177 }
178 );
179}
180
181}
182
183#endif
184
185/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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