8 #ifndef INCLUDED_ORCUS_THREADED_SAX_TOKEN_PARSER_HPP
9 #define INCLUDED_ORCUS_THREADED_SAX_TOKEN_PARSER_HPP
11 #include "orcus/tokens.hpp"
12 #include "orcus/xml_namespace.hpp"
13 #include "orcus/sax_token_parser_thread.hpp"
14 #include "orcus/exception.hpp"
15 #include "orcus/detail/thread.hpp"
24 template<
typename _Handler>
29 typedef _Handler handler_type;
43 handler_type& hdl,
size_t min_token_size);
58 handler_type& hdl,
size_t min_token_size,
size_t max_token_size);
70 void process_tokens(sax::parse_tokens_t&
tokens);
74 handler_type& m_handler;
77 template<
typename _Handler>
80 handler_type& hdl,
size_t min_token_size) :
81 m_parser_thread(p, n, tks, ns_cxt, min_token_size), m_handler(hdl) {}
83 template<
typename _Handler>
86 size_t min_token_size,
size_t max_token_size) :
87 m_parser_thread(p, n, tks, ns_cxt, min_token_size, max_token_size), m_handler(hdl) {}
89 template<
typename _Handler>
92 std::thread t(&threaded_sax_token_parser::thread_parse,
this);
95 sax::parse_tokens_t
tokens;
97 while (m_parser_thread.next_tokens(
tokens))
103 template<
typename _Handler>
106 m_parser_thread.swap_string_pool(pool);
109 template<
typename _Handler>
110 void threaded_sax_token_parser<_Handler>::thread_parse()
113 m_parser_thread.start();
116 template<
typename _Handler>
117 void threaded_sax_token_parser<_Handler>::process_tokens(sax::parse_tokens_t& tks)
119 std::for_each(tks.begin(), tks.end(),
120 [
this](
const sax::parse_token& t)
124 case sax::parse_token_t::start_element:
125 m_handler.start_element(*t.element);
127 case sax::parse_token_t::end_element:
128 m_handler.end_element(*t.element);
130 case sax::parse_token_t::characters:
131 m_handler.characters(pstring(t.characters.p, t.characters.n), false);
134 throw general_error(
"unknown token type encountered.");