Coverage Report

Created: 2023-06-07 06:18

/src/jsoncons/include/jsoncons/json_parser.hpp
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2013-2023 Daniel Parker
2
// Distributed under the Boost license, Version 1.0.
3
// (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
5
// See https://github.com/danielaparker/jsoncons for latest version
6
7
#ifndef JSONCONS_JSON_PARSER_HPP
8
#define JSONCONS_JSON_PARSER_HPP
9
10
#include <memory> // std::allocator
11
#include <string>
12
#include <vector>
13
#include <stdexcept>
14
#include <system_error>
15
#include <unordered_map>
16
#include <limits> // std::numeric_limits
17
#include <functional> // std::function
18
#include <jsoncons/json_exception.hpp>
19
#include <jsoncons/json_filter.hpp>
20
#include <jsoncons/json_options.hpp>
21
#include <jsoncons/json_visitor.hpp>
22
#include <jsoncons/json_error.hpp>
23
#include <jsoncons/detail/parse_number.hpp>
24
25
#define JSONCONS_ILLEGAL_CONTROL_CHARACTER \
26
396
        case 0x00:case 0x01:case 0x02:case 0x03:case 0x04:case 0x05:case 0x06:case 0x07:case 0x08:case 0x0b: \
27
675
        case 0x0c:case 0x0e:case 0x0f:case 0x10:case 0x11:case 0x12:case 0x13:case 0x14:case 0x15:case 0x16: \
28
924
        case 0x17:case 0x18:case 0x19:case 0x1a:case 0x1b:case 0x1c:case 0x1d:case 0x1e:case 0x1f 
