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 "orcus/json_parser_thread.hpp"
12 #include "orcus/json_parser_base.hpp"
13 #include "orcus/detail/thread.hpp"
14 
15 #include <algorithm>
16 
17 namespace orcus {
18 
19 template<typename _Handler>
21 {
22 public:
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 
65 private:
66  void thread_parse();
67 
68  void process_tokens(json::parse_tokens_t& tokens);
69 
70 private:
71  json::parser_thread m_parser_thread;
72  handler_type& m_handler;
73 };
74 
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) {}
79 
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) {}
84 
85 template<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 
99 template<typename _Handler>
101 {
102  return m_parser_thread.get_stats();
103 }
104 
105 template<typename _Handler>
107 {
108  m_parser_thread.swap_string_pool(pool);
109 }
110 
111 template<typename _Handler>
112 void threaded_json_parser<_Handler>::thread_parse()
113 {
114  // Start parsing.
115  m_parser_thread.start();
116 }
117 
118 template<typename _Handler>
119 void 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(t.numeric_value);
155  break;
156  case json::parse_token_t::object_key:
157  m_handler.object_key(t.string_value.p, t.string_value.len, false);
158  break;
159  case json::parse_token_t::string:
160  m_handler.string(t.string_value.p, t.string_value.len, false);
161  break;
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:
165  default:
166  throw general_error("unknown token type encountered.");
167  }
168  }
169  );
170 }
171 
172 }
173 
174 #endif
175 
176 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
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:23
Definition: json_parser_thread.hpp:23
Definition: base64.hpp:15