8#ifndef INCLUDED_ORCUS_THREADED_SAX_TOKEN_PARSER_HPP
9#define INCLUDED_ORCUS_THREADED_SAX_TOKEN_PARSER_HPP
12#include "xml_namespace.hpp"
13#include "sax_token_parser_thread.hpp"
14#include "sax_parser_base.hpp"
15#include "exception.hpp"
16#include "detail/thread.hpp"
25template<
typename _Handler>
30 typedef _Handler handler_type;
44 handler_type& hdl,
size_t min_token_size);
59 handler_type& hdl,
size_t min_token_size,
size_t max_token_size);
71 void process_tokens(
const sax::parse_tokens_t&
tokens);
75 handler_type& m_handler;
78template<
typename _Handler>
81 handler_type& hdl,
size_t min_token_size) :
82 m_parser_thread(p, n, tks, ns_cxt, min_token_size), m_handler(hdl) {}
84template<
typename _Handler>
87 size_t min_token_size,
size_t max_token_size) :
88 m_parser_thread(p, n, tks, ns_cxt, min_token_size, max_token_size), m_handler(hdl) {}
90template<
typename _Handler>
93 std::thread t(&threaded_sax_token_parser::thread_parse,
this);
96 sax::parse_tokens_t
tokens;
100 while (m_parser_thread.next_tokens(
tokens))
105 catch (
const std::exception& e)
107 m_parser_thread.abort();
112template<
typename _Handler>
115 m_parser_thread.swap_string_pool(pool);
118template<
typename _Handler>
119void threaded_sax_token_parser<_Handler>::thread_parse()
122 m_parser_thread.start();
125template<
typename _Handler>
126void threaded_sax_token_parser<_Handler>::process_tokens(
const sax::parse_tokens_t& tks)
128 for (
const sax::parse_token& t : tks)
132 case sax::parse_token_t::start_element:
134 const auto* elem = std::get<const xml_token_element_t*>(t.value);
135 m_handler.start_element(*elem);
138 case sax::parse_token_t::end_element:
140 const auto* elem = std::get<const xml_token_element_t*>(t.value);
141 m_handler.end_element(*elem);
144 case sax::parse_token_t::characters:
146 auto s = std::get<std::string_view>(t.value);
147 m_handler.characters(s,
false);
150 case sax::parse_token_t::parse_error:
152 auto v = std::get<parse_error_value_t>(t.value);
153 throw sax::malformed_xml_error(std::string{v.str}, v.offset);
156 throw general_error(
"unknown token type encountered.");
Definition sax_token_parser_thread.hpp:62
Definition string_pool.hpp:23
Definition threaded_sax_token_parser.hpp:27
threaded_sax_token_parser(const char *p, size_t n, const tokens &tks, xmlns_context &ns_cxt, handler_type &hdl, size_t min_token_size)
Definition threaded_sax_token_parser.hpp:79
void parse()
Definition threaded_sax_token_parser.hpp:91
Definition xml_namespace.hpp:82