29
30
namespace jsoncons {
31
32
namespace detail {
33
34
}
35
36
enum class json_parse_state : uint8_t 
37
{
38
    root,
39
    start, 
40
    accept, 
41
    slash,  
42
    slash_slash, 
43
    slash_star, 
44
    slash_star_star,
45
    expect_comma_or_end,  
46
    object,
47
    expect_member_name_or_end, 
48
    expect_member_name, 
49
    expect_colon,
50
    expect_value_or_end,
51
    expect_value,
52
    array, 
53
    string,
54
    member_name,
55
    escape, 
56
    escape_u1, 
57
    escape_u2, 
58
    escape_u3, 
59
    escape_u4, 
60
    escape_expect_surrogate_pair1, 
61
    escape_expect_surrogate_pair2, 
62
    escape_u5, 
63
    escape_u6, 
64
    escape_u7, 
65
    escape_u8, 
66
    minus, 
67
    zero,  
68
    integer,
69
    fraction1,
70
    fraction2,
71
    exp1,
72
    exp2,
73
    exp3,
74
    n,
75
    nu,
76
    nul,
77
    t,  
78
    tr,  
79
    tru,  
80
    f,  
81
    fa,  
82
    fal,  
83
    fals,  
84
    cr,
85
    done
86
};
87
88
template <class CharT, class TempAllocator = std::allocator<char>>
89
class basic_json_parser : public ser_context
90
{
91
public:
92
    using char_type = CharT;
93
    using string_view_type = typename basic_json_visitor<CharT>::string_view_type;
94
private:
95
    struct string_maps_to_double
96
    {
97
        string_view_type s;
98
99
        bool operator()(const std::pair<string_view_type,double>& val) const
100
0
        {
101
0
            return val.first == s;
102
0
        }
Unexecuted instantiation: jsoncons::basic_json_parser<char, std::__1::allocator<char> >::string_maps_to_double::operator()(std::__1::pair<jsoncons::detail::basic_string_view<char, std::__1::char_traits<char> >, double> const&) const
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::string_maps_to_double::operator()(std::__1::pair<jsoncons::detail::basic_string_view<wchar_t, std::__1::char_traits<wchar_t> >, double> const&) const
103
    };
104
105
    using temp_allocator_type = TempAllocator;
106
    using char_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<CharT>;
107
    using parse_state_allocator_type = typename std::allocator_traits<temp_allocator_type>:: template rebind_alloc<json_parse_state>;
108
109
    static constexpr std::size_t initial_string_buffer_capacity_ = 1024;
110
    static constexpr std::size_t default_initial_stack_capacity_ = 100;
111
112
    basic_json_decode_options<char_type> options_;
113
114
    std::function<bool(json_errc,const ser_context&)> err_handler_;
115
    int initial_stack_capacity_;
116
    int nesting_depth_;
117
    uint32_t cp_;
118
    uint32_t cp2_;
119
    std::size_t line_;
120
    std::size_t position_;
121
    std::size_t mark_position_;
122
    std::size_t saved_position_;
123
    const char_type* begin_input_;
124
    const char_type* end_input_;
125
    const char_type* input_ptr_;
126
    json_parse_state state_;
127
    bool more_;
128
    bool done_;
129
130
    std::basic_string<char_type,std::char_traits<char_type>,char_allocator_type> string_buffer_;
131
    jsoncons::detail::chars_to to_double_;
132
133
    std::vector<json_parse_state,parse_state_allocator_type> state_stack_;
134
    std::vector<std::pair<std::basic_string<char_type>,double>> string_double_map_;
135
136
    // Noncopyable and nonmoveable
137
    basic_json_parser(const basic_json_parser&) = delete;
138
    basic_json_parser& operator=(const basic_json_parser&) = delete;
139
140
public:
141
    basic_json_parser(const TempAllocator& temp_alloc = TempAllocator())
142
        : basic_json_parser(basic_json_decode_options<char_type>(), default_json_parsing(), temp_alloc)
143
0
    {
144
0
    }
145
146
    basic_json_parser(std::function<bool(json_errc,const ser_context&)> err_handler, 
147
                      const TempAllocator& temp_alloc = TempAllocator())
148
        : basic_json_parser(basic_json_decode_options<char_type>(), err_handler, temp_alloc)
149
    {
150
    }
151
152
    basic_json_parser(const basic_json_decode_options<char_type>& options, 
153
                      const TempAllocator& temp_alloc = TempAllocator())
154
        : basic_json_parser(options, options.err_handler(), temp_alloc)
155
5.29k
    {
156
5.29k
    }
157
158
    basic_json_parser(const basic_json_decode_options<char_type>& options,
159
                      std::function<bool(json_errc,const ser_context&)> err_handler, 
160
                      const TempAllocator& temp_alloc = TempAllocator())
161
       : options_(options),
162
         err_handler_(err_handler),
163
         initial_stack_capacity_(default_initial_stack_capacity_),
164
         nesting_depth_(0), 
165
         cp_(0),
166
         cp2_(0),
167
         line_(1),
168
         position_(0),
169
         mark_position_(0),
170
         saved_position_(0),
171
         begin_input_(nullptr),
172
         end_input_(nullptr),
173
         input_ptr_(nullptr),
174
         state_(json_parse_state::start),
175
         more_(true),
176
         done_(false),
177
         string_buffer_(temp_alloc),
178
         state_stack_(temp_alloc)
179
18.3k
    {
180
18.3k
        string_buffer_.reserve(initial_string_buffer_capacity_);
181
182
18.3k
        state_stack_.reserve(initial_stack_capacity_);
183
18.3k
        push_state(json_parse_state::root);
184
185
18.3k
        if (options_.enable_str_to_nan())
186
0
        {
187
0
            string_double_map_.emplace_back(options_.nan_to_str(),std::nan(""));
188
0
        }
189
18.3k
        if (options_.enable_str_to_inf())
190
0
        {
191
0
            string_double_map_.emplace_back(options_.inf_to_str(),std::numeric_limits<double>::infinity());
192
0
        }
193
18.3k
        if (options_.enable_str_to_neginf())
194
0
        {
195
0
            string_double_map_.emplace_back(options_.neginf_to_str(),-std::numeric_limits<double>::infinity());
196
0
        }
197
18.3k
    }
198
199
    bool source_exhausted() const
200
77.4k
    {
201
77.4k
        return input_ptr_ == end_input_;
202
77.4k
    }
203
204
    ~basic_json_parser() noexcept
205
18.3k
    {
206
18.3k
    }
207
208
    json_parse_state parent() const
209
55.0M
    {
210
55.0M
        JSONCONS_ASSERT(state_stack_.size() >= 1);
211
55.0M
        return state_stack_.back();
212
55.0M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parent() const
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parent() const
Line
Count
Source
209
55.0M
    {
210
55.0M
        JSONCONS_ASSERT(state_stack_.size() >= 1);
211
55.0M
        return state_stack_.back();
212
55.0M
    }
213
214
    bool done() const
215
8.64k
    {
216
8.64k
        return done_;
217
8.64k
    }
218
219
    bool enter() const
220
10.9k
    {
221
10.9k
        return state_ == json_parse_state::start;
222
10.9k
    }
223
224
    bool accept() const
225
10.6k
    {
226
10.6k
        return state_ == json_parse_state::accept || done_;
227
10.6k
    }
228
229
    bool stopped() const
230
45.5k
    {
231
45.5k
        return !more_;
232
45.5k
    }
233
234
    json_parse_state state() const
235
    {
236
        return state_;
237
    }
238
239
    bool finished() const
240
9.60k
    {
241
9.60k
        return !more_ && state_ != json_parse_state::accept;
242
9.60k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::finished() const
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::finished() const
Line
Count
Source
240
9.60k
    {
241
9.60k
        return !more_ && state_ != json_parse_state::accept;
242
9.60k
    }
243
244
    const char_type* first() const
245
    {
246
        return begin_input_;
247
    }
248
249
    const char_type* current() const
250
    {
251
        return input_ptr_;
252
    }
253
254
    const char_type* last() const
255
    {
256
        return end_input_;
257
    }
258
259
    void skip_space()
260
376k
    {
261
376k
        const char_type* local_input_end = end_input_;
262
9.51M
        while (input_ptr_ != local_input_end) 
263
9.51M
        {
264
9.51M
            switch (*input_ptr_)
265
9.51M
            {
266
9.07M
                case ' ':
267
9.14M
                case '\t':
268
9.14M
                    ++input_ptr_;
269
9.14M
                    ++position_;
270
9.14M
                    break;
271
252k
                case '\r': 
272
252k
                    push_state(state_);
273
252k
                    ++input_ptr_;
274
252k
                    ++position_;
275
252k
                    state_ = json_parse_state::cr;
276
252k
                    return; 
277
100k
                case '\n': 
278
100k
                    ++input_ptr_;
279
100k
                    ++line_;
280
100k
                    ++position_;
281
100k
                    mark_position_ = position_;
282
100k
                    return;   
283
21.8k
                default:
284
21.8k
                    return;
285
9.51M
            }
286
9.51M
        }
287
376k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::skip_space()
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::skip_space()
Line
Count
Source
260
376k
    {
261
376k
        const char_type* local_input_end = end_input_;
262
9.51M
        while (input_ptr_ != local_input_end) 
263
9.51M
        {
264
9.51M
            switch (*input_ptr_)
265
9.51M
            {
266
9.07M
                case ' ':
267
9.14M
                case '\t':
268
9.14M
                    ++input_ptr_;
269
9.14M
                    ++position_;
270
9.14M
                    break;
271
252k
                case '\r': 
272
252k
                    push_state(state_);
273
252k
                    ++input_ptr_;
274
252k
                    ++position_;
275
252k
                    state_ = json_parse_state::cr;
276
252k
                    return; 
277
100k
                case '\n': 
278
100k
                    ++input_ptr_;
279
100k
                    ++line_;
280
100k
                    ++position_;
281
100k
                    mark_position_ = position_;
282
100k
                    return;   
283
21.8k
                default:
284
21.8k
                    return;
285
9.51M
            }
286
9.51M
        }
287
376k
    }
288
289
    void skip_whitespace()
290
438
    {
291
438
        const char_type* local_input_end = end_input_;
292
293
557k
        while (input_ptr_ != local_input_end) 
294
557k
        {
295
557k
            switch (state_)
296
557k
            {
297
232k
                case json_parse_state::cr:
298
232k
                    ++line_;
299
232k
                    ++position_;
300
232k
                    mark_position_ = position_;
301
232k
                    switch (*input_ptr_)
302
232k
                    {
303
4.28k
                        case '\n':
304
4.28k
                            ++input_ptr_;
305
4.28k
                            ++position_;
306
4.28k
                            state_ = pop_state();
307
4.28k
                            break;
308
227k
                        default:
309
227k
                            state_ = pop_state();
310
227k
                            break;
311
232k
                    }
312
232k
                    break;
313
314
325k
                default:
315
325k
                    switch (*input_ptr_)
316
325k
                    {
317
35.2k
                        case ' ':
318
60.3k
                        case '\t':
319
144k
                        case '\n':
320
324k
                        case '\r':
321
324k
                            skip_space();
322
324k
                            break;
323
46
                        default:
324
46
                            return;
325
325k
                    }
326
324k
                    break;
327
557k
            }
328
557k
        }
329
438
    }
330
331
    void begin_object(basic_json_visitor<char_type>& visitor, std::error_code& ec)
332
512k
    {
333
512k
        if (JSONCONS_UNLIKELY(++nesting_depth_ > options_.max_nesting_depth()))
334
7
        {
335
7
            more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this);
336
7
            if (!more_)
337
7
            {
338
7
                ec = json_errc::max_nesting_depth_exceeded;
339
7
                return;
340
7
            }
341
7
        } 
342
343
512k
        push_state(json_parse_state::object);
344
512k
        state_ = json_parse_state::expect_member_name_or_end;
345
512k
        more_ = visitor.begin_object(semantic_tag::none, *this, ec);
346
512k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::begin_object(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::begin_object(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
332
512k
    {
333
512k
        if (JSONCONS_UNLIKELY(++nesting_depth_ > options_.max_nesting_depth()))
334
7
        {
335
7
            more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this);
336
7
            if (!more_)
337
7
            {
338
7
                ec = json_errc::max_nesting_depth_exceeded;
339
7
                return;
340
7
            }
341
7
        } 
342
343
512k
        push_state(json_parse_state::object);
344
512k
        state_ = json_parse_state::expect_member_name_or_end;
345
512k
        more_ = visitor.begin_object(semantic_tag::none, *this, ec);
346
512k
    }
347
348
    void end_object(basic_json_visitor<char_type>& visitor, std::error_code& ec)
349
507k
    {
350
507k
        if (JSONCONS_UNLIKELY(nesting_depth_ < 1))
351
18
        {
352
18
            err_handler_(json_errc::unexpected_rbrace, *this);
353
18
            ec = json_errc::unexpected_rbrace;
354
18
            more_ = false;
355
18
            return;
356
18
        }
357
507k
        --nesting_depth_;
358
507k
        state_ = pop_state();
359
507k
        if (state_ == json_parse_state::object)
360
507k
        {
361
507k
            more_ = visitor.end_object(*this, ec);
362
507k
        }
363
104
        else if (state_ == json_parse_state::array)
364
104
        {
365
104
            err_handler_(json_errc::expected_comma_or_rbracket, *this);
366
104
            ec = json_errc::expected_comma_or_rbracket;
367
104
            more_ = false;
368
104
            return;
369
104
        }
370
0
        else
371
0
        {
372
0
            err_handler_(json_errc::unexpected_rbrace, *this);
373
0
            ec = json_errc::unexpected_rbrace;
374
0
            more_ = false;
375
0
            return;
376
0
        }
377
378
507k
        if (parent() == json_parse_state::root)
379
983
        {
380
983
            state_ = json_parse_state::accept;
381
983
        }
382
506k
        else
383
506k
        {
384
506k
            state_ = json_parse_state::expect_comma_or_end;
385
506k
        }
386
507k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_object(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_object(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
349
507k
    {
350
507k
        if (JSONCONS_UNLIKELY(nesting_depth_ < 1))
351
18
        {
352
18
            err_handler_(json_errc::unexpected_rbrace, *this);
353
18
            ec = json_errc::unexpected_rbrace;
354
18
            more_ = false;
355
18
            return;
356
18
        }
357
507k
        --nesting_depth_;
358
507k
        state_ = pop_state();
359
507k
        if (state_ == json_parse_state::object)
360
507k
        {
361
507k
            more_ = visitor.end_object(*this, ec);
362
507k
        }
363
104
        else if (state_ == json_parse_state::array)
364
104
        {
365
104
            err_handler_(json_errc::expected_comma_or_rbracket, *this);
366
104
            ec = json_errc::expected_comma_or_rbracket;
367
104
            more_ = false;
368
104
            return;
369
104
        }
370
0
        else
371
0
        {
372
0
            err_handler_(json_errc::unexpected_rbrace, *this);
373
0
            ec = json_errc::unexpected_rbrace;
374
0
            more_ = false;
375
0
            return;
376
0
        }
377
378
507k
        if (parent() == json_parse_state::root)
379
983
        {
380
983
            state_ = json_parse_state::accept;
381
983
        }
382
506k
        else
383
506k
        {
384
506k
            state_ = json_parse_state::expect_comma_or_end;
385
506k
        }
386
507k
    }
387
388
    void begin_array(basic_json_visitor<char_type>& visitor, std::error_code& ec)
389
11.4M
    {
390
11.4M
        if (++nesting_depth_ > options_.max_nesting_depth())
391
9
        {
392
9
            more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this);
393
9
            if (!more_)
394
9
            {
395
9
                ec = json_errc::max_nesting_depth_exceeded;
396
9
                return;
397
9
            }
398
9
        }
399
400
11.4M
        push_state(json_parse_state::array);
401
11.4M
        state_ = json_parse_state::expect_value_or_end;
402
11.4M
        more_ = visitor.begin_array(semantic_tag::none, *this, ec);
403
11.4M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::begin_array(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::begin_array(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
389
11.4M
    {
390
11.4M
        if (++nesting_depth_ > options_.max_nesting_depth())
391
9
        {
392
9
            more_ = err_handler_(json_errc::max_nesting_depth_exceeded, *this);
393
9
            if (!more_)
394
9
            {
395
9
                ec = json_errc::max_nesting_depth_exceeded;
396
9
                return;
397
9
            }
398
9
        }
399
400
11.4M
        push_state(json_parse_state::array);
401
11.4M
        state_ = json_parse_state::expect_value_or_end;
402
11.4M
        more_ = visitor.begin_array(semantic_tag::none, *this, ec);
403
11.4M
    }
404
405
    void end_array(basic_json_visitor<char_type>& visitor, std::error_code& ec)
406
25.8k
    {
407
25.8k
        if (nesting_depth_ < 1)
408
19
        {
409
19
            err_handler_(json_errc::unexpected_rbracket, *this);
410
19
            ec = json_errc::unexpected_rbracket;
411
19
            more_ = false;
412
19
            return;
413
19
        }
414
25.8k
        --nesting_depth_;
415
25.8k
        state_ = pop_state();
416
25.8k
        if (state_ == json_parse_state::array)
417
25.8k
        {
418
25.8k
            more_ = visitor.end_array(*this, ec);
419
25.8k
        }
420
3
        else if (state_ == json_parse_state::object)
421
3
        {
422
3
            err_handler_(json_errc::expected_comma_or_rbrace, *this);
423
3
            ec = json_errc::expected_comma_or_rbrace;
424
3
            more_ = false;
425
3
            return;
426
3
        }
427
0
        else
428
0
        {
429
0
            err_handler_(json_errc::unexpected_rbracket, *this);
430
0
            ec = json_errc::unexpected_rbracket;
431
0
            more_ = false;
432
0
            return;
433
0
        }
434
25.8k
        if (parent() == json_parse_state::root)
435
415
        {
436
415
            state_ = json_parse_state::accept;
437
415
        }
438
25.4k
        else
439
25.4k
        {
440
25.4k
            state_ = json_parse_state::expect_comma_or_end;
441
25.4k
        }
442
25.8k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_array(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_array(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
406
25.8k
    {
407
25.8k
        if (nesting_depth_ < 1)
408
19
        {
409
19
            err_handler_(json_errc::unexpected_rbracket, *this);
410
19
            ec = json_errc::unexpected_rbracket;
411
19
            more_ = false;
412
19
            return;
413
19
        }
414
25.8k
        --nesting_depth_;
415
25.8k
        state_ = pop_state();
416
25.8k
        if (state_ == json_parse_state::array)
417
25.8k
        {
418
25.8k
            more_ = visitor.end_array(*this, ec);
419
25.8k
        }
420
3
        else if (state_ == json_parse_state::object)
421
3
        {
422
3
            err_handler_(json_errc::expected_comma_or_rbrace, *this);
423
3
            ec = json_errc::expected_comma_or_rbrace;
424
3
            more_ = false;
425
3
            return;
426
3
        }
427
0
        else
428
0
        {
429
0
            err_handler_(json_errc::unexpected_rbracket, *this);
430
0
            ec = json_errc::unexpected_rbracket;
431
0
            more_ = false;
432
0
            return;
433
0
        }
434
25.8k
        if (parent() == json_parse_state::root)
435
415
        {
436
415
            state_ = json_parse_state::accept;
437
415
        }
438
25.4k
        else
439
25.4k
        {
440
25.4k
            state_ = json_parse_state::expect_comma_or_end;
441
25.4k
        }
442
25.8k
    }
443
444
    void reinitialize()
445
    {
446
        reset();
447
        cp_ = 0;
448
        cp2_ = 0;
449
        saved_position_ = 0;
450
        begin_input_ = nullptr;
451
        end_input_ = nullptr;
452
        input_ptr_ = nullptr;
453
        string_buffer_.clear();
454
    }
455
456
    void reset()
457
9.74k
    {
458
9.74k
        state_stack_.clear();
459
9.74k
        state_stack_.reserve(initial_stack_capacity_);
460
9.74k
        push_state(json_parse_state::root);
461
9.74k
        state_ = json_parse_state::start;
462
9.74k
        more_ = true;
463
9.74k
        done_ = false;
464
9.74k
        line_ = 1;
465
9.74k
        position_ = 0;
466
9.74k
        mark_position_ = 0;
467
9.74k
        nesting_depth_ = 0;
468
9.74k
    }
469
470
    void restart()
471
5.30k
    {
472
5.30k
        more_ = true;
473
5.30k
    }
474
475
    void check_done()
476
2.27k
    {
477
2.27k
        std::error_code ec;
478
2.27k
        check_done(ec);
479
2.27k
        if (ec)
480
133
        {
481
133
            JSONCONS_THROW(ser_error(ec,line_,column()));
482
133
        }
483
2.27k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::check_done()
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::check_done()
Line
Count
Source
476
2.27k
    {
477
2.27k
        std::error_code ec;
478
2.27k
        check_done(ec);
479
2.27k
        if (ec)
480
133
        {
481
133
            JSONCONS_THROW(ser_error(ec,line_,column()));
482
133
        }
483
2.27k
    }
484
485
    void check_done(std::error_code& ec)
486
5.57k
    {
487
25.9k
        for (; input_ptr_ != end_input_; ++input_ptr_)
488
20.6k
        {
489
20.6k
            char_type curr_char_ = *input_ptr_;
490
20.6k
            switch (curr_char_)
491
20.6k
            {
492
512
                case '\n':
493
2.19k
                case '\r':
494
2.39k
                case '\t':
495
20.3k
                case ' ':
496
20.3k
                    break;
497
241
                default:
498
241
                    more_ = err_handler_(json_errc::extra_character, *this);
499
241
                    if (!more_)
500
241
                    {
501
241
                        ec = json_errc::extra_character;
502
241
                        return;
503
241
                    }
504
0
                    break;
505
20.6k
            }
506
20.6k
        }
507
5.57k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::check_done(std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::check_done(std::__1::error_code&)
Line
Count
Source
486
5.57k
    {
487
25.9k
        for (; input_ptr_ != end_input_; ++input_ptr_)
488
20.6k
        {
489
20.6k
            char_type curr_char_ = *input_ptr_;
490
20.6k
            switch (curr_char_)
491
20.6k
            {
492
512
                case '\n':
493
2.19k
                case '\r':
494
2.39k
                case '\t':
495
20.3k
                case ' ':
496
20.3k
                    break;
497
241
                default:
498
241
                    more_ = err_handler_(json_errc::extra_character, *this);
499
241
                    if (!more_)
500
241
                    {
501
241
                        ec = json_errc::extra_character;
502
241
                        return;
503
241
                    }
504
0
                    break;
505
20.6k
            }
506
20.6k
        }
507
5.57k
    }
508
509
    void update(const string_view_type sv)
510
    {
511
        update(sv.data(),sv.length());
512
    }
513
514
    void update(const char_type* data, std::size_t length)
515
29.4k
    {
516
29.4k
        begin_input_ = data;
517
29.4k
        end_input_ = data + length;
518
29.4k
        input_ptr_ = begin_input_;
519
29.4k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::update(wchar_t const*, unsigned long)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::update(char const*, unsigned long)
Line
Count
Source
515
29.4k
    {
516
29.4k
        begin_input_ = data;
517
29.4k
        end_input_ = data + length;
518
29.4k
        input_ptr_ = begin_input_;
519
29.4k
    }
520
521
    void parse_some(basic_json_visitor<char_type>& visitor)
522
5.28k
    {
523
5.28k
        std::error_code ec;
524
5.28k
        parse_some(visitor, ec);
525
5.28k
        if (ec)
526
1.10k
        {
527
1.10k
            JSONCONS_THROW(ser_error(ec,line_,column()));
528
1.10k
        }
529
5.28k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<wchar_t>&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<char>&)
Line
Count
Source
522
5.28k
    {
523
5.28k
        std::error_code ec;
524
5.28k
        parse_some(visitor, ec);
525
5.28k
        if (ec)
526
1.10k
        {
527
1.10k
            JSONCONS_THROW(ser_error(ec,line_,column()));
528
1.10k
        }
529
5.28k
    }
530
531
    void parse_some(basic_json_visitor<char_type>& visitor, std::error_code& ec)
532
49.1k
    {
533
49.1k
        parse_some_(visitor, ec);
534
49.1k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_some(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
532
49.1k
    {
533
49.1k
        parse_some_(visitor, ec);
534
49.1k
    }
535
536
    void finish_parse(basic_json_visitor<char_type>& visitor)
537
4.18k
    {
538
4.18k
        std::error_code ec;
539
4.18k
        finish_parse(visitor, ec);
540
4.18k
        if (ec)
541
1.91k
        {
542
1.91k
            JSONCONS_THROW(ser_error(ec,line_,column()));
543
1.91k
        }
544
4.18k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<wchar_t>&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<char>&)
Line
Count
Source
537
4.18k
    {
538
4.18k
        std::error_code ec;
539
4.18k
        finish_parse(visitor, ec);
540
4.18k
        if (ec)
541
1.91k
        {
542
1.91k
            JSONCONS_THROW(ser_error(ec,line_,column()));
543
1.91k
        }
544
4.18k
    }
545
546
    void finish_parse(basic_json_visitor<char_type>& visitor, std::error_code& ec)
547
4.18k
    {
548
9.60k
        while (!finished())
549
5.41k
        {
550
5.41k
            parse_some(visitor, ec);
551
5.41k
        }
552
4.18k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::finish_parse(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
547
4.18k
    {
548
9.60k
        while (!finished())
549
5.41k
        {
550
5.41k
            parse_some(visitor, ec);
551
5.41k
        }
552
4.18k
    }
553
554
    void parse_some_(basic_json_visitor<char_type>& visitor, std::error_code& ec)
555
49.1k
    {
556
49.1k
        if (state_ == json_parse_state::accept)
557
7.01k
        {
558
7.01k
            visitor.flush();
559
7.01k
            done_ = true;
560
7.01k
            state_ = json_parse_state::done;
561
7.01k
            more_ = false;
562
7.01k
            return;
563
7.01k
        }
564
42.1k
        const char_type* local_input_end = end_input_;
565
566
42.1k
        if (input_ptr_ == local_input_end && more_)
567
13.0k
        {
568
13.0k
            switch (state_)
569
13.0k
            {
570
176
                case json_parse_state::zero:  
571
3.44k
                case json_parse_state::integer:
572
3.44k
                    end_integer_value(visitor, ec);
573
3.44k
                    if (ec) return;
574
3.44k
                    break;
575
3.44k
                case json_parse_state::fraction2:
576
3.23k
                case json_parse_state::exp3:
577
3.23k
                    end_fraction_value(visitor, ec);
578
3.23k
                    if (ec) return;
579
3.23k
                    break;
580
3.23k
                case json_parse_state::accept:
581
0
                    visitor.flush();
582
0
                    done_ = true;
583
0
                    state_ = json_parse_state::done;
584
0
                    more_ = false;
585
0
                    break;
586
332
                case json_parse_state::start:
587
332
                case json_parse_state::done:
588
332
                    more_ = false;
589
332
                    break;
590
422
                case json_parse_state::cr:
591
422
                    state_ = pop_state();
592
422
                    break;
593
5.56k
                default:
594
5.56k
                    err_handler_(json_errc::unexpected_eof, *this);
595
5.56k
                    ec = json_errc::unexpected_eof;
596
5.56k
                    more_ = false;
597
5.56k
                    return;
598
13.0k
            }
599
13.0k
        }
600
601
52.4M
        while ((input_ptr_ < local_input_end) && more_)
602
52.4M
        {
603
52.4M
            switch (state_)
604
52.4M
            {
605
176
                case json_parse_state::accept:
606
176
                    visitor.flush();
607
176
                    done_ = true;
608
176
                    state_ = json_parse_state::done;
609
176
                    more_ = false;
610
176
                    break;
611
476k
                case json_parse_state::cr:
612
476k
                    ++line_;
613
476k
                    mark_position_ = position_;
614
476k
                    switch (*input_ptr_)
615
476k
                    {
616
2.78k
                        case '\n':
617
2.78k
                            ++input_ptr_;
618
2.78k
                            ++position_;
619
2.78k
                            state_ = pop_state();
620
2.78k
                            break;
621
473k
                        default:
622
473k
                            state_ = pop_state();
623
473k
                            break;
624
476k
                    }
625
476k
                    break;
626
476k
                case json_parse_state::start: 
627
70.5k
                    {
628
70.5k
                        switch (*input_ptr_)
629
70.5k
                        {
630
4.72k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
631
4.72k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
632
4.72k
                                if (!more_)
633
230
                                {
634
230
                                    ec = json_errc::illegal_control_character;
635
230
                                    return;
636
230
                                }
637
0
                                break;
638
11.5k
                            case '\r': 
639
11.5k
                                push_state(state_);
640
11.5k
                                ++input_ptr_;
641
11.5k
                                ++position_;
642
11.5k
                                state_ = json_parse_state::cr;
643
11.5k
                                break; 
644
21.7k
                            case '\n': 
645
21.7k
                                ++input_ptr_;
646
21.7k
                                ++line_;
647
21.7k
                                ++position_;
648
21.7k
                                mark_position_ = position_;
649
21.7k
                                break;   
650
11.0k
                            case ' ':case '\t':
651
11.0k
                                skip_space();
652
11.0k
                                break;
653
8.53k
                            case '/': 
654
8.53k
                                ++input_ptr_;
655
8.53k
                                ++position_;
656
8.53k
                                push_state(state_);
657
8.53k
                                state_ = json_parse_state::slash;
658
8.53k
                                break;
659
2.30k
                            case '{':
660
2.30k
                                saved_position_ = position_;
661
2.30k
                                ++input_ptr_;
662
2.30k
                                ++position_;
663
2.30k
                                begin_object(visitor, ec);
664
2.30k
                                if (ec) return;
665
2.30k
                                break;
666
5.40k
                            case '[':
667
5.40k
                                saved_position_ = position_;
668
5.40k
                                ++input_ptr_;
669
5.40k
                                ++position_;
670
5.40k
                                begin_array(visitor, ec);
671
5.40k
                                if (ec) return;
672
5.40k
                                break;
673
5.40k
                            case '\"':
674
2.67k
                                state_ = json_parse_state::string;
675
2.67k
                                saved_position_ = position_;
676
2.67k
                                ++input_ptr_;
677
2.67k
                                ++position_;
678
2.67k
                                string_buffer_.clear();
679
2.67k
                                parse_string(visitor, ec);
680
2.67k
                                if (ec) return;
681
2.02k
                                break;
682
2.02k
                            case '-':
683
1.25k
                                string_buffer_.clear();
684
1.25k
                                string_buffer_.push_back('-');
685
1.25k
                                saved_position_ = position_;
686
1.25k
                                ++input_ptr_;
687
1.25k
                                ++position_;
688
1.25k
                                state_ = json_parse_state::minus;
689
1.25k
                                parse_number(visitor, ec);
690
1.25k
                                if (ec) {return;}
691
1.23k
                                break;
692
1.23k
                            case '0': 
693
331
                                string_buffer_.clear();
694
331
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
695
331
                                state_ = json_parse_state::zero;
696
331
                                saved_position_ = position_;
697
331
                                ++input_ptr_;
698
331
                                ++position_;
699
331
                                parse_number(visitor, ec);
700
331
                                if (ec) {return;}
701
259
                                break;
702
4.02k
                            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
703
4.02k
                                string_buffer_.clear();
704
4.02k
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
705
4.02k
                                saved_position_ = position_;
706
4.02k
                                ++input_ptr_;
707
4.02k
                                ++position_;
708
4.02k
                                state_ = json_parse_state::integer;
709
4.02k
                                parse_number(visitor, ec);
710
4.02k
                                if (ec) {return;}
711
3.91k
                                break;
712
3.91k
                            case 'n':
713
309
                                parse_null(visitor, ec);
714
309
                                if (ec) {return;}
715
124
                                break;
716
290
                            case 't':
717
290
                                parse_true(visitor, ec);
718
290
                                if (ec) {return;}
719
129
                                break;
720
375
                            case 'f':
721
375
                                parse_false(visitor, ec);
722
375
                                if (ec) {return;}
723
176
                                break;
724
176
                            case '}':
725
6
                                err_handler_(json_errc::unexpected_rbrace, *this);
726
6
                                ec = json_errc::unexpected_rbrace;
727
6
                                more_ = false;
728
6
                                return;
729
7
                            case ']':
730
7
                                err_handler_(json_errc::unexpected_rbracket, *this);
731
7
                                ec = json_errc::unexpected_rbracket;
732
7
                                more_ = false;
733
7
                                return;
734
352
                            default:
735
352
                                err_handler_(json_errc::syntax_error, *this);
736
352
                                ec = json_errc::syntax_error;
737
352
                                more_ = false;
738
352
                                return;
739
70.5k
                        }
740
70.5k
                    }
741
68.5k
                    break;
742
743
3.08M
                case json_parse_state::expect_comma_or_end: 
744
3.08M
                    {
745
3.08M
                        switch (*input_ptr_)
746
3.08M
                        {
747
1.50k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
748
1.50k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
749
1.50k
                                if (!more_)
750
98
                                {
751
98
                                    ec = json_errc::illegal_control_character;
752
98
                                    return;
753
98
                                }
754
0
                                ++input_ptr_;
755
0
                                ++position_;
756
0
                                break;
757
47.0k
                            case '\r': 
758
47.0k
                                ++input_ptr_;
759
47.0k
                                ++position_;
760
47.0k
                                push_state(state_);
761
47.0k
                                state_ = json_parse_state::cr;
762
47.0k
                                break; 
763
12.0k
                            case '\n': 
764
12.0k
                                ++input_ptr_;
765
12.0k
                                ++line_;
766
12.0k
                                ++position_;
767
12.0k
                                mark_position_ = position_;
768
12.0k
                                break;   
769
6.20k
                            case ' ':case '\t':
770
6.20k
                                skip_space();
771
6.20k
                                break;
772
4.11k
                            case '/':
773
4.11k
                                ++input_ptr_;
774
4.11k
                                ++position_;
775
4.11k
                                push_state(state_); 
776
4.11k
                                state_ = json_parse_state::slash;
777
4.11k
                                break;
778
13.5k
                            case '}':
779
13.5k
                                saved_position_ = position_;
780
13.5k
                                ++input_ptr_;
781
13.5k
                                ++position_;
782
13.5k
                                end_object(visitor, ec);
783
13.5k
                                if (ec) return;
784
13.4k
                                break;
785
19.4k
                            case ']':
786
19.4k
                                saved_position_ = position_;
787
19.4k
                                ++input_ptr_;
788
19.4k
                                ++position_;
789
19.4k
                                end_array(visitor, ec);
790
19.4k
                                if (ec) return;
791
19.3k
                                break;
792
2.97M
                            case ',':
793
2.97M
                                begin_member_or_element(ec);
794
2.97M
                                if (ec) return;
795
2.97M
                                ++input_ptr_;
796
2.97M
                                ++position_;
797
2.97M
                                break;
798
146
                            default:
799
146
                                if (parent() == json_parse_state::array)
800
120
                                {
801
120
                                    more_ = err_handler_(json_errc::expected_comma_or_rbracket, *this);
802
120
                                    if (!more_)
803
120
                                    {
804
120
                                        ec = json_errc::expected_comma_or_rbracket;
805
120
                                        return;
806
120
                                    }
807
120
                                }
808
26
                                else if (parent() == json_parse_state::object)
809
26
                                {
810
26
                                    more_ = err_handler_(json_errc::expected_comma_or_rbrace, *this);
811
26
                                    if (!more_)
812
26
                                    {
813
26
                                        ec = json_errc::expected_comma_or_rbrace;
814
26
                                        return;
815
26
                                    }
816
26
                                }
817
0
                                ++input_ptr_;
818
0
                                ++position_;
819
0
                                break;
820
3.08M
                        }
821
3.08M
                    }
822
3.08M
                    break;
823
3.08M
                case json_parse_state::expect_member_name_or_end: 
824
516k
                    {
825
516k
                        switch (*input_ptr_)
826
516k
                        {
827
1.32k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
828
1.32k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
829
1.32k
                                if (!more_)
830
88
                                {
831
88
                                    ec = json_errc::illegal_control_character;
832
88
                                    return;
833
88
                                }
834
0
                                ++input_ptr_;
835
0
                                ++position_;
836
0
                                break;
837
1.02k
                            case '\r': 
838
1.02k
                                ++input_ptr_;
839
1.02k
                                ++position_;
840
1.02k
                                push_state(state_);
841
1.02k
                                state_ = json_parse_state::cr;
842
1.02k
                                break; 
843
766
                            case '\n': 
844
766
                                ++input_ptr_;
845
766
                                ++line_;
846
766
                                ++position_;
847
766
                                mark_position_ = position_;
848
766
                                break;   
849
1.24k
                            case ' ':case '\t':
850
1.24k
                                skip_space();
851
1.24k
                                break;
852
584
                            case '/':
853
584
                                ++input_ptr_;
854
584
                                ++position_;
855
584
                                push_state(state_); 
856
584
                                state_ = json_parse_state::slash;
857
584
                                break;
858
494k
                            case '}':
859
494k
                                saved_position_ = position_;
860
494k
                                ++input_ptr_;
861
494k
                                ++position_;
862
494k
                                end_object(visitor, ec);
863
494k
                                if (ec) return;
864
494k
                                break;
865
494k
                            case '\"':
866
18.2k
                                saved_position_ = position_;
867
18.2k
                                ++input_ptr_;
868
18.2k
                                ++position_;
869
18.2k
                                push_state(json_parse_state::member_name);
870
18.2k
                                state_ = json_parse_state::string;
871
18.2k
                                string_buffer_.clear();
872
18.2k
                                parse_string(visitor, ec);
873
18.2k
                                if (ec) return;
874
18.2k
                                break;
875
18.2k
                            case '\'':
876
3
                                more_ = err_handler_(json_errc::single_quote, *this);
877
3
                                if (!more_)
878
3
                                {
879
3
                                    ec = json_errc::single_quote;
880
3
                                    return;
881
3
                                }
882
0
                                ++input_ptr_;
883
0
                                ++position_;
884
0
                                break;
885
14
                            default:
886
14
                                more_ = err_handler_(json_errc::expected_key, *this);
887
14
                                if (!more_)
888
14
                                {
889
14
                                    ec = json_errc::expected_key;
890
14
                                    return;
891
14
                                }
892
0
                                ++input_ptr_;
893
0
                                ++position_;
894
0
                                break;
895
516k
                        }
896
516k
                    }
897
516k
                    break;
898
2.03M
                case json_parse_state::expect_member_name: 
899
2.03M
                    {
900
2.03M
                        switch (*input_ptr_)
901
2.03M
                        {
902
1.36k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
903
1.36k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
904
1.36k
                                if (!more_)
905
90
                                {
906
90
                                    ec = json_errc::illegal_control_character;
907
90
                                    return;
908
90
                                }
909
0
                                ++input_ptr_;
910
0
                                ++position_;
911
0
                                break;
912
1.21k
                            case '\r': 
913
1.21k
                                ++input_ptr_;
914
1.21k
                                ++position_;
915
1.21k
                                push_state(state_);
916
1.21k
                                state_ = json_parse_state::cr;
917
1.21k
                                break; 
918
1.79k
                            case '\n': 
919
1.79k
                                ++input_ptr_;
920
1.79k
                                ++line_;
921
1.79k
                                ++position_;
922
1.79k
                                mark_position_ = position_;
923
1.79k
                                break;   
924
1.28k
                            case ' ':case '\t':
925
1.28k
                                skip_space();
926
1.28k
                                break;
927
605
                            case '/': 
928
605
                                ++input_ptr_;
929
605
                                ++position_;
930
605
                                push_state(state_);
931
605
                                state_ = json_parse_state::slash;
932
605
                                break;
933
2.02M
                            case '\"':
934
2.02M
                                saved_position_ = position_;
935
2.02M
                                ++input_ptr_;
936
2.02M
                                ++position_;
937
2.02M
                                push_state(json_parse_state::member_name);
938
2.02M
                                state_ = json_parse_state::string;
939
2.02M
                                string_buffer_.clear();
940
2.02M
                                parse_string(visitor, ec);
941
2.02M
                                if (ec) return;
942
2.02M
                                break;
943
2.02M
                            case '}':
944
3
                                more_ = err_handler_(json_errc::extra_comma, *this);
945
3
                                if (!more_)
946
3
                                {
947
3
                                    ec = json_errc::extra_comma;
948
3
                                    return;
949
3
                                }
950
0
                                saved_position_ = position_;
951
0
                                ++input_ptr_;
952
0
                                ++position_;
953
0
                                end_object(visitor, ec);  // Recover
954
0
                                if (ec) return;
955
0
                                break;
956
3
                            case '\'':
957
3
                                more_ = err_handler_(json_errc::single_quote, *this);
958
3
                                if (!more_)
959
3
                                {
960
3
                                    ec = json_errc::single_quote;
961
3
                                    return;
962
3
                                }
963
0
                                ++input_ptr_;
964
0
                                ++position_;
965
0
                                break;
966
19
                            default:
967
19
                                more_ = err_handler_(json_errc::expected_key, *this);
968
19
                                if (!more_)
969
19
                                {
970
19
                                    ec = json_errc::expected_key;
971
19
                                    return;
972
19
                                }
973
0
                                ++input_ptr_;
974
0
                                ++position_;
975
0
                                break;
976
2.03M
                        }
977
2.03M
                    }
978
2.03M
                    break;
979
2.05M
                case json_parse_state::expect_colon: 
980
2.05M
                    {
981
2.05M
                        switch (*input_ptr_)
982
2.05M
                        {
983
1.36k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
984
1.36k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
985
1.36k
                                if (!more_)
986
90
                                {
987
90
                                    ec = json_errc::illegal_control_character;
988
90
                                    return;
989
90
                                }
990
0
                                ++input_ptr_;
991
0
                                ++position_;
992
0
                                break;
993
1.02k
                            case '\r': 
994
1.02k
                                push_state(state_);
995
1.02k
                                state_ = json_parse_state::cr;
996
1.02k
                                ++input_ptr_;
997
1.02k
                                ++position_;
998
1.02k
                                break; 
999
4.89k
                            case '\n': 
1000
4.89k
                                ++input_ptr_;
1001
4.89k
                                ++line_;
1002
4.89k
                                ++position_;
1003
4.89k
                                mark_position_ = position_;
1004
4.89k
                                break;   
1005
1.48k
                            case ' ':case '\t':
1006
1.48k
                                skip_space();
1007
1.48k
                                break;
1008
582
                            case '/': 
1009
582
                                push_state(state_);
1010
582
                                state_ = json_parse_state::slash;
1011
582
                                ++input_ptr_;
1012
582
                                ++position_;
1013
582
                                break;
1014
2.04M
                            case ':':
1015
2.04M
                                state_ = json_parse_state::expect_value;
1016
2.04M
                                ++input_ptr_;
1017
2.04M
                                ++position_;
1018
2.04M
                                break;
1019
30
                            default:
1020
30
                                more_ = err_handler_(json_errc::expected_colon, *this);
1021
30
                                if (!more_)
1022
30
                                {
1023
30
                                    ec = json_errc::expected_colon;
1024
30
                                    return;
1025
30
                                }
1026
0
                                ++input_ptr_;
1027
0
                                ++position_;
1028
0
                                break;
1029
2.05M
                        }
1030
2.05M
                    }
1031
2.05M
                    break;
1032
1033
26.5M
                    case json_parse_state::expect_value: 
1034
26.5M
                    {
1035
26.5M
                        switch (*input_ptr_)
1036
26.5M
                        {
1037
1.37k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
1038
1.37k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
1039
1.37k
                                if (!more_)
1040
90
                                {
1041
90
                                    ec = json_errc::illegal_control_character;
1042
90
                                    return;
1043
90
                                }
1044
0
                                ++input_ptr_;
1045
0
                                ++position_;
1046
0
                                break;
1047
22.1k
                            case '\r': 
1048
22.1k
                                push_state(state_);
1049
22.1k
                                ++input_ptr_;
1050
22.1k
                                ++position_;
1051
22.1k
                                state_ = json_parse_state::cr;
1052
22.1k
                                break; 
1053
30.3k
                            case '\n': 
1054
30.3k
                                ++input_ptr_;
1055
30.3k
                                ++line_;
1056
30.3k
                                ++position_;
1057
30.3k
                                mark_position_ = position_;
1058
30.3k
                                break;   
1059
7.77k
                            case ' ':case '\t':
1060
7.77k
                                skip_space();
1061
7.77k
                                break;
1062
6.06k
                            case '/': 
1063
6.06k
                                push_state(state_);
1064
6.06k
                                ++input_ptr_;
1065
6.06k
                                ++position_;
1066
6.06k
                                state_ = json_parse_state::slash;
1067
6.06k
                                break;
1068
495k
                            case '{':
1069
495k
                                saved_position_ = position_;
1070
495k
                                ++input_ptr_;
1071
495k
                                ++position_;
1072
495k
                                begin_object(visitor, ec);
1073
495k
                                if (ec) return;
1074
495k
                                break;
1075
495k
                            case '[':
1076
264k
                                saved_position_ = position_;
1077
264k
                                ++input_ptr_;
1078
264k
                                ++position_;
1079
264k
                                begin_array(visitor, ec);
1080
264k
                                if (ec) return;
1081
264k
                                break;
1082
264k
                            case '\"':
1083
72.1k
                                saved_position_ = position_;
1084
72.1k
                                ++input_ptr_;
1085
72.1k
                                ++position_;
1086
72.1k
                                state_ = json_parse_state::string;
1087
72.1k
                                string_buffer_.clear();
1088
72.1k
                                parse_string(visitor, ec);
1089
72.1k
                                if (ec) return;
1090
72.0k
                                break;
1091
747k
                            case '-':
1092
747k
                                string_buffer_.clear();
1093
747k
                                string_buffer_.push_back('-');
1094
747k
                                saved_position_ = position_;
1095
747k
                                ++input_ptr_;
1096
747k
                                ++position_;
1097
747k
                                state_ = json_parse_state::minus;
1098
747k
                                parse_number(visitor, ec);
1099
747k
                                if (ec) {return;}
1100
747k
                                break;
1101
4.90M
                            case '0': 
1102
4.90M
                                string_buffer_.clear();
1103
4.90M
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1104
4.90M
                                saved_position_ = position_;
1105
4.90M
                                ++input_ptr_;
1106
4.90M
                                ++position_;
1107
4.90M
                                state_ = json_parse_state::zero;
1108
4.90M
                                parse_number(visitor, ec);
1109
4.90M
                                if (ec) {return;}
1110
4.90M
                                break;
1111
18.0M
                            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1112
18.0M
                                string_buffer_.clear();
1113
18.0M
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1114
18.0M
                                saved_position_ = position_;
1115
18.0M
                                ++input_ptr_;
1116
18.0M
                                ++position_;
1117
18.0M
                                state_ = json_parse_state::integer;
1118
18.0M
                                parse_number(visitor, ec);
1119
18.0M
                                if (ec) {return;}
1120
18.0M
                                break;
1121
18.0M
                            case 'n':
1122
692k
                                parse_null(visitor, ec);
1123
692k
                                if (ec) {return;}
1124
692k
                                break;
1125
878k
                            case 't':
1126
878k
                                parse_true(visitor, ec);
1127
878k
                                if (ec) {return;}
1128
878k
                                break;
1129
878k
                            case 'f':
1130
404k
                                parse_false(visitor, ec);
1131
404k
                                if (ec) {return;}
1132
404k
                                break;
1133
404k
                            case ']':
1134
8
                                saved_position_ = position_;
1135
8
                                ++input_ptr_;
1136
8
                                ++position_;
1137
8
                                if (parent() == json_parse_state::array)
1138
5
                                {
1139
5
                                    more_ = err_handler_(json_errc::extra_comma, *this);
1140
5
                                    if (!more_)
1141
5
                                    {
1142
5
                                        ec = json_errc::extra_comma;
1143
5
                                        return;
1144
5
                                    }
1145
0
                                    end_array(visitor, ec);  // Recover
1146
0
                                    if (ec) return;
1147
0
                                }
1148
3
                                else
1149
3
                                {
1150
3
                                    more_ = err_handler_(json_errc::expected_value, *this);
1151
3
                                    if (!more_)
1152
3
                                    {
1153
3
                                        ec = json_errc::expected_value;
1154
3
                                        return;
1155
3
                                    }
1156
3
                                }
1157
0
                                break;
1158
3
                            case '\'':
1159
3
                                more_ = err_handler_(json_errc::single_quote, *this);
1160
3
                                if (!more_)
1161
3
                                {
1162
3
                                    ec = json_errc::single_quote;
1163
3
                                    return;
1164
3
                                }
1165
0
                                ++input_ptr_;
1166
0
                                ++position_;
1167
0
                                break;
1168
51
                            default:
1169
51
                                more_ = err_handler_(json_errc::expected_value, *this);
1170
51
                                if (!more_)
1171
51
                                {
1172
51
                                    ec = json_errc::expected_value;
1173
51
                                    return;
1174
51
                                }
1175
0
                                ++input_ptr_;
1176
0
                                ++position_;
1177
0
                                break;
1178
26.5M
                        }
1179
26.5M
                    }
1180
26.5M
                    break;
1181
26.5M
                    case json_parse_state::expect_value_or_end: 
1182
11.6M
                    {
1183
11.6M
                        switch (*input_ptr_)
1184
11.6M
                        {
1185
1.39k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
1186
1.39k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
1187
1.39k
                                if (!more_)
1188
91
                                {
1189
91
                                    ec = json_errc::illegal_control_character;
1190
91
                                    return;
1191
91
                                }
1192
0
                                ++input_ptr_;
1193
0
                                ++position_;
1194
0
                                break;
1195
23.4k
                            case '\r': 
1196
23.4k
                                ++input_ptr_;
1197
23.4k
                                ++position_;
1198
23.4k
                                push_state(state_);
1199
23.4k
                                state_ = json_parse_state::cr;
1200
23.4k
                                break; 
1201
201k
                            case '\n': 
1202
201k
                                ++input_ptr_;
1203
201k
                                ++line_;
1204
201k
                                ++position_;
1205
201k
                                mark_position_ = position_;
1206
201k
                                break;   
1207
10.7k
                            case ' ':case '\t':
1208
10.7k
                                skip_space();
1209
10.7k
                                break;
1210
5.74k
                            case '/': 
1211
5.74k
                                ++input_ptr_;
1212
5.74k
                                ++position_;
1213
5.74k
                                push_state(state_);
1214
5.74k
                                state_ = json_parse_state::slash;
1215
5.74k
                                break;
1216
14.6k
                            case '{':
1217
14.6k
                                saved_position_ = position_;
1218
14.6k
                                ++input_ptr_;
1219
14.6k
                                ++position_;
1220
14.6k
                                begin_object(visitor, ec);
1221
14.6k
                                if (ec) return;
1222
14.6k
                                break;
1223
11.1M
                            case '[':
1224
11.1M
                                saved_position_ = position_;
1225
11.1M
                                ++input_ptr_;
1226
11.1M
                                ++position_;
1227
11.1M
                                begin_array(visitor, ec);
1228
11.1M
                                if (ec) return;
1229
11.1M
                                break;
1230
11.1M
                            case ']':
1231
6.47k
                                saved_position_ = position_;
1232
6.47k
                                ++input_ptr_;
1233
6.47k
                                ++position_;
1234
6.47k
                                end_array(visitor, ec);
1235
6.47k
                                if (ec) return;
1236
6.47k
                                break;
1237
6.47k
                            case '\"':
1238
983
                                saved_position_ = position_;
1239
983
                                ++input_ptr_;
1240
983
                                ++position_;
1241
983
                                state_ = json_parse_state::string;
1242
983
                                string_buffer_.clear();
1243
983
                                parse_string(visitor, ec);
1244
983
                                if (ec) return;
1245
972
                                break;
1246
111k
                            case '-':
1247
111k
                                string_buffer_.clear();
1248
111k
                                string_buffer_.push_back('-');
1249
111k
                                saved_position_ = position_;
1250
111k
                                ++input_ptr_;
1251
111k
                                ++position_;
1252
111k
                                state_ = json_parse_state::minus;
1253
111k
                                parse_number(visitor, ec);
1254
111k
                                if (ec) {return;}
1255
111k
                                break;
1256
111k
                            case '0': 
1257
7.25k
                                string_buffer_.clear();
1258
7.25k
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1259
7.25k
                                saved_position_ = position_;
1260
7.25k
                                ++input_ptr_;
1261
7.25k
                                ++position_;
1262
7.25k
                                state_ = json_parse_state::zero;
1263
7.25k
                                parse_number(visitor, ec);
1264
7.25k
                                if (ec) {return;}
1265
7.24k
                                break;
1266
41.0k
                            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1267
41.0k
                                string_buffer_.clear();
1268
41.0k
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1269
41.0k
                                saved_position_ = position_;
1270
41.0k
                                ++input_ptr_;
1271
41.0k
                                ++position_;
1272
41.0k
                                state_ = json_parse_state::integer;
1273
41.0k
                                parse_number(visitor, ec);
1274
41.0k
                                if (ec) {return;}
1275
41.0k
                                break;
1276
41.0k
                            case 'n':
1277
9.82k
                                parse_null(visitor, ec);
1278
9.82k
                                if (ec) {return;}
1279
9.81k
                                break;
1280
9.81k
                            case 't':
1281
9.75k
                                parse_true(visitor, ec);
1282
9.75k
                                if (ec) {return;}
1283
9.74k
                                break;
1284
68.1k
                            case 'f':
1285
68.1k
                                parse_false(visitor, ec);
1286
68.1k
                                if (ec) {return;}
1287
68.1k
                                break;
1288
68.1k
                            case '\'':
1289
3
                                more_ = err_handler_(json_errc::single_quote, *this);
1290
3
                                if (!more_)
1291
3
                                {
1292
3
                                    ec = json_errc::single_quote;
1293
3
                                    return;
1294
3
                                }
1295
0
                                ++input_ptr_;
1296
0
                                ++position_;
1297
0
                                break;
1298
16
                            default:
1299
16
                                more_ = err_handler_(json_errc::expected_value, *this);
1300
16
                                if (!more_)
1301
16
                                {
1302
16
                                    ec = json_errc::expected_value;
1303
16
                                    return;
1304
16
                                }
1305
0
                                ++input_ptr_;
1306
0
                                ++position_;
1307
0
                                break;
1308
11.6M
                            }
1309
11.6M
                        }
1310
11.6M
                    break;
1311
11.6M
                case json_parse_state::string: 
1312
1.16M
                case json_parse_state::escape: 
1313
1.16M
                case json_parse_state::escape_u1: 
1314
1.17M
                case json_parse_state::escape_u2: 
1315
1.17M
                case json_parse_state::escape_u3: 
1316
1.17M
                case json_parse_state::escape_u4: 
1317
1.17M
                case json_parse_state::escape_expect_surrogate_pair1: 
1318
1.17M
                case json_parse_state::escape_expect_surrogate_pair2: 
1319
1.17M
                case json_parse_state::escape_u5: 
1320
1.17M
                case json_parse_state::escape_u6: 
1321
1.17M
                case json_parse_state::escape_u7: 
1322
1.17M
                case json_parse_state::escape_u8: 
1323
1.17M
                    parse_string(visitor, ec);
1324
1.17M
                    if (ec) return;
1325
1.17M
                    break;
1326
1.17M
                case json_parse_state::minus:
1327
584
                case json_parse_state::zero:  
1328
2.34k
                case json_parse_state::integer: 
1329
2.46k
                case json_parse_state::fraction1: 
1330
2.94k
                case json_parse_state::fraction2: 
1331
3.18k
                case json_parse_state::exp1: 
1332
3.26k
                case json_parse_state::exp2:  
1333
3.88k
                case json_parse_state::exp3: 
1334
3.88k
                    parse_number(visitor, ec);  
1335
3.88k
                    if (ec) return;
1336
3.87k
                    break;
1337
3.87k
                case json_parse_state::t: 
1338
433
                    switch (*input_ptr_)
1339
433
                    {
1340
386
                        case 'r':
1341
386
                            ++input_ptr_;
1342
386
                            ++position_;
1343
386
                            state_ = json_parse_state::tr;
1344
386
                            break;
1345
47
                        default:
1346
47
                            err_handler_(json_errc::invalid_value, *this);
1347
47
                            ec = json_errc::invalid_value;
1348
47
                            more_ = false;
1349
47
                            return;
1350
433
                    }
1351
386
                    break;
1352
386
                case json_parse_state::tr: 
1353
371
                    switch (*input_ptr_)
1354
371
                    {
1355
326
                        case 'u':
1356
326
                            state_ = json_parse_state::tru;
1357
326
                            break;
1358
45
                        default:
1359
45
                            err_handler_(json_errc::invalid_value, *this);
1360
45
                            ec = json_errc::invalid_value;
1361
45
                            more_ = false;
1362
45
                            return;
1363
371
                    }
1364
326
                    ++input_ptr_;
1365
326
                    ++position_;
1366
326
                    break;
1367
312
                case json_parse_state::tru: 
1368
312
                    switch (*input_ptr_)
1369
312
                    {
1370
282
                        case 'e':
1371
282
                            ++input_ptr_;
1372
282
                            ++position_;
1373
282
                            more_ = visitor.bool_value(true,  semantic_tag::none, *this, ec);
1374
282
                            if (parent() == json_parse_state::root)
1375
3
                            {
1376
3
                                state_ = json_parse_state::accept;
1377
3
                            }
1378
279
                            else
1379
279
                            {
1380
279
                                state_ = json_parse_state::expect_comma_or_end;
1381
279
                            }
1382
282
                            break;
1383
30
                        default:
1384
30
                            err_handler_(json_errc::invalid_value, *this);
1385
30
                            ec = json_errc::invalid_value;
1386
30
                            more_ = false;
1387
30
                            return;
1388
312
                    }
1389
282
                    break;
1390
429
                case json_parse_state::f: 
1391
429
                    switch (*input_ptr_)
1392
429
                    {
1393
381
                        case 'a':
1394
381
                            ++input_ptr_;
1395
381
                            ++position_;
1396
381
                            state_ = json_parse_state::fa;
1397
381
                            break;
1398
48
                        default:
1399
48
                            err_handler_(json_errc::invalid_value, *this);
1400
48
                            ec = json_errc::invalid_value;
1401
48
                            more_ = false;
1402
48
                            return;
1403
429
                    }
1404
381
                    break;
1405
381
                case json_parse_state::fa: 
1406
372
                    switch (*input_ptr_)
1407
372
                    {
1408
324
                        case 'l':
1409
324
                            state_ = json_parse_state::fal;
1410
324
                            break;
1411
48
                        default:
1412
48
                            err_handler_(json_errc::invalid_value, *this);
1413
48
                            ec = json_errc::invalid_value;
1414
48
                            more_ = false;
1415
48
                            return;
1416
372
                    }
1417
324
                    ++input_ptr_;
1418
324
                    ++position_;
1419
324
                    break;
1420
314
                case json_parse_state::fal: 
1421
314
                    switch (*input_ptr_)
1422
314
                    {
1423
270
                        case 's':
1424
270
                            state_ = json_parse_state::fals;
1425
270
                            break;
1426
44
                        default:
1427
44
                            err_handler_(json_errc::invalid_value, *this);
1428
44
                            ec = json_errc::invalid_value;
1429
44
                            more_ = false;
1430
44
                            return;
1431
314
                    }
1432
270
                    ++input_ptr_;
1433
270
                    ++position_;
1434
270
                    break;
1435
257
                case json_parse_state::fals: 
1436
257
                    switch (*input_ptr_)
1437
257
                    {
1438
228
                        case 'e':
1439
228
                            ++input_ptr_;
1440
228
                            ++position_;
1441
228
                            more_ = visitor.bool_value(false, semantic_tag::none, *this, ec);
1442
228
                            if (parent() == json_parse_state::root)
1443
3
                            {
1444
3
                                state_ = json_parse_state::accept;
1445
3
                            }
1446
225
                            else
1447
225
                            {
1448
225
                                state_ = json_parse_state::expect_comma_or_end;
1449
225
                            }
1450
228
                            break;
1451
29
                        default:
1452
29
                            err_handler_(json_errc::invalid_value, *this);
1453
29
                            ec = json_errc::invalid_value;
1454
29
                            more_ = false;
1455
29
                            return;
1456
257
                    }
1457
228
                    break;
1458
353
                case json_parse_state::n: 
1459
353
                    switch (*input_ptr_)
1460
353
                    {
1461
308
                        case 'u':
1462
308
                            ++input_ptr_;
1463
308
                            ++position_;
1464
308
                            state_ = json_parse_state::nu;
1465
308
                            break;
1466
45
                        default:
1467
45
                            err_handler_(json_errc::invalid_value, *this);
1468
45
                            ec = json_errc::invalid_value;
1469
45
                            more_ = false;
1470
45
                            return;
1471
353
                    }
1472
308
                    break;
1473
308
                case json_parse_state::nu: 
1474
304
                    switch (*input_ptr_)
1475
304
                    {
1476
260
                        case 'l':
1477
260
                            state_ = json_parse_state::nul;
1478
260
                            break;
1479
44
                        default:
1480
44
                            err_handler_(json_errc::invalid_value, *this);
1481
44
                            ec = json_errc::invalid_value;
1482
44
                            more_ = false;
1483
44
                            return;
1484
304
                    }
1485
260
                    ++input_ptr_;
1486
260
                    ++position_;
1487
260
                    break;
1488
243
                case json_parse_state::nul: 
1489
243
                    ++position_;
1490
243
                    switch (*input_ptr_)
1491
243
                    {
1492
209
                    case 'l':
1493
209
                        more_ = visitor.null_value(semantic_tag::none, *this, ec);
1494
209
                        if (parent() == json_parse_state::root)
1495
3
                        {
1496
3
                            state_ = json_parse_state::accept;
1497
3
                        }
1498
206
                        else
1499
206
                        {
1500
206
                            state_ = json_parse_state::expect_comma_or_end;
1501
206
                        }
1502
209
                        break;
1503
34
                    default:
1504
34
                        err_handler_(json_errc::invalid_value, *this);
1505
34
                        ec = json_errc::invalid_value;
1506
34
                        more_ = false;
1507
34
                        return;
1508
243
                    }
1509
209
                    ++input_ptr_;
1510
209
                    break;
1511
31.8k
                case json_parse_state::slash: 
1512
31.8k
                {
1513
31.8k
                    switch (*input_ptr_)
1514
31.8k
                    {
1515
6.72k
                    case '*':
1516
6.72k
                        state_ = json_parse_state::slash_star;
1517
6.72k
                        more_ = err_handler_(json_errc::illegal_comment, *this);
1518
6.72k
                        if (!more_)
1519
0
                        {
1520
0
                            ec = json_errc::illegal_comment;
1521
0
                            return;
1522
0
                        }
1523
6.72k
                        break;
1524
25.1k
                    case '/':
1525
25.1k
                        state_ = json_parse_state::slash_slash;
1526
25.1k
                        more_ = err_handler_(json_errc::illegal_comment, *this);
1527
25.1k
                        if (!more_)
1528
0
                        {
1529
0
                            ec = json_errc::illegal_comment;
1530
0
                            return;
1531
0
                        }
1532
25.1k
                        break;
1533
25.1k
                    default:    
1534
6
                        more_ = err_handler_(json_errc::syntax_error, *this);
1535
6
                        if (!more_)
1536
6
                        {
1537
6
                            ec = json_errc::syntax_error;
1538
6
                            return;
1539
6
                        }
1540
0
                        break;
1541
31.8k
                    }
1542
31.8k
                    ++input_ptr_;
1543
31.8k
                    ++position_;
1544
31.8k
                    break;
1545
31.8k
                }
1546
1.99M
                case json_parse_state::slash_star:  
1547
1.99M
                {
1548
1.99M
                    switch (*input_ptr_)
1549
1.99M
                    {
1550
48.2k
                        case '\r':
1551
48.2k
                            push_state(state_);
1552
48.2k
                            ++input_ptr_;
1553
48.2k
                            ++position_;
1554
48.2k
                            state_ = json_parse_state::cr;
1555
48.2k
                            break;
1556
22.7k
                        case '\n':
1557
22.7k
                            ++input_ptr_;
1558
22.7k
                            ++line_;
1559
22.7k
                            ++position_;
1560
22.7k
                            mark_position_ = position_;
1561
22.7k
                            break;
1562
15.9k
                        case '*':
1563
15.9k
                            ++input_ptr_;
1564
15.9k
                            ++position_;
1565
15.9k
                            state_ = json_parse_state::slash_star_star;
1566
15.9k
                            break;
1567
1.90M
                        default:
1568
1.90M
                            ++input_ptr_;
1569
1.90M
                            ++position_;
1570
1.90M
                            break;
1571
1.99M
                    }
1572
1.99M
                    break;
1573
1.99M
                }
1574
2.74M
                case json_parse_state::slash_slash: 
1575
2.74M
                {
1576
2.74M
                    switch (*input_ptr_)
1577
2.74M
                    {
1578
15.9k
                    case '\r':
1579
25.0k
                    case '\n':
1580
25.0k
                        state_ = pop_state();
1581
25.0k
                        break;
1582
2.72M
                    default:
1583
2.72M
                        ++input_ptr_;
1584
2.72M
                        ++position_;
1585
2.74M
                    }
1586
2.74M
                    break;
1587
2.74M
                }
1588
2.74M
                case json_parse_state::slash_star_star: 
1589
15.9k
                {
1590
15.9k
                    switch (*input_ptr_)
1591
15.9k
                    {
1592
6.47k
                    case '/':
1593
6.47k
                        state_ = pop_state();
1594
6.47k
                        break;
1595
9.44k
                    default:    
1596
9.44k
                        state_ = json_parse_state::slash_star;
1597
9.44k
                        break;
1598
15.9k
                    }
1599
15.9k
                    ++input_ptr_;
1600
15.9k
                    ++position_;
1601
15.9k
                    break;
1602
15.9k
                }
1603
0
                default:
1604
0
                    JSONCONS_ASSERT(false);
1605
0
                    break;
1606
52.4M
            }
1607
52.4M
        }
1608
36.5k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_some_(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_some_(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
555
49.1k
    {
556
49.1k
        if (state_ == json_parse_state::accept)
557
7.01k
        {
558
7.01k
            visitor.flush();
559
7.01k
            done_ = true;
560
7.01k
            state_ = json_parse_state::done;
561
7.01k
            more_ = false;
562
7.01k
            return;
563
7.01k
        }
564
42.1k
        const char_type* local_input_end = end_input_;
565
566
42.1k
        if (input_ptr_ == local_input_end && more_)
567
13.0k
        {
568
13.0k
            switch (state_)
569
13.0k
            {
570
176
                case json_parse_state::zero:  
571
3.44k
                case json_parse_state::integer:
572
3.44k
                    end_integer_value(visitor, ec);
573
3.44k
                    if (ec) return;
574
3.44k
                    break;
575
3.44k
                case json_parse_state::fraction2:
576
3.23k
                case json_parse_state::exp3:
577
3.23k
                    end_fraction_value(visitor, ec);
578
3.23k
                    if (ec) return;
579
3.23k
                    break;
580
3.23k
                case json_parse_state::accept:
581
0
                    visitor.flush();
582
0
                    done_ = true;
583
0
                    state_ = json_parse_state::done;
584
0
                    more_ = false;
585
0
                    break;
586
332
                case json_parse_state::start:
587
332
                case json_parse_state::done:
588
332
                    more_ = false;
589
332
                    break;
590
422
                case json_parse_state::cr:
591
422
                    state_ = pop_state();
592
422
                    break;
593
5.56k
                default:
594
5.56k
                    err_handler_(json_errc::unexpected_eof, *this);
595
5.56k
                    ec = json_errc::unexpected_eof;
596
5.56k
                    more_ = false;
597
5.56k
                    return;
598
13.0k
            }
599
13.0k
        }
600
601
52.4M
        while ((input_ptr_ < local_input_end) && more_)
602
52.4M
        {
603
52.4M
            switch (state_)
604
52.4M
            {
605
176
                case json_parse_state::accept:
606
176
                    visitor.flush();
607
176
                    done_ = true;
608
176
                    state_ = json_parse_state::done;
609
176
                    more_ = false;
610
176
                    break;
611
476k
                case json_parse_state::cr:
612
476k
                    ++line_;
613
476k
                    mark_position_ = position_;
614
476k
                    switch (*input_ptr_)
615
476k
                    {
616
2.78k
                        case '\n':
617
2.78k
                            ++input_ptr_;
618
2.78k
                            ++position_;
619
2.78k
                            state_ = pop_state();
620
2.78k
                            break;
621
473k
                        default:
622
473k
                            state_ = pop_state();
623
473k
                            break;
624
476k
                    }
625
476k
                    break;
626
476k
                case json_parse_state::start: 
627
70.5k
                    {
628
70.5k
                        switch (*input_ptr_)
629
70.5k
                        {
630
4.72k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
631
4.72k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
632
4.72k
                                if (!more_)
633
230
                                {
634
230
                                    ec = json_errc::illegal_control_character;
635
230
                                    return;
636
230
                                }
637
0
                                break;
638
11.5k
                            case '\r': 
639
11.5k
                                push_state(state_);
640
11.5k
                                ++input_ptr_;
641
11.5k
                                ++position_;
642
11.5k
                                state_ = json_parse_state::cr;
643
11.5k
                                break; 
644
21.7k
                            case '\n': 
645
21.7k
                                ++input_ptr_;
646
21.7k
                                ++line_;
647
21.7k
                                ++position_;
648
21.7k
                                mark_position_ = position_;
649
21.7k
                                break;   
650
11.0k
                            case ' ':case '\t':
651
11.0k
                                skip_space();
652
11.0k
                                break;
653
8.53k
                            case '/': 
654
8.53k
                                ++input_ptr_;
655
8.53k
                                ++position_;
656
8.53k
                                push_state(state_);
657
8.53k
                                state_ = json_parse_state::slash;
658
8.53k
                                break;
659
2.30k
                            case '{':
660
2.30k
                                saved_position_ = position_;
661
2.30k
                                ++input_ptr_;
662
2.30k
                                ++position_;
663
2.30k
                                begin_object(visitor, ec);
664
2.30k
                                if (ec) return;
665
2.30k
                                break;
666
5.40k
                            case '[':
667
5.40k
                                saved_position_ = position_;
668
5.40k
                                ++input_ptr_;
669
5.40k
                                ++position_;
670
5.40k
                                begin_array(visitor, ec);
671
5.40k
                                if (ec) return;
672
5.40k
                                break;
673
5.40k
                            case '\"':
674
2.67k
                                state_ = json_parse_state::string;
675
2.67k
                                saved_position_ = position_;
676
2.67k
                                ++input_ptr_;
677
2.67k
                                ++position_;
678
2.67k
                                string_buffer_.clear();
679
2.67k
                                parse_string(visitor, ec);
680
2.67k
                                if (ec) return;
681
2.02k
                                break;
682
2.02k
                            case '-':
683
1.25k
                                string_buffer_.clear();
684
1.25k
                                string_buffer_.push_back('-');
685
1.25k
                                saved_position_ = position_;
686
1.25k
                                ++input_ptr_;
687
1.25k
                                ++position_;
688
1.25k
                                state_ = json_parse_state::minus;
689
1.25k
                                parse_number(visitor, ec);
690
1.25k
                                if (ec) {return;}
691
1.23k
                                break;
692
1.23k
                            case '0': 
693
331
                                string_buffer_.clear();
694
331
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
695
331
                                state_ = json_parse_state::zero;
696
331
                                saved_position_ = position_;
697
331
                                ++input_ptr_;
698
331
                                ++position_;
699
331
                                parse_number(visitor, ec);
700
331
                                if (ec) {return;}
701
259
                                break;
702
4.02k
                            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
703
4.02k
                                string_buffer_.clear();
704
4.02k
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
705
4.02k
                                saved_position_ = position_;
706
4.02k
                                ++input_ptr_;
707
4.02k
                                ++position_;
708
4.02k
                                state_ = json_parse_state::integer;
709
4.02k
                                parse_number(visitor, ec);
710
4.02k
                                if (ec) {return;}
711
3.91k
                                break;
712
3.91k
                            case 'n':
713
309
                                parse_null(visitor, ec);
714
309
                                if (ec) {return;}
715
124
                                break;
716
290
                            case 't':
717
290
                                parse_true(visitor, ec);
718
290
                                if (ec) {return;}
719
129
                                break;
720
375
                            case 'f':
721
375
                                parse_false(visitor, ec);
722
375
                                if (ec) {return;}
723
176
                                break;
724
176
                            case '}':
725
6
                                err_handler_(json_errc::unexpected_rbrace, *this);
726
6
                                ec = json_errc::unexpected_rbrace;
727
6
                                more_ = false;
728
6
                                return;
729
7
                            case ']':
730
7
                                err_handler_(json_errc::unexpected_rbracket, *this);
731
7
                                ec = json_errc::unexpected_rbracket;
732
7
                                more_ = false;
733
7
                                return;
734
352
                            default:
735
352
                                err_handler_(json_errc::syntax_error, *this);
736
352
                                ec = json_errc::syntax_error;
737
352
                                more_ = false;
738
352
                                return;
739
70.5k
                        }
740
70.5k
                    }
741
68.5k
                    break;
742
743
3.08M
                case json_parse_state::expect_comma_or_end: 
744
3.08M
                    {
745
3.08M
                        switch (*input_ptr_)
746
3.08M
                        {
747
1.50k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
748
1.50k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
749
1.50k
                                if (!more_)
750
98
                                {
751
98
                                    ec = json_errc::illegal_control_character;
752
98
                                    return;
753
98
                                }
754
0
                                ++input_ptr_;
755
0
                                ++position_;
756
0
                                break;
757
47.0k
                            case '\r': 
758
47.0k
                                ++input_ptr_;
759
47.0k
                                ++position_;
760
47.0k
                                push_state(state_);
761
47.0k
                                state_ = json_parse_state::cr;
762
47.0k
                                break; 
763
12.0k
                            case '\n': 
764
12.0k
                                ++input_ptr_;
765
12.0k
                                ++line_;
766
12.0k
                                ++position_;
767
12.0k
                                mark_position_ = position_;
768
12.0k
                                break;   
769
6.20k
                            case ' ':case '\t':
770
6.20k
                                skip_space();
771
6.20k
                                break;
772
4.11k
                            case '/':
773
4.11k
                                ++input_ptr_;
774
4.11k
                                ++position_;
775
4.11k
                                push_state(state_); 
776
4.11k
                                state_ = json_parse_state::slash;
777
4.11k
                                break;
778
13.5k
                            case '}':
779
13.5k
                                saved_position_ = position_;
780
13.5k
                                ++input_ptr_;
781
13.5k
                                ++position_;
782
13.5k
                                end_object(visitor, ec);
783
13.5k
                                if (ec) return;
784
13.4k
                                break;
785
19.4k
                            case ']':
786
19.4k
                                saved_position_ = position_;
787
19.4k
                                ++input_ptr_;
788
19.4k
                                ++position_;
789
19.4k
                                end_array(visitor, ec);
790
19.4k
                                if (ec) return;
791
19.3k
                                break;
792
2.97M
                            case ',':
793
2.97M
                                begin_member_or_element(ec);
794
2.97M
                                if (ec) return;
795
2.97M
                                ++input_ptr_;
796
2.97M
                                ++position_;
797
2.97M
                                break;
798
146
                            default:
799
146
                                if (parent() == json_parse_state::array)
800
120
                                {
801
120
                                    more_ = err_handler_(json_errc::expected_comma_or_rbracket, *this);
802
120
                                    if (!more_)
803
120
                                    {
804
120
                                        ec = json_errc::expected_comma_or_rbracket;
805
120
                                        return;
806
120
                                    }
807
120
                                }
808
26
                                else if (parent() == json_parse_state::object)
809
26
                                {
810
26
                                    more_ = err_handler_(json_errc::expected_comma_or_rbrace, *this);
811
26
                                    if (!more_)
812
26
                                    {
813
26
                                        ec = json_errc::expected_comma_or_rbrace;
814
26
                                        return;
815
26
                                    }
816
26
                                }
817
0
                                ++input_ptr_;
818
0
                                ++position_;
819
0
                                break;
820
3.08M
                        }
821
3.08M
                    }
822
3.08M
                    break;
823
3.08M
                case json_parse_state::expect_member_name_or_end: 
824
516k
                    {
825
516k
                        switch (*input_ptr_)
826
516k
                        {
827
1.32k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
828
1.32k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
829
1.32k
                                if (!more_)
830
88
                                {
831
88
                                    ec = json_errc::illegal_control_character;
832
88
                                    return;
833
88
                                }
834
0
                                ++input_ptr_;
835
0
                                ++position_;
836
0
                                break;
837
1.02k
                            case '\r': 
838
1.02k
                                ++input_ptr_;
839
1.02k
                                ++position_;
840
1.02k
                                push_state(state_);
841
1.02k
                                state_ = json_parse_state::cr;
842
1.02k
                                break; 
843
766
                            case '\n': 
844
766
                                ++input_ptr_;
845
766
                                ++line_;
846
766
                                ++position_;
847
766
                                mark_position_ = position_;
848
766
                                break;   
849
1.24k
                            case ' ':case '\t':
850
1.24k
                                skip_space();
851
1.24k
                                break;
852
584
                            case '/':
853
584
                                ++input_ptr_;
854
584
                                ++position_;
855
584
                                push_state(state_); 
856
584
                                state_ = json_parse_state::slash;
857
584
                                break;
858
494k
                            case '}':
859
494k
                                saved_position_ = position_;
860
494k
                                ++input_ptr_;
861
494k
                                ++position_;
862
494k
                                end_object(visitor, ec);
863
494k
                                if (ec) return;
864
494k
                                break;
865
494k
                            case '\"':
866
18.2k
                                saved_position_ = position_;
867
18.2k
                                ++input_ptr_;
868
18.2k
                                ++position_;
869
18.2k
                                push_state(json_parse_state::member_name);
870
18.2k
                                state_ = json_parse_state::string;
871
18.2k
                                string_buffer_.clear();
872
18.2k
                                parse_string(visitor, ec);
873
18.2k
                                if (ec) return;
874
18.2k
                                break;
875
18.2k
                            case '\'':
876
3
                                more_ = err_handler_(json_errc::single_quote, *this);
877
3
                                if (!more_)
878
3
                                {
879
3
                                    ec = json_errc::single_quote;
880
3
                                    return;
881
3
                                }
882
0
                                ++input_ptr_;
883
0
                                ++position_;
884
0
                                break;
885
14
                            default:
886
14
                                more_ = err_handler_(json_errc::expected_key, *this);
887
14
                                if (!more_)
888
14
                                {
889
14
                                    ec = json_errc::expected_key;
890
14
                                    return;
891
14
                                }
892
0
                                ++input_ptr_;
893
0
                                ++position_;
894
0
                                break;
895
516k
                        }
896
516k
                    }
897
516k
                    break;
898
2.03M
                case json_parse_state::expect_member_name: 
899
2.03M
                    {
900
2.03M
                        switch (*input_ptr_)
901
2.03M
                        {
902
1.36k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
903
1.36k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
904
1.36k
                                if (!more_)
905
90
                                {
906
90
                                    ec = json_errc::illegal_control_character;
907
90
                                    return;
908
90
                                }
909
0
                                ++input_ptr_;
910
0
                                ++position_;
911
0
                                break;
912
1.21k
                            case '\r': 
913
1.21k
                                ++input_ptr_;
914
1.21k
                                ++position_;
915
1.21k
                                push_state(state_);
916
1.21k
                                state_ = json_parse_state::cr;
917
1.21k
                                break; 
918
1.79k
                            case '\n': 
919
1.79k
                                ++input_ptr_;
920
1.79k
                                ++line_;
921
1.79k
                                ++position_;
922
1.79k
                                mark_position_ = position_;
923
1.79k
                                break;   
924
1.28k
                            case ' ':case '\t':
925
1.28k
                                skip_space();
926
1.28k
                                break;
927
605
                            case '/': 
928
605
                                ++input_ptr_;
929
605
                                ++position_;
930
605
                                push_state(state_);
931
605
                                state_ = json_parse_state::slash;
932
605
                                break;
933
2.02M
                            case '\"':
934
2.02M
                                saved_position_ = position_;
935
2.02M
                                ++input_ptr_;
936
2.02M
                                ++position_;
937
2.02M
                                push_state(json_parse_state::member_name);
938
2.02M
                                state_ = json_parse_state::string;
939
2.02M
                                string_buffer_.clear();
940
2.02M
                                parse_string(visitor, ec);
941
2.02M
                                if (ec) return;
942
2.02M
                                break;
943
2.02M
                            case '}':
944
3
                                more_ = err_handler_(json_errc::extra_comma, *this);
945
3
                                if (!more_)
946
3
                                {
947
3
                                    ec = json_errc::extra_comma;
948
3
                                    return;
949
3
                                }
950
0
                                saved_position_ = position_;
951
0
                                ++input_ptr_;
952
0
                                ++position_;
953
0
                                end_object(visitor, ec);  // Recover
954
0
                                if (ec) return;
955
0
                                break;
956
3
                            case '\'':
957
3
                                more_ = err_handler_(json_errc::single_quote, *this);
958
3
                                if (!more_)
959
3
                                {
960
3
                                    ec = json_errc::single_quote;
961
3
                                    return;
962
3
                                }
963
0
                                ++input_ptr_;
964
0
                                ++position_;
965
0
                                break;
966
19
                            default:
967
19
                                more_ = err_handler_(json_errc::expected_key, *this);
968
19
                                if (!more_)
969
19
                                {
970
19
                                    ec = json_errc::expected_key;
971
19
                                    return;
972
19
                                }
973
0
                                ++input_ptr_;
974
0
                                ++position_;
975
0
                                break;
976
2.03M
                        }
977
2.03M
                    }
978
2.03M
                    break;
979
2.05M
                case json_parse_state::expect_colon: 
980
2.05M
                    {
981
2.05M
                        switch (*input_ptr_)
982
2.05M
                        {
983
1.36k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
984
1.36k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
985
1.36k
                                if (!more_)
986
90
                                {
987
90
                                    ec = json_errc::illegal_control_character;
988
90
                                    return;
989
90
                                }
990
0
                                ++input_ptr_;
991
0
                                ++position_;
992
0
                                break;
993
1.02k
                            case '\r': 
994
1.02k
                                push_state(state_);
995
1.02k
                                state_ = json_parse_state::cr;
996
1.02k
                                ++input_ptr_;
997
1.02k
                                ++position_;
998
1.02k
                                break; 
999
4.89k
                            case '\n': 
1000
4.89k
                                ++input_ptr_;
1001
4.89k
                                ++line_;
1002
4.89k
                                ++position_;
1003
4.89k
                                mark_position_ = position_;
1004
4.89k
                                break;   
1005
1.48k
                            case ' ':case '\t':
1006
1.48k
                                skip_space();
1007
1.48k
                                break;
1008
582
                            case '/': 
1009
582
                                push_state(state_);
1010
582
                                state_ = json_parse_state::slash;
1011
582
                                ++input_ptr_;
1012
582
                                ++position_;
1013
582
                                break;
1014
2.04M
                            case ':':
1015
2.04M
                                state_ = json_parse_state::expect_value;
1016
2.04M
                                ++input_ptr_;
1017
2.04M
                                ++position_;
1018
2.04M
                                break;
1019
30
                            default:
1020
30
                                more_ = err_handler_(json_errc::expected_colon, *this);
1021
30
                                if (!more_)
1022
30
                                {
1023
30
                                    ec = json_errc::expected_colon;
1024
30
                                    return;
1025
30
                                }
1026
0
                                ++input_ptr_;
1027
0
                                ++position_;
1028
0
                                break;
1029
2.05M
                        }
1030
2.05M
                    }
1031
2.05M
                    break;
1032
1033
26.5M
                    case json_parse_state::expect_value: 
1034
26.5M
                    {
1035
26.5M
                        switch (*input_ptr_)
1036
26.5M
                        {
1037
1.37k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
1038
1.37k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
1039
1.37k
                                if (!more_)
1040
90
                                {
1041
90
                                    ec = json_errc::illegal_control_character;
1042
90
                                    return;
1043
90
                                }
1044
0
                                ++input_ptr_;
1045
0
                                ++position_;
1046
0
                                break;
1047
22.1k
                            case '\r': 
1048
22.1k
                                push_state(state_);
1049
22.1k
                                ++input_ptr_;
1050
22.1k
                                ++position_;
1051
22.1k
                                state_ = json_parse_state::cr;
1052
22.1k
                                break; 
1053
30.3k
                            case '\n': 
1054
30.3k
                                ++input_ptr_;
1055
30.3k
                                ++line_;
1056
30.3k
                                ++position_;
1057
30.3k
                                mark_position_ = position_;
1058
30.3k
                                break;   
1059
7.77k
                            case ' ':case '\t':
1060
7.77k
                                skip_space();
1061
7.77k
                                break;
1062
6.06k
                            case '/': 
1063
6.06k
                                push_state(state_);
1064
6.06k
                                ++input_ptr_;
1065
6.06k
                                ++position_;
1066
6.06k
                                state_ = json_parse_state::slash;
1067
6.06k
                                break;
1068
495k
                            case '{':
1069
495k
                                saved_position_ = position_;
1070
495k
                                ++input_ptr_;
1071
495k
                                ++position_;
1072
495k
                                begin_object(visitor, ec);
1073
495k
                                if (ec) return;
1074
495k
                                break;
1075
495k
                            case '[':
1076
264k
                                saved_position_ = position_;
1077
264k
                                ++input_ptr_;
1078
264k
                                ++position_;
1079
264k
                                begin_array(visitor, ec);
1080
264k
                                if (ec) return;
1081
264k
                                break;
1082
264k
                            case '\"':
1083
72.1k
                                saved_position_ = position_;
1084
72.1k
                                ++input_ptr_;
1085
72.1k
                                ++position_;
1086
72.1k
                                state_ = json_parse_state::string;
1087
72.1k
                                string_buffer_.clear();
1088
72.1k
                                parse_string(visitor, ec);
1089
72.1k
                                if (ec) return;
1090
72.0k
                                break;
1091
747k
                            case '-':
1092
747k
                                string_buffer_.clear();
1093
747k
                                string_buffer_.push_back('-');
1094
747k
                                saved_position_ = position_;
1095
747k
                                ++input_ptr_;
1096
747k
                                ++position_;
1097
747k
                                state_ = json_parse_state::minus;
1098
747k
                                parse_number(visitor, ec);
1099
747k
                                if (ec) {return;}
1100
747k
                                break;
1101
4.90M
                            case '0': 
1102
4.90M
                                string_buffer_.clear();
1103
4.90M
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1104
4.90M
                                saved_position_ = position_;
1105
4.90M
                                ++input_ptr_;
1106
4.90M
                                ++position_;
1107
4.90M
                                state_ = json_parse_state::zero;
1108
4.90M
                                parse_number(visitor, ec);
1109
4.90M
                                if (ec) {return;}
1110
4.90M
                                break;
1111
18.0M
                            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1112
18.0M
                                string_buffer_.clear();
1113
18.0M
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1114
18.0M
                                saved_position_ = position_;
1115
18.0M
                                ++input_ptr_;
1116
18.0M
                                ++position_;
1117
18.0M
                                state_ = json_parse_state::integer;
1118
18.0M
                                parse_number(visitor, ec);
1119
18.0M
                                if (ec) {return;}
1120
18.0M
                                break;
1121
18.0M
                            case 'n':
1122
692k
                                parse_null(visitor, ec);
1123
692k
                                if (ec) {return;}
1124
692k
                                break;
1125
878k
                            case 't':
1126
878k
                                parse_true(visitor, ec);
1127
878k
                                if (ec) {return;}
1128
878k
                                break;
1129
878k
                            case 'f':
1130
404k
                                parse_false(visitor, ec);
1131
404k
                                if (ec) {return;}
1132
404k
                                break;
1133
404k
                            case ']':
1134
8
                                saved_position_ = position_;
1135
8
                                ++input_ptr_;
1136
8
                                ++position_;
1137
8
                                if (parent() == json_parse_state::array)
1138
5
                                {
1139
5
                                    more_ = err_handler_(json_errc::extra_comma, *this);
1140
5
                                    if (!more_)
1141
5
                                    {
1142
5
                                        ec = json_errc::extra_comma;
1143
5
                                        return;
1144
5
                                    }
1145
0
                                    end_array(visitor, ec);  // Recover
1146
0
                                    if (ec) return;
1147
0
                                }
1148
3
                                else
1149
3
                                {
1150
3
                                    more_ = err_handler_(json_errc::expected_value, *this);
1151
3
                                    if (!more_)
1152
3
                                    {
1153
3
                                        ec = json_errc::expected_value;
1154
3
                                        return;
1155
3
                                    }
1156
3
                                }
1157
0
                                break;
1158
3
                            case '\'':
1159
3
                                more_ = err_handler_(json_errc::single_quote, *this);
1160
3
                                if (!more_)
1161
3
                                {
1162
3
                                    ec = json_errc::single_quote;
1163
3
                                    return;
1164
3
                                }
1165
0
                                ++input_ptr_;
1166
0
                                ++position_;
1167
0
                                break;
1168
51
                            default:
1169
51
                                more_ = err_handler_(json_errc::expected_value, *this);
1170
51
                                if (!more_)
1171
51
                                {
1172
51
                                    ec = json_errc::expected_value;
1173
51
                                    return;
1174
51
                                }
1175
0
                                ++input_ptr_;
1176
0
                                ++position_;
1177
0
                                break;
1178
26.5M
                        }
1179
26.5M
                    }
1180
26.5M
                    break;
1181
26.5M
                    case json_parse_state::expect_value_or_end: 
1182
11.6M
                    {
1183
11.6M
                        switch (*input_ptr_)
1184
11.6M
                        {
1185
1.39k
                            JSONCONS_ILLEGAL_CONTROL_CHARACTER:
1186
1.39k
                                more_ = err_handler_(json_errc::illegal_control_character, *this);
1187
1.39k
                                if (!more_)
1188
91
                                {
1189
91
                                    ec = json_errc::illegal_control_character;
1190
91
                                    return;
1191
91
                                }
1192
0
                                ++input_ptr_;
1193
0
                                ++position_;
1194
0
                                break;
1195
23.4k
                            case '\r': 
1196
23.4k
                                ++input_ptr_;
1197
23.4k
                                ++position_;
1198
23.4k
                                push_state(state_);
1199
23.4k
                                state_ = json_parse_state::cr;
1200
23.4k
                                break; 
1201
201k
                            case '\n': 
1202
201k
                                ++input_ptr_;
1203
201k
                                ++line_;
1204
201k
                                ++position_;
1205
201k
                                mark_position_ = position_;
1206
201k
                                break;   
1207
10.7k
                            case ' ':case '\t':
1208
10.7k
                                skip_space();
1209
10.7k
                                break;
1210
5.74k
                            case '/': 
1211
5.74k
                                ++input_ptr_;
1212
5.74k
                                ++position_;
1213
5.74k
                                push_state(state_);
1214
5.74k
                                state_ = json_parse_state::slash;
1215
5.74k
                                break;
1216
14.6k
                            case '{':
1217
14.6k
                                saved_position_ = position_;
1218
14.6k
                                ++input_ptr_;
1219
14.6k
                                ++position_;
1220
14.6k
                                begin_object(visitor, ec);
1221
14.6k
                                if (ec) return;
1222
14.6k
                                break;
1223
11.1M
                            case '[':
1224
11.1M
                                saved_position_ = position_;
1225
11.1M
                                ++input_ptr_;
1226
11.1M
                                ++position_;
1227
11.1M
                                begin_array(visitor, ec);
1228
11.1M
                                if (ec) return;
1229
11.1M
                                break;
1230
11.1M
                            case ']':
1231
6.47k
                                saved_position_ = position_;
1232
6.47k
                                ++input_ptr_;
1233
6.47k
                                ++position_;
1234
6.47k
                                end_array(visitor, ec);
1235
6.47k
                                if (ec) return;
1236
6.47k
                                break;
1237
6.47k
                            case '\"':
1238
983
                                saved_position_ = position_;
1239
983
                                ++input_ptr_;
1240
983
                                ++position_;
1241
983
                                state_ = json_parse_state::string;
1242
983
                                string_buffer_.clear();
1243
983
                                parse_string(visitor, ec);
1244
983
                                if (ec) return;
1245
972
                                break;
1246
111k
                            case '-':
1247
111k
                                string_buffer_.clear();
1248
111k
                                string_buffer_.push_back('-');
1249
111k
                                saved_position_ = position_;
1250
111k
                                ++input_ptr_;
1251
111k
                                ++position_;
1252
111k
                                state_ = json_parse_state::minus;
1253
111k
                                parse_number(visitor, ec);
1254
111k
                                if (ec) {return;}
1255
111k
                                break;
1256
111k
                            case '0': 
1257
7.25k
                                string_buffer_.clear();
1258
7.25k
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1259
7.25k
                                saved_position_ = position_;
1260
7.25k
                                ++input_ptr_;
1261
7.25k
                                ++position_;
1262
7.25k
                                state_ = json_parse_state::zero;
1263
7.25k
                                parse_number(visitor, ec);
1264
7.25k
                                if (ec) {return;}
1265
7.24k
                                break;
1266
41.0k
                            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1267
41.0k
                                string_buffer_.clear();
1268
41.0k
                                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1269
41.0k
                                saved_position_ = position_;
1270
41.0k
                                ++input_ptr_;
1271
41.0k
                                ++position_;
1272
41.0k
                                state_ = json_parse_state::integer;
1273
41.0k
                                parse_number(visitor, ec);
1274
41.0k
                                if (ec) {return;}
1275
41.0k
                                break;
1276
41.0k
                            case 'n':
1277
9.82k
                                parse_null(visitor, ec);
1278
9.82k
                                if (ec) {return;}
1279
9.81k
                                break;
1280
9.81k
                            case 't':
1281
9.75k
                                parse_true(visitor, ec);
1282
9.75k
                                if (ec) {return;}
1283
9.74k
                                break;
1284
68.1k
                            case 'f':
1285
68.1k
                                parse_false(visitor, ec);
1286
68.1k
                                if (ec) {return;}
1287
68.1k
                                break;
1288
68.1k
                            case '\'':
1289
3
                                more_ = err_handler_(json_errc::single_quote, *this);
1290
3
                                if (!more_)
1291
3
                                {
1292
3
                                    ec = json_errc::single_quote;
1293
3
                                    return;
1294
3
                                }
1295
0
                                ++input_ptr_;
1296
0
                                ++position_;
1297
0
                                break;
1298
16
                            default:
1299
16
                                more_ = err_handler_(json_errc::expected_value, *this);
1300
16
                                if (!more_)
1301
16
                                {
1302
16
                                    ec = json_errc::expected_value;
1303
16
                                    return;
1304
16
                                }
1305
0
                                ++input_ptr_;
1306
0
                                ++position_;
1307
0
                                break;
1308
11.6M
                            }
1309
11.6M
                        }
1310
11.6M
                    break;
1311
11.6M
                case json_parse_state::string: 
1312
1.16M
                case json_parse_state::escape: 
1313
1.16M
                case json_parse_state::escape_u1: 
1314
1.17M
                case json_parse_state::escape_u2: 
1315
1.17M
                case json_parse_state::escape_u3: 
1316
1.17M
                case json_parse_state::escape_u4: 
1317
1.17M
                case json_parse_state::escape_expect_surrogate_pair1: 
1318
1.17M
                case json_parse_state::escape_expect_surrogate_pair2: 
1319
1.17M
                case json_parse_state::escape_u5: 
1320
1.17M
                case json_parse_state::escape_u6: 
1321
1.17M
                case json_parse_state::escape_u7: 
1322
1.17M
                case json_parse_state::escape_u8: 
1323
1.17M
                    parse_string(visitor, ec);
1324
1.17M
                    if (ec) return;
1325
1.17M
                    break;
1326
1.17M
                case json_parse_state::minus:
1327
584
                case json_parse_state::zero:  
1328
2.34k
                case json_parse_state::integer: 
1329
2.46k
                case json_parse_state::fraction1: 
1330
2.94k
                case json_parse_state::fraction2: 
1331
3.18k
                case json_parse_state::exp1: 
1332
3.26k
                case json_parse_state::exp2:  
1333
3.88k
                case json_parse_state::exp3: 
1334
3.88k
                    parse_number(visitor, ec);  
1335
3.88k
                    if (ec) return;
1336
3.87k
                    break;
1337
3.87k
                case json_parse_state::t: 
1338
433
                    switch (*input_ptr_)
1339
433
                    {
1340
386
                        case 'r':
1341
386
                            ++input_ptr_;
1342
386
                            ++position_;
1343
386
                            state_ = json_parse_state::tr;
1344
386
                            break;
1345
47
                        default:
1346
47
                            err_handler_(json_errc::invalid_value, *this);
1347
47
                            ec = json_errc::invalid_value;
1348
47
                            more_ = false;
1349
47
                            return;
1350
433
                    }
1351
386
                    break;
1352
386
                case json_parse_state::tr: 
1353
371
                    switch (*input_ptr_)
1354
371
                    {
1355
326
                        case 'u':
1356
326
                            state_ = json_parse_state::tru;
1357
326
                            break;
1358
45
                        default:
1359
45
                            err_handler_(json_errc::invalid_value, *this);
1360
45
                            ec = json_errc::invalid_value;
1361
45
                            more_ = false;
1362
45
                            return;
1363
371
                    }
1364
326
                    ++input_ptr_;
1365
326
                    ++position_;
1366
326
                    break;
1367
312
                case json_parse_state::tru: 
1368
312
                    switch (*input_ptr_)
1369
312
                    {
1370
282
                        case 'e':
1371
282
                            ++input_ptr_;
1372
282
                            ++position_;
1373
282
                            more_ = visitor.bool_value(true,  semantic_tag::none, *this, ec);
1374
282
                            if (parent() == json_parse_state::root)
1375
3
                            {
1376
3
                                state_ = json_parse_state::accept;
1377
3
                            }
1378
279
                            else
1379
279
                            {
1380
279
                                state_ = json_parse_state::expect_comma_or_end;
1381
279
                            }
1382
282
                            break;
1383
30
                        default:
1384
30
                            err_handler_(json_errc::invalid_value, *this);
1385
30
                            ec = json_errc::invalid_value;
1386
30
                            more_ = false;
1387
30
                            return;
1388
312
                    }
1389
282
                    break;
1390
429
                case json_parse_state::f: 
1391
429
                    switch (*input_ptr_)
1392
429
                    {
1393
381
                        case 'a':
1394
381
                            ++input_ptr_;
1395
381
                            ++position_;
1396
381
                            state_ = json_parse_state::fa;
1397
381
                            break;
1398
48
                        default:
1399
48
                            err_handler_(json_errc::invalid_value, *this);
1400
48
                            ec = json_errc::invalid_value;
1401
48
                            more_ = false;
1402
48
                            return;
1403
429
                    }
1404
381
                    break;
1405
381
                case json_parse_state::fa: 
1406
372
                    switch (*input_ptr_)
1407
372
                    {
1408
324
                        case 'l':
1409
324
                            state_ = json_parse_state::fal;
1410
324
                            break;
1411
48
                        default:
1412
48
                            err_handler_(json_errc::invalid_value, *this);
1413
48
                            ec = json_errc::invalid_value;
1414
48
                            more_ = false;
1415
48
                            return;
1416
372
                    }
1417
324
                    ++input_ptr_;
1418
324
                    ++position_;
1419
324
                    break;
1420
314
                case json_parse_state::fal: 
1421
314
                    switch (*input_ptr_)
1422
314
                    {
1423
270
                        case 's':
1424
270
                            state_ = json_parse_state::fals;
1425
270
                            break;
1426
44
                        default:
1427
44
                            err_handler_(json_errc::invalid_value, *this);
1428
44
                            ec = json_errc::invalid_value;
1429
44
                            more_ = false;
1430
44
                            return;
1431
314
                    }
1432
270
                    ++input_ptr_;
1433
270
                    ++position_;
1434
270
                    break;
1435
257
                case json_parse_state::fals: 
1436
257
                    switch (*input_ptr_)
1437
257
                    {
1438
228
                        case 'e':
1439
228
                            ++input_ptr_;
1440
228
                            ++position_;
1441
228
                            more_ = visitor.bool_value(false, semantic_tag::none, *this, ec);
1442
228
                            if (parent() == json_parse_state::root)
1443
3
                            {
1444
3
                                state_ = json_parse_state::accept;
1445
3
                            }
1446
225
                            else
1447
225
                            {
1448
225
                                state_ = json_parse_state::expect_comma_or_end;
1449
225
                            }
1450
228
                            break;
1451
29
                        default:
1452
29
                            err_handler_(json_errc::invalid_value, *this);
1453
29
                            ec = json_errc::invalid_value;
1454
29
                            more_ = false;
1455
29
                            return;
1456
257
                    }
1457
228
                    break;
1458
353
                case json_parse_state::n: 
1459
353
                    switch (*input_ptr_)
1460
353
                    {
1461
308
                        case 'u':
1462
308
                            ++input_ptr_;
1463
308
                            ++position_;
1464
308
                            state_ = json_parse_state::nu;
1465
308
                            break;
1466
45
                        default:
1467
45
                            err_handler_(json_errc::invalid_value, *this);
1468
45
                            ec = json_errc::invalid_value;
1469
45
                            more_ = false;
1470
45
                            return;
1471
353
                    }
1472
308
                    break;
1473
308
                case json_parse_state::nu: 
1474
304
                    switch (*input_ptr_)
1475
304
                    {
1476
260
                        case 'l':
1477
260
                            state_ = json_parse_state::nul;
1478
260
                            break;
1479
44
                        default:
1480
44
                            err_handler_(json_errc::invalid_value, *this);
1481
44
                            ec = json_errc::invalid_value;
1482
44
                            more_ = false;
1483
44
                            return;
1484
304
                    }
1485
260
                    ++input_ptr_;
1486
260
                    ++position_;
1487
260
                    break;
1488
243
                case json_parse_state::nul: 
1489
243
                    ++position_;
1490
243
                    switch (*input_ptr_)
1491
243
                    {
1492
209
                    case 'l':
1493
209
                        more_ = visitor.null_value(semantic_tag::none, *this, ec);
1494
209
                        if (parent() == json_parse_state::root)
1495
3
                        {
1496
3
                            state_ = json_parse_state::accept;
1497
3
                        }
1498
206
                        else
1499
206
                        {
1500
206
                            state_ = json_parse_state::expect_comma_or_end;
1501
206
                        }
1502
209
                        break;
1503
34
                    default:
1504
34
                        err_handler_(json_errc::invalid_value, *this);
1505
34
                        ec = json_errc::invalid_value;
1506
34
                        more_ = false;
1507
34
                        return;
1508
243
                    }
1509
209
                    ++input_ptr_;
1510
209
                    break;
1511
31.8k
                case json_parse_state::slash: 
1512
31.8k
                {
1513
31.8k
                    switch (*input_ptr_)
1514
31.8k
                    {
1515
6.72k
                    case '*':
1516
6.72k
                        state_ = json_parse_state::slash_star;
1517
6.72k
                        more_ = err_handler_(json_errc::illegal_comment, *this);
1518
6.72k
                        if (!more_)
1519
0
                        {
1520
0
                            ec = json_errc::illegal_comment;
1521
0
                            return;
1522
0
                        }
1523
6.72k
                        break;
1524
25.1k
                    case '/':
1525
25.1k
                        state_ = json_parse_state::slash_slash;
1526
25.1k
                        more_ = err_handler_(json_errc::illegal_comment, *this);
1527
25.1k
                        if (!more_)
1528
0
                        {
1529
0
                            ec = json_errc::illegal_comment;
1530
0
                            return;
1531
0
                        }
1532
25.1k
                        break;
1533
25.1k
                    default:    
1534
6
                        more_ = err_handler_(json_errc::syntax_error, *this);
1535
6
                        if (!more_)
1536
6
                        {
1537
6
                            ec = json_errc::syntax_error;
1538
6
                            return;
1539
6
                        }
1540
0
                        break;
1541
31.8k
                    }
1542
31.8k
                    ++input_ptr_;
1543
31.8k
                    ++position_;
1544
31.8k
                    break;
1545
31.8k
                }
1546
1.99M
                case json_parse_state::slash_star:  
1547
1.99M
                {
1548
1.99M
                    switch (*input_ptr_)
1549
1.99M
                    {
1550
48.2k
                        case '\r':
1551
48.2k
                            push_state(state_);
1552
48.2k
                            ++input_ptr_;
1553
48.2k
                            ++position_;
1554
48.2k
                            state_ = json_parse_state::cr;
1555
48.2k
                            break;
1556
22.7k
                        case '\n':
1557
22.7k
                            ++input_ptr_;
1558
22.7k
                            ++line_;
1559
22.7k
                            ++position_;
1560
22.7k
                            mark_position_ = position_;
1561
22.7k
                            break;
1562
15.9k
                        case '*':
1563
15.9k
                            ++input_ptr_;
1564
15.9k
                            ++position_;
1565
15.9k
                            state_ = json_parse_state::slash_star_star;
1566
15.9k
                            break;
1567
1.90M
                        default:
1568
1.90M
                            ++input_ptr_;
1569
1.90M
                            ++position_;
1570
1.90M
                            break;
1571
1.99M
                    }
1572
1.99M
                    break;
1573
1.99M
                }
1574
2.74M
                case json_parse_state::slash_slash: 
1575
2.74M
                {
1576
2.74M
                    switch (*input_ptr_)
1577
2.74M
                    {
1578
15.9k
                    case '\r':
1579
25.0k
                    case '\n':
1580
25.0k
                        state_ = pop_state();
1581
25.0k
                        break;
1582
2.72M
                    default:
1583
2.72M
                        ++input_ptr_;
1584
2.72M
                        ++position_;
1585
2.74M
                    }
1586
2.74M
                    break;
1587
2.74M
                }
1588
2.74M
                case json_parse_state::slash_star_star: 
1589
15.9k
                {
1590
15.9k
                    switch (*input_ptr_)
1591
15.9k
                    {
1592
6.47k
                    case '/':
1593
6.47k
                        state_ = pop_state();
1594
6.47k
                        break;
1595
9.44k
                    default:    
1596
9.44k
                        state_ = json_parse_state::slash_star;
1597
9.44k
                        break;
1598
15.9k
                    }
1599
15.9k
                    ++input_ptr_;
1600
15.9k
                    ++position_;
1601
15.9k
                    break;
1602
15.9k
                }
1603
0
                default:
1604
0
                    JSONCONS_ASSERT(false);
1605
0
                    break;
1606
52.4M
            }
1607
52.4M
        }
1608
36.5k
    }
1609
1610
    void parse_true(basic_json_visitor<char_type>& visitor, std::error_code& ec)
1611
888k
    {
1612
888k
        saved_position_ = position_;
1613
888k
        if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4))
1614
888k
        {
1615
888k
            if (*(input_ptr_+1) == 'r' && *(input_ptr_+2) == 'u' && *(input_ptr_+3) == 'e')
1616
887k
            {
1617
887k
                input_ptr_ += 4;
1618
887k
                position_ += 4;
1619
887k
                more_ = visitor.bool_value(true, semantic_tag::none, *this, ec);
1620
887k
                if (parent() == json_parse_state::root)
1621
6
                {
1622
6
                    state_ = json_parse_state::accept;
1623
6
                }
1624
887k
                else
1625
887k
                {
1626
887k
                    state_ = json_parse_state::expect_comma_or_end;
1627
887k
                }
1628
887k
            }
1629
169
            else
1630
169
            {
1631
169
                err_handler_(json_errc::invalid_value, *this);
1632
169
                ec = json_errc::invalid_value;
1633
169
                more_ = false;
1634
169
                return;
1635
169
            }
1636
888k
        }
1637
511
        else
1638
511
        {
1639
511
            ++input_ptr_;
1640
511
            ++position_;
1641
511
            state_ = json_parse_state::t;
1642
511
        }
1643
888k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_true(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_true(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
1611
888k
    {
1612
888k
        saved_position_ = position_;
1613
888k
        if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4))
1614
888k
        {
1615
888k
            if (*(input_ptr_+1) == 'r' && *(input_ptr_+2) == 'u' && *(input_ptr_+3) == 'e')
1616
887k
            {
1617
887k
                input_ptr_ += 4;
1618
887k
                position_ += 4;
1619
887k
                more_ = visitor.bool_value(true, semantic_tag::none, *this, ec);
1620
887k
                if (parent() == json_parse_state::root)
1621
6
                {
1622
6
                    state_ = json_parse_state::accept;
1623
6
                }
1624
887k
                else
1625
887k
                {
1626
887k
                    state_ = json_parse_state::expect_comma_or_end;
1627
887k
                }
1628
887k
            }
1629
169
            else
1630
169
            {
1631
169
                err_handler_(json_errc::invalid_value, *this);
1632
169
                ec = json_errc::invalid_value;
1633
169
                more_ = false;
1634
169
                return;
1635
169
            }
1636
888k
        }
1637
511
        else
1638
511
        {
1639
511
            ++input_ptr_;
1640
511
            ++position_;
1641
511
            state_ = json_parse_state::t;
1642
511
        }
1643
888k
    }
1644
1645
    void parse_null(basic_json_visitor<char_type>& visitor, std::error_code& ec)
1646
702k
    {
1647
702k
        saved_position_ = position_;
1648
702k
        if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4))
1649
702k
        {
1650
702k
            if (*(input_ptr_+1) == 'u' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 'l')
1651
701k
            {
1652
701k
                input_ptr_ += 4;
1653
701k
                position_ += 4;
1654
701k
                more_ = visitor.null_value(semantic_tag::none, *this, ec);
1655
701k
                if (parent() == json_parse_state::root)
1656
5
                {
1657
5
                    state_ = json_parse_state::accept;
1658
5
                }
1659
701k
                else
1660
701k
                {
1661
701k
                    state_ = json_parse_state::expect_comma_or_end;
1662
701k
                }
1663
701k
            }
1664
195
            else
1665
195
            {
1666
195
                err_handler_(json_errc::invalid_value, *this);
1667
195
                ec = json_errc::invalid_value;
1668
195
                more_ = false;
1669
195
                return;
1670
195
            }
1671
702k
        }
1672
428
        else
1673
428
        {
1674
428
            ++input_ptr_;
1675
428
            ++position_;
1676
428
            state_ = json_parse_state::n;
1677
428
        }
1678
702k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_null(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_null(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
1646
702k
    {
1647
702k
        saved_position_ = position_;
1648
702k
        if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 4))
1649
702k
        {
1650
702k
            if (*(input_ptr_+1) == 'u' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 'l')
1651
701k
            {
1652
701k
                input_ptr_ += 4;
1653
701k
                position_ += 4;
1654
701k
                more_ = visitor.null_value(semantic_tag::none, *this, ec);
1655
701k
                if (parent() == json_parse_state::root)
1656
5
                {
1657
5
                    state_ = json_parse_state::accept;
1658
5
                }
1659
701k
                else
1660
701k
                {
1661
701k
                    state_ = json_parse_state::expect_comma_or_end;
1662
701k
                }
1663
701k
            }
1664
195
            else
1665
195
            {
1666
195
                err_handler_(json_errc::invalid_value, *this);
1667
195
                ec = json_errc::invalid_value;
1668
195
                more_ = false;
1669
195
                return;
1670
195
            }
1671
702k
        }
1672
428
        else
1673
428
        {
1674
428
            ++input_ptr_;
1675
428
            ++position_;
1676
428
            state_ = json_parse_state::n;
1677
428
        }
1678
702k
    }
1679
1680
    void parse_false(basic_json_visitor<char_type>& visitor, std::error_code& ec)
1681
473k
    {
1682
473k
        saved_position_ = position_;
1683
473k
        if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 5))
1684
472k
        {
1685
472k
            if (*(input_ptr_+1) == 'a' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 's' && *(input_ptr_+4) == 'e')
1686
472k
            {
1687
472k
                input_ptr_ += 5;
1688
472k
                position_ += 5;
1689
472k
                more_ = visitor.bool_value(false, semantic_tag::none, *this, ec);
1690
472k
                if (parent() == json_parse_state::root)
1691
4
                {
1692
4
                    state_ = json_parse_state::accept;
1693
4
                }
1694
472k
                else
1695
472k
                {
1696
472k
                    state_ = json_parse_state::expect_comma_or_end;
1697
472k
                }
1698
472k
            }
1699
209
            else
1700
209
            {
1701
209
                err_handler_(json_errc::invalid_value, *this);
1702
209
                ec = json_errc::invalid_value;
1703
209
                more_ = false;
1704
209
                return;
1705
209
            }
1706
472k
        }
1707
507
        else
1708
507
        {
1709
507
            ++input_ptr_;
1710
507
            ++position_;
1711
507
            state_ = json_parse_state::f;
1712
507
        }
1713
473k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_false(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_false(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
1681
473k
    {
1682
473k
        saved_position_ = position_;
1683
473k
        if (JSONCONS_LIKELY(end_input_ - input_ptr_ >= 5))
1684
472k
        {
1685
472k
            if (*(input_ptr_+1) == 'a' && *(input_ptr_+2) == 'l' && *(input_ptr_+3) == 's' && *(input_ptr_+4) == 'e')
1686
472k
            {
1687
472k
                input_ptr_ += 5;
1688
472k
                position_ += 5;
1689
472k
                more_ = visitor.bool_value(false, semantic_tag::none, *this, ec);
1690
472k
                if (parent() == json_parse_state::root)
1691
4
                {
1692
4
                    state_ = json_parse_state::accept;
1693
4
                }
1694
472k
                else
1695
472k
                {
1696
472k
                    state_ = json_parse_state::expect_comma_or_end;
1697
472k
                }
1698
472k
            }
1699
209
            else
1700
209
            {
1701
209
                err_handler_(json_errc::invalid_value, *this);
1702
209
                ec = json_errc::invalid_value;
1703
209
                more_ = false;
1704
209
                return;
1705
209
            }
1706
472k
        }
1707
507
        else
1708
507
        {
1709
507
            ++input_ptr_;
1710
507
            ++position_;
1711
507
            state_ = json_parse_state::f;
1712
507
        }
1713
473k
    }
1714
1715
    void parse_number(basic_json_visitor<char_type>& visitor, std::error_code& ec)
1716
23.8M
    {
1717
23.8M
        const char_type* local_input_end = end_input_;
1718
1719
23.8M
        switch (state_)
1720
23.8M
        {
1721
860k
            case json_parse_state::minus:
1722
860k
                goto minus_sign;
1723
4.91M
            case json_parse_state::zero:
1724
4.91M
                goto zero;
1725
18.0M
            case json_parse_state::integer:
1726
18.0M
                goto integer;
1727
126
            case json_parse_state::fraction1:
1728
126
                goto fraction1;
1729
483
            case json_parse_state::fraction2:
1730
483
                goto fraction2;
1731
233
            case json_parse_state::exp1:
1732
233
                goto exp1;
1733
82
            case json_parse_state::exp2:
1734
82
                goto exp2;
1735
623
            case json_parse_state::exp3:
1736
623
                goto exp3;
1737
0
            default:
1738
0
                JSONCONS_UNREACHABLE();               
1739
23.8M
        }
1740
860k
minus_sign:
1741
860k
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1742
194
        {
1743
194
            state_ = json_parse_state::minus;
1744
194
            return;
1745
194
        }
1746
859k
        switch (*input_ptr_)
1747
859k
        {
1748
3.53k
            case '0': 
1749
3.53k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1750
3.53k
                ++input_ptr_;
1751
3.53k
                ++position_;
1752
3.53k
                goto zero;
1753
856k
            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1754
856k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1755
856k
                ++input_ptr_;
1756
856k
                ++position_;
1757
856k
                goto integer;
1758
18
            default:
1759
18
                err_handler_(json_errc::invalid_number, *this);
1760
18
                ec = json_errc::expected_value;
1761
18
                more_ = false;
1762
18
                return;
1763
859k
        }
1764
4.91M
zero:
1765
4.91M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1766
629
        {
1767
629
            state_ = json_parse_state::zero;
1768
629
            return;
1769
629
        }
1770
4.91M
        switch (*input_ptr_)
1771
4.91M
        {
1772
3.55k
            case '\r': 
1773
3.55k
                end_integer_value(visitor, ec);
1774
3.55k
                if (ec) return;
1775
3.55k
                ++input_ptr_;
1776
3.55k
                ++position_;
1777
3.55k
                push_state(state_);
1778
3.55k
                state_ = json_parse_state::cr;
1779
3.55k
                return; 
1780
1.11k
            case '\n': 
1781
1.11k
                end_integer_value(visitor, ec);
1782
1.11k
                if (ec) return;
1783
1.11k
                ++input_ptr_;
1784
1.11k
                ++line_;
1785
1.11k
                ++position_;
1786
1.11k
                mark_position_ = position_;
1787
1.11k
                return;   
1788
1.63k
            case ' ':case '\t':
1789
1.63k
                end_integer_value(visitor, ec);
1790
1.63k
                if (ec) return;
1791
1.63k
                skip_space();
1792
1.63k
                return;
1793
1.58k
            case '/': 
1794
1.58k
                end_integer_value(visitor, ec);
1795
1.58k
                if (ec) return;
1796
1.58k
                ++input_ptr_;
1797
1.58k
                ++position_;
1798
1.58k
                push_state(state_);
1799
1.58k
                state_ = json_parse_state::slash;
1800
1.58k
                return;
1801
3.03k
            case '}':
1802
6.58k
            case ']':
1803
6.58k
                end_integer_value(visitor, ec);
1804
6.58k
                if (ec) return;
1805
6.58k
                state_ = json_parse_state::expect_comma_or_end;
1806
6.58k
                return;
1807
79.5k
            case '.':
1808
79.5k
                string_buffer_.push_back(to_double_.get_decimal_point());
1809
79.5k
                ++input_ptr_;
1810
79.5k
                ++position_;
1811
79.5k
                goto fraction1;
1812
248k
            case 'e':case 'E':
1813
248k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1814
248k
                ++input_ptr_;
1815
248k
                ++position_;
1816
248k
                goto exp1;
1817
4.57M
            case ',':
1818
4.57M
                end_integer_value(visitor, ec);
1819
4.57M
                if (ec) return;
1820
4.57M
                begin_member_or_element(ec);
1821
4.57M
                if (ec) return;
1822
4.57M
                ++input_ptr_;
1823
4.57M
                ++position_;
1824
4.57M
                return;
1825
49
            case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1826
49
                err_handler_(json_errc::leading_zero, *this);
1827
49
                ec = json_errc::leading_zero;
1828
49
                more_ = false;
1829
49
                state_ = json_parse_state::zero;
1830
49
                return;
1831
15
            default:
1832
15
                err_handler_(json_errc::invalid_number, *this);
1833
15
                ec = json_errc::invalid_number;
1834
15
                more_ = false;
1835
15
                state_ = json_parse_state::zero;
1836
15
                return;
1837
4.91M
        }
1838
53.7M
integer:
1839
53.7M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1840
5.02k
        {
1841
5.02k
            state_ = json_parse_state::integer;
1842
5.02k
            return;
1843
5.02k
        }
1844
53.7M
        switch (*input_ptr_)
1845
53.7M
        {
1846
15.5k
            case '\r': 
1847
15.5k
                end_integer_value(visitor, ec);
1848
15.5k
                if (ec) return;
1849
15.5k
                push_state(state_);
1850
15.5k
                ++input_ptr_;
1851
15.5k
                ++position_;
1852
15.5k
                state_ = json_parse_state::cr;
1853
15.5k
                return; 
1854
1.79k
            case '\n': 
1855
1.79k
                end_integer_value(visitor, ec);
1856
1.79k
                if (ec) return;
1857
1.79k
                ++input_ptr_;
1858
1.79k
                ++line_;
1859
1.79k
                ++position_;
1860
1.79k
                mark_position_ = position_;
1861
1.79k
                return;   
1862
2.68k
            case ' ':case '\t':
1863
2.68k
                end_integer_value(visitor, ec);
1864
2.68k
                if (ec) return;
1865
2.68k
                skip_space();
1866
2.68k
                return;
1867
708
            case '/': 
1868
708
                end_integer_value(visitor, ec);
1869
708
                if (ec) return;
1870
708
                push_state(state_);
1871
708
                ++input_ptr_;
1872
708
                ++position_;
1873
708
                state_ = json_parse_state::slash;
1874
708
                return;
1875
3.97k
            case '}':
1876
10.7k
            case ']':
1877
10.7k
                end_integer_value(visitor, ec);
1878
10.7k
                if (ec) return;
1879
10.7k
                state_ = json_parse_state::expect_comma_or_end;
1880
10.7k
                return;
1881
34.8M
            case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1882
34.8M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1883
34.8M
                ++input_ptr_;
1884
34.8M
                ++position_;
1885
34.8M
                goto integer;
1886
651k
            case '.':
1887
651k
                string_buffer_.push_back(to_double_.get_decimal_point());
1888
651k
                ++input_ptr_;
1889
651k
                ++position_;
1890
651k
                goto fraction1;
1891
1.58M
            case 'e':case 'E':
1892
1.58M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1893
1.58M
                ++input_ptr_;
1894
1.58M
                ++position_;
1895
1.58M
                goto exp1;
1896
16.6M
            case ',':
1897
16.6M
                end_integer_value(visitor, ec);
1898
16.6M
                if (ec) return;
1899
16.6M
                begin_member_or_element(ec);
1900
16.6M
                if (ec) return;
1901
16.6M
                ++input_ptr_;
1902
16.6M
                ++position_;
1903
16.6M
                return;
1904
54
            default:
1905
54
                err_handler_(json_errc::invalid_number, *this);
1906
54
                ec = json_errc::invalid_number;
1907
54
                more_ = false;
1908
54
                state_ = json_parse_state::integer;
1909
54
                return;
1910
53.7M
        }
1911
731k
fraction1:
1912
731k
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1913
189
        {
1914
189
            state_ = json_parse_state::fraction1;
1915
189
            return;
1916
189
        }
1917
731k
        switch (*input_ptr_)
1918
731k
        {
1919
730k
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1920
730k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1921
730k
                ++input_ptr_;
1922
730k
                ++position_;
1923
730k
                goto fraction2;
1924
54
            default:
1925
54
                err_handler_(json_errc::invalid_number, *this);
1926
54
                ec = json_errc::invalid_number;
1927
54
                more_ = false;
1928
54
                state_ = json_parse_state::fraction1;
1929
54
                return;
1930
731k
        }
1931
7.73M
fraction2:
1932
7.73M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1933
1.72k
        {
1934
1.72k
            state_ = json_parse_state::fraction2;
1935
1.72k
            return;
1936
1.72k
        }
1937
7.73M
        switch (*input_ptr_)
1938
7.73M
        {
1939
214k
            case '\r': 
1940
214k
                end_fraction_value(visitor, ec);
1941
214k
                if (ec) return;
1942
214k
                push_state(state_);
1943
214k
                ++input_ptr_;
1944
214k
                ++position_;
1945
214k
                state_ = json_parse_state::cr;
1946
214k
                return; 
1947
862
            case '\n': 
1948
862
                end_fraction_value(visitor, ec);
1949
862
                if (ec) return;
1950
862
                ++input_ptr_;
1951
862
                ++line_;
1952
862
                ++position_;
1953
862
                mark_position_ = position_;
1954
862
                return;   
1955
1.47k
            case ' ':case '\t':
1956
1.47k
                end_fraction_value(visitor, ec);
1957
1.47k
                if (ec) return;
1958
1.47k
                skip_space();
1959
1.47k
                return;
1960
3.00k
            case '/': 
1961
3.00k
                end_fraction_value(visitor, ec);
1962
3.00k
                if (ec) return;
1963
3.00k
                push_state(state_);
1964
3.00k
                ++input_ptr_;
1965
3.00k
                ++position_;
1966
3.00k
                state_ = json_parse_state::slash;
1967
3.00k
                return;
1968
845
            case '}':
1969
845
                end_fraction_value(visitor, ec);
1970
845
                if (ec) return;
1971
845
                state_ = json_parse_state::expect_comma_or_end;
1972
845
                return;
1973
591
            case ']':
1974
591
                end_fraction_value(visitor, ec);
1975
591
                if (ec) return;
1976
591
                state_ = json_parse_state::expect_comma_or_end;
1977
591
                return;
1978
497k
            case ',':
1979
497k
                end_fraction_value(visitor, ec);
1980
497k
                if (ec) return;
1981
497k
                begin_member_or_element(ec);
1982
497k
                if (ec) return;
1983
497k
                ++input_ptr_;
1984
497k
                ++position_;
1985
497k
                return;
1986
7.00M
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1987
7.00M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1988
7.00M
                ++input_ptr_;
1989
7.00M
                ++position_;
1990
7.00M
                goto fraction2;
1991
10.4k
            case 'e':case 'E':
1992
10.4k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1993
10.4k
                ++input_ptr_;
1994
10.4k
                ++position_;
1995
10.4k
                goto exp1;
1996
9
            default:
1997
9
                err_handler_(json_errc::invalid_number, *this);
1998
9
                ec = json_errc::invalid_number;
1999
9
                more_ = false;
2000
9
                state_ = json_parse_state::fraction2;
2001
9
                return;
2002
7.73M
        }
2003
1.84M
exp1:
2004
1.84M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2005
389
        {
2006
389
            state_ = json_parse_state::exp1;
2007
389
            return;
2008
389
        }
2009
1.84M
        switch (*input_ptr_)
2010
1.84M
        {
2011
76.7k
            case '+':
2012
76.7k
                ++input_ptr_;
2013
76.7k
                ++position_;
2014
76.7k
                goto exp2;
2015
161k
            case '-':
2016
161k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2017
161k
                ++input_ptr_;
2018
161k
                ++position_;
2019
161k
                goto exp2;
2020
1.60M
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
2021
1.60M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2022
1.60M
                ++input_ptr_;
2023
1.60M
                ++position_;
2024
1.60M
                goto exp3;
2025
16
            default:
2026
16
                err_handler_(json_errc::invalid_number, *this);
2027
16
                ec = json_errc::expected_value;
2028
16
                more_ = false;
2029
16
                state_ = json_parse_state::exp1;
2030
16
                return;
2031
1.84M
        }
2032
238k
exp2:
2033
238k
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2034
143
        {
2035
143
            state_ = json_parse_state::exp2;
2036
143
            return;
2037
143
        }
2038
238k
        switch (*input_ptr_)
2039
238k
        {
2040
238k
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
2041
238k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2042
238k
                ++input_ptr_;
2043
238k
                ++position_;
2044
238k
                goto exp3;
2045
51
            default:
2046
51
                err_handler_(json_errc::invalid_number, *this);
2047
51
                ec = json_errc::expected_value;
2048
51
                more_ = false;
2049
51
                state_ = json_parse_state::exp2;
2050
51
                return;
2051
238k
        }
2052
        
2053
10.3M
exp3:
2054
10.3M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2055
2.62k
        {
2056
2.62k
            state_ = json_parse_state::exp3;
2057
2.62k
            return;
2058
2.62k
        }
2059
10.3M
        switch (*input_ptr_)
2060
10.3M
        {
2061
66.3k
            case '\r': 
2062
66.3k
                end_fraction_value(visitor, ec);
2063
66.3k
                if (ec) return;
2064
66.3k
                ++input_ptr_;
2065
66.3k
                ++position_;
2066
66.3k
                push_state(state_);
2067
66.3k
                state_ = json_parse_state::cr;
2068
66.3k
                return; 
2069
692
            case '\n': 
2070
692
                end_fraction_value(visitor, ec);
2071
692
                if (ec) return;
2072
692
                ++input_ptr_;
2073
692
                ++line_;
2074
692
                ++position_;
2075
692
                mark_position_ = position_;
2076
692
                return;   
2077
5.63k
            case ' ':case '\t':
2078
5.63k
                end_fraction_value(visitor, ec);
2079
5.63k
                if (ec) return;
2080
5.63k
                skip_space();
2081
5.63k
                return;
2082
649
            case '/': 
2083
649
                end_fraction_value(visitor, ec);
2084
649
                if (ec) return;
2085
649
                push_state(state_);
2086
649
                ++input_ptr_;
2087
649
                ++position_;
2088
649
                state_ = json_parse_state::slash;
2089
649
                return;
2090
704
            case '}':
2091
704
                end_fraction_value(visitor, ec);
2092
704
                if (ec) return;
2093
704
                state_ = json_parse_state::expect_comma_or_end;
2094
704
                return;
2095
3.84k
            case ']':
2096
3.84k
                end_fraction_value(visitor, ec);
2097
3.84k
                if (ec) return;
2098
3.84k
                state_ = json_parse_state::expect_comma_or_end;
2099
3.84k
                return;
2100
1.76M
            case ',':
2101
1.76M
                end_fraction_value(visitor, ec);
2102
1.76M
                if (ec) return;
2103
1.76M
                begin_member_or_element(ec);
2104
1.76M
                if (ec) return;
2105
1.76M
                ++input_ptr_;
2106
1.76M
                ++position_;
2107
1.76M
                return;
2108
8.50M
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
2109
8.50M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2110
8.50M
                ++input_ptr_;
2111
8.50M
                ++position_;
2112
8.50M
                goto exp3;
2113
21
            default:
2114
21
                err_handler_(json_errc::invalid_number, *this);
2115
21
                ec = json_errc::invalid_number;
2116
21
                more_ = false;
2117
21
                state_ = json_parse_state::exp3;
2118
21
                return;
2119
10.3M
        }
2120
2121
10.3M
        JSONCONS_UNREACHABLE();               
2122
10.3M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_number(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_number(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
1716
23.8M
    {
1717
23.8M
        const char_type* local_input_end = end_input_;
1718
1719
23.8M
        switch (state_)
1720
23.8M
        {
1721
860k
            case json_parse_state::minus:
1722
860k
                goto minus_sign;
1723
4.91M
            case json_parse_state::zero:
1724
4.91M
                goto zero;
1725
18.0M
            case json_parse_state::integer:
1726
18.0M
                goto integer;
1727
126
            case json_parse_state::fraction1:
1728
126
                goto fraction1;
1729
483
            case json_parse_state::fraction2:
1730
483
                goto fraction2;
1731
233
            case json_parse_state::exp1:
1732
233
                goto exp1;
1733
82
            case json_parse_state::exp2:
1734
82
                goto exp2;
1735
623
            case json_parse_state::exp3:
1736
623
                goto exp3;
1737
0
            default:
1738
0
                JSONCONS_UNREACHABLE();               
1739
23.8M
        }
1740
860k
minus_sign:
1741
860k
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1742
194
        {
1743
194
            state_ = json_parse_state::minus;
1744
194
            return;
1745
194
        }
1746
859k
        switch (*input_ptr_)
1747
859k
        {
1748
3.53k
            case '0': 
1749
3.53k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1750
3.53k
                ++input_ptr_;
1751
3.53k
                ++position_;
1752
3.53k
                goto zero;
1753
856k
            case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1754
856k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1755
856k
                ++input_ptr_;
1756
856k
                ++position_;
1757
856k
                goto integer;
1758
18
            default:
1759
18
                err_handler_(json_errc::invalid_number, *this);
1760
18
                ec = json_errc::expected_value;
1761
18
                more_ = false;
1762
18
                return;
1763
859k
        }
1764
4.91M
zero:
1765
4.91M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1766
629
        {
1767
629
            state_ = json_parse_state::zero;
1768
629
            return;
1769
629
        }
1770
4.91M
        switch (*input_ptr_)
1771
4.91M
        {
1772
3.55k
            case '\r': 
1773
3.55k
                end_integer_value(visitor, ec);
1774
3.55k
                if (ec) return;
1775
3.55k
                ++input_ptr_;
1776
3.55k
                ++position_;
1777
3.55k
                push_state(state_);
1778
3.55k
                state_ = json_parse_state::cr;
1779
3.55k
                return; 
1780
1.11k
            case '\n': 
1781
1.11k
                end_integer_value(visitor, ec);
1782
1.11k
                if (ec) return;
1783
1.11k
                ++input_ptr_;
1784
1.11k
                ++line_;
1785
1.11k
                ++position_;
1786
1.11k
                mark_position_ = position_;
1787
1.11k
                return;   
1788
1.63k
            case ' ':case '\t':
1789
1.63k
                end_integer_value(visitor, ec);
1790
1.63k
                if (ec) return;
1791
1.63k
                skip_space();
1792
1.63k
                return;
1793
1.58k
            case '/': 
1794
1.58k
                end_integer_value(visitor, ec);
1795
1.58k
                if (ec) return;
1796
1.58k
                ++input_ptr_;
1797
1.58k
                ++position_;
1798
1.58k
                push_state(state_);
1799
1.58k
                state_ = json_parse_state::slash;
1800
1.58k
                return;
1801
3.03k
            case '}':
1802
6.58k
            case ']':
1803
6.58k
                end_integer_value(visitor, ec);
1804
6.58k
                if (ec) return;
1805
6.58k
                state_ = json_parse_state::expect_comma_or_end;
1806
6.58k
                return;
1807
79.5k
            case '.':
1808
79.5k
                string_buffer_.push_back(to_double_.get_decimal_point());
1809
79.5k
                ++input_ptr_;
1810
79.5k
                ++position_;
1811
79.5k
                goto fraction1;
1812
248k
            case 'e':case 'E':
1813
248k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1814
248k
                ++input_ptr_;
1815
248k
                ++position_;
1816
248k
                goto exp1;
1817
4.57M
            case ',':
1818
4.57M
                end_integer_value(visitor, ec);
1819
4.57M
                if (ec) return;
1820
4.57M
                begin_member_or_element(ec);
1821
4.57M
                if (ec) return;
1822
4.57M
                ++input_ptr_;
1823
4.57M
                ++position_;
1824
4.57M
                return;
1825
49
            case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1826
49
                err_handler_(json_errc::leading_zero, *this);
1827
49
                ec = json_errc::leading_zero;
1828
49
                more_ = false;
1829
49
                state_ = json_parse_state::zero;
1830
49
                return;
1831
15
            default:
1832
15
                err_handler_(json_errc::invalid_number, *this);
1833
15
                ec = json_errc::invalid_number;
1834
15
                more_ = false;
1835
15
                state_ = json_parse_state::zero;
1836
15
                return;
1837
4.91M
        }
1838
53.7M
integer:
1839
53.7M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1840
5.02k
        {
1841
5.02k
            state_ = json_parse_state::integer;
1842
5.02k
            return;
1843
5.02k
        }
1844
53.7M
        switch (*input_ptr_)
1845
53.7M
        {
1846
15.5k
            case '\r': 
1847
15.5k
                end_integer_value(visitor, ec);
1848
15.5k
                if (ec) return;
1849
15.5k
                push_state(state_);
1850
15.5k
                ++input_ptr_;
1851
15.5k
                ++position_;
1852
15.5k
                state_ = json_parse_state::cr;
1853
15.5k
                return; 
1854
1.79k
            case '\n': 
1855
1.79k
                end_integer_value(visitor, ec);
1856
1.79k
                if (ec) return;
1857
1.79k
                ++input_ptr_;
1858
1.79k
                ++line_;
1859
1.79k
                ++position_;
1860
1.79k
                mark_position_ = position_;
1861
1.79k
                return;   
1862
2.68k
            case ' ':case '\t':
1863
2.68k
                end_integer_value(visitor, ec);
1864
2.68k
                if (ec) return;
1865
2.68k
                skip_space();
1866
2.68k
                return;
1867
708
            case '/': 
1868
708
                end_integer_value(visitor, ec);
1869
708
                if (ec) return;
1870
708
                push_state(state_);
1871
708
                ++input_ptr_;
1872
708
                ++position_;
1873
708
                state_ = json_parse_state::slash;
1874
708
                return;
1875
3.97k
            case '}':
1876
10.7k
            case ']':
1877
10.7k
                end_integer_value(visitor, ec);
1878
10.7k
                if (ec) return;
1879
10.7k
                state_ = json_parse_state::expect_comma_or_end;
1880
10.7k
                return;
1881
34.8M
            case '0': case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1882
34.8M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1883
34.8M
                ++input_ptr_;
1884
34.8M
                ++position_;
1885
34.8M
                goto integer;
1886
651k
            case '.':
1887
651k
                string_buffer_.push_back(to_double_.get_decimal_point());
1888
651k
                ++input_ptr_;
1889
651k
                ++position_;
1890
651k
                goto fraction1;
1891
1.58M
            case 'e':case 'E':
1892
1.58M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1893
1.58M
                ++input_ptr_;
1894
1.58M
                ++position_;
1895
1.58M
                goto exp1;
1896
16.6M
            case ',':
1897
16.6M
                end_integer_value(visitor, ec);
1898
16.6M
                if (ec) return;
1899
16.6M
                begin_member_or_element(ec);
1900
16.6M
                if (ec) return;
1901
16.6M
                ++input_ptr_;
1902
16.6M
                ++position_;
1903
16.6M
                return;
1904
54
            default:
1905
54
                err_handler_(json_errc::invalid_number, *this);
1906
54
                ec = json_errc::invalid_number;
1907
54
                more_ = false;
1908
54
                state_ = json_parse_state::integer;
1909
54
                return;
1910
53.7M
        }
1911
731k
fraction1:
1912
731k
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1913
189
        {
1914
189
            state_ = json_parse_state::fraction1;
1915
189
            return;
1916
189
        }
1917
731k
        switch (*input_ptr_)
1918
731k
        {
1919
730k
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1920
730k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1921
730k
                ++input_ptr_;
1922
730k
                ++position_;
1923
730k
                goto fraction2;
1924
54
            default:
1925
54
                err_handler_(json_errc::invalid_number, *this);
1926
54
                ec = json_errc::invalid_number;
1927
54
                more_ = false;
1928
54
                state_ = json_parse_state::fraction1;
1929
54
                return;
1930
731k
        }
1931
7.73M
fraction2:
1932
7.73M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
1933
1.72k
        {
1934
1.72k
            state_ = json_parse_state::fraction2;
1935
1.72k
            return;
1936
1.72k
        }
1937
7.73M
        switch (*input_ptr_)
1938
7.73M
        {
1939
214k
            case '\r': 
1940
214k
                end_fraction_value(visitor, ec);
1941
214k
                if (ec) return;
1942
214k
                push_state(state_);
1943
214k
                ++input_ptr_;
1944
214k
                ++position_;
1945
214k
                state_ = json_parse_state::cr;
1946
214k
                return; 
1947
862
            case '\n': 
1948
862
                end_fraction_value(visitor, ec);
1949
862
                if (ec) return;
1950
862
                ++input_ptr_;
1951
862
                ++line_;
1952
862
                ++position_;
1953
862
                mark_position_ = position_;
1954
862
                return;   
1955
1.47k
            case ' ':case '\t':
1956
1.47k
                end_fraction_value(visitor, ec);
1957
1.47k
                if (ec) return;
1958
1.47k
                skip_space();
1959
1.47k
                return;
1960
3.00k
            case '/': 
1961
3.00k
                end_fraction_value(visitor, ec);
1962
3.00k
                if (ec) return;
1963
3.00k
                push_state(state_);
1964
3.00k
                ++input_ptr_;
1965
3.00k
                ++position_;
1966
3.00k
                state_ = json_parse_state::slash;
1967
3.00k
                return;
1968
845
            case '}':
1969
845
                end_fraction_value(visitor, ec);
1970
845
                if (ec) return;
1971
845
                state_ = json_parse_state::expect_comma_or_end;
1972
845
                return;
1973
591
            case ']':
1974
591
                end_fraction_value(visitor, ec);
1975
591
                if (ec) return;
1976
591
                state_ = json_parse_state::expect_comma_or_end;
1977
591
                return;
1978
497k
            case ',':
1979
497k
                end_fraction_value(visitor, ec);
1980
497k
                if (ec) return;
1981
497k
                begin_member_or_element(ec);
1982
497k
                if (ec) return;
1983
497k
                ++input_ptr_;
1984
497k
                ++position_;
1985
497k
                return;
1986
7.00M
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
1987
7.00M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1988
7.00M
                ++input_ptr_;
1989
7.00M
                ++position_;
1990
7.00M
                goto fraction2;
1991
10.4k
            case 'e':case 'E':
1992
10.4k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
1993
10.4k
                ++input_ptr_;
1994
10.4k
                ++position_;
1995
10.4k
                goto exp1;
1996
9
            default:
1997
9
                err_handler_(json_errc::invalid_number, *this);
1998
9
                ec = json_errc::invalid_number;
1999
9
                more_ = false;
2000
9
                state_ = json_parse_state::fraction2;
2001
9
                return;
2002
7.73M
        }
2003
1.84M
exp1:
2004
1.84M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2005
389
        {
2006
389
            state_ = json_parse_state::exp1;
2007
389
            return;
2008
389
        }
2009
1.84M
        switch (*input_ptr_)
2010
1.84M
        {
2011
76.7k
            case '+':
2012
76.7k
                ++input_ptr_;
2013
76.7k
                ++position_;
2014
76.7k
                goto exp2;
2015
161k
            case '-':
2016
161k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2017
161k
                ++input_ptr_;
2018
161k
                ++position_;
2019
161k
                goto exp2;
2020
1.60M
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
2021
1.60M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2022
1.60M
                ++input_ptr_;
2023
1.60M
                ++position_;
2024
1.60M
                goto exp3;
2025
16
            default:
2026
16
                err_handler_(json_errc::invalid_number, *this);
2027
16
                ec = json_errc::expected_value;
2028
16
                more_ = false;
2029
16
                state_ = json_parse_state::exp1;
2030
16
                return;
2031
1.84M
        }
2032
238k
exp2:
2033
238k
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2034
143
        {
2035
143
            state_ = json_parse_state::exp2;
2036
143
            return;
2037
143
        }
2038
238k
        switch (*input_ptr_)
2039
238k
        {
2040
238k
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
2041
238k
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2042
238k
                ++input_ptr_;
2043
238k
                ++position_;
2044
238k
                goto exp3;
2045
51
            default:
2046
51
                err_handler_(json_errc::invalid_number, *this);
2047
51
                ec = json_errc::expected_value;
2048
51
                more_ = false;
2049
51
                state_ = json_parse_state::exp2;
2050
51
                return;
2051
238k
        }
2052
        
2053
10.3M
exp3:
2054
10.3M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2055
2.62k
        {
2056
2.62k
            state_ = json_parse_state::exp3;
2057
2.62k
            return;
2058
2.62k
        }
2059
10.3M
        switch (*input_ptr_)
2060
10.3M
        {
2061
66.3k
            case '\r': 
2062
66.3k
                end_fraction_value(visitor, ec);
2063
66.3k
                if (ec) return;
2064
66.3k
                ++input_ptr_;
2065
66.3k
                ++position_;
2066
66.3k
                push_state(state_);
2067
66.3k
                state_ = json_parse_state::cr;
2068
66.3k
                return; 
2069
692
            case '\n': 
2070
692
                end_fraction_value(visitor, ec);
2071
692
                if (ec) return;
2072
692
                ++input_ptr_;
2073
692
                ++line_;
2074
692
                ++position_;
2075
692
                mark_position_ = position_;
2076
692
                return;   
2077
5.63k
            case ' ':case '\t':
2078
5.63k
                end_fraction_value(visitor, ec);
2079
5.63k
                if (ec) return;
2080
5.63k
                skip_space();
2081
5.63k
                return;
2082
649
            case '/': 
2083
649
                end_fraction_value(visitor, ec);
2084
649
                if (ec) return;
2085
649
                push_state(state_);
2086
649
                ++input_ptr_;
2087
649
                ++position_;
2088
649
                state_ = json_parse_state::slash;
2089
649
                return;
2090
704
            case '}':
2091
704
                end_fraction_value(visitor, ec);
2092
704
                if (ec) return;
2093
704
                state_ = json_parse_state::expect_comma_or_end;
2094
704
                return;
2095
3.84k
            case ']':
2096
3.84k
                end_fraction_value(visitor, ec);
2097
3.84k
                if (ec) return;
2098
3.84k
                state_ = json_parse_state::expect_comma_or_end;
2099
3.84k
                return;
2100
1.76M
            case ',':
2101
1.76M
                end_fraction_value(visitor, ec);
2102
1.76M
                if (ec) return;
2103
1.76M
                begin_member_or_element(ec);
2104
1.76M
                if (ec) return;
2105
1.76M
                ++input_ptr_;
2106
1.76M
                ++position_;
2107
1.76M
                return;
2108
8.50M
            case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9':
2109
8.50M
                string_buffer_.push_back(static_cast<char>(*input_ptr_));
2110
8.50M
                ++input_ptr_;
2111
8.50M
                ++position_;
2112
8.50M
                goto exp3;
2113
21
            default:
2114
21
                err_handler_(json_errc::invalid_number, *this);
2115
21
                ec = json_errc::invalid_number;
2116
21
                more_ = false;
2117
21
                state_ = json_parse_state::exp3;
2118
21
                return;
2119
10.3M
        }
2120
2121
0
        JSONCONS_UNREACHABLE();               
2122
10.3M
    }
2123
2124
    void parse_string(basic_json_visitor<char_type>& visitor, std::error_code& ec)
2125
3.29M
    {
2126
3.29M
        const char_type* local_input_end = end_input_;
2127
3.29M
        const char_type* sb = input_ptr_;
2128
2129
3.29M
        switch (state_)
2130
3.29M
        {
2131
3.29M
            case json_parse_state::string:
2132
3.29M
                goto string_u1;
2133
385
            case json_parse_state::escape:
2134
385
                goto escape;
2135
241
            case json_parse_state::escape_u1:
2136
241
                goto escape_u1;
2137
240
            case json_parse_state::escape_u2:
2138
240
                goto escape_u2;
2139
245
            case json_parse_state::escape_u3:
2140
245
                goto escape_u3;
2141
240
            case json_parse_state::escape_u4:
2142
240
                goto escape_u4;
2143
242
            case json_parse_state::escape_expect_surrogate_pair1:
2144
242
                goto escape_expect_surrogate_pair1;
2145
209
            case json_parse_state::escape_expect_surrogate_pair2:
2146
209
                goto escape_expect_surrogate_pair2;
2147
213
            case json_parse_state::escape_u5:
2148
213
                goto escape_u5;
2149
206
            case json_parse_state::escape_u6:
2150
206
                goto escape_u6;
2151
213
            case json_parse_state::escape_u7:
2152
213
                goto escape_u7;
2153
202
            case json_parse_state::escape_u8:
2154
202
                goto escape_u8;
2155
0
            default:
2156
0
                JSONCONS_UNREACHABLE();               
2157
3.29M
        }
2158
2159
9.46M
string_u1:
2160
83.1M
        while (input_ptr_ < local_input_end)
2161
83.0M
        {
2162
83.0M
            switch (*input_ptr_)
2163
83.0M
            {
2164
2.40k
                JSONCONS_ILLEGAL_CONTROL_CHARACTER:
2165
2.40k
                {
2166
2.40k
                    position_ += (input_ptr_ - sb + 1);
2167
2.40k
                    more_ = err_handler_(json_errc::illegal_control_character, *this);
2168
2.40k
                    if (!more_)
2169
147
                    {
2170
147
                        ec = json_errc::illegal_control_character;
2171
147
                        state_ = json_parse_state::string;
2172
147
                        return;
2173
147
                    }
2174
                    // recovery - skip
2175
0
                    string_buffer_.append(sb,input_ptr_-sb);
2176
0
                    ++input_ptr_;
2177
0
                    state_ = json_parse_state::string;
2178
0
                    return;
2179
2.40k
                }
2180
5
                case '\r':
2181
5
                {
2182
5
                    position_ += (input_ptr_ - sb + 1);
2183
5
                    more_ = err_handler_(json_errc::illegal_character_in_string, *this);
2184
5
                    if (!more_)
2185
5
                    {
2186
5
                        ec = json_errc::illegal_character_in_string;
2187
5
                        state_ = json_parse_state::string;
2188
5
                        return;
2189
5
                    }
2190
                    // recovery - keep
2191
0
                    string_buffer_.append(sb, input_ptr_ - sb + 1);
2192
0
                    ++input_ptr_;
2193
0
                    push_state(state_);
2194
0
                    state_ = json_parse_state::cr;
2195
0
                    return;
2196
5
                }
2197
5
                case '\n':
2198
5
                {
2199
5
                    ++line_;
2200
5
                    ++position_;
2201
5
                    mark_position_ = position_;
2202
5
                    more_ = err_handler_(json_errc::illegal_character_in_string, *this);
2203
5
                    if (!more_)
2204
5
                    {
2205
5
                        ec = json_errc::illegal_character_in_string;
2206
5
                        state_ = json_parse_state::string;
2207
5
                        return;
2208
5
                    }
2209
                    // recovery - keep
2210
0
                    string_buffer_.append(sb, input_ptr_ - sb + 1);
2211
0
                    ++input_ptr_;
2212
0
                    return;
2213
5
                }
2214
7
                case '\t':
2215
7
                {
2216
7
                    position_ += (input_ptr_ - sb + 1);
2217
7
                    more_ = err_handler_(json_errc::illegal_character_in_string, *this);
2218
7
                    if (!more_)
2219
7
                    {
2220
7
                        ec = json_errc::illegal_character_in_string;
2221
7
                        state_ = json_parse_state::string;
2222
7
                        return;
2223
7
                    }
2224
                    // recovery - keep
2225
0
                    string_buffer_.append(sb, input_ptr_ - sb + 1);
2226
0
                    ++input_ptr_;
2227
0
                    state_ = json_parse_state::string;
2228
0
                    return;
2229
7
                }
2230
7.33M
                case '\\': 
2231
7.33M
                {
2232
7.33M
                    string_buffer_.append(sb,input_ptr_-sb);
2233
7.33M
                    position_ += (input_ptr_ - sb + 1);
2234
7.33M
                    ++input_ptr_;
2235
7.33M
                    goto escape;
2236
7
                }
2237
2.12M
                case '\"':
2238
2.12M
                {
2239
2.12M
                    position_ += (input_ptr_ - sb + 1);
2240
2.12M
                    if (string_buffer_.length() == 0)
2241
2.11M
                    {
2242
2.11M
                        end_string_value(sb,input_ptr_-sb, visitor, ec);
2243
2.11M
                        if (ec) {return;}
2244
2.11M
                    }
2245
1.67k
                    else
2246
1.67k
                    {
2247
1.67k
                        string_buffer_.append(sb,input_ptr_-sb);
2248
1.67k
                        end_string_value(string_buffer_.data(),string_buffer_.length(), visitor, ec);
2249
1.67k
                        if (ec) {return;}
2250
1.67k
                    }
2251
2.12M
                    ++input_ptr_;
2252
2.12M
                    return;
2253
2.12M
                }
2254
73.6M
            default:
2255
73.6M
                break;
2256
83.0M
            }
2257
73.6M
            ++input_ptr_;
2258
73.6M
        }
2259
2260
        // Buffer exhausted               
2261
3.02k
        {
2262
3.02k
            string_buffer_.append(sb,input_ptr_-sb);
2263
3.02k
            position_ += (input_ptr_ - sb);
2264
3.02k
            state_ = json_parse_state::string;
2265
3.02k
            return;
2266
9.46M
        }
2267
2268
7.34M
escape:
2269
7.34M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2270
439
        {
2271
439
            state_ = json_parse_state::escape;
2272
439
            return;
2273
439
        }
2274
7.33M
        switch (*input_ptr_)
2275
7.33M
        {
2276
816k
        case '\"':
2277
816k
            string_buffer_.push_back('\"');
2278
816k
            sb = ++input_ptr_;
2279
816k
            ++position_;
2280
816k
            goto string_u1;
2281
4.24M
        case '\\': 
2282
4.24M
            string_buffer_.push_back('\\');
2283
4.24M
            sb = ++input_ptr_;
2284
4.24M
            ++position_;
2285
4.24M
            goto string_u1;
2286
1.05k
        case '/':
2287
1.05k
            string_buffer_.push_back('/');
2288
1.05k
            sb = ++input_ptr_;
2289
1.05k
            ++position_;
2290
1.05k
            goto string_u1;
2291
12.4k
        case 'b':
2292
12.4k
            string_buffer_.push_back('\b');
2293
12.4k
            sb = ++input_ptr_;
2294
12.4k
            ++position_;
2295
12.4k
            goto string_u1;
2296
8.43k
        case 'f':
2297
8.43k
            string_buffer_.push_back('\f');
2298
8.43k
            sb = ++input_ptr_;
2299
8.43k
            ++position_;
2300
8.43k
            goto string_u1;
2301
3.43k
        case 'n':
2302
3.43k
            string_buffer_.push_back('\n');
2303
3.43k
            sb = ++input_ptr_;
2304
3.43k
            ++position_;
2305
3.43k
            goto string_u1;
2306
3.32k
        case 'r':
2307
3.32k
            string_buffer_.push_back('\r');
2308
3.32k
            sb = ++input_ptr_;
2309
3.32k
            ++position_;
2310
3.32k
            goto string_u1;
2311
2.43k
        case 't':
2312
2.43k
            string_buffer_.push_back('\t');
2313
2.43k
            sb = ++input_ptr_;
2314
2.43k
            ++position_;
2315
2.43k
            goto string_u1;
2316
2.24M
        case 'u':
2317
2.24M
             cp_ = 0;
2318
2.24M
             ++input_ptr_;
2319
2.24M
             ++position_;
2320
2.24M
             goto escape_u1;
2321
10
        default:    
2322
10
            err_handler_(json_errc::illegal_escaped_character, *this);
2323
10
            ec = json_errc::illegal_escaped_character;
2324
10
            more_ = false;
2325
10
            state_ = json_parse_state::escape;
2326
10
            return;
2327
7.33M
        }
2328
2329
2.24M
escape_u1:
2330
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2331
287
        {
2332
287
            state_ = json_parse_state::escape_u1;
2333
287
            return;
2334
287
        }
2335
2.24M
        {
2336
2.24M
            cp_ = append_to_codepoint(0, *input_ptr_, ec);
2337
2.24M
            if (ec)
2338
144
            {
2339
144
                state_ = json_parse_state::escape_u1;
2340
144
                return;
2341
144
            }
2342
2.24M
            ++input_ptr_;
2343
2.24M
            ++position_;
2344
2.24M
            goto escape_u2;
2345
2.24M
        }
2346
2347
2.24M
escape_u2:
2348
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2349
330
        {
2350
330
            state_ = json_parse_state::escape_u2;
2351
330
            return;
2352
330
        }
2353
2.24M
        {
2354
2.24M
            cp_ = append_to_codepoint(cp_, *input_ptr_, ec);
2355
2.24M
            if (ec)
2356
6
            {
2357
6
                state_ = json_parse_state::escape_u2;
2358
6
                return;
2359
6
            }
2360
2.24M
            ++input_ptr_;
2361
2.24M
            ++position_;
2362
2.24M
            goto escape_u3;
2363
2.24M
        }
2364
2365
2.24M
escape_u3:
2366
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2367
319
        {
2368
319
            state_ = json_parse_state::escape_u3;
2369
319
            return;
2370
319
        }
2371
2.24M
        {
2372
2.24M
            cp_ = append_to_codepoint(cp_, *input_ptr_, ec);
2373
2.24M
            if (ec)
2374
10
            {
2375
10
                state_ = json_parse_state::escape_u3;
2376
10
                return;
2377
10
            }
2378
2.24M
            ++input_ptr_;
2379
2.24M
            ++position_;
2380
2.24M
            goto escape_u4;
2381
2.24M
        }
2382
2383
2.24M
escape_u4:
2384
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2385
308
        {
2386
308
            state_ = json_parse_state::escape_u4;
2387
308
            return;
2388
308
        }
2389
2.24M
        {
2390
2.24M
            cp_ = append_to_codepoint(cp_, *input_ptr_, ec);
2391
2.24M
            if (ec)
2392
9
            {
2393
9
                state_ = json_parse_state::escape_u4;
2394
9
                return;
2395
9
            }
2396
2.24M
            if (unicode_traits::is_high_surrogate(cp_))
2397
1.08M
            {
2398
1.08M
                ++input_ptr_;
2399
1.08M
                ++position_;
2400
1.08M
                goto escape_expect_surrogate_pair1;
2401
1.08M
            }
2402
1.16M
            else
2403
1.16M
            {
2404
1.16M
                unicode_traits::convert(&cp_, 1, string_buffer_);
2405
1.16M
                sb = ++input_ptr_;
2406
1.16M
                ++position_;
2407
1.16M
                state_ = json_parse_state::string;
2408
1.16M
                return;
2409
1.16M
            }
2410
2.24M
        }
2411
2412
1.08M
escape_expect_surrogate_pair1:
2413
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2414
342
        {
2415
342
            state_ = json_parse_state::escape_expect_surrogate_pair1;
2416
342
            return;
2417
342
        }
2418
1.08M
        {
2419
1.08M
            switch (*input_ptr_)
2420
1.08M
            {
2421
1.08M
            case '\\': 
2422
1.08M
                cp2_ = 0;
2423
1.08M
                ++input_ptr_;
2424
1.08M
                ++position_;
2425
1.08M
                goto escape_expect_surrogate_pair2;
2426
44
            default:
2427
44
                err_handler_(json_errc::expected_codepoint_surrogate_pair, *this);
2428
44
                ec = json_errc::expected_codepoint_surrogate_pair;
2429
44
                more_ = false;
2430
44
                state_ = json_parse_state::escape_expect_surrogate_pair1;
2431
44
                return;
2432
1.08M
            }
2433
1.08M
        }
2434
2435
1.08M
escape_expect_surrogate_pair2:
2436
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2437
264
        {
2438
264
            state_ = json_parse_state::escape_expect_surrogate_pair2;
2439
264
            return;
2440
264
        }
2441
1.08M
        {
2442
1.08M
            switch (*input_ptr_)
2443
1.08M
            {
2444
1.08M
            case 'u':
2445
1.08M
                ++input_ptr_;
2446
1.08M
                ++position_;
2447
1.08M
                goto escape_u5;
2448
45
            default:
2449
45
                err_handler_(json_errc::expected_codepoint_surrogate_pair, *this);
2450
45
                ec = json_errc::expected_codepoint_surrogate_pair;
2451
45
                more_ = false;
2452
45
                state_ = json_parse_state::escape_expect_surrogate_pair2;
2453
45
                return;
2454
1.08M
            }
2455
1.08M
        }
2456
2457
1.08M
escape_u5:
2458
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2459
276
        {
2460
276
            state_ = json_parse_state::escape_u5;
2461
276
            return;
2462
276
        }
2463
1.08M
        {
2464
1.08M
            cp2_ = append_to_codepoint(0, *input_ptr_, ec);
2465
1.08M
            if (ec)
2466
4
            {
2467
4
                state_ = json_parse_state::escape_u5;
2468
4
                return;
2469
4
            }
2470
1.08M
        }
2471
1.08M
        ++input_ptr_;
2472
1.08M
        ++position_;
2473
1.08M
        goto escape_u6;
2474
2475
1.08M
escape_u6:
2476
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2477
260
        {
2478
260
            state_ = json_parse_state::escape_u6;
2479
260
            return;
2480
260
        }
2481
1.08M
        {
2482
1.08M
            cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec);
2483
1.08M
            if (ec)
2484
5
            {
2485
5
                state_ = json_parse_state::escape_u6;
2486
5
                return;
2487
5
            }
2488
1.08M
            ++input_ptr_;
2489
1.08M
            ++position_;
2490
1.08M
            goto escape_u7;
2491
1.08M
        }
2492
2493
1.08M
escape_u7:
2494
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2495
270
        {
2496
270
            state_ = json_parse_state::escape_u7;
2497
270
            return;
2498
270
        }
2499
1.08M
        {
2500
1.08M
            cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec);
2501
1.08M
            if (ec)
2502
6
            {
2503
6
                state_ = json_parse_state::escape_u7;
2504
6
                return;
2505
6
            }
2506
1.08M
            ++input_ptr_;
2507
1.08M
            ++position_;
2508
1.08M
            goto escape_u8;
2509
1.08M
        }
2510
2511
1.08M
escape_u8:
2512
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2513
260
        {
2514
260
            state_ = json_parse_state::escape_u8;
2515
260
            return;
2516
260
        }
2517
1.08M
        {
2518
1.08M
            cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec);
2519
1.08M
            if (ec)
2520
7
            {
2521
7
                state_ = json_parse_state::escape_u8;
2522
7
                return;
2523
7
            }
2524
1.08M
            uint32_t cp = 0x10000 + ((cp_ & 0x3FF) << 10) + (cp2_ & 0x3FF);
2525
1.08M
            unicode_traits::convert(&cp, 1, string_buffer_);
2526
1.08M
            sb = ++input_ptr_;
2527
1.08M
            ++position_;
2528
1.08M
            goto string_u1;
2529
1.08M
        }
2530
2531
1.08M
        JSONCONS_UNREACHABLE();               
2532
1.08M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::parse_string(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::parse_string(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
2125
3.29M
    {
2126
3.29M
        const char_type* local_input_end = end_input_;
2127
3.29M
        const char_type* sb = input_ptr_;
2128
2129
3.29M
        switch (state_)
2130
3.29M
        {
2131
3.29M
            case json_parse_state::string:
2132
3.29M
                goto string_u1;
2133
385
            case json_parse_state::escape:
2134
385
                goto escape;
2135
241
            case json_parse_state::escape_u1:
2136
241
                goto escape_u1;
2137
240
            case json_parse_state::escape_u2:
2138
240
                goto escape_u2;
2139
245
            case json_parse_state::escape_u3:
2140
245
                goto escape_u3;
2141
240
            case json_parse_state::escape_u4:
2142
240
                goto escape_u4;
2143
242
            case json_parse_state::escape_expect_surrogate_pair1:
2144
242
                goto escape_expect_surrogate_pair1;
2145
209
            case json_parse_state::escape_expect_surrogate_pair2:
2146
209
                goto escape_expect_surrogate_pair2;
2147
213
            case json_parse_state::escape_u5:
2148
213
                goto escape_u5;
2149
206
            case json_parse_state::escape_u6:
2150
206
                goto escape_u6;
2151
213
            case json_parse_state::escape_u7:
2152
213
                goto escape_u7;
2153
202
            case json_parse_state::escape_u8:
2154
202
                goto escape_u8;
2155
0
            default:
2156
0
                JSONCONS_UNREACHABLE();               
2157
3.29M
        }
2158
2159
9.46M
string_u1:
2160
83.1M
        while (input_ptr_ < local_input_end)
2161
83.0M
        {
2162
83.0M
            switch (*input_ptr_)
2163
83.0M
            {
2164
2.40k
                JSONCONS_ILLEGAL_CONTROL_CHARACTER:
2165
2.40k
                {
2166
2.40k
                    position_ += (input_ptr_ - sb + 1);
2167
2.40k
                    more_ = err_handler_(json_errc::illegal_control_character, *this);
2168
2.40k
                    if (!more_)
2169
147
                    {
2170
147
                        ec = json_errc::illegal_control_character;
2171
147
                        state_ = json_parse_state::string;
2172
147
                        return;
2173
147
                    }
2174
                    // recovery - skip
2175
0
                    string_buffer_.append(sb,input_ptr_-sb);
2176
0
                    ++input_ptr_;
2177
0
                    state_ = json_parse_state::string;
2178
0
                    return;
2179
2.40k
                }
2180
5
                case '\r':
2181
5
                {
2182
5
                    position_ += (input_ptr_ - sb + 1);
2183
5
                    more_ = err_handler_(json_errc::illegal_character_in_string, *this);
2184
5
                    if (!more_)
2185
5
                    {
2186
5
                        ec = json_errc::illegal_character_in_string;
2187
5
                        state_ = json_parse_state::string;
2188
5
                        return;
2189
5
                    }
2190
                    // recovery - keep
2191
0
                    string_buffer_.append(sb, input_ptr_ - sb + 1);
2192
0
                    ++input_ptr_;
2193
0
                    push_state(state_);
2194
0
                    state_ = json_parse_state::cr;
2195
0
                    return;
2196
5
                }
2197
5
                case '\n':
2198
5
                {
2199
5
                    ++line_;
2200
5
                    ++position_;
2201
5
                    mark_position_ = position_;
2202
5
                    more_ = err_handler_(json_errc::illegal_character_in_string, *this);
2203
5
                    if (!more_)
2204
5
                    {
2205
5
                        ec = json_errc::illegal_character_in_string;
2206
5
                        state_ = json_parse_state::string;
2207
5
                        return;
2208
5
                    }
2209
                    // recovery - keep
2210
0
                    string_buffer_.append(sb, input_ptr_ - sb + 1);
2211
0
                    ++input_ptr_;
2212
0
                    return;
2213
5
                }
2214
7
                case '\t':
2215
7
                {
2216
7
                    position_ += (input_ptr_ - sb + 1);
2217
7
                    more_ = err_handler_(json_errc::illegal_character_in_string, *this);
2218
7
                    if (!more_)
2219
7
                    {
2220
7
                        ec = json_errc::illegal_character_in_string;
2221
7
                        state_ = json_parse_state::string;
2222
7
                        return;
2223
7
                    }
2224
                    // recovery - keep
2225
0
                    string_buffer_.append(sb, input_ptr_ - sb + 1);
2226
0
                    ++input_ptr_;
2227
0
                    state_ = json_parse_state::string;
2228
0
                    return;
2229
7
                }
2230
7.33M
                case '\\': 
2231
7.33M
                {
2232
7.33M
                    string_buffer_.append(sb,input_ptr_-sb);
2233
7.33M
                    position_ += (input_ptr_ - sb + 1);
2234
7.33M
                    ++input_ptr_;
2235
7.33M
                    goto escape;
2236
7
                }
2237
2.12M
                case '\"':
2238
2.12M
                {
2239
2.12M
                    position_ += (input_ptr_ - sb + 1);
2240
2.12M
                    if (string_buffer_.length() == 0)
2241
2.11M
                    {
2242
2.11M
                        end_string_value(sb,input_ptr_-sb, visitor, ec);
2243
2.11M
                        if (ec) {return;}
2244
2.11M
                    }
2245
1.67k
                    else
2246
1.67k
                    {
2247
1.67k
                        string_buffer_.append(sb,input_ptr_-sb);
2248
1.67k
                        end_string_value(string_buffer_.data(),string_buffer_.length(), visitor, ec);
2249
1.67k
                        if (ec) {return;}
2250
1.67k
                    }
2251
2.12M
                    ++input_ptr_;
2252
2.12M
                    return;
2253
2.12M
                }
2254
73.6M
            default:
2255
73.6M
                break;
2256
83.0M
            }
2257
73.6M
            ++input_ptr_;
2258
73.6M
        }
2259
2260
        // Buffer exhausted               
2261
3.02k
        {
2262
3.02k
            string_buffer_.append(sb,input_ptr_-sb);
2263
3.02k
            position_ += (input_ptr_ - sb);
2264
3.02k
            state_ = json_parse_state::string;
2265
3.02k
            return;
2266
9.46M
        }
2267
2268
7.34M
escape:
2269
7.34M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2270
439
        {
2271
439
            state_ = json_parse_state::escape;
2272
439
            return;
2273
439
        }
2274
7.33M
        switch (*input_ptr_)
2275
7.33M
        {
2276
816k
        case '\"':
2277
816k
            string_buffer_.push_back('\"');
2278
816k
            sb = ++input_ptr_;
2279
816k
            ++position_;
2280
816k
            goto string_u1;
2281
4.24M
        case '\\': 
2282
4.24M
            string_buffer_.push_back('\\');
2283
4.24M
            sb = ++input_ptr_;
2284
4.24M
            ++position_;
2285
4.24M
            goto string_u1;
2286
1.05k
        case '/':
2287
1.05k
            string_buffer_.push_back('/');
2288
1.05k
            sb = ++input_ptr_;
2289
1.05k
            ++position_;
2290
1.05k
            goto string_u1;
2291
12.4k
        case 'b':
2292
12.4k
            string_buffer_.push_back('\b');
2293
12.4k
            sb = ++input_ptr_;
2294
12.4k
            ++position_;
2295
12.4k
            goto string_u1;
2296
8.43k
        case 'f':
2297
8.43k
            string_buffer_.push_back('\f');
2298
8.43k
            sb = ++input_ptr_;
2299
8.43k
            ++position_;
2300
8.43k
            goto string_u1;
2301
3.43k
        case 'n':
2302
3.43k
            string_buffer_.push_back('\n');
2303
3.43k
            sb = ++input_ptr_;
2304
3.43k
            ++position_;
2305
3.43k
            goto string_u1;
2306
3.32k
        case 'r':
2307
3.32k
            string_buffer_.push_back('\r');
2308
3.32k
            sb = ++input_ptr_;
2309
3.32k
            ++position_;
2310
3.32k
            goto string_u1;
2311
2.43k
        case 't':
2312
2.43k
            string_buffer_.push_back('\t');
2313
2.43k
            sb = ++input_ptr_;
2314
2.43k
            ++position_;
2315
2.43k
            goto string_u1;
2316
2.24M
        case 'u':
2317
2.24M
             cp_ = 0;
2318
2.24M
             ++input_ptr_;
2319
2.24M
             ++position_;
2320
2.24M
             goto escape_u1;
2321
10
        default:    
2322
10
            err_handler_(json_errc::illegal_escaped_character, *this);
2323
10
            ec = json_errc::illegal_escaped_character;
2324
10
            more_ = false;
2325
10
            state_ = json_parse_state::escape;
2326
10
            return;
2327
7.33M
        }
2328
2329
2.24M
escape_u1:
2330
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2331
287
        {
2332
287
            state_ = json_parse_state::escape_u1;
2333
287
            return;
2334
287
        }
2335
2.24M
        {
2336
2.24M
            cp_ = append_to_codepoint(0, *input_ptr_, ec);
2337
2.24M
            if (ec)
2338
144
            {
2339
144
                state_ = json_parse_state::escape_u1;
2340
144
                return;
2341
144
            }
2342
2.24M
            ++input_ptr_;
2343
2.24M
            ++position_;
2344
2.24M
            goto escape_u2;
2345
2.24M
        }
2346
2347
2.24M
escape_u2:
2348
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2349
330
        {
2350
330
            state_ = json_parse_state::escape_u2;
2351
330
            return;
2352
330
        }
2353
2.24M
        {
2354
2.24M
            cp_ = append_to_codepoint(cp_, *input_ptr_, ec);
2355
2.24M
            if (ec)
2356
6
            {
2357
6
                state_ = json_parse_state::escape_u2;
2358
6
                return;
2359
6
            }
2360
2.24M
            ++input_ptr_;
2361
2.24M
            ++position_;
2362
2.24M
            goto escape_u3;
2363
2.24M
        }
2364
2365
2.24M
escape_u3:
2366
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2367
319
        {
2368
319
            state_ = json_parse_state::escape_u3;
2369
319
            return;
2370
319
        }
2371
2.24M
        {
2372
2.24M
            cp_ = append_to_codepoint(cp_, *input_ptr_, ec);
2373
2.24M
            if (ec)
2374
10
            {
2375
10
                state_ = json_parse_state::escape_u3;
2376
10
                return;
2377
10
            }
2378
2.24M
            ++input_ptr_;
2379
2.24M
            ++position_;
2380
2.24M
            goto escape_u4;
2381
2.24M
        }
2382
2383
2.24M
escape_u4:
2384
2.24M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2385
308
        {
2386
308
            state_ = json_parse_state::escape_u4;
2387
308
            return;
2388
308
        }
2389
2.24M
        {
2390
2.24M
            cp_ = append_to_codepoint(cp_, *input_ptr_, ec);
2391
2.24M
            if (ec)
2392
9
            {
2393
9
                state_ = json_parse_state::escape_u4;
2394
9
                return;
2395
9
            }
2396
2.24M
            if (unicode_traits::is_high_surrogate(cp_))
2397
1.08M
            {
2398
1.08M
                ++input_ptr_;
2399
1.08M
                ++position_;
2400
1.08M
                goto escape_expect_surrogate_pair1;
2401
1.08M
            }
2402
1.16M
            else
2403
1.16M
            {
2404
1.16M
                unicode_traits::convert(&cp_, 1, string_buffer_);
2405
1.16M
                sb = ++input_ptr_;
2406
1.16M
                ++position_;
2407
1.16M
                state_ = json_parse_state::string;
2408
1.16M
                return;
2409
1.16M
            }
2410
2.24M
        }
2411
2412
1.08M
escape_expect_surrogate_pair1:
2413
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2414
342
        {
2415
342
            state_ = json_parse_state::escape_expect_surrogate_pair1;
2416
342
            return;
2417
342
        }
2418
1.08M
        {
2419
1.08M
            switch (*input_ptr_)
2420
1.08M
            {
2421
1.08M
            case '\\': 
2422
1.08M
                cp2_ = 0;
2423
1.08M
                ++input_ptr_;
2424
1.08M
                ++position_;
2425
1.08M
                goto escape_expect_surrogate_pair2;
2426
44
            default:
2427
44
                err_handler_(json_errc::expected_codepoint_surrogate_pair, *this);
2428
44
                ec = json_errc::expected_codepoint_surrogate_pair;
2429
44
                more_ = false;
2430
44
                state_ = json_parse_state::escape_expect_surrogate_pair1;
2431
44
                return;
2432
1.08M
            }
2433
1.08M
        }
2434
2435
1.08M
escape_expect_surrogate_pair2:
2436
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2437
264
        {
2438
264
            state_ = json_parse_state::escape_expect_surrogate_pair2;
2439
264
            return;
2440
264
        }
2441
1.08M
        {
2442
1.08M
            switch (*input_ptr_)
2443
1.08M
            {
2444
1.08M
            case 'u':
2445
1.08M
                ++input_ptr_;
2446
1.08M
                ++position_;
2447
1.08M
                goto escape_u5;
2448
45
            default:
2449
45
                err_handler_(json_errc::expected_codepoint_surrogate_pair, *this);
2450
45
                ec = json_errc::expected_codepoint_surrogate_pair;
2451
45
                more_ = false;
2452
45
                state_ = json_parse_state::escape_expect_surrogate_pair2;
2453
45
                return;
2454
1.08M
            }
2455
1.08M
        }
2456
2457
1.08M
escape_u5:
2458
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2459
276
        {
2460
276
            state_ = json_parse_state::escape_u5;
2461
276
            return;
2462
276
        }
2463
1.08M
        {
2464
1.08M
            cp2_ = append_to_codepoint(0, *input_ptr_, ec);
2465
1.08M
            if (ec)
2466
4
            {
2467
4
                state_ = json_parse_state::escape_u5;
2468
4
                return;
2469
4
            }
2470
1.08M
        }
2471
1.08M
        ++input_ptr_;
2472
1.08M
        ++position_;
2473
1.08M
        goto escape_u6;
2474
2475
1.08M
escape_u6:
2476
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2477
260
        {
2478
260
            state_ = json_parse_state::escape_u6;
2479
260
            return;
2480
260
        }
2481
1.08M
        {
2482
1.08M
            cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec);
2483
1.08M
            if (ec)
2484
5
            {
2485
5
                state_ = json_parse_state::escape_u6;
2486
5
                return;
2487
5
            }
2488
1.08M
            ++input_ptr_;
2489
1.08M
            ++position_;
2490
1.08M
            goto escape_u7;
2491
1.08M
        }
2492
2493
1.08M
escape_u7:
2494
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2495
270
        {
2496
270
            state_ = json_parse_state::escape_u7;
2497
270
            return;
2498
270
        }
2499
1.08M
        {
2500
1.08M
            cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec);
2501
1.08M
            if (ec)
2502
6
            {
2503
6
                state_ = json_parse_state::escape_u7;
2504
6
                return;
2505
6
            }
2506
1.08M
            ++input_ptr_;
2507
1.08M
            ++position_;
2508
1.08M
            goto escape_u8;
2509
1.08M
        }
2510
2511
1.08M
escape_u8:
2512
1.08M
        if (JSONCONS_UNLIKELY(input_ptr_ >= local_input_end)) // Buffer exhausted               
2513
260
        {
2514
260
            state_ = json_parse_state::escape_u8;
2515
260
            return;
2516
260
        }
2517
1.08M
        {
2518
1.08M
            cp2_ = append_to_codepoint(cp2_, *input_ptr_, ec);
2519
1.08M
            if (ec)
2520
7
            {
2521
7
                state_ = json_parse_state::escape_u8;
2522
7
                return;
2523
7
            }
2524
1.08M
            uint32_t cp = 0x10000 + ((cp_ & 0x3FF) << 10) + (cp2_ & 0x3FF);
2525
1.08M
            unicode_traits::convert(&cp, 1, string_buffer_);
2526
1.08M
            sb = ++input_ptr_;
2527
1.08M
            ++position_;
2528
1.08M
            goto string_u1;
2529
1.08M
        }
2530
2531
0
        JSONCONS_UNREACHABLE();               
2532
1.08M
    }
2533
2534
    void translate_conv_errc(unicode_traits::conv_errc result, std::error_code& ec)
2535
322
    {
2536
322
        switch (result)
2537
322
        {
2538
0
        case unicode_traits::conv_errc():
2539
0
            break;
2540
84
        case unicode_traits::conv_errc::over_long_utf8_sequence:
2541
84
            more_ = err_handler_(json_errc::over_long_utf8_sequence, *this);
2542
84
            if (!more_)
2543
84
            {
2544
84
                ec = json_errc::over_long_utf8_sequence;
2545
84
                return;
2546
84
            }
2547
0
            break;
2548
0
        case unicode_traits::conv_errc::unpaired_high_surrogate:
2549
0
            more_ = err_handler_(json_errc::unpaired_high_surrogate, *this);
2550
0
            if (!more_)
2551
0
            {
2552
0
                ec = json_errc::unpaired_high_surrogate;
2553
0
                return;
2554
0
            }
2555
0
            break;
2556
67
        case unicode_traits::conv_errc::expected_continuation_byte:
2557
67
            more_ = err_handler_(json_errc::expected_continuation_byte, *this);
2558
67
            if (!more_)
2559
67
            {
2560
67
                ec = json_errc::expected_continuation_byte;
2561
67
                return;
2562
67
            }
2563
0
            break;
2564
0
        case unicode_traits::conv_errc::illegal_surrogate_value:
2565
0
            more_ = err_handler_(json_errc::illegal_surrogate_value, *this);
2566
0
            if (!more_)
2567
0
            {
2568
0
                ec = json_errc::illegal_surrogate_value;
2569
0
                return;
2570
0
            }
2571
0
            break;
2572
171
        default:
2573
171
            more_ = err_handler_(json_errc::illegal_codepoint, *this);
2574
171
            if (!more_)
2575
171
            {
2576
171
                ec = json_errc::illegal_codepoint;
2577
171
                return;
2578
171
            }
2579
0
            break;
2580
322
        }
2581
322
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::translate_conv_errc(jsoncons::unicode_traits::conv_errc, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::translate_conv_errc(jsoncons::unicode_traits::conv_errc, std::__1::error_code&)
Line
Count
Source
2535
322
    {
2536
322
        switch (result)
2537
322
        {
2538
0
        case unicode_traits::conv_errc():
2539
0
            break;
2540
84
        case unicode_traits::conv_errc::over_long_utf8_sequence:
2541
84
            more_ = err_handler_(json_errc::over_long_utf8_sequence, *this);
2542
84
            if (!more_)
2543
84
            {
2544
84
                ec = json_errc::over_long_utf8_sequence;
2545
84
                return;
2546
84
            }
2547
0
            break;
2548
0
        case unicode_traits::conv_errc::unpaired_high_surrogate:
2549
0
            more_ = err_handler_(json_errc::unpaired_high_surrogate, *this);
2550
0
            if (!more_)
2551
0
            {
2552
0
                ec = json_errc::unpaired_high_surrogate;
2553
0
                return;
2554
0
            }
2555
0
            break;
2556
67
        case unicode_traits::conv_errc::expected_continuation_byte:
2557
67
            more_ = err_handler_(json_errc::expected_continuation_byte, *this);
2558
67
            if (!more_)
2559
67
            {
2560
67
                ec = json_errc::expected_continuation_byte;
2561
67
                return;
2562
67
            }
2563
0
            break;
2564
0
        case unicode_traits::conv_errc::illegal_surrogate_value:
2565
0
            more_ = err_handler_(json_errc::illegal_surrogate_value, *this);
2566
0
            if (!more_)
2567
0
            {
2568
0
                ec = json_errc::illegal_surrogate_value;
2569
0
                return;
2570
0
            }
2571
0
            break;
2572
171
        default:
2573
171
            more_ = err_handler_(json_errc::illegal_codepoint, *this);
2574
171
            if (!more_)
2575
171
            {
2576
171
                ec = json_errc::illegal_codepoint;
2577
171
                return;
2578
171
            }
2579
0
            break;
2580
322
        }
2581
322
    }
2582
2583
#if !defined(JSONCONS_NO_DEPRECATED)
2584
2585
    JSONCONS_DEPRECATED_MSG("Instead, use finish_parse(basic_json_visitor<char_type>&)")
2586
    void end_parse(basic_json_visitor<char_type>& visitor)
2587
    {
2588
        std::error_code ec;
2589
        finish_parse(visitor, ec);
2590
        if (ec)
2591
        {
2592
            JSONCONS_THROW(ser_error(ec,line_,column()));
2593
        }
2594
    }
2595
2596
    JSONCONS_DEPRECATED_MSG("Instead, use finish_parse(basic_json_visitor<char_type>&, std::error_code&)")
2597
    void end_parse(basic_json_visitor<char_type>& visitor, std::error_code& ec)
2598
    {
2599
        while (!finished())
2600
        {
2601
            parse_some(visitor, ec);
2602
        }
2603
    }
2604
2605
    JSONCONS_DEPRECATED_MSG("Instead, use update(const char_type*, std::size_t)")
2606
    void set_source(const char_type* data, std::size_t length)
2607
    {
2608
        begin_input_ = data;
2609
        end_input_ = data + length;
2610
        input_ptr_ = begin_input_;
2611
    }
2612
#endif
2613
2614
    std::size_t line() const override
2615
4
    {
2616
4
        return line_;
2617
4
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::line() const
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::line() const
Line
Count
Source
2615
4
    {
2616
4
        return line_;
2617
4
    }
2618
2619
    std::size_t column() const override
2620
3.15k
    {
2621
3.15k
        return (position_ - mark_position_) + 1;
2622
3.15k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::column() const
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::column() const
Line
Count
Source
2620
3.15k
    {
2621
3.15k
        return (position_ - mark_position_) + 1;
2622
3.15k
    }
2623
2624
    std::size_t position() const override
2625
0
    {
2626
0
        return saved_position_;
2627
0
    }
Unexecuted instantiation: jsoncons::basic_json_parser<char, std::__1::allocator<char> >::position() const
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::position() const
2628
2629
    std::size_t end_position() const override
2630
0
    {
2631
0
        return position_;
2632
0
    }
Unexecuted instantiation: jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_position() const
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_position() const
2633
2634
    std::size_t offset() const 
2635
    {
2636
        return input_ptr_ - begin_input_;
2637
    }
2638
private:
2639
2640
    void end_integer_value(basic_json_visitor<char_type>& visitor, std::error_code& ec)
2641
21.2M
    {
2642
21.2M
        if (string_buffer_[0] == '-')
2643
839k
        {
2644
839k
            end_negative_value(visitor, ec);
2645
839k
        }
2646
20.4M
        else
2647
20.4M
        {
2648
20.4M
            end_positive_value(visitor, ec);
2649
20.4M
        }
2650
21.2M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_integer_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_integer_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
2641
21.2M
    {
2642
21.2M
        if (string_buffer_[0] == '-')
2643
839k
        {
2644
839k
            end_negative_value(visitor, ec);
2645
839k
        }
2646
20.4M
        else
2647
20.4M
        {
2648
20.4M
            end_positive_value(visitor, ec);
2649
20.4M
        }
2650
21.2M
    }
2651
2652
    void end_negative_value(basic_json_visitor<char_type>& visitor, std::error_code& ec)
2653
839k
    {
2654
839k
        int64_t val;
2655
839k
        auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val);
2656
839k
        if (result)
2657
825k
        {
2658
825k
            more_ = visitor.int64_value(val, semantic_tag::none, *this, ec);
2659
825k
        }
2660
14.3k
        else // Must be overflow
2661
14.3k
        {
2662
14.3k
            more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec);
2663
14.3k
        }
2664
839k
        after_value(ec);
2665
839k
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_negative_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_negative_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
2653
839k
    {
2654
839k
        int64_t val;
2655
839k
        auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val);
2656
839k
        if (result)
2657
825k
        {
2658
825k
            more_ = visitor.int64_value(val, semantic_tag::none, *this, ec);
2659
825k
        }
2660
14.3k
        else // Must be overflow
2661
14.3k
        {
2662
14.3k
            more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec);
2663
14.3k
        }
2664
839k
        after_value(ec);
2665
839k
    }
2666
2667
    void end_positive_value(basic_json_visitor<char_type>& visitor, std::error_code& ec)
2668
20.4M
    {
2669
20.4M
        uint64_t val;
2670
20.4M
        auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val);
2671
20.4M
        if (result)
2672
20.4M
        {
2673
20.4M
            more_ = visitor.uint64_value(val, semantic_tag::none, *this, ec);
2674
20.4M
        }
2675
14.1k
        else // Must be overflow
2676
14.1k
        {
2677
14.1k
            more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec);
2678
14.1k
        }
2679
20.4M
        after_value(ec);
2680
20.4M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_positive_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_positive_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
2668
20.4M
    {
2669
20.4M
        uint64_t val;
2670
20.4M
        auto result = jsoncons::detail::to_integer_unchecked(string_buffer_.data(), string_buffer_.length(), val);
2671
20.4M
        if (result)
2672
20.4M
        {
2673
20.4M
            more_ = visitor.uint64_value(val, semantic_tag::none, *this, ec);
2674
20.4M
        }
2675
14.1k
        else // Must be overflow
2676
14.1k
        {
2677
14.1k
            more_ = visitor.string_value(string_buffer_, semantic_tag::bigint, *this, ec);
2678
14.1k
        }
2679
20.4M
        after_value(ec);
2680
20.4M
    }
2681
2682
    void end_fraction_value(basic_json_visitor<char_type>& visitor, std::error_code& ec)
2683
2.56M
    {
2684
2.56M
        JSONCONS_TRY
2685
2.56M
        {
2686
2.56M
            if (options_.lossless_number())
2687
0
            {
2688
0
                more_ = visitor.string_value(string_buffer_, semantic_tag::bigdec, *this, ec);
2689
0
            }
2690
2.56M
            else
2691
2.56M
            {
2692
2.56M
                double d = to_double_(string_buffer_.c_str(), string_buffer_.length());
2693
2.56M
                more_ = visitor.double_value(d, semantic_tag::none, *this, ec);
2694
2.56M
            }
2695
2.56M
        }
2696
2.56M
        JSONCONS_CATCH(...)
2697
2.56M
        {
2698
0
            more_ = err_handler_(json_errc::invalid_number, *this);
2699
0
            if (!more_)
2700
0
            {
2701
0
                ec = json_errc::invalid_number;
2702
0
                return;
2703
0
            }
2704
0
            more_ = visitor.null_value(semantic_tag::none, *this, ec); // recovery
2705
0
        }
2706
2707
2.56M
        after_value(ec);
2708
2.56M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_fraction_value(jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_fraction_value(jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
2683
2.56M
    {
2684
2.56M
        JSONCONS_TRY
2685
2.56M
        {
2686
2.56M
            if (options_.lossless_number())
2687
0
            {
2688
0
                more_ = visitor.string_value(string_buffer_, semantic_tag::bigdec, *this, ec);
2689
0
            }
2690
2.56M
            else
2691
2.56M
            {
2692
2.56M
                double d = to_double_(string_buffer_.c_str(), string_buffer_.length());
2693
2.56M
                more_ = visitor.double_value(d, semantic_tag::none, *this, ec);
2694
2.56M
            }
2695
2.56M
        }
2696
2.56M
        JSONCONS_CATCH(...)
2697
2.56M
        {
2698
0
            more_ = err_handler_(json_errc::invalid_number, *this);
2699
0
            if (!more_)
2700
0
            {
2701
0
                ec = json_errc::invalid_number;
2702
0
                return;
2703
0
            }
2704
0
            more_ = visitor.null_value(semantic_tag::none, *this, ec); // recovery
2705
0
        }
2706
2707
2.56M
        after_value(ec);
2708
2.56M
    }
2709
2710
    void end_string_value(const char_type* s, std::size_t length, basic_json_visitor<char_type>& visitor, std::error_code& ec) 
2711
2.12M
    {
2712
2.12M
        string_view_type sv(s, length);
2713
2.12M
        auto result = unicode_traits::validate(s, length);
2714
2.12M
        if (result.ec != unicode_traits::conv_errc())
2715
322
        {
2716
322
            translate_conv_errc(result.ec,ec);
2717
322
            position_ += (result.ptr - s);
2718
322
            return;
2719
322
        }
2720
2.12M
        switch (parent())
2721
2.12M
        {
2722
2.04M
        case json_parse_state::member_name:
2723
2.04M
            more_ = visitor.key(sv, *this, ec);
2724
2.04M
            pop_state();
2725
2.04M
            state_ = json_parse_state::expect_colon;
2726
2.04M
            break;
2727
7.60k
        case json_parse_state::object:
2728
72.8k
        case json_parse_state::array:
2729
72.8k
        {
2730
72.8k
            auto it = std::find_if(string_double_map_.begin(), string_double_map_.end(), string_maps_to_double{ sv });
2731
72.8k
            if (it != string_double_map_.end())
2732
0
            {
2733
0
                more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec);
2734
0
            }
2735
72.8k
            else
2736
72.8k
            {
2737
72.8k
                more_ = visitor.string_value(sv, semantic_tag::none, *this, ec);
2738
72.8k
            }
2739
72.8k
            state_ = json_parse_state::expect_comma_or_end;
2740
72.8k
            break;
2741
7.60k
        }
2742
497
        case json_parse_state::root:
2743
497
        {
2744
497
            auto it = std::find_if(string_double_map_.begin(),string_double_map_.end(),string_maps_to_double{sv});
2745
497
            if (it != string_double_map_.end())
2746
0
            {
2747
0
                more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec);
2748
0
            }
2749
497
            else
2750
497
            {
2751
497
                more_ = visitor.string_value(sv, semantic_tag::none, *this, ec);
2752
497
            }
2753
497
            state_ = json_parse_state::accept;
2754
497
            break;
2755
7.60k
        }
2756
0
        default:
2757
0
            more_ = err_handler_(json_errc::syntax_error, *this);
2758
0
            if (!more_)
2759
0
            {
2760
0
                ec = json_errc::syntax_error;
2761
0
                return;
2762
0
            }
2763
0
            break;
2764
2.12M
        }
2765
2.12M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::end_string_value(wchar_t const*, unsigned long, jsoncons::basic_json_visitor<wchar_t>&, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::end_string_value(char const*, unsigned long, jsoncons::basic_json_visitor<char>&, std::__1::error_code&)
Line
Count
Source
2711
2.12M
    {
2712
2.12M
        string_view_type sv(s, length);
2713
2.12M
        auto result = unicode_traits::validate(s, length);
2714
2.12M
        if (result.ec != unicode_traits::conv_errc())
2715
322
        {
2716
322
            translate_conv_errc(result.ec,ec);
2717
322
            position_ += (result.ptr - s);
2718
322
            return;
2719
322
        }
2720
2.12M
        switch (parent())
2721
2.12M
        {
2722
2.04M
        case json_parse_state::member_name:
2723
2.04M
            more_ = visitor.key(sv, *this, ec);
2724
2.04M
            pop_state();
2725
2.04M
            state_ = json_parse_state::expect_colon;
2726
2.04M
            break;
2727
7.60k
        case json_parse_state::object:
2728
72.8k
        case json_parse_state::array:
2729
72.8k
        {
2730
72.8k
            auto it = std::find_if(string_double_map_.begin(), string_double_map_.end(), string_maps_to_double{ sv });
2731
72.8k
            if (it != string_double_map_.end())
2732
0
            {
2733
0
                more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec);
2734
0
            }
2735
72.8k
            else
2736
72.8k
            {
2737
72.8k
                more_ = visitor.string_value(sv, semantic_tag::none, *this, ec);
2738
72.8k
            }
2739
72.8k
            state_ = json_parse_state::expect_comma_or_end;
2740
72.8k
            break;
2741
7.60k
        }
2742
497
        case json_parse_state::root:
2743
497
        {
2744
497
            auto it = std::find_if(string_double_map_.begin(),string_double_map_.end(),string_maps_to_double{sv});
2745
497
            if (it != string_double_map_.end())
2746
0
            {
2747
0
                more_ = visitor.double_value(it->second, semantic_tag::none, *this, ec);
2748
0
            }
2749
497
            else
2750
497
            {
2751
497
                more_ = visitor.string_value(sv, semantic_tag::none, *this, ec);
2752
497
            }
2753
497
            state_ = json_parse_state::accept;
2754
497
            break;
2755
7.60k
        }
2756
0
        default:
2757
0
            more_ = err_handler_(json_errc::syntax_error, *this);
2758
0
            if (!more_)
2759
0
            {
2760
0
                ec = json_errc::syntax_error;
2761
0
                return;
2762
0
            }
2763
0
            break;
2764
2.12M
        }
2765
2.12M
    }
2766
2767
    void begin_member_or_element(std::error_code& ec) 
2768
26.4M
    {
2769
26.4M
        switch (parent())
2770
26.4M
        {
2771
2.02M
        case json_parse_state::object:
2772
2.02M
            state_ = json_parse_state::expect_member_name;
2773
2.02M
            break;
2774
24.4M
        case json_parse_state::array:
2775
24.4M
            state_ = json_parse_state::expect_value;
2776
24.4M
            break;
2777
42
        case json_parse_state::root:
2778
42
            break;
2779
0
        default:
2780
0
            more_ = err_handler_(json_errc::syntax_error, *this);
2781
0
            if (!more_)
2782
0
            {
2783
0
                ec = json_errc::syntax_error;
2784
0
                return;
2785
0
            }
2786
0
            break;
2787
26.4M
        }
2788
26.4M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::begin_member_or_element(std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::begin_member_or_element(std::__1::error_code&)
Line
Count
Source
2768
26.4M
    {
2769
26.4M
        switch (parent())
2770
26.4M
        {
2771
2.02M
        case json_parse_state::object:
2772
2.02M
            state_ = json_parse_state::expect_member_name;
2773
2.02M
            break;
2774
24.4M
        case json_parse_state::array:
2775
24.4M
            state_ = json_parse_state::expect_value;
2776
24.4M
            break;
2777
42
        case json_parse_state::root:
2778
42
            break;
2779
0
        default:
2780
0
            more_ = err_handler_(json_errc::syntax_error, *this);
2781
0
            if (!more_)
2782
0
            {
2783
0
                ec = json_errc::syntax_error;
2784
0
                return;
2785
0
            }
2786
0
            break;
2787
26.4M
        }
2788
26.4M
    }
2789
2790
    void after_value(std::error_code& ec) 
2791
23.8M
    {
2792
23.8M
        switch (parent())
2793
23.8M
        {
2794
21.8M
        case json_parse_state::array:
2795
23.8M
        case json_parse_state::object:
2796
23.8M
            state_ = json_parse_state::expect_comma_or_end;
2797
23.8M
            break;
2798
5.36k
        case json_parse_state::root:
2799
5.36k
            state_ = json_parse_state::accept;
2800
5.36k
            break;
2801
0
        default:
2802
0
            more_ = err_handler_(json_errc::syntax_error, *this);
2803
0
            if (!more_)
2804
0
            {
2805
0
                ec = json_errc::syntax_error;
2806
0
                return;
2807
0
            }
2808
0
            break;
2809
23.8M
        }
2810
23.8M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::after_value(std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::after_value(std::__1::error_code&)
Line
Count
Source
2791
23.8M
    {
2792
23.8M
        switch (parent())
2793
23.8M
        {
2794
21.8M
        case json_parse_state::array:
2795
23.8M
        case json_parse_state::object:
2796
23.8M
            state_ = json_parse_state::expect_comma_or_end;
2797
23.8M
            break;
2798
5.36k
        case json_parse_state::root:
2799
5.36k
            state_ = json_parse_state::accept;
2800
5.36k
            break;
2801
0
        default:
2802
0
            more_ = err_handler_(json_errc::syntax_error, *this);
2803
0
            if (!more_)
2804
0
            {
2805
0
                ec = json_errc::syntax_error;
2806
0
                return;
2807
0
            }
2808
0
            break;
2809
23.8M
        }
2810
23.8M
    }
2811
2812
    void push_state(json_parse_state state)
2813
14.7M
    {
2814
14.7M
        state_stack_.push_back(state);
2815
14.7M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::push_state(jsoncons::json_parse_state)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::push_state(jsoncons::json_parse_state)
Line
Count
Source
2813
14.7M
    {
2814
14.7M
        state_stack_.push_back(state);
2815
14.7M
    }
2816
2817
    json_parse_state pop_state()
2818
3.32M
    {
2819
3.32M
        JSONCONS_ASSERT(!state_stack_.empty())
2820
3.32M
        json_parse_state state = state_stack_.back();
2821
3.32M
        state_stack_.pop_back();
2822
3.32M
        return state;
2823
3.32M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::pop_state()
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::pop_state()
Line
Count
Source
2818
3.32M
    {
2819
3.32M
        JSONCONS_ASSERT(!state_stack_.empty())
2820
3.32M
        json_parse_state state = state_stack_.back();
2821
3.32M
        state_stack_.pop_back();
2822
3.32M
        return state;
2823
3.32M
    }
2824
 
2825
    uint32_t append_to_codepoint(uint32_t cp, int c, std::error_code& ec)
2826
13.3M
    {
2827
13.3M
        cp *= 16;
2828
13.3M
        if (c >= '0'  &&  c <= '9')
2829
4.75M
        {
2830
4.75M
            cp += c - '0';
2831
4.75M
        }
2832
8.57M
        else if (c >= 'a'  &&  c <= 'f')
2833
2.15M
        {
2834
2.15M
            cp += c - 'a' + 10;
2835
2.15M
        }
2836
6.41M
        else if (c >= 'A'  &&  c <= 'F')
2837
6.41M
        {
2838
6.41M
            cp += c - 'A' + 10;
2839
6.41M
        }
2840
191
        else
2841
191
        {
2842
191
            more_ = err_handler_(json_errc::invalid_unicode_escape_sequence, *this);
2843
191
            if (!more_)
2844
191
            {
2845
191
                ec = json_errc::invalid_unicode_escape_sequence;
2846
191
                return cp;
2847
191
            }
2848
191
        }
2849
13.3M
        return cp;
2850
13.3M
    }
Unexecuted instantiation: jsoncons::basic_json_parser<wchar_t, std::__1::allocator<char> >::append_to_codepoint(unsigned int, int, std::__1::error_code&)
jsoncons::basic_json_parser<char, std::__1::allocator<char> >::append_to_codepoint(unsigned int, int, std::__1::error_code&)
Line
Count
Source
2826
13.3M
    {
2827
13.3M
        cp *= 16;
2828
13.3M
        if (c >= '0'  &&  c <= '9')
2829
4.75M
        {
2830
4.75M
            cp += c - '0';
2831
4.75M
        }
2832
8.57M
        else if (c >= 'a'  &&  c <= 'f')
2833
2.15M
        {
2834
2.15M
            cp += c - 'a' + 10;
2835
2.15M
        }
2836
6.41M
        else if (c >= 'A'  &&  c <= 'F')
2837
6.41M
        {
2838
6.41M
            cp += c - 'A' + 10;
2839
6.41M
        }
2840
191
        else
2841
191
        {
2842
191
            more_ = err_handler_(json_errc::invalid_unicode_escape_sequence, *this);
2843
191
            if (!more_)
2844
191
            {
2845
191
                ec = json_errc::invalid_unicode_escape_sequence;
2846
191
                return cp;
2847
191
            }
2848
191
        }
2849
13.3M
        return cp;
2850
13.3M
    }
2851
};
2852
2853
using json_parser = basic_json_parser<char>;
2854
using wjson_parser = basic_json_parser<wchar_t>;
2855
2856
}
2857
2858
#endif
2859