Coverage Report

Created: 2026-02-03 06:18

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