_ZN5boost15source_locationC2EPKcjS2_j:
   42|    100|    {
   43|    100|    }
_ZNK5boost15source_location9file_nameEv:
   54|    100|    {
   55|    100|        return file_;
   56|    100|    }
_ZNK5boost15source_location13function_nameEv:
   59|    100|    {
   60|    100|        return function_;
   61|    100|    }
_ZNK5boost15source_location4lineEv:
   64|    100|    {
   65|    100|        return line_;
   66|    100|    }
_ZNK5boost15source_location6columnEv:
   69|    100|    {
   70|    100|        return column_;
   71|    100|    }

_ZnwmPv21boost_container_new_t:
   19|   278k|{  return p;  }

_ZN5boost9container3pmr15memory_resourceD2Ev:
   40|  2.66k|   virtual ~memory_resource(){}
_ZN5boost9container3pmr15memory_resource8allocateEmm:
   45|   278k|   {  
   46|       |      //Obtain a pointer to enough storage and initialize the lifetime 
   47|       |      //of an array object of the given size in the address
   48|   278k|      return ::operator new(bytes, this->do_allocate(bytes, alignment), boost_container_new_t());
   49|   278k|   }
_ZN5boost9container3pmr15memory_resource10deallocateEPvmm:
   54|   268k|   {  return this->do_deallocate(p, bytes, alignment);  }

_ZN5boost4coreeqENS0_17basic_string_viewIcEES2_:
  964|   178k|    {
  965|   178k|        return sv1.size() == sv2.size() && traits_type::compare( sv1.data(), sv2.data(), sv1.size() ) == 0;
  ------------------
  |  Branch (965:16): [True: 170k, False: 7.82k]
  |  Branch (965:44): [True: 168k, False: 2.21k]
  ------------------
  966|   178k|    }
_ZNK5boost4core17basic_string_viewIcE5beginEv:
  450|   172k|    {
  451|   172k|        return p_;
  452|   172k|    }
_ZNK5boost4core17basic_string_viewIcE3endEv:
  455|   172k|    {
  456|   172k|        return p_ + n_;
  457|   172k|    }
_ZN5boost4coreneENS0_17basic_string_viewIcEES2_:
  969|   170k|    {
  970|   170k|        return !( sv1 == sv2 );
  971|   170k|    }

_ZNK5boost4json12basic_parserINS0_6detail7handlerEE4doneEv:
  614|  4.52k|    {
  615|  4.52k|        return done_;
  616|  4.52k|    }
_ZN5boost4json12basic_parserINS0_6detail7handlerEE7handlerEv:
  555|  18.0k|    {
  556|  18.0k|        return h_;
  557|  18.0k|    }
_ZNK5boost4json12basic_parserINS0_6detail7handlerEE5depthEv:
  485|  7.21k|    {
  486|  7.21k|        return opt_.max_depth - depth_;
  487|  7.21k|    }

_ZN5boost4json12basic_parserINS0_6detail7handlerEEC2IJNS0_11storage_ptrERPhRmEEERKNS0_13parse_optionsEDpOT_:
 2656|  4.78k|{
 2657|  4.78k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEEC2IJNS0_11storage_ptrEDniEEERKNS0_13parse_optionsEDpOT_:
 2656|  6.05k|{
 2657|  6.05k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE5resetEv:
 2665|  13.4k|{
 2666|  13.4k|    ec_ = {};
 2667|  13.4k|    st_.clear();
 2668|  13.4k|    more_ = true;
 2669|  13.4k|    done_ = false;
 2670|  13.4k|    clean_ = true;
 2671|  13.4k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE10write_someEbPKcmRNS_6system10error_codeE:
 2701|  18.0k|{
 2702|       |    // see if we exited via exception
 2703|       |    // on the last call to write_some
 2704|  18.0k|    if(! clean_)
  ------------------
  |  Branch (2704:8): [True: 0, False: 18.0k]
  ------------------
 2705|      0|    {
 2706|       |        // prevent UB
 2707|      0|        if(! ec_)
  ------------------
  |  Branch (2707:12): [True: 0, False: 0]
  ------------------
 2708|      0|        {
 2709|      0|            BOOST_JSON_FAIL(ec_, error::exception);
  ------------------
  |  |   20|      0|    BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION; \
  |  |  ------------------
  |  |  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  |  |  ------------------
  |  |   21|      0|    (ec).assign(e, &loc);
  ------------------
 2710|      0|        }
 2711|      0|    }
 2712|  18.0k|    if(ec_)
  ------------------
  |  Branch (2712:8): [True: 0, False: 18.0k]
  ------------------
 2713|      0|    {
 2714|       |        // error is sticky
 2715|      0|        ec = ec_;
 2716|      0|        return 0;
 2717|      0|    }
 2718|  18.0k|    clean_ = false;
 2719|  18.0k|    more_ = more;
 2720|  18.0k|    end_ = data + size;
 2721|  18.0k|    const char* p;
 2722|  18.0k|    if(BOOST_JSON_LIKELY(st_.empty()))
  ------------------
  |  |  171|  18.0k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 10.8k, False: 7.21k]
  |  |  ------------------
  ------------------
 2723|  10.8k|    {
 2724|       |        // first time
 2725|  10.8k|        depth_ = opt_.max_depth;
 2726|  10.8k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  10.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 10.8k]
  |  |  ------------------
  ------------------
 2727|  10.8k|            ! h_.on_document_begin(ec_)))
 2728|      0|        {
 2729|      0|            ec = ec_;
 2730|      0|            return 0;
 2731|      0|        }
 2732|  10.8k|        p = parse_document(data, std::true_type());
 2733|  10.8k|    }
 2734|  7.21k|    else
 2735|  7.21k|    {
 2736|  7.21k|        p = parse_document(data, std::false_type());
 2737|  7.21k|    }
 2738|       |
 2739|  18.0k|    if(BOOST_JSON_LIKELY(p != sentinel()))
  ------------------
  |  |  171|  18.0k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 5.47k, False: 12.5k]
  |  |  ------------------
  ------------------
 2740|  5.47k|    {
 2741|  5.47k|        BOOST_ASSERT(! ec_);
  ------------------
  |  |   60|  5.47k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2742|  5.47k|        if(! done_)
  ------------------
  |  Branch (2742:12): [True: 3.45k, False: 2.01k]
  ------------------
 2743|  3.45k|        {
 2744|  3.45k|            done_ = true;
 2745|  3.45k|            h_.on_document_end(ec_);
 2746|  3.45k|        }
 2747|  5.47k|    }
 2748|  12.5k|    else
 2749|  12.5k|    {
 2750|  12.5k|        if(! ec_)
  ------------------
  |  Branch (2750:12): [True: 9.78k, False: 2.79k]
  ------------------
 2751|  9.78k|        {
 2752|  9.78k|            if(! more_)
  ------------------
  |  Branch (2752:16): [True: 2.57k, False: 7.21k]
  ------------------
 2753|  2.57k|            {
 2754|  2.57k|                BOOST_JSON_FAIL(ec_, error::incomplete);
  ------------------
  |  |   20|  2.57k|    BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION; \
  |  |  ------------------
  |  |  |  |  170|  2.57k|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  |  |  ------------------
  |  |   21|  2.57k|    (ec).assign(e, &loc);
  ------------------
 2755|  2.57k|            }
 2756|  7.21k|            else if(! st_.empty())
  ------------------
  |  Branch (2756:21): [True: 7.21k, False: 0]
  ------------------
 2757|  7.21k|            {
 2758|       |                // consume as much trailing whitespace in
 2759|       |                // the JSON document as possible, but still
 2760|       |                // consider the parse complete
 2761|  7.21k|                state st;
 2762|  7.21k|                st_.peek(st);
 2763|  7.21k|                if( st == state::doc3 &&
  ------------------
  |  Branch (2763:21): [True: 2.01k, False: 5.19k]
  ------------------
 2764|  7.21k|                    ! done_)
  ------------------
  |  Branch (2764:21): [True: 2.01k, False: 0]
  ------------------
 2765|  2.01k|                {
 2766|  2.01k|                    done_ = true;
 2767|  2.01k|                    h_.on_document_end(ec_);
 2768|  2.01k|                }
 2769|  7.21k|            }
 2770|  9.78k|        }
 2771|  12.5k|        p = end_;
 2772|  12.5k|    }
 2773|  18.0k|    ec = ec_;
 2774|  18.0k|    clean_ = true;
 2775|  18.0k|    return p - data;
 2776|  18.0k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE14parse_documentILb1EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  498|  10.8k|{
  499|  10.8k|    detail::const_stream_wrapper cs(p, end_);
  500|  10.8k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (500:8): [Folded - Ignored]
  |  Branch (500:25): [True: 0, False: 0]
  ------------------
  501|      0|    {
  502|      0|        state st;
  503|      0|        st_.pop(st);
  504|      0|        switch(st)
  505|      0|        {
  506|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (506:9): [True: 0, False: 0]
  ------------------
  507|      0|        case state::doc1: goto do_doc1;
  ------------------
  |  Branch (507:9): [True: 0, False: 0]
  ------------------
  508|      0|        case state::doc2: goto do_doc2;
  ------------------
  |  Branch (508:9): [True: 0, False: 0]
  ------------------
  509|      0|        case state::doc3: goto do_doc3;
  ------------------
  |  Branch (509:9): [True: 0, False: 0]
  ------------------
  510|      0|        case state::doc4: goto do_doc4;
  ------------------
  |  Branch (510:9): [True: 0, False: 0]
  ------------------
  511|      0|        }
  512|      0|    }
  513|  10.8k|do_doc1:
  514|  10.8k|    cs = detail::count_whitespace(cs.begin(), cs.end());
  515|  10.8k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  10.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 49, False: 10.7k]
  |  |  ------------------
  ------------------
  516|     49|        return maybe_suspend(cs.begin(), state::doc1);
  517|  10.7k|do_doc2:
  518|  10.7k|    switch(+opt_.allow_comments |
  519|  10.7k|        (opt_.allow_trailing_commas << 1) |
  520|  10.7k|        (opt_.allow_invalid_utf8 << 2))
  521|  10.7k|    {
  522|       |    // no extensions
  523|  1.13k|    default:
  ------------------
  |  Branch (523:5): [True: 1.13k, False: 9.65k]
  ------------------
  524|  1.13k|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::false_type(), std::false_type());
  525|  1.13k|        break;
  526|       |    // comments
  527|  1.09k|    case 1:
  ------------------
  |  Branch (527:5): [True: 1.09k, False: 9.69k]
  ------------------
  528|  1.09k|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::false_type(), std::false_type());
  529|  1.09k|        break;
  530|       |    // trailing
  531|  1.05k|    case 2:
  ------------------
  |  Branch (531:5): [True: 1.05k, False: 9.73k]
  ------------------
  532|  1.05k|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::true_type(), std::false_type());
  533|  1.05k|        break;
  534|       |    // comments & trailing
  535|  1.27k|    case 3:
  ------------------
  |  Branch (535:5): [True: 1.27k, False: 9.51k]
  ------------------
  536|  1.27k|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::true_type(), std::false_type());
  537|  1.27k|        break;
  538|       |    // skip validation
  539|    978|    case 4:
  ------------------
  |  Branch (539:5): [True: 978, False: 9.80k]
  ------------------
  540|    978|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::false_type(), std::true_type());
  541|    978|        break;
  542|       |    // comments & skip validation
  543|  1.17k|    case 5:
  ------------------
  |  Branch (543:5): [True: 1.17k, False: 9.61k]
  ------------------
  544|  1.17k|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::false_type(), std::true_type());
  545|  1.17k|        break;
  546|       |    // trailing & skip validation
  547|  2.21k|    case 6:
  ------------------
  |  Branch (547:5): [True: 2.21k, False: 8.57k]
  ------------------
  548|  2.21k|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::true_type(), std::true_type());
  549|  2.21k|        break;
  550|       |    // comments & trailing & skip validation
  551|  1.86k|    case 7:
  ------------------
  |  Branch (551:5): [True: 1.86k, False: 8.92k]
  ------------------
  552|  1.86k|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::true_type(), std::true_type());
  553|  1.86k|        break;
  554|  10.7k|    }
  555|  10.7k|    if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|  10.7k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 7.73k, False: 2.99k]
  |  |  ------------------
  ------------------
  556|  7.73k|        return suspend_or_fail(state::doc2);
  557|  3.44k|do_doc3:
  558|  3.44k|    cs = detail::count_whitespace(cs.begin(), cs.end());
  559|  3.44k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  3.44k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2.01k, False: 1.42k]
  |  |  ------------------
  ------------------
  560|  2.01k|    {
  561|  2.01k|        if(more_)
  ------------------
  |  Branch (561:12): [True: 2.01k, False: 0]
  ------------------
  562|  2.01k|            return suspend(cs.begin(), state::doc3);
  563|  2.01k|    }
  564|  1.42k|    else if(opt_.allow_comments && *cs == '/')
  ------------------
  |  Branch (564:13): [True: 928, False: 498]
  |  Branch (564:36): [True: 478, False: 450]
  ------------------
  565|    478|    {
  566|    478|do_doc4:
  567|    478|        cs = parse_comment(cs.begin(), stack_empty, std::true_type());
  568|    478|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    478|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 23, False: 455]
  |  |  ------------------
  ------------------
  569|     23|            return suspend_or_fail(state::doc4);
  570|    455|        goto do_doc3;
  571|    478|    }
  572|    948|    return cs.begin();
  573|  3.44k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE13maybe_suspendEPKcNS4_5stateE:
  306|    781|{
  307|    781|    end_ = p;
  308|    781|    if(BOOST_JSON_LIKELY(more_))
  ------------------
  |  |  171|    781|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 393, False: 388]
  |  |  ------------------
  ------------------
  309|    393|    {
  310|       |        // suspend
  311|    393|        reserve();
  312|    393|        st_.push_unchecked(st);
  313|    393|    }
  314|    781|    return sentinel();
  315|    781|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE7reserveEv:
  194|  14.6k|{
  195|  14.6k|    if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  14.6k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 7.42k, False: 7.21k]
  |  |  ------------------
  ------------------
  196|  14.6k|        ! st_.empty()))
  197|  7.42k|        return;
  198|       |    // Reserve the largest stack we need,
  199|       |    // to avoid reallocation during suspend.
  200|  7.21k|    st_.reserve(
  201|  7.21k|        sizeof(state) + // document parsing state
  202|  7.21k|        (sizeof(state) +
  203|  7.21k|            sizeof(std::size_t)) * depth() + // array and object state + size
  204|  7.21k|        sizeof(state) + // value parsing state
  205|  7.21k|        sizeof(std::size_t) + // string size
  206|  7.21k|        sizeof(state)); // comment state
  207|  7.21k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_valueILb1ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
  588|  3.11M|{
  589|  3.11M|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (589:8): [Folded - Ignored]
  |  Branch (589:23): [True: 0, False: 0]
  ------------------
  590|  3.11M|    {
  591|  3.11M|loop:
  592|  3.11M|        switch(*p)
  593|  3.11M|        {
  594|   211k|        case '0':
  ------------------
  |  Branch (594:9): [True: 211k, False: 2.90M]
  ------------------
  595|   211k|            return parse_number(p, std::true_type(), std::integral_constant<char, '0'>());
  596|  12.9k|        case '-':
  ------------------
  |  Branch (596:9): [True: 12.9k, False: 3.10M]
  ------------------
  597|  12.9k|            return parse_number(p, std::true_type(), std::integral_constant<char, '-'>());
  598|  1.87M|        case '1': case '2': case '3':
  ------------------
  |  Branch (598:9): [True: 33.3k, False: 3.08M]
  |  Branch (598:19): [True: 10.7k, False: 3.10M]
  |  Branch (598:29): [True: 1.83M, False: 1.28M]
  ------------------
  599|  1.91M|        case '4': case '5': case '6':
  ------------------
  |  Branch (599:9): [True: 10.5k, False: 3.10M]
  |  Branch (599:19): [True: 10.3k, False: 3.10M]
  |  Branch (599:29): [True: 14.1k, False: 3.10M]
  ------------------
  600|  2.83M|        case '7': case '8': case '9':
  ------------------
  |  Branch (600:9): [True: 807k, False: 2.30M]
  |  Branch (600:19): [True: 92.3k, False: 3.02M]
  |  Branch (600:29): [True: 19.2k, False: 3.09M]
  ------------------
  601|  2.83M|            return parse_number(p, std::true_type(), std::integral_constant<char, '+'>());
  602|  4.15k|        case 't':
  ------------------
  |  Branch (602:9): [True: 4.15k, False: 3.11M]
  ------------------
  603|  4.15k|            return parse_true(p, std::true_type());
  604|  9.22k|        case 'f':
  ------------------
  |  Branch (604:9): [True: 9.22k, False: 3.10M]
  ------------------
  605|  9.22k|            return parse_false(p, std::true_type());
  606|  7.78k|        case 'n':
  ------------------
  |  Branch (606:9): [True: 7.78k, False: 3.10M]
  ------------------
  607|  7.78k|            return parse_null(p, std::true_type());
  608|  26.4k|        case '"':
  ------------------
  |  Branch (608:9): [True: 26.4k, False: 3.09M]
  ------------------
  609|  26.4k|            return parse_unescaped(p, std::true_type(), std::false_type(), allow_bad_utf8);
  610|  9.75k|        case '[':
  ------------------
  |  Branch (610:9): [True: 9.75k, False: 3.10M]
  ------------------
  611|  9.75k|            return parse_array(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  612|  4.91k|        case '{':
  ------------------
  |  Branch (612:9): [True: 4.91k, False: 3.11M]
  ------------------
  613|  4.91k|            return parse_object(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  614|      2|        case '/':
  ------------------
  |  Branch (614:9): [True: 2, False: 3.11M]
  ------------------
  615|      2|            if(! allow_comments)
  ------------------
  |  Branch (615:16): [Folded - Ignored]
  ------------------
  616|      2|            {
  617|      2|                BOOST_STATIC_CONSTEXPR source_location loc
  618|      2|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      2|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  619|      2|                return fail(p, error::syntax, &loc);
  620|      2|            }
  621|      0|            p = parse_comment(p, stack_empty, std::false_type());
  622|       |            // KRYSTIAN NOTE: incomplete takes const_stream, we either
  623|       |            // can add an overload, change the existing one to take a pointer,
  624|       |            // or just leave it as is
  625|      0|            if(BOOST_JSON_UNLIKELY(p == sentinel()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  626|      0|                return maybe_suspend(p, state::val2);
  627|       |            // intentional fallthrough
  628|      0|        case ' ':
  ------------------
  |  Branch (628:9): [True: 0, False: 3.11M]
  ------------------
  629|      0|        case '\t':
  ------------------
  |  Branch (629:9): [True: 0, False: 3.11M]
  ------------------
  630|      0|        case '\n':
  ------------------
  |  Branch (630:9): [True: 0, False: 3.11M]
  ------------------
  631|      0|        case '\r':
  ------------------
  |  Branch (631:9): [True: 0, False: 3.11M]
  ------------------
  632|      0|            p = detail::count_whitespace(p, end_);
  633|      0|            if(BOOST_JSON_UNLIKELY(p == end_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  634|      0|                return maybe_suspend(p, state::val1);
  635|      0|            goto loop;
  636|    216|        default:
  ------------------
  |  Branch (636:9): [True: 216, False: 3.11M]
  ------------------
  637|    216|            {
  638|    216|                BOOST_STATIC_CONSTEXPR source_location loc
  639|    216|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|    216|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  640|    216|                return fail(p, error::syntax, &loc);
  641|      0|            }
  642|  3.11M|        }
  643|  3.11M|    }
  644|      0|    return resume_value(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  645|  3.11M|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_numberILb1ELc48EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IcXT0_EEE:
 1991|   241k|{
 1992|       |    // only one of these will be true if we are not resuming
 1993|       |    // if negative then !zero_first && !nonzero_first
 1994|       |    // if zero_first then !nonzero_first && !negative
 1995|       |    // if nonzero_first then !zero_first && !negative
 1996|   241k|    bool const negative = first == '-';
 1997|   241k|    bool const zero_first = first == '0';
 1998|   241k|    bool const nonzero_first = first == '+';
 1999|   241k|    detail::const_stream_wrapper cs(p, end_);
 2000|   241k|    number num;
 2001|   241k|    const char* begin = cs.begin();
 2002|   241k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (2002:8): [Folded - Ignored]
  |  Branch (2002:23): [True: 0, False: 0]
  ------------------
 2003|   241k|    {
 2004|   241k|        num.bias = 0;
 2005|   241k|        num.exp = 0;
 2006|   241k|        num.frac = false;
 2007|       |
 2008|       |        //----------------------------------
 2009|       |        //
 2010|       |        // '-'
 2011|       |        // leading minus sign
 2012|       |        //
 2013|   241k|        BOOST_ASSERT(cs);
  ------------------
  |  |   60|   241k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2014|   241k|        if(negative)
  ------------------
  |  Branch (2014:12): [Folded - Ignored]
  ------------------
 2015|      0|            ++cs;
 2016|       |
 2017|   241k|        num.neg = negative;
 2018|   241k|        num.frac = false;
 2019|   241k|        num.exp = 0;
 2020|   241k|        num.bias = 0;
 2021|       |
 2022|       |        // fast path
 2023|   241k|        if( cs.remain() >= 16 + 1 + 16 ) // digits . digits
  ------------------
  |  Branch (2023:13): [True: 239k, False: 2.63k]
  ------------------
 2024|   239k|        {
 2025|   239k|            int n1;
 2026|       |
 2027|   239k|            if( nonzero_first ||
  ------------------
  |  Branch (2027:17): [Folded - Ignored]
  ------------------
 2028|   239k|                (negative && *cs != '0') )
  ------------------
  |  Branch (2028:18): [Folded - Ignored]
  |  Branch (2028:30): [True: 0, False: 0]
  ------------------
 2029|      0|            {
 2030|      0|                n1 = detail::count_digits( cs.begin() );
 2031|      0|                BOOST_ASSERT(n1 >= 0 && n1 <= 16);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2032|       |
 2033|      0|                if( ! nonzero_first && n1 == 0 )
  ------------------
  |  Branch (2033:21): [Folded - Ignored]
  |  Branch (2033:40): [True: 0, False: 0]
  ------------------
 2034|      0|                {
 2035|       |                    // digit required
 2036|      0|                    BOOST_STATIC_CONSTEXPR source_location loc
 2037|      0|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2038|      0|                    return fail(cs.begin(), error::syntax, &loc);
 2039|      0|                }
 2040|       |
 2041|      0|                num.mant = detail::parse_unsigned( 0, cs.begin(), n1 );
 2042|       |
 2043|      0|                cs += n1;
 2044|       |
 2045|       |                // integer or floating-point with
 2046|       |                // >= 16 leading digits
 2047|      0|                if( n1 == 16 )
  ------------------
  |  Branch (2047:21): [True: 0, False: 0]
  ------------------
 2048|      0|                {
 2049|      0|                    goto do_num2;
 2050|      0|                }
 2051|      0|            }
 2052|   239k|            else
 2053|   239k|            {
 2054|       |                // 0. floating-point or 0e integer
 2055|   239k|                num.mant = 0;
 2056|   239k|                n1 = 0;
 2057|   239k|                ++cs;
 2058|   239k|            }
 2059|       |
 2060|   239k|            {
 2061|   239k|                const char c = *cs;
 2062|   239k|                if(c != '.')
  ------------------
  |  Branch (2062:20): [True: 235k, False: 3.02k]
  ------------------
 2063|   235k|                {
 2064|   235k|                    if((c | 32) == 'e')
  ------------------
  |  Branch (2064:24): [True: 4.16k, False: 231k]
  ------------------
 2065|  4.16k|                    {
 2066|  4.16k|                        ++cs;
 2067|  4.16k|                        goto do_exp1;
 2068|  4.16k|                    }
 2069|   231k|                    if(negative)
  ------------------
  |  Branch (2069:24): [Folded - Ignored]
  ------------------
 2070|      0|                        num.mant = ~num.mant + 1;
 2071|   231k|                    goto finish_signed;
 2072|   235k|                }
 2073|   239k|            }
 2074|       |
 2075|       |            // floating-point number
 2076|       |
 2077|  3.02k|            ++cs;
 2078|       |
 2079|  3.02k|            int n2 = detail::count_digits( cs.begin() );
 2080|  3.02k|            BOOST_ASSERT(n2 >= 0 && n2 <= 16);
  ------------------
  |  |   60|  3.02k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2081|       |
 2082|  3.02k|            if( n2 == 0 )
  ------------------
  |  Branch (2082:17): [True: 1, False: 3.02k]
  ------------------
 2083|      1|            {
 2084|       |                // digit required
 2085|      1|                BOOST_STATIC_CONSTEXPR source_location loc
 2086|      1|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      1|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2087|      1|                return fail(cs.begin(), error::syntax, &loc);
 2088|      1|            }
 2089|       |
 2090|       |            // floating-point mantissa overflow
 2091|  3.02k|            if( n1 + n2 >= 19 )
  ------------------
  |  Branch (2091:17): [True: 0, False: 3.02k]
  ------------------
 2092|      0|            {
 2093|      0|                goto do_num7;
 2094|      0|            }
 2095|       |
 2096|  3.02k|            num.mant = detail::parse_unsigned( num.mant, cs.begin(), n2 );
 2097|       |
 2098|  3.02k|            BOOST_ASSERT(num.bias == 0);
  ------------------
  |  |   60|  3.02k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2099|       |
 2100|  3.02k|            num.bias -= n2;
 2101|       |
 2102|  3.02k|            cs += n2;
 2103|       |
 2104|  3.02k|            char ch = *cs;
 2105|       |
 2106|  3.02k|            if( (ch | 32) == 'e' )
  ------------------
  |  Branch (2106:17): [True: 241, False: 2.78k]
  ------------------
 2107|    241|            {
 2108|    241|                ++cs;
 2109|    241|                goto do_exp1;
 2110|    241|            }
 2111|  2.78k|            else if( ch >= '0' && ch <= '9' )
  ------------------
  |  Branch (2111:22): [True: 1.22k, False: 1.56k]
  |  Branch (2111:35): [True: 1.02k, False: 198]
  ------------------
 2112|  1.02k|            {
 2113|  1.02k|                goto do_num8;
 2114|  1.02k|            }
 2115|       |
 2116|  1.76k|            goto finish_dub;
 2117|  3.02k|        }
 2118|   241k|    }
 2119|      0|    else
 2120|      0|    {
 2121|      0|        num = num_;
 2122|      0|        state st;
 2123|      0|        st_.pop(st);
 2124|      0|        switch(st)
 2125|      0|        {
 2126|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (2126:9): [True: 0, False: 0]
  ------------------
 2127|      0|        case state::num1: goto do_num1;
  ------------------
  |  Branch (2127:9): [True: 0, False: 0]
  ------------------
 2128|      0|        case state::num2: goto do_num2;
  ------------------
  |  Branch (2128:9): [True: 0, False: 0]
  ------------------
 2129|      0|        case state::num3: goto do_num3;
  ------------------
  |  Branch (2129:9): [True: 0, False: 0]
  ------------------
 2130|      0|        case state::num4: goto do_num4;
  ------------------
  |  Branch (2130:9): [True: 0, False: 0]
  ------------------
 2131|      0|        case state::num5: goto do_num5;
  ------------------
  |  Branch (2131:9): [True: 0, False: 0]
  ------------------
 2132|      0|        case state::num6: goto do_num6;
  ------------------
  |  Branch (2132:9): [True: 0, False: 0]
  ------------------
 2133|      0|        case state::num7: goto do_num7;
  ------------------
  |  Branch (2133:9): [True: 0, False: 0]
  ------------------
 2134|      0|        case state::num8: goto do_num8;
  ------------------
  |  Branch (2134:9): [True: 0, False: 0]
  ------------------
 2135|      0|        case state::exp1: goto do_exp1;
  ------------------
  |  Branch (2135:9): [True: 0, False: 0]
  ------------------
 2136|      0|        case state::exp2: goto do_exp2;
  ------------------
  |  Branch (2136:9): [True: 0, False: 0]
  ------------------
 2137|      0|        case state::exp3: goto do_exp3;
  ------------------
  |  Branch (2137:9): [True: 0, False: 0]
  ------------------
 2138|      0|        }
 2139|      0|    }
 2140|       |
 2141|       |    //----------------------------------
 2142|       |    //
 2143|       |    // DIGIT
 2144|       |    // first digit
 2145|       |    //
 2146|  2.63k|do_num1:
 2147|  2.63k|    if(zero_first || nonzero_first ||
  ------------------
  |  Branch (2147:8): [Folded - Ignored]
  |  Branch (2147:22): [Folded - Ignored]
  ------------------
 2148|  2.63k|        BOOST_JSON_LIKELY(cs))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2149|  2.63k|    {
 2150|  2.63k|        char const c = *cs;
 2151|  2.63k|        if(zero_first)
  ------------------
  |  Branch (2151:12): [Folded - Ignored]
  ------------------
 2152|  2.63k|        {
 2153|  2.63k|            ++cs;
 2154|  2.63k|            num.mant = 0;
 2155|  2.63k|            goto do_num6;
 2156|  2.63k|        }
 2157|      0|        else if(nonzero_first || BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (2157:17): [Folded - Ignored]
  ------------------
 2158|      0|            c >= '1' && c <= '9'))
 2159|      0|        {
 2160|      0|            ++cs;
 2161|      0|            num.mant = c - '0';
 2162|      0|        }
 2163|      0|        else if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2164|      0|            c == '0'))
 2165|      0|        {
 2166|      0|            ++cs;
 2167|      0|            num.mant = 0;
 2168|      0|            goto do_num6;
 2169|      0|        }
 2170|      0|        else
 2171|      0|        {
 2172|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2173|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2174|      0|            return fail(cs.begin(), error::syntax, &loc);
 2175|      0|        }
 2176|  2.63k|    }
 2177|      0|    else
 2178|      0|    {
 2179|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2180|      0|            ! h_.on_number_part(
 2181|      0|                {begin, cs.used(begin)}, ec_)))
 2182|      0|            return fail(cs.begin());
 2183|      0|        return maybe_suspend(
 2184|      0|            cs.begin(), state::num1, num);
 2185|      0|    }
 2186|       |
 2187|       |    //----------------------------------
 2188|       |    //
 2189|       |    // 1*DIGIT
 2190|       |    // significant digits left of decimal
 2191|       |    //
 2192|      0|do_num2:
 2193|      0|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2193:8): [Folded - Ignored]
  |  Branch (2193:21): [Folded - Ignored]
  |  Branch (2193:37): [True: 0, False: 0]
  ------------------
 2194|      0|    {
 2195|      0|        for(;;)
 2196|      0|        {
 2197|      0|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2198|      0|            {
 2199|      0|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2200|      0|                {
 2201|      0|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2202|      0|                        ! h_.on_number_part(
 2203|      0|                            {begin, cs.used(begin)}, ec_)))
 2204|      0|                        return fail(cs.begin());
 2205|      0|                    return suspend(cs.begin(), state::num2, num);
 2206|      0|                }
 2207|      0|                goto finish_int;
 2208|      0|            }
 2209|      0|            char const c = *cs;
 2210|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2211|      0|                c >= '0' && c <= '9'))
 2212|      0|            {
 2213|      0|                ++cs;
 2214|       |                //              9223372036854775808 INT64_MIN
 2215|      0|                if( num.mant  > 922337203685477580 || (
  ------------------
  |  Branch (2215:21): [True: 0, False: 0]
  ------------------
 2216|      0|                    num.mant == 922337203685477580 && c > '8'))
  ------------------
  |  Branch (2216:21): [True: 0, False: 0]
  |  Branch (2216:55): [True: 0, False: 0]
  ------------------
 2217|      0|                    break;
 2218|      0|                num.mant = 10 * num.mant + ( c - '0' );
 2219|      0|                continue;
 2220|      0|            }
 2221|      0|            goto do_num6; // [.eE]
 2222|      0|        }
 2223|      0|    }
 2224|      0|    else
 2225|      0|    {
 2226|      0|        for(;;)
 2227|      0|        {
 2228|      0|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2229|      0|            {
 2230|      0|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2231|      0|                {
 2232|      0|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2233|      0|                        ! h_.on_number_part(
 2234|      0|                            {begin, cs.used(begin)}, ec_)))
 2235|      0|                        return fail(cs.begin());
 2236|      0|                    return suspend(cs.begin(), state::num2, num);
 2237|      0|                }
 2238|      0|                goto finish_int;
 2239|      0|            }
 2240|      0|            char const c = *cs;
 2241|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2242|      0|                c >= '0' && c <= '9'))
 2243|      0|            {
 2244|      0|                ++cs;
 2245|       |                //              18446744073709551615 UINT64_MAX
 2246|      0|                if( num.mant  > 1844674407370955161 || (
  ------------------
  |  Branch (2246:21): [True: 0, False: 0]
  ------------------
 2247|      0|                    num.mant == 1844674407370955161 && c > '5'))
  ------------------
  |  Branch (2247:21): [True: 0, False: 0]
  |  Branch (2247:56): [True: 0, False: 0]
  ------------------
 2248|      0|                    break;
 2249|      0|                num.mant = 10 * num.mant + ( c - '0' );
 2250|      0|            }
 2251|      0|            else
 2252|      0|            {
 2253|      0|                goto do_num6; // [.eE]
 2254|      0|            }
 2255|      0|        }
 2256|      0|    }
 2257|      0|    ++num.bias;
 2258|       |
 2259|       |    //----------------------------------
 2260|       |    //
 2261|       |    // 1*DIGIT
 2262|       |    // non-significant digits left of decimal
 2263|       |    //
 2264|      0|do_num3:
 2265|      0|    for(;;)
 2266|      0|    {
 2267|      0|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2268|      0|        {
 2269|      0|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2270|      0|            {
 2271|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2272|      0|                    ! h_.on_number_part(
 2273|      0|                        {begin, cs.used(begin)}, ec_)))
 2274|      0|                    return fail(cs.begin());
 2275|      0|                return suspend(cs.begin(), state::num3, num);
 2276|      0|            }
 2277|      0|            goto finish_dub;
 2278|      0|        }
 2279|      0|        char const c = *cs;
 2280|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2281|      0|            c >= '0' && c <= '9'))
 2282|      0|        {
 2283|      0|            ++cs;
 2284|       |            // VFALCO check overflow
 2285|      0|            ++num.bias;
 2286|      0|        }
 2287|      0|        else if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2288|      0|            c == '.'))
 2289|      0|        {
 2290|      0|            ++cs;
 2291|      0|            break;
 2292|      0|        }
 2293|      0|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2293:17): [True: 0, False: 0]
  ------------------
 2294|      0|        {
 2295|      0|            ++cs;
 2296|      0|            goto do_exp1;
 2297|      0|        }
 2298|      0|        else
 2299|      0|        {
 2300|      0|            goto finish_dub;
 2301|      0|        }
 2302|      0|    }
 2303|       |
 2304|       |    //----------------------------------
 2305|       |    //
 2306|       |    // DIGIT
 2307|       |    // first non-significant digit
 2308|       |    // to the right of decimal
 2309|       |    //
 2310|      0|do_num4:
 2311|      0|    {
 2312|      0|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2313|      0|        {
 2314|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2315|      0|                ! h_.on_number_part(
 2316|      0|                    {begin, cs.used(begin)}, ec_)))
 2317|      0|                return fail(cs.begin());
 2318|      0|            return maybe_suspend(
 2319|      0|                cs.begin(), state::num4, num);
 2320|      0|        }
 2321|      0|        char const c = *cs;
 2322|      0|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2323|       |            //static_cast<unsigned char>(c - '0') < 10))
 2324|      0|            c >= '0' && c <= '9'))
 2325|      0|        {
 2326|      0|            ++cs;
 2327|      0|        }
 2328|      0|        else
 2329|      0|        {
 2330|       |            // digit required
 2331|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2332|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2333|      0|            return fail(cs.begin(), error::syntax, &loc);
 2334|      0|        }
 2335|      0|    }
 2336|       |
 2337|       |    //----------------------------------
 2338|       |    //
 2339|       |    // 1*DIGIT
 2340|       |    // non-significant digits
 2341|       |    // to the right of decimal
 2342|       |    //
 2343|    658|do_num5:
 2344|    658|    for(;;)
 2345|  1.87k|    {
 2346|  1.87k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  1.87k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 16, False: 1.85k]
  |  |  ------------------
  ------------------
 2347|     16|        {
 2348|     16|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     16|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 16, False: 0]
  |  |  ------------------
  ------------------
 2349|     16|            {
 2350|     16|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     16|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 16]
  |  |  ------------------
  ------------------
 2351|     16|                    ! h_.on_number_part(
 2352|     16|                        {begin, cs.used(begin)}, ec_)))
 2353|      0|                    return fail(cs.begin());
 2354|     16|                return suspend(cs.begin(), state::num5, num);
 2355|     16|            }
 2356|      0|            goto finish_dub;
 2357|     16|        }
 2358|  1.85k|        char const c = *cs;
 2359|  1.85k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  3.26k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.21k, False: 642]
  |  |  |  Branch (171:52): [True: 1.41k, False: 443]
  |  |  |  Branch (171:52): [True: 1.21k, False: 199]
  |  |  ------------------
  ------------------
 2360|  1.85k|            c >= '0' && c <= '9'))
 2361|  1.21k|        {
 2362|  1.21k|            ++cs;
 2363|  1.21k|        }
 2364|    642|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2364:17): [True: 198, False: 444]
  ------------------
 2365|    198|        {
 2366|    198|            ++cs;
 2367|    198|            goto do_exp1;
 2368|    198|        }
 2369|    444|        else
 2370|    444|        {
 2371|    444|            goto finish_dub;
 2372|    444|        }
 2373|  1.85k|    }
 2374|       |
 2375|       |    //----------------------------------
 2376|       |    //
 2377|       |    // [.eE]
 2378|       |    //
 2379|  2.63k|do_num6:
 2380|  2.63k|    {
 2381|  2.63k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.63k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 2.60k]
  |  |  ------------------
  ------------------
 2382|     33|        {
 2383|     33|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 0]
  |  |  ------------------
  ------------------
 2384|     33|            {
 2385|     33|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 33]
  |  |  ------------------
  ------------------
 2386|     33|                    ! h_.on_number_part(
 2387|     33|                        {begin, cs.used(begin)}, ec_)))
 2388|      0|                    return fail(cs.begin());
 2389|     33|                return suspend(cs.begin(), state::num6, num);
 2390|     33|            }
 2391|      0|            goto finish_int;
 2392|     33|        }
 2393|  2.60k|        char const c = *cs;
 2394|  2.60k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  2.60k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 411, False: 2.19k]
  |  |  ------------------
  ------------------
 2395|  2.60k|            c == '.'))
 2396|    411|        {
 2397|    411|            ++cs;
 2398|    411|        }
 2399|  2.19k|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2399:17): [True: 618, False: 1.57k]
  ------------------
 2400|    618|        {
 2401|    618|            ++cs;
 2402|    618|            goto do_exp1;
 2403|    618|        }
 2404|  1.57k|        else
 2405|  1.57k|        {
 2406|  1.57k|            goto finish_int;
 2407|  1.57k|        }
 2408|  2.60k|    }
 2409|       |
 2410|       |    //----------------------------------
 2411|       |    //
 2412|       |    // DIGIT
 2413|       |    // first significant digit
 2414|       |    // to the right of decimal
 2415|       |    //
 2416|    411|do_num7:
 2417|    411|    {
 2418|    411|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    411|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 6, False: 405]
  |  |  ------------------
  ------------------
 2419|      6|        {
 2420|      6|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      6|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 6, False: 0]
  |  |  ------------------
  ------------------
 2421|      6|            {
 2422|      6|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      6|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 6]
  |  |  ------------------
  ------------------
 2423|      6|                    ! h_.on_number_part(
 2424|      6|                        {begin, cs.used(begin)}, ec_)))
 2425|      0|                    return fail(cs.begin());
 2426|      6|                return suspend(cs.begin(), state::num7, num);
 2427|      6|            }
 2428|       |            // digit required
 2429|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2430|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2431|      0|            return fail(cs.begin(), error::syntax, &loc);
 2432|      6|        }
 2433|    405|        char const c = *cs;
 2434|    405|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    801|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 12, False: 393]
  |  |  |  Branch (179:54): [True: 9, False: 396]
  |  |  |  Branch (179:54): [True: 3, False: 393]
  |  |  ------------------
  ------------------
 2435|    405|            c < '0' || c > '9'))
 2436|     12|        {
 2437|       |            // digit required
 2438|     12|            BOOST_STATIC_CONSTEXPR source_location loc
 2439|     12|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     12|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2440|     12|            return fail(cs.begin(), error::syntax, &loc);
 2441|     12|        }
 2442|    405|    }
 2443|       |
 2444|       |    //----------------------------------
 2445|       |    //
 2446|       |    // 1*DIGIT
 2447|       |    // significant digits
 2448|       |    // to the right of decimal
 2449|       |    //
 2450|  1.41k|do_num8:
 2451|  1.41k|    for(;;)
 2452|  4.02k|    {
 2453|  4.02k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.02k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 90, False: 3.93k]
  |  |  ------------------
  ------------------
 2454|     90|        {
 2455|     90|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     90|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 90, False: 0]
  |  |  ------------------
  ------------------
 2456|     90|            {
 2457|     90|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     90|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 90]
  |  |  ------------------
  ------------------
 2458|     90|                    ! h_.on_number_part(
 2459|     90|                        {begin, cs.used(begin)}, ec_)))
 2460|      0|                    return fail(cs.begin());
 2461|     90|                return suspend(cs.begin(), state::num8, num);
 2462|     90|            }
 2463|      0|            goto finish_dub;
 2464|     90|        }
 2465|  3.93k|        char const c = *cs;
 2466|  3.93k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  7.44k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 3.26k, False: 668]
  |  |  |  Branch (171:52): [True: 3.51k, False: 416]
  |  |  |  Branch (171:52): [True: 3.26k, False: 252]
  |  |  ------------------
  ------------------
 2467|  3.93k|            c >= '0' && c <= '9'))
 2468|  3.26k|        {
 2469|  3.26k|            ++cs;
 2470|  3.26k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  3.26k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.60k, False: 658]
  |  |  ------------------
  ------------------
 2471|  3.26k|                num.mant <= 9007199254740991)) // 2^53-1
 2472|  2.60k|            {
 2473|  2.60k|                --num.bias;
 2474|  2.60k|                num.mant = 10 * num.mant + ( c - '0' );
 2475|  2.60k|            }
 2476|    658|            else
 2477|    658|            {
 2478|    658|                goto do_num5;
 2479|    658|            }
 2480|  3.26k|        }
 2481|    668|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2481:17): [True: 229, False: 439]
  ------------------
 2482|    229|        {
 2483|    229|            ++cs;
 2484|    229|            goto do_exp1;
 2485|    229|        }
 2486|    439|        else
 2487|    439|        {
 2488|    439|            goto finish_dub;
 2489|    439|        }
 2490|  3.93k|    }
 2491|       |
 2492|       |    //----------------------------------
 2493|       |    //
 2494|       |    // *[+-]
 2495|       |    //
 2496|  5.45k|do_exp1:
 2497|  5.45k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  5.45k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 23, False: 5.42k]
  |  |  ------------------
  ------------------
 2498|     23|    {
 2499|     23|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     23|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 23]
  |  |  ------------------
  ------------------
 2500|     23|            ! h_.on_number_part(
 2501|     23|                {begin, cs.used(begin)}, ec_)))
 2502|      0|            return fail(cs.begin());
 2503|     23|        return maybe_suspend(
 2504|     23|            cs.begin(), state::exp1, num);
 2505|     23|    }
 2506|  5.42k|    if(*cs == '+')
  ------------------
  |  Branch (2506:8): [True: 197, False: 5.23k]
  ------------------
 2507|    197|    {
 2508|    197|        ++cs;
 2509|    197|    }
 2510|  5.23k|    else if(*cs == '-')
  ------------------
  |  Branch (2510:13): [True: 1.37k, False: 3.86k]
  ------------------
 2511|  1.37k|    {
 2512|  1.37k|        ++cs;
 2513|  1.37k|        num.frac = true;
 2514|  1.37k|    }
 2515|       |
 2516|       |    //----------------------------------
 2517|       |    //
 2518|       |    // DIGIT
 2519|       |    // first digit of the exponent
 2520|       |    //
 2521|  5.42k|do_exp2:
 2522|  5.42k|    {
 2523|  5.42k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  5.42k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 15, False: 5.41k]
  |  |  ------------------
  ------------------
 2524|     15|        {
 2525|     15|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     15|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 15, False: 0]
  |  |  ------------------
  ------------------
 2526|     15|            {
 2527|     15|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     15|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 15]
  |  |  ------------------
  ------------------
 2528|     15|                    ! h_.on_number_part(
 2529|     15|                        {begin, cs.used(begin)}, ec_)))
 2530|      0|                    return fail(cs.begin());
 2531|     15|                return suspend(cs.begin(), state::exp2, num);
 2532|     15|            }
 2533|       |            // digit required
 2534|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2535|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2536|      0|            return fail(cs.begin(), error::syntax, &loc);
 2537|     15|        }
 2538|  5.41k|        char const c = *cs;
 2539|  5.41k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  10.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 28, False: 5.38k]
  |  |  |  Branch (179:54): [True: 18, False: 5.39k]
  |  |  |  Branch (179:54): [True: 10, False: 5.38k]
  |  |  ------------------
  ------------------
 2540|  5.41k|            c < '0' || c > '9'))
 2541|     28|        {
 2542|       |            // digit required
 2543|     28|            BOOST_STATIC_CONSTEXPR source_location loc
 2544|     28|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     28|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2545|     28|            return fail(cs.begin(), error::syntax, &loc);
 2546|     28|        }
 2547|  5.38k|        ++cs;
 2548|  5.38k|        num.exp = c - '0';
 2549|  5.38k|    }
 2550|       |
 2551|       |    //----------------------------------
 2552|       |    //
 2553|       |    // 1*DIGIT
 2554|       |    // subsequent digits in the exponent
 2555|       |    //
 2556|  5.38k|do_exp3:
 2557|  5.38k|    for(;;)
 2558|  12.3k|    {
 2559|  12.3k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  12.3k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 118, False: 12.2k]
  |  |  ------------------
  ------------------
 2560|    118|        {
 2561|    118|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    118|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 118, False: 0]
  |  |  ------------------
  ------------------
 2562|    118|            {
 2563|    118|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    118|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 118]
  |  |  ------------------
  ------------------
 2564|    118|                    ! h_.on_number_part(
 2565|    118|                        {begin, cs.used(begin)}, ec_)))
 2566|      0|                    return fail(cs.begin());
 2567|    118|                return suspend(cs.begin(), state::exp3, num);
 2568|    118|            }
 2569|    118|        }
 2570|  12.2k|        else
 2571|  12.2k|        {
 2572|  12.2k|            char const c = *cs;
 2573|  12.2k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  19.2k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 6.94k, False: 5.25k]
  |  |  |  Branch (171:52): [True: 7.03k, False: 5.16k]
  |  |  |  Branch (171:52): [True: 6.94k, False: 92]
  |  |  ------------------
  ------------------
 2574|  12.2k|                c >= '0' && c <= '9'))
 2575|  6.94k|            {
 2576|  6.94k|                if(BOOST_JSON_UNLIKELY
  ------------------
  |  |  179|  21.0k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 8, False: 6.93k]
  |  |  |  Branch (179:54): [True: 208, False: 6.73k]
  |  |  |  Branch (179:54): [True: 2, False: 206]
  |  |  |  Branch (179:54): [True: 6, False: 6.93k]
  |  |  ------------------
  ------------------
 2577|       |                //              2147483647 INT_MAX
 2578|  6.94k|                    (num.exp  > 214748364 || (
 2579|  6.94k|                        num.exp == 214748364 && c > '7')))
 2580|      8|                {
 2581|      8|                    BOOST_STATIC_CONSTEXPR source_location loc
 2582|      8|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      8|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2583|      8|                    return fail(cs.begin(), error::exponent_overflow, &loc);
 2584|      8|                }
 2585|  6.93k|                ++cs;
 2586|  6.93k|                num.exp = 10 * num.exp + ( c - '0' );
 2587|  6.93k|                continue;
 2588|  6.94k|            }
 2589|  12.2k|        }
 2590|  5.25k|        BOOST_ASSERT(num.exp >= 0);
  ------------------
  |  |   60|  5.25k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2591|  5.25k|        if ( num.frac )
  ------------------
  |  Branch (2591:14): [True: 1.32k, False: 3.93k]
  ------------------
 2592|  1.32k|        {
 2593|  1.32k|            if (BOOST_JSON_UNLIKELY( num.bias  < (INT_MIN + num.exp) ))
  ------------------
  |  |  179|  1.32k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1, False: 1.32k]
  |  |  ------------------
  ------------------
 2594|      1|            {
 2595|      1|                BOOST_STATIC_CONSTEXPR source_location loc
 2596|      1|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      1|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2597|      1|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2598|      1|            }
 2599|  1.32k|        }
 2600|  3.93k|        else
 2601|  3.93k|        {
 2602|  3.93k|            if (BOOST_JSON_UNLIKELY( num.bias > (INT_MAX - num.exp) ))
  ------------------
  |  |  179|  3.93k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 3.93k]
  |  |  ------------------
  ------------------
 2603|      0|            {
 2604|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 2605|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2606|      0|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2607|      0|            }
 2608|  3.93k|        }
 2609|  5.25k|        goto finish_dub;
 2610|  5.25k|    }
 2611|       |
 2612|  1.57k|finish_int:
 2613|  1.57k|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2613:8): [Folded - Ignored]
  |  Branch (2613:21): [Folded - Ignored]
  |  Branch (2613:37): [True: 0, False: 0]
  ------------------
 2614|      0|    {
 2615|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2616|      0|            ! h_.on_int64(static_cast<
 2617|      0|                int64_t>(~num.mant + 1), {begin, cs.used(begin)}, ec_)))
 2618|      0|            return fail(cs.begin());
 2619|      0|        return cs.begin();
 2620|      0|    }
 2621|  1.57k|    if(num.mant <= INT64_MAX)
  ------------------
  |  Branch (2621:8): [True: 1.57k, False: 0]
  ------------------
 2622|  1.57k|    {
 2623|   233k|finish_signed:
 2624|   233k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|   233k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 233k]
  |  |  ------------------
  ------------------
 2625|   233k|            ! h_.on_int64(static_cast<
 2626|   233k|                int64_t>(num.mant), {begin, cs.used(begin)}, ec_)))
 2627|      0|            return fail(cs.begin());
 2628|   233k|        return cs.begin();
 2629|   233k|    }
 2630|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2631|      0|        ! h_.on_uint64(num.mant, {begin, cs.used(begin)}, ec_)))
 2632|      0|        return fail(cs.begin());
 2633|      0|    return cs.begin();
 2634|  7.90k|finish_dub:
 2635|  7.90k|    double const d = detail::dec_to_float(
 2636|  7.90k|        num.mant,
 2637|  7.90k|        num.bias + (num.frac ?
  ------------------
  |  Branch (2637:21): [True: 1.32k, False: 6.58k]
  ------------------
 2638|  6.58k|            -num.exp : num.exp),
 2639|  7.90k|        num.neg);
 2640|  7.90k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  7.90k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 7.90k]
  |  |  ------------------
  ------------------
 2641|  7.90k|        ! h_.on_double(d, {begin, cs.used(begin)}, ec_)))
 2642|      0|        return fail(cs.begin());
 2643|  7.90k|    return cs.begin();
 2644|  7.90k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE7suspendEPKcNS4_5stateERKNS4_6numberE:
  376|  2.98k|{
  377|  2.98k|    end_ = p;
  378|       |    // suspend
  379|  2.98k|    num_ = num;
  380|  2.98k|    reserve();
  381|  2.98k|    st_.push_unchecked(st);
  382|  2.98k|    return sentinel();
  383|  2.98k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE13maybe_suspendEPKcNS4_5stateERKNS4_6numberE:
  343|    224|{
  344|    224|    end_ = p;
  345|    224|    if(BOOST_JSON_LIKELY(more_))
  ------------------
  |  |  171|    224|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 112, False: 112]
  |  |  ------------------
  ------------------
  346|    112|    {
  347|       |        // suspend
  348|    112|        num_ = num;
  349|    112|        reserve();
  350|    112|        st_.push_unchecked(st);;
  351|    112|    }
  352|    224|    return sentinel();
  353|    224|}
_ZN5boost4json6detail12dec_to_floatEmib:
  148|  4.96M|{
  149|       |    // convert to double explicitly to silence warnings
  150|  4.96M|    double x = static_cast<double>(m);
  151|  4.96M|    if(neg)
  ------------------
  |  Branch (151:8): [True: 11.4k, False: 4.95M]
  ------------------
  152|  11.4k|        x = -x;
  153|       |
  154|  4.96M|    if(e < -305)
  ------------------
  |  Branch (154:8): [True: 3.05k, False: 4.96M]
  ------------------
  155|  3.05k|    {
  156|  3.05k|        x *= 1e-305 ;
  157|  3.05k|        e += 305;
  158|  3.05k|    }
  159|       |
  160|  4.96M|    if(e >= -22 && e < 0)
  ------------------
  |  Branch (160:8): [True: 4.90M, False: 60.6k]
  |  Branch (160:20): [True: 19.1k, False: 4.88M]
  ------------------
  161|  19.1k|        return x / pow10(-e);
  162|       |
  163|  4.94M|    return x * pow10(e);
  164|  4.96M|}
_ZN5boost4json6detail5pow10Ei:
   52|  4.96M|{
   53|  4.96M|    static double const tab[618] = {
   54|  4.96M|                        1e-308, 1e-307, 1e-306, 1e-305, 1e-304, 1e-303, 1e-302, 1e-301,
   55|       |
   56|  4.96M|        1e-300, 1e-299, 1e-298, 1e-297, 1e-296, 1e-295, 1e-294, 1e-293, 1e-292, 1e-291,
   57|  4.96M|        1e-290, 1e-289, 1e-288, 1e-287, 1e-286, 1e-285, 1e-284, 1e-283, 1e-282, 1e-281,
   58|  4.96M|        1e-280, 1e-279, 1e-278, 1e-277, 1e-276, 1e-275, 1e-274, 1e-273, 1e-272, 1e-271,
   59|  4.96M|        1e-270, 1e-269, 1e-268, 1e-267, 1e-266, 1e-265, 1e-264, 1e-263, 1e-262, 1e-261,
   60|  4.96M|        1e-260, 1e-259, 1e-258, 1e-257, 1e-256, 1e-255, 1e-254, 1e-253, 1e-252, 1e-251,
   61|  4.96M|        1e-250, 1e-249, 1e-248, 1e-247, 1e-246, 1e-245, 1e-244, 1e-243, 1e-242, 1e-241,
   62|  4.96M|        1e-240, 1e-239, 1e-238, 1e-237, 1e-236, 1e-235, 1e-234, 1e-233, 1e-232, 1e-231,
   63|  4.96M|        1e-230, 1e-229, 1e-228, 1e-227, 1e-226, 1e-225, 1e-224, 1e-223, 1e-222, 1e-221,
   64|  4.96M|        1e-220, 1e-219, 1e-218, 1e-217, 1e-216, 1e-215, 1e-214, 1e-213, 1e-212, 1e-211,
   65|  4.96M|        1e-210, 1e-209, 1e-208, 1e-207, 1e-206, 1e-205, 1e-204, 1e-203, 1e-202, 1e-201,
   66|       |
   67|  4.96M|        1e-200, 1e-199, 1e-198, 1e-197, 1e-196, 1e-195, 1e-194, 1e-193, 1e-192, 1e-191,
   68|  4.96M|        1e-190, 1e-189, 1e-188, 1e-187, 1e-186, 1e-185, 1e-184, 1e-183, 1e-182, 1e-181,
   69|  4.96M|        1e-180, 1e-179, 1e-178, 1e-177, 1e-176, 1e-175, 1e-174, 1e-173, 1e-172, 1e-171,
   70|  4.96M|        1e-170, 1e-169, 1e-168, 1e-167, 1e-166, 1e-165, 1e-164, 1e-163, 1e-162, 1e-161,
   71|  4.96M|        1e-160, 1e-159, 1e-158, 1e-157, 1e-156, 1e-155, 1e-154, 1e-153, 1e-152, 1e-151,
   72|  4.96M|        1e-150, 1e-149, 1e-148, 1e-147, 1e-146, 1e-145, 1e-144, 1e-143, 1e-142, 1e-141,
   73|  4.96M|        1e-140, 1e-139, 1e-138, 1e-137, 1e-136, 1e-135, 1e-134, 1e-133, 1e-132, 1e-131,
   74|  4.96M|        1e-130, 1e-129, 1e-128, 1e-127, 1e-126, 1e-125, 1e-124, 1e-123, 1e-122, 1e-121,
   75|  4.96M|        1e-120, 1e-119, 1e-118, 1e-117, 1e-116, 1e-115, 1e-114, 1e-113, 1e-112, 1e-111,
   76|  4.96M|        1e-110, 1e-109, 1e-108, 1e-107, 1e-106, 1e-105, 1e-104, 1e-103, 1e-102, 1e-101,
   77|       |
   78|  4.96M|        1e-100, 1e-099, 1e-098, 1e-097, 1e-096, 1e-095, 1e-094, 1e-093, 1e-092, 1e-091,
   79|  4.96M|        1e-090, 1e-089, 1e-088, 1e-087, 1e-086, 1e-085, 1e-084, 1e-083, 1e-082, 1e-081,
   80|  4.96M|        1e-080, 1e-079, 1e-078, 1e-077, 1e-076, 1e-075, 1e-074, 1e-073, 1e-072, 1e-071,
   81|  4.96M|        1e-070, 1e-069, 1e-068, 1e-067, 1e-066, 1e-065, 1e-064, 1e-063, 1e-062, 1e-061,
   82|  4.96M|        1e-060, 1e-059, 1e-058, 1e-057, 1e-056, 1e-055, 1e-054, 1e-053, 1e-052, 1e-051,
   83|  4.96M|        1e-050, 1e-049, 1e-048, 1e-047, 1e-046, 1e-045, 1e-044, 1e-043, 1e-042, 1e-041,
   84|  4.96M|        1e-040, 1e-039, 1e-038, 1e-037, 1e-036, 1e-035, 1e-034, 1e-033, 1e-032, 1e-031,
   85|  4.96M|        1e-030, 1e-029, 1e-028, 1e-027, 1e-026, 1e-025, 1e-024, 1e-023, 1e-022, 1e-021,
   86|  4.96M|        1e-020, 1e-019, 1e-018, 1e-017, 1e-016, 1e-015, 1e-014, 1e-013, 1e-012, 1e-011,
   87|  4.96M|        1e-010, 1e-009, 1e-008, 1e-007, 1e-006, 1e-005, 1e-004, 1e-003, 1e-002, 1e-001,
   88|       |
   89|  4.96M|        1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009,
   90|  4.96M|        1e+010, 1e+011, 1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019,
   91|  4.96M|        1e+020, 1e+021, 1e+022, 1e+023, 1e+024, 1e+025, 1e+026, 1e+027, 1e+028, 1e+029,
   92|  4.96M|        1e+030, 1e+031, 1e+032, 1e+033, 1e+034, 1e+035, 1e+036, 1e+037, 1e+038, 1e+039,
   93|  4.96M|        1e+040, 1e+041, 1e+042, 1e+043, 1e+044, 1e+045, 1e+046, 1e+047, 1e+048, 1e+049,
   94|  4.96M|        1e+050, 1e+051, 1e+052, 1e+053, 1e+054, 1e+055, 1e+056, 1e+057, 1e+058, 1e+059,
   95|  4.96M|        1e+060, 1e+061, 1e+062, 1e+063, 1e+064, 1e+065, 1e+066, 1e+067, 1e+068, 1e+069,
   96|  4.96M|        1e+070, 1e+071, 1e+072, 1e+073, 1e+074, 1e+075, 1e+076, 1e+077, 1e+078, 1e+079,
   97|  4.96M|        1e+080, 1e+081, 1e+082, 1e+083, 1e+084, 1e+085, 1e+086, 1e+087, 1e+088, 1e+089,
   98|  4.96M|        1e+090, 1e+091, 1e+092, 1e+093, 1e+094, 1e+095, 1e+096, 1e+097, 1e+098, 1e+099,
   99|       |
  100|  4.96M|        1e+100, 1e+101, 1e+102, 1e+103, 1e+104, 1e+105, 1e+106, 1e+107, 1e+108, 1e+109,
  101|  4.96M|        1e+110, 1e+111, 1e+112, 1e+113, 1e+114, 1e+115, 1e+116, 1e+117, 1e+118, 1e+119,
  102|  4.96M|        1e+120, 1e+121, 1e+122, 1e+123, 1e+124, 1e+125, 1e+126, 1e+127, 1e+128, 1e+129,
  103|  4.96M|        1e+130, 1e+131, 1e+132, 1e+133, 1e+134, 1e+135, 1e+136, 1e+137, 1e+138, 1e+139,
  104|  4.96M|        1e+140, 1e+141, 1e+142, 1e+143, 1e+144, 1e+145, 1e+146, 1e+147, 1e+148, 1e+149,
  105|  4.96M|        1e+150, 1e+151, 1e+152, 1e+153, 1e+154, 1e+155, 1e+156, 1e+157, 1e+158, 1e+159,
  106|  4.96M|        1e+160, 1e+161, 1e+162, 1e+163, 1e+164, 1e+165, 1e+166, 1e+167, 1e+168, 1e+169,
  107|  4.96M|        1e+170, 1e+171, 1e+172, 1e+173, 1e+174, 1e+175, 1e+176, 1e+177, 1e+178, 1e+179,
  108|  4.96M|        1e+180, 1e+181, 1e+182, 1e+183, 1e+184, 1e+185, 1e+186, 1e+187, 1e+188, 1e+189,
  109|  4.96M|        1e+190, 1e+191, 1e+192, 1e+193, 1e+194, 1e+195, 1e+196, 1e+197, 1e+198, 1e+199,
  110|       |
  111|  4.96M|        1e+200, 1e+201, 1e+202, 1e+203, 1e+204, 1e+205, 1e+206, 1e+207, 1e+208, 1e+209,
  112|  4.96M|        1e+210, 1e+211, 1e+212, 1e+213, 1e+214, 1e+215, 1e+216, 1e+217, 1e+218, 1e+219,
  113|  4.96M|        1e+220, 1e+221, 1e+222, 1e+223, 1e+224, 1e+225, 1e+226, 1e+227, 1e+228, 1e+229,
  114|  4.96M|        1e+230, 1e+231, 1e+232, 1e+233, 1e+234, 1e+235, 1e+236, 1e+237, 1e+238, 1e+239,
  115|  4.96M|        1e+240, 1e+241, 1e+242, 1e+243, 1e+244, 1e+245, 1e+246, 1e+247, 1e+248, 1e+249,
  116|  4.96M|        1e+250, 1e+251, 1e+252, 1e+253, 1e+254, 1e+255, 1e+256, 1e+257, 1e+258, 1e+259,
  117|  4.96M|        1e+260, 1e+261, 1e+262, 1e+263, 1e+264, 1e+265, 1e+266, 1e+267, 1e+268, 1e+269,
  118|  4.96M|        1e+270, 1e+271, 1e+272, 1e+273, 1e+274, 1e+275, 1e+276, 1e+277, 1e+278, 1e+279,
  119|  4.96M|        1e+280, 1e+281, 1e+282, 1e+283, 1e+284, 1e+285, 1e+286, 1e+287, 1e+288, 1e+289,
  120|  4.96M|        1e+290, 1e+291, 1e+292, 1e+293, 1e+294, 1e+295, 1e+296, 1e+297, 1e+298, 1e+299,
  121|       |
  122|  4.96M|        1e+300, 1e+301, 1e+302, 1e+303, 1e+304, 1e+305, 1e+306, 1e+307, 1e+308 };
  123|       |
  124|  4.96M|    if( exp > 308 )
  ------------------
  |  Branch (124:9): [True: 41.4k, False: 4.92M]
  ------------------
  125|  41.4k|    {
  126|  41.4k|        return std::numeric_limits<double>::infinity();
  127|  41.4k|    }
  128|  4.92M|    else if( exp < -308 )
  ------------------
  |  Branch (128:14): [True: 2.70k, False: 4.92M]
  ------------------
  129|  2.70k|    {
  130|       |        // due to the way pow10 is used by dec_to_float,
  131|       |        // we can afford to return 0.0 here
  132|  2.70k|        return 0.0;
  133|  2.70k|    }
  134|  4.92M|    else
  135|  4.92M|    {
  136|  4.92M|        exp += 308;
  137|  4.92M|        BOOST_ASSERT(exp >= 0 && exp < 618);
  ------------------
  |  |   60|  4.92M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  138|  4.92M|        return tab[exp];
  139|  4.92M|    }
  140|  4.96M|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_numberILb1ELc45EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IcXT0_EEE:
 1991|  20.5k|{
 1992|       |    // only one of these will be true if we are not resuming
 1993|       |    // if negative then !zero_first && !nonzero_first
 1994|       |    // if zero_first then !nonzero_first && !negative
 1995|       |    // if nonzero_first then !zero_first && !negative
 1996|  20.5k|    bool const negative = first == '-';
 1997|  20.5k|    bool const zero_first = first == '0';
 1998|  20.5k|    bool const nonzero_first = first == '+';
 1999|  20.5k|    detail::const_stream_wrapper cs(p, end_);
 2000|  20.5k|    number num;
 2001|  20.5k|    const char* begin = cs.begin();
 2002|  20.5k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (2002:8): [Folded - Ignored]
  |  Branch (2002:23): [True: 0, False: 0]
  ------------------
 2003|  20.5k|    {
 2004|  20.5k|        num.bias = 0;
 2005|  20.5k|        num.exp = 0;
 2006|  20.5k|        num.frac = false;
 2007|       |
 2008|       |        //----------------------------------
 2009|       |        //
 2010|       |        // '-'
 2011|       |        // leading minus sign
 2012|       |        //
 2013|  20.5k|        BOOST_ASSERT(cs);
  ------------------
  |  |   60|  20.5k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2014|  20.5k|        if(negative)
  ------------------
  |  Branch (2014:12): [Folded - Ignored]
  ------------------
 2015|  20.5k|            ++cs;
 2016|       |
 2017|  20.5k|        num.neg = negative;
 2018|  20.5k|        num.frac = false;
 2019|  20.5k|        num.exp = 0;
 2020|  20.5k|        num.bias = 0;
 2021|       |
 2022|       |        // fast path
 2023|  20.5k|        if( cs.remain() >= 16 + 1 + 16 ) // digits . digits
  ------------------
  |  Branch (2023:13): [True: 18.8k, False: 1.75k]
  ------------------
 2024|  18.8k|        {
 2025|  18.8k|            int n1;
 2026|       |
 2027|  18.8k|            if( nonzero_first ||
  ------------------
  |  Branch (2027:17): [Folded - Ignored]
  ------------------
 2028|  18.8k|                (negative && *cs != '0') )
  ------------------
  |  Branch (2028:18): [Folded - Ignored]
  |  Branch (2028:30): [True: 15.5k, False: 3.24k]
  ------------------
 2029|  15.5k|            {
 2030|  15.5k|                n1 = detail::count_digits( cs.begin() );
 2031|  15.5k|                BOOST_ASSERT(n1 >= 0 && n1 <= 16);
  ------------------
  |  |   60|  15.5k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2032|       |
 2033|  15.5k|                if( ! nonzero_first && n1 == 0 )
  ------------------
  |  Branch (2033:21): [Folded - Ignored]
  |  Branch (2033:40): [True: 7, False: 15.5k]
  ------------------
 2034|      7|                {
 2035|       |                    // digit required
 2036|      7|                    BOOST_STATIC_CONSTEXPR source_location loc
 2037|      7|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      7|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2038|      7|                    return fail(cs.begin(), error::syntax, &loc);
 2039|      7|                }
 2040|       |
 2041|  15.5k|                num.mant = detail::parse_unsigned( 0, cs.begin(), n1 );
 2042|       |
 2043|  15.5k|                cs += n1;
 2044|       |
 2045|       |                // integer or floating-point with
 2046|       |                // >= 16 leading digits
 2047|  15.5k|                if( n1 == 16 )
  ------------------
  |  Branch (2047:21): [True: 3.59k, False: 11.9k]
  ------------------
 2048|  3.59k|                {
 2049|  3.59k|                    goto do_num2;
 2050|  3.59k|                }
 2051|  15.5k|            }
 2052|  3.24k|            else
 2053|  3.24k|            {
 2054|       |                // 0. floating-point or 0e integer
 2055|  3.24k|                num.mant = 0;
 2056|  3.24k|                n1 = 0;
 2057|  3.24k|                ++cs;
 2058|  3.24k|            }
 2059|       |
 2060|  15.2k|            {
 2061|  15.2k|                const char c = *cs;
 2062|  15.2k|                if(c != '.')
  ------------------
  |  Branch (2062:20): [True: 12.7k, False: 2.41k]
  ------------------
 2063|  12.7k|                {
 2064|  12.7k|                    if((c | 32) == 'e')
  ------------------
  |  Branch (2064:24): [True: 6.06k, False: 6.71k]
  ------------------
 2065|  6.06k|                    {
 2066|  6.06k|                        ++cs;
 2067|  6.06k|                        goto do_exp1;
 2068|  6.06k|                    }
 2069|  6.71k|                    if(negative)
  ------------------
  |  Branch (2069:24): [Folded - Ignored]
  ------------------
 2070|  6.71k|                        num.mant = ~num.mant + 1;
 2071|  6.71k|                    goto finish_signed;
 2072|  12.7k|                }
 2073|  15.2k|            }
 2074|       |
 2075|       |            // floating-point number
 2076|       |
 2077|  2.41k|            ++cs;
 2078|       |
 2079|  2.41k|            int n2 = detail::count_digits( cs.begin() );
 2080|  2.41k|            BOOST_ASSERT(n2 >= 0 && n2 <= 16);
  ------------------
  |  |   60|  2.41k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2081|       |
 2082|  2.41k|            if( n2 == 0 )
  ------------------
  |  Branch (2082:17): [True: 7, False: 2.41k]
  ------------------
 2083|      7|            {
 2084|       |                // digit required
 2085|      7|                BOOST_STATIC_CONSTEXPR source_location loc
 2086|      7|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      7|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2087|      7|                return fail(cs.begin(), error::syntax, &loc);
 2088|      7|            }
 2089|       |
 2090|       |            // floating-point mantissa overflow
 2091|  2.41k|            if( n1 + n2 >= 19 )
  ------------------
  |  Branch (2091:17): [True: 235, False: 2.17k]
  ------------------
 2092|    235|            {
 2093|    235|                goto do_num7;
 2094|    235|            }
 2095|       |
 2096|  2.17k|            num.mant = detail::parse_unsigned( num.mant, cs.begin(), n2 );
 2097|       |
 2098|  2.17k|            BOOST_ASSERT(num.bias == 0);
  ------------------
  |  |   60|  2.17k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2099|       |
 2100|  2.17k|            num.bias -= n2;
 2101|       |
 2102|  2.17k|            cs += n2;
 2103|       |
 2104|  2.17k|            char ch = *cs;
 2105|       |
 2106|  2.17k|            if( (ch | 32) == 'e' )
  ------------------
  |  Branch (2106:17): [True: 315, False: 1.86k]
  ------------------
 2107|    315|            {
 2108|    315|                ++cs;
 2109|    315|                goto do_exp1;
 2110|    315|            }
 2111|  1.86k|            else if( ch >= '0' && ch <= '9' )
  ------------------
  |  Branch (2111:22): [True: 407, False: 1.45k]
  |  Branch (2111:35): [True: 207, False: 200]
  ------------------
 2112|    207|            {
 2113|    207|                goto do_num8;
 2114|    207|            }
 2115|       |
 2116|  1.65k|            goto finish_dub;
 2117|  2.17k|        }
 2118|  20.5k|    }
 2119|      0|    else
 2120|      0|    {
 2121|      0|        num = num_;
 2122|      0|        state st;
 2123|      0|        st_.pop(st);
 2124|      0|        switch(st)
 2125|      0|        {
 2126|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (2126:9): [True: 0, False: 0]
  ------------------
 2127|      0|        case state::num1: goto do_num1;
  ------------------
  |  Branch (2127:9): [True: 0, False: 0]
  ------------------
 2128|      0|        case state::num2: goto do_num2;
  ------------------
  |  Branch (2128:9): [True: 0, False: 0]
  ------------------
 2129|      0|        case state::num3: goto do_num3;
  ------------------
  |  Branch (2129:9): [True: 0, False: 0]
  ------------------
 2130|      0|        case state::num4: goto do_num4;
  ------------------
  |  Branch (2130:9): [True: 0, False: 0]
  ------------------
 2131|      0|        case state::num5: goto do_num5;
  ------------------
  |  Branch (2131:9): [True: 0, False: 0]
  ------------------
 2132|      0|        case state::num6: goto do_num6;
  ------------------
  |  Branch (2132:9): [True: 0, False: 0]
  ------------------
 2133|      0|        case state::num7: goto do_num7;
  ------------------
  |  Branch (2133:9): [True: 0, False: 0]
  ------------------
 2134|      0|        case state::num8: goto do_num8;
  ------------------
  |  Branch (2134:9): [True: 0, False: 0]
  ------------------
 2135|      0|        case state::exp1: goto do_exp1;
  ------------------
  |  Branch (2135:9): [True: 0, False: 0]
  ------------------
 2136|      0|        case state::exp2: goto do_exp2;
  ------------------
  |  Branch (2136:9): [True: 0, False: 0]
  ------------------
 2137|      0|        case state::exp3: goto do_exp3;
  ------------------
  |  Branch (2137:9): [True: 0, False: 0]
  ------------------
 2138|      0|        }
 2139|      0|    }
 2140|       |
 2141|       |    //----------------------------------
 2142|       |    //
 2143|       |    // DIGIT
 2144|       |    // first digit
 2145|       |    //
 2146|  1.75k|do_num1:
 2147|  1.75k|    if(zero_first || nonzero_first ||
  ------------------
  |  Branch (2147:8): [Folded - Ignored]
  |  Branch (2147:22): [Folded - Ignored]
  ------------------
 2148|  1.75k|        BOOST_JSON_LIKELY(cs))
  ------------------
  |  |  171|  1.75k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.72k, False: 23]
  |  |  ------------------
  ------------------
 2149|  1.72k|    {
 2150|  1.72k|        char const c = *cs;
 2151|  1.72k|        if(zero_first)
  ------------------
  |  Branch (2151:12): [Folded - Ignored]
  ------------------
 2152|      0|        {
 2153|      0|            ++cs;
 2154|      0|            num.mant = 0;
 2155|      0|            goto do_num6;
 2156|      0|        }
 2157|  1.72k|        else if(nonzero_first || BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  3.18k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.44k, False: 285]
  |  |  |  Branch (171:52): [True: 1.45k, False: 276]
  |  |  |  Branch (171:52): [True: 1.44k, False: 9]
  |  |  ------------------
  ------------------
  |  Branch (2157:17): [Folded - Ignored]
  ------------------
 2158|  1.72k|            c >= '1' && c <= '9'))
 2159|  1.44k|        {
 2160|  1.44k|            ++cs;
 2161|  1.44k|            num.mant = c - '0';
 2162|  1.44k|        }
 2163|    285|        else if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    285|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 257, False: 28]
  |  |  ------------------
  ------------------
 2164|    285|            c == '0'))
 2165|    257|        {
 2166|    257|            ++cs;
 2167|    257|            num.mant = 0;
 2168|    257|            goto do_num6;
 2169|    257|        }
 2170|     28|        else
 2171|     28|        {
 2172|     28|            BOOST_STATIC_CONSTEXPR source_location loc
 2173|     28|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     28|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2174|     28|            return fail(cs.begin(), error::syntax, &loc);
 2175|     28|        }
 2176|  1.72k|    }
 2177|     23|    else
 2178|     23|    {
 2179|     23|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     23|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 23]
  |  |  ------------------
  ------------------
 2180|     23|            ! h_.on_number_part(
 2181|     23|                {begin, cs.used(begin)}, ec_)))
 2182|      0|            return fail(cs.begin());
 2183|     23|        return maybe_suspend(
 2184|     23|            cs.begin(), state::num1, num);
 2185|     23|    }
 2186|       |
 2187|       |    //----------------------------------
 2188|       |    //
 2189|       |    // 1*DIGIT
 2190|       |    // significant digits left of decimal
 2191|       |    //
 2192|  5.04k|do_num2:
 2193|  5.04k|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2193:8): [Folded - Ignored]
  |  Branch (2193:21): [Folded - Ignored]
  |  Branch (2193:37): [True: 0, False: 0]
  ------------------
 2194|  5.04k|    {
 2195|  5.04k|        for(;;)
 2196|  15.6k|        {
 2197|  15.6k|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  15.6k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 286, False: 15.3k]
  |  |  ------------------
  ------------------
 2198|    286|            {
 2199|    286|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    286|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 286, False: 0]
  |  |  ------------------
  ------------------
 2200|    286|                {
 2201|    286|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    286|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 286]
  |  |  ------------------
  ------------------
 2202|    286|                        ! h_.on_number_part(
 2203|    286|                            {begin, cs.used(begin)}, ec_)))
 2204|      0|                        return fail(cs.begin());
 2205|    286|                    return suspend(cs.begin(), state::num2, num);
 2206|    286|                }
 2207|      0|                goto finish_int;
 2208|    286|            }
 2209|  15.3k|            char const c = *cs;
 2210|  15.3k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  27.8k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 11.8k, False: 3.45k]
  |  |  |  Branch (171:52): [True: 12.5k, False: 2.80k]
  |  |  |  Branch (171:52): [True: 11.8k, False: 653]
  |  |  ------------------
  ------------------
 2211|  15.3k|                c >= '0' && c <= '9'))
 2212|  11.8k|            {
 2213|  11.8k|                ++cs;
 2214|       |                //              9223372036854775808 INT64_MIN
 2215|  11.8k|                if( num.mant  > 922337203685477580 || (
  ------------------
  |  Branch (2215:21): [True: 980, False: 10.8k]
  ------------------
 2216|  10.8k|                    num.mant == 922337203685477580 && c > '8'))
  ------------------
  |  Branch (2216:21): [True: 519, False: 10.3k]
  |  Branch (2216:55): [True: 319, False: 200]
  ------------------
 2217|  1.29k|                    break;
 2218|  10.5k|                num.mant = 10 * num.mant + ( c - '0' );
 2219|  10.5k|                continue;
 2220|  11.8k|            }
 2221|  3.45k|            goto do_num6; // [.eE]
 2222|  15.3k|        }
 2223|  5.04k|    }
 2224|      0|    else
 2225|      0|    {
 2226|      0|        for(;;)
 2227|      0|        {
 2228|      0|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2229|      0|            {
 2230|      0|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2231|      0|                {
 2232|      0|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2233|      0|                        ! h_.on_number_part(
 2234|      0|                            {begin, cs.used(begin)}, ec_)))
 2235|      0|                        return fail(cs.begin());
 2236|      0|                    return suspend(cs.begin(), state::num2, num);
 2237|      0|                }
 2238|      0|                goto finish_int;
 2239|      0|            }
 2240|      0|            char const c = *cs;
 2241|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2242|      0|                c >= '0' && c <= '9'))
 2243|      0|            {
 2244|      0|                ++cs;
 2245|       |                //              18446744073709551615 UINT64_MAX
 2246|      0|                if( num.mant  > 1844674407370955161 || (
  ------------------
  |  Branch (2246:21): [True: 0, False: 0]
  ------------------
 2247|      0|                    num.mant == 1844674407370955161 && c > '5'))
  ------------------
  |  Branch (2247:21): [True: 0, False: 0]
  |  Branch (2247:56): [True: 0, False: 0]
  ------------------
 2248|      0|                    break;
 2249|      0|                num.mant = 10 * num.mant + ( c - '0' );
 2250|      0|            }
 2251|      0|            else
 2252|      0|            {
 2253|      0|                goto do_num6; // [.eE]
 2254|      0|            }
 2255|      0|        }
 2256|      0|    }
 2257|  1.29k|    ++num.bias;
 2258|       |
 2259|       |    //----------------------------------
 2260|       |    //
 2261|       |    // 1*DIGIT
 2262|       |    // non-significant digits left of decimal
 2263|       |    //
 2264|  1.29k|do_num3:
 2265|  1.29k|    for(;;)
 2266|  1.00M|    {
 2267|  1.00M|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  1.00M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 28, False: 1.00M]
  |  |  ------------------
  ------------------
 2268|     28|        {
 2269|     28|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     28|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 28, False: 0]
  |  |  ------------------
  ------------------
 2270|     28|            {
 2271|     28|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     28|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 28]
  |  |  ------------------
  ------------------
 2272|     28|                    ! h_.on_number_part(
 2273|     28|                        {begin, cs.used(begin)}, ec_)))
 2274|      0|                    return fail(cs.begin());
 2275|     28|                return suspend(cs.begin(), state::num3, num);
 2276|     28|            }
 2277|      0|            goto finish_dub;
 2278|     28|        }
 2279|  1.00M|        char const c = *cs;
 2280|  1.00M|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  2.01M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1.00M, False: 1.27k]
  |  |  |  Branch (179:54): [True: 1.00M, False: 1.06k]
  |  |  |  Branch (179:54): [True: 1.00M, False: 204]
  |  |  ------------------
  ------------------
 2281|  1.00M|            c >= '0' && c <= '9'))
 2282|  1.00M|        {
 2283|  1.00M|            ++cs;
 2284|       |            // VFALCO check overflow
 2285|  1.00M|            ++num.bias;
 2286|  1.00M|        }
 2287|  1.27k|        else if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  1.27k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 259, False: 1.01k]
  |  |  ------------------
  ------------------
 2288|  1.27k|            c == '.'))
 2289|    259|        {
 2290|    259|            ++cs;
 2291|    259|            break;
 2292|    259|        }
 2293|  1.01k|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2293:17): [True: 200, False: 812]
  ------------------
 2294|    200|        {
 2295|    200|            ++cs;
 2296|    200|            goto do_exp1;
 2297|    200|        }
 2298|    812|        else
 2299|    812|        {
 2300|    812|            goto finish_dub;
 2301|    812|        }
 2302|  1.00M|    }
 2303|       |
 2304|       |    //----------------------------------
 2305|       |    //
 2306|       |    // DIGIT
 2307|       |    // first non-significant digit
 2308|       |    // to the right of decimal
 2309|       |    //
 2310|    259|do_num4:
 2311|    259|    {
 2312|    259|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    259|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 255]
  |  |  ------------------
  ------------------
 2313|      4|        {
 2314|      4|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 2315|      4|                ! h_.on_number_part(
 2316|      4|                    {begin, cs.used(begin)}, ec_)))
 2317|      0|                return fail(cs.begin());
 2318|      4|            return maybe_suspend(
 2319|      4|                cs.begin(), state::num4, num);
 2320|      4|        }
 2321|    255|        char const c = *cs;
 2322|    255|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|    503|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 243, False: 12]
  |  |  |  Branch (171:52): [True: 248, False: 7]
  |  |  |  Branch (171:52): [True: 243, False: 5]
  |  |  ------------------
  ------------------
 2323|       |            //static_cast<unsigned char>(c - '0') < 10))
 2324|    255|            c >= '0' && c <= '9'))
 2325|    243|        {
 2326|    243|            ++cs;
 2327|    243|        }
 2328|     12|        else
 2329|     12|        {
 2330|       |            // digit required
 2331|     12|            BOOST_STATIC_CONSTEXPR source_location loc
 2332|     12|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     12|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2333|     12|            return fail(cs.begin(), error::syntax, &loc);
 2334|     12|        }
 2335|    255|    }
 2336|       |
 2337|       |    //----------------------------------
 2338|       |    //
 2339|       |    // 1*DIGIT
 2340|       |    // non-significant digits
 2341|       |    // to the right of decimal
 2342|       |    //
 2343|    912|do_num5:
 2344|    912|    for(;;)
 2345|  1.89k|    {
 2346|  1.89k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  1.89k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 1.85k]
  |  |  ------------------
  ------------------
 2347|     33|        {
 2348|     33|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 0]
  |  |  ------------------
  ------------------
 2349|     33|            {
 2350|     33|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 33]
  |  |  ------------------
  ------------------
 2351|     33|                    ! h_.on_number_part(
 2352|     33|                        {begin, cs.used(begin)}, ec_)))
 2353|      0|                    return fail(cs.begin());
 2354|     33|                return suspend(cs.begin(), state::num5, num);
 2355|     33|            }
 2356|      0|            goto finish_dub;
 2357|     33|        }
 2358|  1.85k|        char const c = *cs;
 2359|  1.85k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  3.03k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 980, False: 879]
  |  |  |  Branch (171:52): [True: 1.18k, False: 679]
  |  |  |  Branch (171:52): [True: 980, False: 200]
  |  |  ------------------
  ------------------
 2360|  1.85k|            c >= '0' && c <= '9'))
 2361|    980|        {
 2362|    980|            ++cs;
 2363|    980|        }
 2364|    879|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2364:17): [True: 195, False: 684]
  ------------------
 2365|    195|        {
 2366|    195|            ++cs;
 2367|    195|            goto do_exp1;
 2368|    195|        }
 2369|    684|        else
 2370|    684|        {
 2371|    684|            goto finish_dub;
 2372|    684|        }
 2373|  1.85k|    }
 2374|       |
 2375|       |    //----------------------------------
 2376|       |    //
 2377|       |    // [.eE]
 2378|       |    //
 2379|  3.71k|do_num6:
 2380|  3.71k|    {
 2381|  3.71k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  3.71k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 3.70k]
  |  |  ------------------
  ------------------
 2382|      5|        {
 2383|      5|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      5|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 0]
  |  |  ------------------
  ------------------
 2384|      5|            {
 2385|      5|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      5|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 5]
  |  |  ------------------
  ------------------
 2386|      5|                    ! h_.on_number_part(
 2387|      5|                        {begin, cs.used(begin)}, ec_)))
 2388|      0|                    return fail(cs.begin());
 2389|      5|                return suspend(cs.begin(), state::num6, num);
 2390|      5|            }
 2391|      0|            goto finish_int;
 2392|      5|        }
 2393|  3.70k|        char const c = *cs;
 2394|  3.70k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  3.70k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.05k, False: 2.65k]
  |  |  ------------------
  ------------------
 2395|  3.70k|            c == '.'))
 2396|  1.05k|        {
 2397|  1.05k|            ++cs;
 2398|  1.05k|        }
 2399|  2.65k|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2399:17): [True: 724, False: 1.93k]
  ------------------
 2400|    724|        {
 2401|    724|            ++cs;
 2402|    724|            goto do_exp1;
 2403|    724|        }
 2404|  1.93k|        else
 2405|  1.93k|        {
 2406|  1.93k|            goto finish_int;
 2407|  1.93k|        }
 2408|  3.70k|    }
 2409|       |
 2410|       |    //----------------------------------
 2411|       |    //
 2412|       |    // DIGIT
 2413|       |    // first significant digit
 2414|       |    // to the right of decimal
 2415|       |    //
 2416|  1.28k|do_num7:
 2417|  1.28k|    {
 2418|  1.28k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  1.28k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 1.28k]
  |  |  ------------------
  ------------------
 2419|      4|        {
 2420|      4|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 0]
  |  |  ------------------
  ------------------
 2421|      4|            {
 2422|      4|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 2423|      4|                    ! h_.on_number_part(
 2424|      4|                        {begin, cs.used(begin)}, ec_)))
 2425|      0|                    return fail(cs.begin());
 2426|      4|                return suspend(cs.begin(), state::num7, num);
 2427|      4|            }
 2428|       |            // digit required
 2429|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2430|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2431|      0|            return fail(cs.begin(), error::syntax, &loc);
 2432|      4|        }
 2433|  1.28k|        char const c = *cs;
 2434|  1.28k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  2.55k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 14, False: 1.26k]
  |  |  |  Branch (179:54): [True: 12, False: 1.26k]
  |  |  |  Branch (179:54): [True: 2, False: 1.26k]
  |  |  ------------------
  ------------------
 2435|  1.28k|            c < '0' || c > '9'))
 2436|     14|        {
 2437|       |            // digit required
 2438|     14|            BOOST_STATIC_CONSTEXPR source_location loc
 2439|     14|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     14|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2440|     14|            return fail(cs.begin(), error::syntax, &loc);
 2441|     14|        }
 2442|  1.28k|    }
 2443|       |
 2444|       |    //----------------------------------
 2445|       |    //
 2446|       |    // 1*DIGIT
 2447|       |    // significant digits
 2448|       |    // to the right of decimal
 2449|       |    //
 2450|  1.47k|do_num8:
 2451|  1.47k|    for(;;)
 2452|  5.25k|    {
 2453|  5.25k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  5.25k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 99, False: 5.15k]
  |  |  ------------------
  ------------------
 2454|     99|        {
 2455|     99|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     99|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 99, False: 0]
  |  |  ------------------
  ------------------
 2456|     99|            {
 2457|     99|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     99|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 2458|     99|                    ! h_.on_number_part(
 2459|     99|                        {begin, cs.used(begin)}, ec_)))
 2460|      0|                    return fail(cs.begin());
 2461|     99|                return suspend(cs.begin(), state::num8, num);
 2462|     99|            }
 2463|      0|            goto finish_dub;
 2464|     99|        }
 2465|  5.15k|        char const c = *cs;
 2466|  5.15k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  9.82k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.44k, False: 706]
  |  |  |  Branch (171:52): [True: 4.67k, False: 483]
  |  |  |  Branch (171:52): [True: 4.44k, False: 223]
  |  |  ------------------
  ------------------
 2467|  5.15k|            c >= '0' && c <= '9'))
 2468|  4.44k|        {
 2469|  4.44k|            ++cs;
 2470|  4.44k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  4.44k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 3.77k, False: 669]
  |  |  ------------------
  ------------------
 2471|  4.44k|                num.mant <= 9007199254740991)) // 2^53-1
 2472|  3.77k|            {
 2473|  3.77k|                --num.bias;
 2474|  3.77k|                num.mant = 10 * num.mant + ( c - '0' );
 2475|  3.77k|            }
 2476|    669|            else
 2477|    669|            {
 2478|    669|                goto do_num5;
 2479|    669|            }
 2480|  4.44k|        }
 2481|    706|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2481:17): [True: 212, False: 494]
  ------------------
 2482|    212|        {
 2483|    212|            ++cs;
 2484|    212|            goto do_exp1;
 2485|    212|        }
 2486|    494|        else
 2487|    494|        {
 2488|    494|            goto finish_dub;
 2489|    494|        }
 2490|  5.15k|    }
 2491|       |
 2492|       |    //----------------------------------
 2493|       |    //
 2494|       |    // *[+-]
 2495|       |    //
 2496|  7.71k|do_exp1:
 2497|  7.71k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  7.71k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 29, False: 7.68k]
  |  |  ------------------
  ------------------
 2498|     29|    {
 2499|     29|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     29|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 29]
  |  |  ------------------
  ------------------
 2500|     29|            ! h_.on_number_part(
 2501|     29|                {begin, cs.used(begin)}, ec_)))
 2502|      0|            return fail(cs.begin());
 2503|     29|        return maybe_suspend(
 2504|     29|            cs.begin(), state::exp1, num);
 2505|     29|    }
 2506|  7.68k|    if(*cs == '+')
  ------------------
  |  Branch (2506:8): [True: 194, False: 7.48k]
  ------------------
 2507|    194|    {
 2508|    194|        ++cs;
 2509|    194|    }
 2510|  7.48k|    else if(*cs == '-')
  ------------------
  |  Branch (2510:13): [True: 1.80k, False: 5.68k]
  ------------------
 2511|  1.80k|    {
 2512|  1.80k|        ++cs;
 2513|  1.80k|        num.frac = true;
 2514|  1.80k|    }
 2515|       |
 2516|       |    //----------------------------------
 2517|       |    //
 2518|       |    // DIGIT
 2519|       |    // first digit of the exponent
 2520|       |    //
 2521|  7.68k|do_exp2:
 2522|  7.68k|    {
 2523|  7.68k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  7.68k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 12, False: 7.67k]
  |  |  ------------------
  ------------------
 2524|     12|        {
 2525|     12|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     12|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 12, False: 0]
  |  |  ------------------
  ------------------
 2526|     12|            {
 2527|     12|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     12|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 12]
  |  |  ------------------
  ------------------
 2528|     12|                    ! h_.on_number_part(
 2529|     12|                        {begin, cs.used(begin)}, ec_)))
 2530|      0|                    return fail(cs.begin());
 2531|     12|                return suspend(cs.begin(), state::exp2, num);
 2532|     12|            }
 2533|       |            // digit required
 2534|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2535|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2536|      0|            return fail(cs.begin(), error::syntax, &loc);
 2537|     12|        }
 2538|  7.67k|        char const c = *cs;
 2539|  7.67k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  15.3k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 26, False: 7.64k]
  |  |  |  Branch (179:54): [True: 18, False: 7.65k]
  |  |  |  Branch (179:54): [True: 8, False: 7.64k]
  |  |  ------------------
  ------------------
 2540|  7.67k|            c < '0' || c > '9'))
 2541|     26|        {
 2542|       |            // digit required
 2543|     26|            BOOST_STATIC_CONSTEXPR source_location loc
 2544|     26|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     26|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2545|     26|            return fail(cs.begin(), error::syntax, &loc);
 2546|     26|        }
 2547|  7.64k|        ++cs;
 2548|  7.64k|        num.exp = c - '0';
 2549|  7.64k|    }
 2550|       |
 2551|       |    //----------------------------------
 2552|       |    //
 2553|       |    // 1*DIGIT
 2554|       |    // subsequent digits in the exponent
 2555|       |    //
 2556|  7.64k|do_exp3:
 2557|  7.64k|    for(;;)
 2558|  16.9k|    {
 2559|  16.9k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  16.9k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 89, False: 16.8k]
  |  |  ------------------
  ------------------
 2560|     89|        {
 2561|     89|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     89|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 89, False: 0]
  |  |  ------------------
  ------------------
 2562|     89|            {
 2563|     89|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     89|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 89]
  |  |  ------------------
  ------------------
 2564|     89|                    ! h_.on_number_part(
 2565|     89|                        {begin, cs.used(begin)}, ec_)))
 2566|      0|                    return fail(cs.begin());
 2567|     89|                return suspend(cs.begin(), state::exp3, num);
 2568|     89|            }
 2569|     89|        }
 2570|  16.8k|        else
 2571|  16.8k|        {
 2572|  16.8k|            char const c = *cs;
 2573|  16.8k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  26.2k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 9.29k, False: 7.55k]
  |  |  |  Branch (171:52): [True: 9.36k, False: 7.48k]
  |  |  |  Branch (171:52): [True: 9.29k, False: 70]
  |  |  ------------------
  ------------------
 2574|  16.8k|                c >= '0' && c <= '9'))
 2575|  9.29k|            {
 2576|  9.29k|                if(BOOST_JSON_UNLIKELY
  ------------------
  |  |  179|  28.0k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 9.28k]
  |  |  |  Branch (179:54): [True: 207, False: 9.08k]
  |  |  |  Branch (179:54): [True: 1, False: 206]
  |  |  |  Branch (179:54): [True: 3, False: 9.29k]
  |  |  ------------------
  ------------------
 2577|       |                //              2147483647 INT_MAX
 2578|  9.29k|                    (num.exp  > 214748364 || (
 2579|  9.29k|                        num.exp == 214748364 && c > '7')))
 2580|      4|                {
 2581|      4|                    BOOST_STATIC_CONSTEXPR source_location loc
 2582|      4|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      4|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2583|      4|                    return fail(cs.begin(), error::exponent_overflow, &loc);
 2584|      4|                }
 2585|  9.28k|                ++cs;
 2586|  9.28k|                num.exp = 10 * num.exp + ( c - '0' );
 2587|  9.28k|                continue;
 2588|  9.29k|            }
 2589|  16.8k|        }
 2590|  7.55k|        BOOST_ASSERT(num.exp >= 0);
  ------------------
  |  |   60|  7.55k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2591|  7.55k|        if ( num.frac )
  ------------------
  |  Branch (2591:14): [True: 1.79k, False: 5.75k]
  ------------------
 2592|  1.79k|        {
 2593|  1.79k|            if (BOOST_JSON_UNLIKELY( num.bias  < (INT_MIN + num.exp) ))
  ------------------
  |  |  179|  1.79k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1, False: 1.79k]
  |  |  ------------------
  ------------------
 2594|      1|            {
 2595|      1|                BOOST_STATIC_CONSTEXPR source_location loc
 2596|      1|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      1|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2597|      1|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2598|      1|            }
 2599|  1.79k|        }
 2600|  5.75k|        else
 2601|  5.75k|        {
 2602|  5.75k|            if (BOOST_JSON_UNLIKELY( num.bias > (INT_MAX - num.exp) ))
  ------------------
  |  |  179|  5.75k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 5.74k]
  |  |  ------------------
  ------------------
 2603|      5|            {
 2604|      5|                BOOST_STATIC_CONSTEXPR source_location loc
 2605|      5|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      5|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2606|      5|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2607|      5|            }
 2608|  5.75k|        }
 2609|  7.54k|        goto finish_dub;
 2610|  7.55k|    }
 2611|       |
 2612|  1.93k|finish_int:
 2613|  1.93k|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2613:8): [Folded - Ignored]
  |  Branch (2613:21): [Folded - Ignored]
  |  Branch (2613:37): [True: 0, False: 0]
  ------------------
 2614|  1.93k|    {
 2615|  1.93k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  1.93k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 1.93k]
  |  |  ------------------
  ------------------
 2616|  1.93k|            ! h_.on_int64(static_cast<
 2617|  1.93k|                int64_t>(~num.mant + 1), {begin, cs.used(begin)}, ec_)))
 2618|      0|            return fail(cs.begin());
 2619|  1.93k|        return cs.begin();
 2620|  1.93k|    }
 2621|      0|    if(num.mant <= INT64_MAX)
  ------------------
  |  Branch (2621:8): [True: 0, False: 0]
  ------------------
 2622|      0|    {
 2623|  6.71k|finish_signed:
 2624|  6.71k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  6.71k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 6.71k]
  |  |  ------------------
  ------------------
 2625|  6.71k|            ! h_.on_int64(static_cast<
 2626|  6.71k|                int64_t>(num.mant), {begin, cs.used(begin)}, ec_)))
 2627|      0|            return fail(cs.begin());
 2628|  6.71k|        return cs.begin();
 2629|  6.71k|    }
 2630|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2631|      0|        ! h_.on_uint64(num.mant, {begin, cs.used(begin)}, ec_)))
 2632|      0|        return fail(cs.begin());
 2633|      0|    return cs.begin();
 2634|  11.1k|finish_dub:
 2635|  11.1k|    double const d = detail::dec_to_float(
 2636|  11.1k|        num.mant,
 2637|  11.1k|        num.bias + (num.frac ?
  ------------------
  |  Branch (2637:21): [True: 1.79k, False: 9.39k]
  ------------------
 2638|  9.39k|            -num.exp : num.exp),
 2639|  11.1k|        num.neg);
 2640|  11.1k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  11.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 11.1k]
  |  |  ------------------
  ------------------
 2641|  11.1k|        ! h_.on_double(d, {begin, cs.used(begin)}, ec_)))
 2642|      0|        return fail(cs.begin());
 2643|  11.1k|    return cs.begin();
 2644|  11.1k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_numberILb1ELc43EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IcXT0_EEE:
 1991|  7.20M|{
 1992|       |    // only one of these will be true if we are not resuming
 1993|       |    // if negative then !zero_first && !nonzero_first
 1994|       |    // if zero_first then !nonzero_first && !negative
 1995|       |    // if nonzero_first then !zero_first && !negative
 1996|  7.20M|    bool const negative = first == '-';
 1997|  7.20M|    bool const zero_first = first == '0';
 1998|  7.20M|    bool const nonzero_first = first == '+';
 1999|  7.20M|    detail::const_stream_wrapper cs(p, end_);
 2000|  7.20M|    number num;
 2001|  7.20M|    const char* begin = cs.begin();
 2002|  7.20M|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (2002:8): [Folded - Ignored]
  |  Branch (2002:23): [True: 0, False: 0]
  ------------------
 2003|  7.20M|    {
 2004|  7.20M|        num.bias = 0;
 2005|  7.20M|        num.exp = 0;
 2006|  7.20M|        num.frac = false;
 2007|       |
 2008|       |        //----------------------------------
 2009|       |        //
 2010|       |        // '-'
 2011|       |        // leading minus sign
 2012|       |        //
 2013|  7.20M|        BOOST_ASSERT(cs);
  ------------------
  |  |   60|  7.20M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2014|  7.20M|        if(negative)
  ------------------
  |  Branch (2014:12): [Folded - Ignored]
  ------------------
 2015|      0|            ++cs;
 2016|       |
 2017|  7.20M|        num.neg = negative;
 2018|  7.20M|        num.frac = false;
 2019|  7.20M|        num.exp = 0;
 2020|  7.20M|        num.bias = 0;
 2021|       |
 2022|       |        // fast path
 2023|  7.20M|        if( cs.remain() >= 16 + 1 + 16 ) // digits . digits
  ------------------
  |  Branch (2023:13): [True: 7.19M, False: 10.2k]
  ------------------
 2024|  7.19M|        {
 2025|  7.19M|            int n1;
 2026|       |
 2027|  7.19M|            if( nonzero_first ||
  ------------------
  |  Branch (2027:17): [Folded - Ignored]
  ------------------
 2028|  7.19M|                (negative && *cs != '0') )
  ------------------
  |  Branch (2028:18): [Folded - Ignored]
  |  Branch (2028:30): [True: 0, False: 0]
  ------------------
 2029|  7.19M|            {
 2030|  7.19M|                n1 = detail::count_digits( cs.begin() );
 2031|  7.19M|                BOOST_ASSERT(n1 >= 0 && n1 <= 16);
  ------------------
  |  |   60|  7.19M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2032|       |
 2033|  7.19M|                if( ! nonzero_first && n1 == 0 )
  ------------------
  |  Branch (2033:21): [Folded - Ignored]
  |  Branch (2033:40): [True: 0, False: 0]
  ------------------
 2034|      0|                {
 2035|       |                    // digit required
 2036|      0|                    BOOST_STATIC_CONSTEXPR source_location loc
 2037|      0|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2038|      0|                    return fail(cs.begin(), error::syntax, &loc);
 2039|      0|                }
 2040|       |
 2041|  7.19M|                num.mant = detail::parse_unsigned( 0, cs.begin(), n1 );
 2042|       |
 2043|  7.19M|                cs += n1;
 2044|       |
 2045|       |                // integer or floating-point with
 2046|       |                // >= 16 leading digits
 2047|  7.19M|                if( n1 == 16 )
  ------------------
  |  Branch (2047:21): [True: 29.3k, False: 7.16M]
  ------------------
 2048|  29.3k|                {
 2049|  29.3k|                    goto do_num2;
 2050|  29.3k|                }
 2051|  7.19M|            }
 2052|      0|            else
 2053|      0|            {
 2054|       |                // 0. floating-point or 0e integer
 2055|      0|                num.mant = 0;
 2056|      0|                n1 = 0;
 2057|      0|                ++cs;
 2058|      0|            }
 2059|       |
 2060|  7.16M|            {
 2061|  7.16M|                const char c = *cs;
 2062|  7.16M|                if(c != '.')
  ------------------
  |  Branch (2062:20): [True: 7.15M, False: 10.9k]
  ------------------
 2063|  7.15M|                {
 2064|  7.15M|                    if((c | 32) == 'e')
  ------------------
  |  Branch (2064:24): [True: 4.92M, False: 2.23M]
  ------------------
 2065|  4.92M|                    {
 2066|  4.92M|                        ++cs;
 2067|  4.92M|                        goto do_exp1;
 2068|  4.92M|                    }
 2069|  2.23M|                    if(negative)
  ------------------
  |  Branch (2069:24): [Folded - Ignored]
  ------------------
 2070|      0|                        num.mant = ~num.mant + 1;
 2071|  2.23M|                    goto finish_signed;
 2072|  7.15M|                }
 2073|  7.16M|            }
 2074|       |
 2075|       |            // floating-point number
 2076|       |
 2077|  10.9k|            ++cs;
 2078|       |
 2079|  10.9k|            int n2 = detail::count_digits( cs.begin() );
 2080|  10.9k|            BOOST_ASSERT(n2 >= 0 && n2 <= 16);
  ------------------
  |  |   60|  10.9k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2081|       |
 2082|  10.9k|            if( n2 == 0 )
  ------------------
  |  Branch (2082:17): [True: 3, False: 10.9k]
  ------------------
 2083|      3|            {
 2084|       |                // digit required
 2085|      3|                BOOST_STATIC_CONSTEXPR source_location loc
 2086|      3|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      3|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2087|      3|                return fail(cs.begin(), error::syntax, &loc);
 2088|      3|            }
 2089|       |
 2090|       |            // floating-point mantissa overflow
 2091|  10.9k|            if( n1 + n2 >= 19 )
  ------------------
  |  Branch (2091:17): [True: 890, False: 10.0k]
  ------------------
 2092|    890|            {
 2093|    890|                goto do_num7;
 2094|    890|            }
 2095|       |
 2096|  10.0k|            num.mant = detail::parse_unsigned( num.mant, cs.begin(), n2 );
 2097|       |
 2098|  10.0k|            BOOST_ASSERT(num.bias == 0);
  ------------------
  |  |   60|  10.0k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2099|       |
 2100|  10.0k|            num.bias -= n2;
 2101|       |
 2102|  10.0k|            cs += n2;
 2103|       |
 2104|  10.0k|            char ch = *cs;
 2105|       |
 2106|  10.0k|            if( (ch | 32) == 'e' )
  ------------------
  |  Branch (2106:17): [True: 1.89k, False: 8.13k]
  ------------------
 2107|  1.89k|            {
 2108|  1.89k|                ++cs;
 2109|  1.89k|                goto do_exp1;
 2110|  1.89k|            }
 2111|  8.13k|            else if( ch >= '0' && ch <= '9' )
  ------------------
  |  Branch (2111:22): [True: 462, False: 7.67k]
  |  Branch (2111:35): [True: 261, False: 201]
  ------------------
 2112|    261|            {
 2113|    261|                goto do_num8;
 2114|    261|            }
 2115|       |
 2116|  7.87k|            goto finish_dub;
 2117|  10.0k|        }
 2118|  7.20M|    }
 2119|      0|    else
 2120|      0|    {
 2121|      0|        num = num_;
 2122|      0|        state st;
 2123|      0|        st_.pop(st);
 2124|      0|        switch(st)
 2125|      0|        {
 2126|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (2126:9): [True: 0, False: 0]
  ------------------
 2127|      0|        case state::num1: goto do_num1;
  ------------------
  |  Branch (2127:9): [True: 0, False: 0]
  ------------------
 2128|      0|        case state::num2: goto do_num2;
  ------------------
  |  Branch (2128:9): [True: 0, False: 0]
  ------------------
 2129|      0|        case state::num3: goto do_num3;
  ------------------
  |  Branch (2129:9): [True: 0, False: 0]
  ------------------
 2130|      0|        case state::num4: goto do_num4;
  ------------------
  |  Branch (2130:9): [True: 0, False: 0]
  ------------------
 2131|      0|        case state::num5: goto do_num5;
  ------------------
  |  Branch (2131:9): [True: 0, False: 0]
  ------------------
 2132|      0|        case state::num6: goto do_num6;
  ------------------
  |  Branch (2132:9): [True: 0, False: 0]
  ------------------
 2133|      0|        case state::num7: goto do_num7;
  ------------------
  |  Branch (2133:9): [True: 0, False: 0]
  ------------------
 2134|      0|        case state::num8: goto do_num8;
  ------------------
  |  Branch (2134:9): [True: 0, False: 0]
  ------------------
 2135|      0|        case state::exp1: goto do_exp1;
  ------------------
  |  Branch (2135:9): [True: 0, False: 0]
  ------------------
 2136|      0|        case state::exp2: goto do_exp2;
  ------------------
  |  Branch (2136:9): [True: 0, False: 0]
  ------------------
 2137|      0|        case state::exp3: goto do_exp3;
  ------------------
  |  Branch (2137:9): [True: 0, False: 0]
  ------------------
 2138|      0|        }
 2139|      0|    }
 2140|       |
 2141|       |    //----------------------------------
 2142|       |    //
 2143|       |    // DIGIT
 2144|       |    // first digit
 2145|       |    //
 2146|  10.2k|do_num1:
 2147|  10.2k|    if(zero_first || nonzero_first ||
  ------------------
  |  Branch (2147:8): [Folded - Ignored]
  |  Branch (2147:22): [Folded - Ignored]
  ------------------
 2148|  10.2k|        BOOST_JSON_LIKELY(cs))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2149|  10.2k|    {
 2150|  10.2k|        char const c = *cs;
 2151|  10.2k|        if(zero_first)
  ------------------
  |  Branch (2151:12): [Folded - Ignored]
  ------------------
 2152|      0|        {
 2153|      0|            ++cs;
 2154|      0|            num.mant = 0;
 2155|      0|            goto do_num6;
 2156|      0|        }
 2157|  10.2k|        else if(nonzero_first || BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (2157:17): [Folded - Ignored]
  ------------------
 2158|  10.2k|            c >= '1' && c <= '9'))
 2159|  10.2k|        {
 2160|  10.2k|            ++cs;
 2161|  10.2k|            num.mant = c - '0';
 2162|  10.2k|        }
 2163|      0|        else if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2164|      0|            c == '0'))
 2165|      0|        {
 2166|      0|            ++cs;
 2167|      0|            num.mant = 0;
 2168|      0|            goto do_num6;
 2169|      0|        }
 2170|      0|        else
 2171|      0|        {
 2172|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2173|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2174|      0|            return fail(cs.begin(), error::syntax, &loc);
 2175|      0|        }
 2176|  10.2k|    }
 2177|      0|    else
 2178|      0|    {
 2179|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2180|      0|            ! h_.on_number_part(
 2181|      0|                {begin, cs.used(begin)}, ec_)))
 2182|      0|            return fail(cs.begin());
 2183|      0|        return maybe_suspend(
 2184|      0|            cs.begin(), state::num1, num);
 2185|      0|    }
 2186|       |
 2187|       |    //----------------------------------
 2188|       |    //
 2189|       |    // 1*DIGIT
 2190|       |    // significant digits left of decimal
 2191|       |    //
 2192|  39.6k|do_num2:
 2193|  39.6k|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2193:8): [Folded - Ignored]
  |  Branch (2193:21): [Folded - Ignored]
  |  Branch (2193:37): [True: 0, False: 0]
  ------------------
 2194|      0|    {
 2195|      0|        for(;;)
 2196|      0|        {
 2197|      0|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2198|      0|            {
 2199|      0|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2200|      0|                {
 2201|      0|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2202|      0|                        ! h_.on_number_part(
 2203|      0|                            {begin, cs.used(begin)}, ec_)))
 2204|      0|                        return fail(cs.begin());
 2205|      0|                    return suspend(cs.begin(), state::num2, num);
 2206|      0|                }
 2207|      0|                goto finish_int;
 2208|      0|            }
 2209|      0|            char const c = *cs;
 2210|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2211|      0|                c >= '0' && c <= '9'))
 2212|      0|            {
 2213|      0|                ++cs;
 2214|       |                //              9223372036854775808 INT64_MIN
 2215|      0|                if( num.mant  > 922337203685477580 || (
  ------------------
  |  Branch (2215:21): [True: 0, False: 0]
  ------------------
 2216|      0|                    num.mant == 922337203685477580 && c > '8'))
  ------------------
  |  Branch (2216:21): [True: 0, False: 0]
  |  Branch (2216:55): [True: 0, False: 0]
  ------------------
 2217|      0|                    break;
 2218|      0|                num.mant = 10 * num.mant + ( c - '0' );
 2219|      0|                continue;
 2220|      0|            }
 2221|      0|            goto do_num6; // [.eE]
 2222|      0|        }
 2223|      0|    }
 2224|  39.6k|    else
 2225|  39.6k|    {
 2226|  39.6k|        for(;;)
 2227|   149k|        {
 2228|   149k|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|   149k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 540, False: 149k]
  |  |  ------------------
  ------------------
 2229|    540|            {
 2230|    540|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    540|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 540, False: 0]
  |  |  ------------------
  ------------------
 2231|    540|                {
 2232|    540|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    540|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 540]
  |  |  ------------------
  ------------------
 2233|    540|                        ! h_.on_number_part(
 2234|    540|                            {begin, cs.used(begin)}, ec_)))
 2235|      0|                        return fail(cs.begin());
 2236|    540|                    return suspend(cs.begin(), state::num2, num);
 2237|    540|                }
 2238|      0|                goto finish_int;
 2239|    540|            }
 2240|   149k|            char const c = *cs;
 2241|   149k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|   269k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 116k, False: 32.8k]
  |  |  |  Branch (171:52): [True: 120k, False: 28.9k]
  |  |  |  Branch (171:52): [True: 116k, False: 3.91k]
  |  |  ------------------
  ------------------
 2242|   149k|                c >= '0' && c <= '9'))
 2243|   116k|            {
 2244|   116k|                ++cs;
 2245|       |                //              18446744073709551615 UINT64_MAX
 2246|   116k|                if( num.mant  > 1844674407370955161 || (
  ------------------
  |  Branch (2246:21): [True: 5.89k, False: 110k]
  ------------------
 2247|   110k|                    num.mant == 1844674407370955161 && c > '5'))
  ------------------
  |  Branch (2247:21): [True: 10.1k, False: 100k]
  |  Branch (2247:56): [True: 403, False: 9.71k]
  ------------------
 2248|  6.30k|                    break;
 2249|   109k|                num.mant = 10 * num.mant + ( c - '0' );
 2250|   109k|            }
 2251|  32.8k|            else
 2252|  32.8k|            {
 2253|  32.8k|                goto do_num6; // [.eE]
 2254|  32.8k|            }
 2255|   149k|        }
 2256|  39.6k|    }
 2257|  6.30k|    ++num.bias;
 2258|       |
 2259|       |    //----------------------------------
 2260|       |    //
 2261|       |    // 1*DIGIT
 2262|       |    // non-significant digits left of decimal
 2263|       |    //
 2264|  6.30k|do_num3:
 2265|  6.30k|    for(;;)
 2266|  2.05M|    {
 2267|  2.05M|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.05M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 2.05M]
  |  |  ------------------
  ------------------
 2268|     33|        {
 2269|     33|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 0]
  |  |  ------------------
  ------------------
 2270|     33|            {
 2271|     33|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 33]
  |  |  ------------------
  ------------------
 2272|     33|                    ! h_.on_number_part(
 2273|     33|                        {begin, cs.used(begin)}, ec_)))
 2274|      0|                    return fail(cs.begin());
 2275|     33|                return suspend(cs.begin(), state::num3, num);
 2276|     33|            }
 2277|      0|            goto finish_dub;
 2278|     33|        }
 2279|  2.05M|        char const c = *cs;
 2280|  2.05M|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  4.10M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2.05M, False: 6.26k]
  |  |  |  Branch (179:54): [True: 2.05M, False: 5.86k]
  |  |  |  Branch (179:54): [True: 2.05M, False: 401]
  |  |  ------------------
  ------------------
 2281|  2.05M|            c >= '0' && c <= '9'))
 2282|  2.05M|        {
 2283|  2.05M|            ++cs;
 2284|       |            // VFALCO check overflow
 2285|  2.05M|            ++num.bias;
 2286|  2.05M|        }
 2287|  6.26k|        else if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  6.26k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.58k, False: 4.68k]
  |  |  ------------------
  ------------------
 2288|  6.26k|            c == '.'))
 2289|  1.58k|        {
 2290|  1.58k|            ++cs;
 2291|  1.58k|            break;
 2292|  1.58k|        }
 2293|  4.68k|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2293:17): [True: 396, False: 4.28k]
  ------------------
 2294|    396|        {
 2295|    396|            ++cs;
 2296|    396|            goto do_exp1;
 2297|    396|        }
 2298|  4.28k|        else
 2299|  4.28k|        {
 2300|  4.28k|            goto finish_dub;
 2301|  4.28k|        }
 2302|  2.05M|    }
 2303|       |
 2304|       |    //----------------------------------
 2305|       |    //
 2306|       |    // DIGIT
 2307|       |    // first non-significant digit
 2308|       |    // to the right of decimal
 2309|       |    //
 2310|  1.58k|do_num4:
 2311|  1.58k|    {
 2312|  1.58k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  1.58k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1, False: 1.58k]
  |  |  ------------------
  ------------------
 2313|      1|        {
 2314|      1|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      1|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 2315|      1|                ! h_.on_number_part(
 2316|      1|                    {begin, cs.used(begin)}, ec_)))
 2317|      0|                return fail(cs.begin());
 2318|      1|            return maybe_suspend(
 2319|      1|                cs.begin(), state::num4, num);
 2320|      1|        }
 2321|  1.58k|        char const c = *cs;
 2322|  1.58k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  3.16k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.57k, False: 13]
  |  |  |  Branch (171:52): [True: 1.57k, False: 9]
  |  |  |  Branch (171:52): [True: 1.57k, False: 4]
  |  |  ------------------
  ------------------
 2323|       |            //static_cast<unsigned char>(c - '0') < 10))
 2324|  1.58k|            c >= '0' && c <= '9'))
 2325|  1.57k|        {
 2326|  1.57k|            ++cs;
 2327|  1.57k|        }
 2328|     13|        else
 2329|     13|        {
 2330|       |            // digit required
 2331|     13|            BOOST_STATIC_CONSTEXPR source_location loc
 2332|     13|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     13|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2333|     13|            return fail(cs.begin(), error::syntax, &loc);
 2334|     13|        }
 2335|  1.58k|    }
 2336|       |
 2337|       |    //----------------------------------
 2338|       |    //
 2339|       |    // 1*DIGIT
 2340|       |    // non-significant digits
 2341|       |    // to the right of decimal
 2342|       |    //
 2343|  5.31k|do_num5:
 2344|  5.31k|    for(;;)
 2345|  24.1k|    {
 2346|  24.1k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  24.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 57, False: 24.1k]
  |  |  ------------------
  ------------------
 2347|     57|        {
 2348|     57|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     57|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 57, False: 0]
  |  |  ------------------
  ------------------
 2349|     57|            {
 2350|     57|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     57|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 57]
  |  |  ------------------
  ------------------
 2351|     57|                    ! h_.on_number_part(
 2352|     57|                        {begin, cs.used(begin)}, ec_)))
 2353|      0|                    return fail(cs.begin());
 2354|     57|                return suspend(cs.begin(), state::num5, num);
 2355|     57|            }
 2356|      0|            goto finish_dub;
 2357|     57|        }
 2358|  24.1k|        char const c = *cs;
 2359|  24.1k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  43.5k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 18.8k, False: 5.26k]
  |  |  |  Branch (171:52): [True: 19.4k, False: 4.62k]
  |  |  |  Branch (171:52): [True: 18.8k, False: 637]
  |  |  ------------------
  ------------------
 2360|  24.1k|            c >= '0' && c <= '9'))
 2361|  18.8k|        {
 2362|  18.8k|            ++cs;
 2363|  18.8k|        }
 2364|  5.26k|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2364:17): [True: 628, False: 4.63k]
  ------------------
 2365|    628|        {
 2366|    628|            ++cs;
 2367|    628|            goto do_exp1;
 2368|    628|        }
 2369|  4.63k|        else
 2370|  4.63k|        {
 2371|  4.63k|            goto finish_dub;
 2372|  4.63k|        }
 2373|  24.1k|    }
 2374|       |
 2375|       |    //----------------------------------
 2376|       |    //
 2377|       |    // [.eE]
 2378|       |    //
 2379|  32.8k|do_num6:
 2380|  32.8k|    {
 2381|  32.8k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  32.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 32.8k]
  |  |  ------------------
  ------------------
 2382|      0|        {
 2383|      0|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2384|      0|            {
 2385|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2386|      0|                    ! h_.on_number_part(
 2387|      0|                        {begin, cs.used(begin)}, ec_)))
 2388|      0|                    return fail(cs.begin());
 2389|      0|                return suspend(cs.begin(), state::num6, num);
 2390|      0|            }
 2391|      0|            goto finish_int;
 2392|      0|        }
 2393|  32.8k|        char const c = *cs;
 2394|  32.8k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  32.8k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.56k, False: 28.2k]
  |  |  ------------------
  ------------------
 2395|  32.8k|            c == '.'))
 2396|  4.56k|        {
 2397|  4.56k|            ++cs;
 2398|  4.56k|        }
 2399|  28.2k|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2399:17): [True: 3.12k, False: 25.1k]
  ------------------
 2400|  3.12k|        {
 2401|  3.12k|            ++cs;
 2402|  3.12k|            goto do_exp1;
 2403|  3.12k|        }
 2404|  25.1k|        else
 2405|  25.1k|        {
 2406|  25.1k|            goto finish_int;
 2407|  25.1k|        }
 2408|  32.8k|    }
 2409|       |
 2410|       |    //----------------------------------
 2411|       |    //
 2412|       |    // DIGIT
 2413|       |    // first significant digit
 2414|       |    // to the right of decimal
 2415|       |    //
 2416|  5.45k|do_num7:
 2417|  5.45k|    {
 2418|  5.45k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  5.45k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 6, False: 5.44k]
  |  |  ------------------
  ------------------
 2419|      6|        {
 2420|      6|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|      6|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 6, False: 0]
  |  |  ------------------
  ------------------
 2421|      6|            {
 2422|      6|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      6|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 6]
  |  |  ------------------
  ------------------
 2423|      6|                    ! h_.on_number_part(
 2424|      6|                        {begin, cs.used(begin)}, ec_)))
 2425|      0|                    return fail(cs.begin());
 2426|      6|                return suspend(cs.begin(), state::num7, num);
 2427|      6|            }
 2428|       |            // digit required
 2429|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2430|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2431|      0|            return fail(cs.begin(), error::syntax, &loc);
 2432|      6|        }
 2433|  5.44k|        char const c = *cs;
 2434|  5.44k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  10.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 16, False: 5.43k]
  |  |  |  Branch (179:54): [True: 11, False: 5.43k]
  |  |  |  Branch (179:54): [True: 5, False: 5.43k]
  |  |  ------------------
  ------------------
 2435|  5.44k|            c < '0' || c > '9'))
 2436|     16|        {
 2437|       |            // digit required
 2438|     16|            BOOST_STATIC_CONSTEXPR source_location loc
 2439|     16|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     16|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2440|     16|            return fail(cs.begin(), error::syntax, &loc);
 2441|     16|        }
 2442|  5.44k|    }
 2443|       |
 2444|       |    //----------------------------------
 2445|       |    //
 2446|       |    // 1*DIGIT
 2447|       |    // significant digits
 2448|       |    // to the right of decimal
 2449|       |    //
 2450|  5.69k|do_num8:
 2451|  5.69k|    for(;;)
 2452|  16.5k|    {
 2453|  16.5k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  16.5k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 838, False: 15.6k]
  |  |  ------------------
  ------------------
 2454|    838|        {
 2455|    838|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    838|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 838, False: 0]
  |  |  ------------------
  ------------------
 2456|    838|            {
 2457|    838|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    838|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 838]
  |  |  ------------------
  ------------------
 2458|    838|                    ! h_.on_number_part(
 2459|    838|                        {begin, cs.used(begin)}, ec_)))
 2460|      0|                    return fail(cs.begin());
 2461|    838|                return suspend(cs.begin(), state::num8, num);
 2462|    838|            }
 2463|      0|            goto finish_dub;
 2464|    838|        }
 2465|  15.6k|        char const c = *cs;
 2466|  15.6k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  30.6k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 14.5k, False: 1.11k]
  |  |  |  Branch (171:52): [True: 14.9k, False: 731]
  |  |  |  Branch (171:52): [True: 14.5k, False: 379]
  |  |  ------------------
  ------------------
 2467|  15.6k|            c >= '0' && c <= '9'))
 2468|  14.5k|        {
 2469|  14.5k|            ++cs;
 2470|  14.5k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  14.5k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 10.8k, False: 3.74k]
  |  |  ------------------
  ------------------
 2471|  14.5k|                num.mant <= 9007199254740991)) // 2^53-1
 2472|  10.8k|            {
 2473|  10.8k|                --num.bias;
 2474|  10.8k|                num.mant = 10 * num.mant + ( c - '0' );
 2475|  10.8k|            }
 2476|  3.74k|            else
 2477|  3.74k|            {
 2478|  3.74k|                goto do_num5;
 2479|  3.74k|            }
 2480|  14.5k|        }
 2481|  1.11k|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2481:17): [True: 250, False: 860]
  ------------------
 2482|    250|        {
 2483|    250|            ++cs;
 2484|    250|            goto do_exp1;
 2485|    250|        }
 2486|    860|        else
 2487|    860|        {
 2488|    860|            goto finish_dub;
 2489|    860|        }
 2490|  15.6k|    }
 2491|       |
 2492|       |    //----------------------------------
 2493|       |    //
 2494|       |    // *[+-]
 2495|       |    //
 2496|  4.93M|do_exp1:
 2497|  4.93M|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.93M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 32, False: 4.93M]
  |  |  ------------------
  ------------------
 2498|     32|    {
 2499|     32|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     32|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 32]
  |  |  ------------------
  ------------------
 2500|     32|            ! h_.on_number_part(
 2501|     32|                {begin, cs.used(begin)}, ec_)))
 2502|      0|            return fail(cs.begin());
 2503|     32|        return maybe_suspend(
 2504|     32|            cs.begin(), state::exp1, num);
 2505|     32|    }
 2506|  4.93M|    if(*cs == '+')
  ------------------
  |  Branch (2506:8): [True: 774, False: 4.92M]
  ------------------
 2507|    774|    {
 2508|    774|        ++cs;
 2509|    774|    }
 2510|  4.92M|    else if(*cs == '-')
  ------------------
  |  Branch (2510:13): [True: 60.2k, False: 4.86M]
  ------------------
 2511|  60.2k|    {
 2512|  60.2k|        ++cs;
 2513|  60.2k|        num.frac = true;
 2514|  60.2k|    }
 2515|       |
 2516|       |    //----------------------------------
 2517|       |    //
 2518|       |    // DIGIT
 2519|       |    // first digit of the exponent
 2520|       |    //
 2521|  4.93M|do_exp2:
 2522|  4.93M|    {
 2523|  4.93M|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.93M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 15, False: 4.93M]
  |  |  ------------------
  ------------------
 2524|     15|        {
 2525|     15|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     15|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 15, False: 0]
  |  |  ------------------
  ------------------
 2526|     15|            {
 2527|     15|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     15|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 15]
  |  |  ------------------
  ------------------
 2528|     15|                    ! h_.on_number_part(
 2529|     15|                        {begin, cs.used(begin)}, ec_)))
 2530|      0|                    return fail(cs.begin());
 2531|     15|                return suspend(cs.begin(), state::exp2, num);
 2532|     15|            }
 2533|       |            // digit required
 2534|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2535|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2536|      0|            return fail(cs.begin(), error::syntax, &loc);
 2537|     15|        }
 2538|  4.93M|        char const c = *cs;
 2539|  4.93M|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  9.86M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 37, False: 4.93M]
  |  |  |  Branch (179:54): [True: 29, False: 4.93M]
  |  |  |  Branch (179:54): [True: 8, False: 4.93M]
  |  |  ------------------
  ------------------
 2540|  4.93M|            c < '0' || c > '9'))
 2541|     37|        {
 2542|       |            // digit required
 2543|     37|            BOOST_STATIC_CONSTEXPR source_location loc
 2544|     37|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     37|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2545|     37|            return fail(cs.begin(), error::syntax, &loc);
 2546|     37|        }
 2547|  4.93M|        ++cs;
 2548|  4.93M|        num.exp = c - '0';
 2549|  4.93M|    }
 2550|       |
 2551|       |    //----------------------------------
 2552|       |    //
 2553|       |    // 1*DIGIT
 2554|       |    // subsequent digits in the exponent
 2555|       |    //
 2556|  4.93M|do_exp3:
 2557|  4.93M|    for(;;)
 2558|  9.88M|    {
 2559|  9.88M|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  9.88M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 663, False: 9.88M]
  |  |  ------------------
  ------------------
 2560|    663|        {
 2561|    663|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    663|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 663, False: 0]
  |  |  ------------------
  ------------------
 2562|    663|            {
 2563|    663|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    663|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 663]
  |  |  ------------------
  ------------------
 2564|    663|                    ! h_.on_number_part(
 2565|    663|                        {begin, cs.used(begin)}, ec_)))
 2566|      0|                    return fail(cs.begin());
 2567|    663|                return suspend(cs.begin(), state::exp3, num);
 2568|    663|            }
 2569|    663|        }
 2570|  9.88M|        else
 2571|  9.88M|        {
 2572|  9.88M|            char const c = *cs;
 2573|  9.88M|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  14.8M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.95M, False: 4.92M]
  |  |  |  Branch (171:52): [True: 4.95M, False: 4.92M]
  |  |  |  Branch (171:52): [True: 4.95M, False: 1.67k]
  |  |  ------------------
  ------------------
 2574|  9.88M|                c >= '0' && c <= '9'))
 2575|  4.95M|            {
 2576|  4.95M|                if(BOOST_JSON_UNLIKELY
  ------------------
  |  |  179|  14.8M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 4.95M]
  |  |  |  Branch (179:54): [True: 223, False: 4.95M]
  |  |  |  Branch (179:54): [True: 1, False: 222]
  |  |  |  Branch (179:54): [True: 3, False: 4.95M]
  |  |  ------------------
  ------------------
 2577|       |                //              2147483647 INT_MAX
 2578|  4.95M|                    (num.exp  > 214748364 || (
 2579|  4.95M|                        num.exp == 214748364 && c > '7')))
 2580|      4|                {
 2581|      4|                    BOOST_STATIC_CONSTEXPR source_location loc
 2582|      4|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      4|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2583|      4|                    return fail(cs.begin(), error::exponent_overflow, &loc);
 2584|      4|                }
 2585|  4.95M|                ++cs;
 2586|  4.95M|                num.exp = 10 * num.exp + ( c - '0' );
 2587|  4.95M|                continue;
 2588|  4.95M|            }
 2589|  9.88M|        }
 2590|  4.92M|        BOOST_ASSERT(num.exp >= 0);
  ------------------
  |  |   60|  4.92M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2591|  4.92M|        if ( num.frac )
  ------------------
  |  Branch (2591:14): [True: 60.0k, False: 4.86M]
  ------------------
 2592|  60.0k|        {
 2593|  60.0k|            if (BOOST_JSON_UNLIKELY( num.bias  < (INT_MIN + num.exp) ))
  ------------------
  |  |  179|  60.0k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1, False: 60.0k]
  |  |  ------------------
  ------------------
 2594|      1|            {
 2595|      1|                BOOST_STATIC_CONSTEXPR source_location loc
 2596|      1|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      1|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2597|      1|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2598|      1|            }
 2599|  60.0k|        }
 2600|  4.86M|        else
 2601|  4.86M|        {
 2602|  4.86M|            if (BOOST_JSON_UNLIKELY( num.bias > (INT_MAX - num.exp) ))
  ------------------
  |  |  179|  4.86M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 4.86M]
  |  |  ------------------
  ------------------
 2603|      5|            {
 2604|      5|                BOOST_STATIC_CONSTEXPR source_location loc
 2605|      5|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      5|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2606|      5|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2607|      5|            }
 2608|  4.86M|        }
 2609|  4.92M|        goto finish_dub;
 2610|  4.92M|    }
 2611|       |
 2612|  25.1k|finish_int:
 2613|  25.1k|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2613:8): [Folded - Ignored]
  |  Branch (2613:21): [Folded - Ignored]
  |  Branch (2613:37): [True: 0, False: 0]
  ------------------
 2614|      0|    {
 2615|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2616|      0|            ! h_.on_int64(static_cast<
 2617|      0|                int64_t>(~num.mant + 1), {begin, cs.used(begin)}, ec_)))
 2618|      0|            return fail(cs.begin());
 2619|      0|        return cs.begin();
 2620|      0|    }
 2621|  25.1k|    if(num.mant <= INT64_MAX)
  ------------------
  |  Branch (2621:8): [True: 7.74k, False: 17.3k]
  ------------------
 2622|  7.74k|    {
 2623|  2.24M|finish_signed:
 2624|  2.24M|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  2.24M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 2.24M]
  |  |  ------------------
  ------------------
 2625|  2.24M|            ! h_.on_int64(static_cast<
 2626|  2.24M|                int64_t>(num.mant), {begin, cs.used(begin)}, ec_)))
 2627|      0|            return fail(cs.begin());
 2628|  2.24M|        return cs.begin();
 2629|  2.24M|    }
 2630|  17.3k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  17.3k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 17.3k]
  |  |  ------------------
  ------------------
 2631|  17.3k|        ! h_.on_uint64(num.mant, {begin, cs.used(begin)}, ec_)))
 2632|      0|        return fail(cs.begin());
 2633|  17.3k|    return cs.begin();
 2634|  4.94M|finish_dub:
 2635|  4.94M|    double const d = detail::dec_to_float(
 2636|  4.94M|        num.mant,
 2637|  4.94M|        num.bias + (num.frac ?
  ------------------
  |  Branch (2637:21): [True: 60.0k, False: 4.88M]
  ------------------
 2638|  4.88M|            -num.exp : num.exp),
 2639|  4.94M|        num.neg);
 2640|  4.94M|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  4.94M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4.94M]
  |  |  ------------------
  ------------------
 2641|  4.94M|        ! h_.on_double(d, {begin, cs.used(begin)}, ec_)))
 2642|      0|        return fail(cs.begin());
 2643|  4.94M|    return cs.begin();
 2644|  4.94M|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE10parse_trueILb1EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  816|  9.23k|{
  817|  9.23k|    detail::const_stream_wrapper cs(p, end_);
  818|  9.23k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (818:8): [Folded - Ignored]
  |  Branch (818:23): [True: 0, False: 0]
  ------------------
  819|  9.23k|    {
  820|  9.23k|        if(BOOST_JSON_LIKELY(cs.remain() >= 4))
  ------------------
  |  |  171|  9.23k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 9.19k, False: 43]
  |  |  ------------------
  ------------------
  821|  9.19k|        {
  822|  9.19k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  9.19k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 20, False: 9.17k]
  |  |  ------------------
  ------------------
  823|  9.19k|                std::memcmp(cs.begin(), "true", 4) != 0))
  824|     20|            {
  825|     20|                BOOST_STATIC_CONSTEXPR source_location loc
  826|     20|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     20|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  827|     20|                return fail(cs.begin(), error::syntax, &loc);
  828|     20|            }
  829|  9.17k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  9.17k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 9.17k]
  |  |  ------------------
  ------------------
  830|  9.17k|                ! h_.on_bool(true, ec_)))
  831|      0|                return fail(cs.begin());
  832|  9.17k|            cs += 4;
  833|  9.17k|            return cs.begin();
  834|  9.17k|        }
  835|  9.23k|    }
  836|      0|    else
  837|      0|    {
  838|      0|        state st;
  839|      0|        st_.pop(st);
  840|      0|        switch(st)
  841|      0|        {
  842|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (842:9): [True: 0, False: 0]
  ------------------
  843|      0|        case state::tru1: goto do_tru1;
  ------------------
  |  Branch (843:9): [True: 0, False: 0]
  ------------------
  844|      0|        case state::tru2: goto do_tru2;
  ------------------
  |  Branch (844:9): [True: 0, False: 0]
  ------------------
  845|      0|        case state::tru3: goto do_tru3;
  ------------------
  |  Branch (845:9): [True: 0, False: 0]
  ------------------
  846|      0|        }
  847|      0|    }
  848|     43|    ++cs;
  849|     43|do_tru1:
  850|     43|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     43|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 19, False: 24]
  |  |  ------------------
  ------------------
  851|     19|        return maybe_suspend(cs.begin(), state::tru1);
  852|     24|    if(BOOST_JSON_UNLIKELY(*cs != 'r'))
  ------------------
  |  |  179|     24|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 15]
  |  |  ------------------
  ------------------
  853|      9|    {
  854|      9|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      9|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  855|      9|        return fail(cs.begin(), error::syntax, &loc);
  856|      9|    }
  857|     15|    ++cs;
  858|     15|do_tru2:
  859|     15|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     15|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 13]
  |  |  ------------------
  ------------------
  860|      2|        return maybe_suspend(cs.begin(), state::tru2);
  861|     13|    if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|     13|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 11, False: 2]
  |  |  ------------------
  ------------------
  862|     11|    {
  863|     11|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     11|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  864|     11|        return fail(cs.begin(), error::syntax, &loc);
  865|     11|    }
  866|      2|    ++cs;
  867|      2|do_tru3:
  868|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  869|      2|        return maybe_suspend(cs.begin(), state::tru3);
  870|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'e'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  871|      0|    {
  872|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  873|      0|        return fail(cs.begin(), error::syntax, &loc);
  874|      0|    }
  875|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  876|      0|        ! h_.on_bool(true, ec_)))
  877|      0|        return fail(cs.begin());
  878|      0|    ++cs;
  879|      0|    return cs.begin();
  880|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_falseILb1EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  888|  10.3k|{
  889|  10.3k|    detail::const_stream_wrapper cs(p, end_);
  890|  10.3k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (890:8): [Folded - Ignored]
  |  Branch (890:23): [True: 0, False: 0]
  ------------------
  891|  10.3k|    {
  892|  10.3k|        if(BOOST_JSON_LIKELY(cs.remain() >= 5))
  ------------------
  |  |  171|  10.3k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 10.3k, False: 39]
  |  |  ------------------
  ------------------
  893|  10.3k|        {
  894|  10.3k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  10.3k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 10.2k]
  |  |  ------------------
  ------------------
  895|  10.3k|                std::memcmp(cs.begin() + 1, "alse", 4) != 0))
  896|      9|            {
  897|      9|                BOOST_STATIC_CONSTEXPR source_location loc
  898|      9|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      9|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  899|      9|                return fail(cs.begin(), error::syntax, &loc);
  900|      9|            }
  901|  10.2k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  10.2k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 10.2k]
  |  |  ------------------
  ------------------
  902|  10.2k|                ! h_.on_bool(false, ec_)))
  903|      0|                return fail(cs.begin());
  904|  10.2k|            cs += 5;
  905|  10.2k|            return cs.begin();
  906|  10.2k|        }
  907|  10.3k|    }
  908|      0|    else
  909|      0|    {
  910|      0|        state st;
  911|      0|        st_.pop(st);
  912|      0|        switch(st)
  913|      0|        {
  914|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (914:9): [True: 0, False: 0]
  ------------------
  915|      0|        case state::fal1: goto do_fal1;
  ------------------
  |  Branch (915:9): [True: 0, False: 0]
  ------------------
  916|      0|        case state::fal2: goto do_fal2;
  ------------------
  |  Branch (916:9): [True: 0, False: 0]
  ------------------
  917|      0|        case state::fal3: goto do_fal3;
  ------------------
  |  Branch (917:9): [True: 0, False: 0]
  ------------------
  918|      0|        case state::fal4: goto do_fal4;
  ------------------
  |  Branch (918:9): [True: 0, False: 0]
  ------------------
  919|      0|        }
  920|      0|    }
  921|     39|    ++cs;
  922|     39|do_fal1:
  923|     39|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     39|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 17, False: 22]
  |  |  ------------------
  ------------------
  924|     17|        return maybe_suspend(cs.begin(), state::fal1);
  925|     22|    if(BOOST_JSON_UNLIKELY(*cs != 'a'))
  ------------------
  |  |  179|     22|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 18]
  |  |  ------------------
  ------------------
  926|      4|    {
  927|      4|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      4|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  928|      4|        return fail(cs.begin(), error::syntax, &loc);
  929|      4|    }
  930|     18|    ++cs;
  931|     18|do_fal2:
  932|     18|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     18|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 16]
  |  |  ------------------
  ------------------
  933|      2|        return maybe_suspend(cs.begin(), state::fal2);
  934|     16|    if(BOOST_JSON_UNLIKELY(*cs != 'l'))
  ------------------
  |  |  179|     16|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 14]
  |  |  ------------------
  ------------------
  935|      2|    {
  936|      2|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      2|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  937|      2|        return fail(cs.begin(), error::syntax, &loc);
  938|      2|    }
  939|     14|    ++cs;
  940|     14|do_fal3:
  941|     14|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     14|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 12]
  |  |  ------------------
  ------------------
  942|      2|        return maybe_suspend(cs.begin(), state::fal3);
  943|     12|    if(BOOST_JSON_UNLIKELY(*cs != 's'))
  ------------------
  |  |  179|     12|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 10, False: 2]
  |  |  ------------------
  ------------------
  944|     10|    {
  945|     10|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     10|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  946|     10|        return fail(cs.begin(), error::syntax, &loc);
  947|     10|    }
  948|      2|    ++cs;
  949|      2|do_fal4:
  950|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  951|      2|        return maybe_suspend(cs.begin(), state::fal4);
  952|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'e'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  953|      0|    {
  954|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  955|      0|        return fail(cs.begin(), error::syntax, &loc);
  956|      0|    }
  957|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  958|      0|        ! h_.on_bool(false, ec_)))
  959|      0|        return fail(cs.begin());
  960|      0|    ++cs;
  961|      0|    return cs.begin();
  962|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE10parse_nullILb1EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  744|  11.8k|{
  745|  11.8k|    detail::const_stream_wrapper cs(p, end_);
  746|  11.8k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (746:8): [Folded - Ignored]
  |  Branch (746:23): [True: 0, False: 0]
  ------------------
  747|  11.8k|    {
  748|  11.8k|        if(BOOST_JSON_LIKELY(cs.remain() >= 4))
  ------------------
  |  |  171|  11.8k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 11.7k, False: 46]
  |  |  ------------------
  ------------------
  749|  11.7k|        {
  750|  11.7k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  11.7k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 13, False: 11.7k]
  |  |  ------------------
  ------------------
  751|  11.7k|                std::memcmp(cs.begin(), "null", 4) != 0))
  752|     13|            {
  753|     13|                BOOST_STATIC_CONSTEXPR source_location loc
  754|     13|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     13|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  755|     13|                return fail(cs.begin(), error::syntax, &loc);
  756|     13|            }
  757|  11.7k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  11.7k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 11.7k]
  |  |  ------------------
  ------------------
  758|  11.7k|                ! h_.on_null(ec_)))
  759|      0|                return fail(cs.begin());
  760|  11.7k|            cs += 4;
  761|  11.7k|            return cs.begin();
  762|  11.7k|        }
  763|  11.8k|    }
  764|      0|    else
  765|      0|    {
  766|      0|        state st;
  767|      0|        st_.pop(st);
  768|      0|        switch(st)
  769|      0|        {
  770|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (770:9): [True: 0, False: 0]
  ------------------
  771|      0|        case state::nul1: goto do_nul1;
  ------------------
  |  Branch (771:9): [True: 0, False: 0]
  ------------------
  772|      0|        case state::nul2: goto do_nul2;
  ------------------
  |  Branch (772:9): [True: 0, False: 0]
  ------------------
  773|      0|        case state::nul3: goto do_nul3;
  ------------------
  |  Branch (773:9): [True: 0, False: 0]
  ------------------
  774|      0|        }
  775|      0|    }
  776|     46|    ++cs;
  777|     46|do_nul1:
  778|     46|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     46|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 18, False: 28]
  |  |  ------------------
  ------------------
  779|     18|        return maybe_suspend(cs.begin(), state::nul1);
  780|     28|    if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|     28|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 12, False: 16]
  |  |  ------------------
  ------------------
  781|     12|    {
  782|     12|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     12|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  783|     12|        return fail(cs.begin(), error::syntax, &loc);
  784|     12|    }
  785|     16|    ++cs;
  786|     16|do_nul2:
  787|     16|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     16|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 14]
  |  |  ------------------
  ------------------
  788|      2|        return maybe_suspend(cs.begin(), state::nul2);
  789|     14|    if(BOOST_JSON_UNLIKELY(*cs != 'l'))
  ------------------
  |  |  179|     14|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 12, False: 2]
  |  |  ------------------
  ------------------
  790|     12|    {
  791|     12|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     12|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  792|     12|        return fail(cs.begin(), error::syntax, &loc);
  793|     12|    }
  794|      2|    ++cs;
  795|      2|do_nul3:
  796|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  797|      2|        return maybe_suspend(cs.begin(), state::nul3);
  798|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'l'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  799|      0|    {
  800|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  801|      0|        return fail(cs.begin(), error::syntax, &loc);
  802|      0|    }
  803|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  804|      0|        ! h_.on_null(ec_)))
  805|      0|        return fail(cs.begin());
  806|      0|    ++cs;
  807|      0|    return cs.begin();
  808|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE15parse_unescapedILb1ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEb:
 1013|  34.1k|{
 1014|  34.1k|    detail::const_stream_wrapper cs(p, end_);
 1015|  34.1k|    std::size_t total;
 1016|  34.1k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (1016:8): [Folded - Ignored]
  |  Branch (1016:23): [True: 0, False: 0]
  ------------------
 1017|  34.1k|    {
 1018|  34.1k|        BOOST_ASSERT(*cs == '\x22'); // '"'
  ------------------
  |  |   60|  34.1k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1019|  34.1k|        ++cs;
 1020|  34.1k|        total = 0;
 1021|  34.1k|    }
 1022|      0|    else
 1023|      0|    {
 1024|      0|        state st;
 1025|      0|        st_.pop(st);
 1026|      0|        st_.pop(total);
 1027|      0|    }
 1028|  34.1k|    char const* start = cs.begin();
 1029|  34.1k|    cs = allow_bad_utf8?
  ------------------
  |  Branch (1029:10): [True: 30.5k, False: 3.59k]
  ------------------
 1030|  30.5k|        detail::count_valid<true>(cs.begin(), cs.end()):
 1031|  34.1k|        detail::count_valid<false>(cs.begin(), cs.end());
 1032|  34.1k|    std::size_t size = cs.used(start);
 1033|  34.1k|    if(is_key)
  ------------------
  |  Branch (1033:8): [Folded - Ignored]
  ------------------
 1034|      0|    {
 1035|      0|        BOOST_ASSERT(total <= Handler::max_key_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1036|      0|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1037|      0|            Handler::max_key_size - total))
 1038|      0|        {
 1039|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1040|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1041|      0|            return fail(cs.begin(), error::key_too_large, &loc);
 1042|      0|        }
 1043|      0|    }
 1044|  34.1k|    else
 1045|  34.1k|    {
 1046|  34.1k|        BOOST_ASSERT(total <= Handler::max_string_size);
  ------------------
  |  |   60|  34.1k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1047|  34.1k|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|  34.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 34.1k]
  |  |  ------------------
  ------------------
 1048|  34.1k|            Handler::max_string_size - total))
 1049|      0|        {
 1050|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1051|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1052|      0|            return fail(cs.begin(), error::string_too_large, &loc);
 1053|      0|        }
 1054|  34.1k|    }
 1055|  34.1k|    total += size;
 1056|  34.1k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  34.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 169, False: 33.9k]
  |  |  ------------------
  ------------------
 1057|    169|    {
 1058|       |        // call handler if the string isn't empty
 1059|    169|        if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|    169|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 146, False: 23]
  |  |  ------------------
  ------------------
 1060|    146|        {
 1061|    146|            {
 1062|    146|                bool r = is_key?
  ------------------
  |  Branch (1062:26): [Folded - Ignored]
  ------------------
 1063|      0|                    h_.on_key_part( {start, size}, total, ec_ ):
 1064|    146|                    h_.on_string_part( {start, size}, total, ec_ );
 1065|       |
 1066|    146|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|    146|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 146]
  |  |  ------------------
  ------------------
 1067|      0|                {
 1068|      0|                    return fail(cs.begin());
 1069|      0|                }
 1070|    146|            }
 1071|    146|        }
 1072|    169|        return maybe_suspend(cs.begin(), state::str1, total);
 1073|    169|    }
 1074|       |    // at this point all valid characters have been skipped, so any remaining
 1075|       |    // if there are any more characters, they are either escaped, or incomplete
 1076|       |    // utf8, or invalid utf8
 1077|  33.9k|    if(BOOST_JSON_UNLIKELY(*cs != '\x22')) // '"'
  ------------------
  |  |  179|  33.9k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 15.7k, False: 18.1k]
  |  |  ------------------
  ------------------
 1078|  15.7k|    {
 1079|       |        // sequence is invalid or incomplete
 1080|  15.7k|        if((*cs & 0x80) && !allow_bad_utf8)
  ------------------
  |  Branch (1080:12): [True: 113, False: 15.6k]
  |  Branch (1080:28): [True: 113, False: 0]
  ------------------
 1081|    113|        {
 1082|    113|            seq_.save(cs.begin(), cs.remain());
 1083|    113|            if(BOOST_JSON_UNLIKELY(seq_.complete()))
  ------------------
  |  |  179|    113|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 106, False: 7]
  |  |  ------------------
  ------------------
 1084|    106|            {
 1085|    106|                BOOST_STATIC_CONSTEXPR source_location loc
 1086|    106|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|    106|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1087|    106|                return fail(cs.begin(), error::syntax, &loc);
 1088|    106|            }
 1089|      7|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|      7|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1, False: 6]
  |  |  ------------------
  ------------------
 1090|      1|            {
 1091|      1|                {
 1092|      1|                    bool r = is_key?
  ------------------
  |  Branch (1092:30): [Folded - Ignored]
  ------------------
 1093|      0|                        h_.on_key_part( {start, size}, total, ec_ ):
 1094|      1|                        h_.on_string_part( {start, size}, total, ec_ );
 1095|       |
 1096|      1|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      1|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 1]
  |  |  ------------------
  ------------------
 1097|      0|                    {
 1098|      0|                        return fail(cs.begin());
 1099|      0|                    }
 1100|      1|                }
 1101|      1|            }
 1102|      7|            return maybe_suspend(cs.end(), state::str8, total);
 1103|      7|        }
 1104|  15.6k|        else if(BOOST_JSON_LIKELY(*cs == '\\'))
  ------------------
  |  |  171|  15.6k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 15.6k, False: 29]
  |  |  ------------------
  ------------------
 1105|  15.6k|        {
 1106|       |            // flush unescaped run from input
 1107|  15.6k|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|  15.6k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 13.4k, False: 2.16k]
  |  |  ------------------
  ------------------
 1108|  13.4k|            {
 1109|  13.4k|                {
 1110|  13.4k|                    bool r = is_key?
  ------------------
  |  Branch (1110:30): [Folded - Ignored]
  ------------------
 1111|      0|                        h_.on_key_part( {start, size}, total, ec_ ):
 1112|  13.4k|                        h_.on_string_part( {start, size}, total, ec_ );
 1113|       |
 1114|  13.4k|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|  13.4k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 13.4k]
  |  |  ------------------
  ------------------
 1115|      0|                    {
 1116|      0|                        return fail(cs.begin());
 1117|      0|                    }
 1118|  13.4k|                }
 1119|  13.4k|            }
 1120|  15.6k|            return parse_escaped(cs.begin(), total, stack_empty, is_key, allow_bad_utf8);
 1121|  15.6k|        }
 1122|       |        // illegal control
 1123|     29|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     29|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1124|     29|        return fail(cs.begin(), error::syntax, &loc);
 1125|  15.7k|    }
 1126|       |
 1127|  18.1k|    {
 1128|  18.1k|        bool r = is_key?
  ------------------
  |  Branch (1128:18): [Folded - Ignored]
  ------------------
 1129|      0|            h_.on_key( {start, size}, total, ec_ ):
 1130|  18.1k|            h_.on_string( {start, size}, total, ec_ );
 1131|       |
 1132|  18.1k|        if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|  18.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 18.1k]
  |  |  ------------------
  ------------------
 1133|      0|        {
 1134|      0|            return fail(cs.begin());
 1135|      0|        }
 1136|  18.1k|    }
 1137|       |
 1138|  18.1k|    ++cs;
 1139|  18.1k|    return cs.begin();
 1140|  18.1k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE13maybe_suspendEPKcNS4_5stateEm:
  324|  3.94k|{
  325|  3.94k|    end_ = p;
  326|  3.94k|    if(BOOST_JSON_LIKELY(more_))
  ------------------
  |  |  171|  3.94k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.78k, False: 2.15k]
  |  |  ------------------
  ------------------
  327|  1.78k|    {
  328|       |        // suspend
  329|  1.78k|        reserve();
  330|  1.78k|        st_.push_unchecked(n);
  331|  1.78k|        st_.push_unchecked(st);
  332|  1.78k|    }
  333|  3.94k|    return sentinel();
  334|  3.94k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE13parse_escapedILb1EEEPKcS7_mNSt3__117integral_constantIbXT_EEEbb:
 1155|  19.6k|{
 1156|       |    //---------------------------------------------------------------
 1157|       |    //
 1158|       |    // To handle escapes, a local temporary buffer accumulates
 1159|       |    // the unescaped result. The algorithm attempts to fill the
 1160|       |    // buffer to capacity before invoking the handler.
 1161|       |    // In some cases the temporary buffer needs to be flushed
 1162|       |    // before it is full:
 1163|       |    // * When the closing double quote is seen
 1164|       |    // * When there in no more input (and more is expected later)
 1165|       |    // A goal of the algorithm is to call the handler as few times
 1166|       |    // as possible. Thus, when the first escape is encountered,
 1167|       |    // the algorithm attempts to fill the temporary buffer first.
 1168|       |    //
 1169|  19.6k|    auto const ev_too_large = is_key?
  ------------------
  |  Branch (1169:31): [True: 4.03k, False: 15.6k]
  ------------------
 1170|  15.6k|        error::key_too_large : error::string_too_large;
 1171|  19.6k|    auto const max_size = is_key?
  ------------------
  |  Branch (1171:27): [True: 4.03k, False: 15.6k]
  ------------------
 1172|  15.6k|        Handler::max_key_size : Handler::max_string_size;
 1173|  19.6k|    detail::clipped_const_stream cs(p, end_);
 1174|  19.6k|    detail::buffer<BOOST_JSON_STACK_BUFFER_SIZE> temp;
 1175|  19.6k|    int digit;
 1176|  19.6k|    char c;
 1177|  19.6k|    cs.clip(temp.max_size());
 1178|  19.6k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1178:8): [Folded - Ignored]
  |  Branch (1178:25): [True: 0, False: 0]
  ------------------
 1179|      0|    {
 1180|      0|        state st;
 1181|      0|        st_.pop(st);
 1182|      0|        st_.pop(total);
 1183|      0|        switch(st)
 1184|      0|        {
 1185|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1185:9): [True: 0, False: 0]
  ------------------
 1186|      0|        case state::str2: goto do_str2;
  ------------------
  |  Branch (1186:9): [True: 0, False: 0]
  ------------------
 1187|      0|        case state::str3: goto do_str3;
  ------------------
  |  Branch (1187:9): [True: 0, False: 0]
  ------------------
 1188|      0|        case state::str4: goto do_str4;
  ------------------
  |  Branch (1188:9): [True: 0, False: 0]
  ------------------
 1189|      0|        case state::str5: goto do_str5;
  ------------------
  |  Branch (1189:9): [True: 0, False: 0]
  ------------------
 1190|      0|        case state::str6: goto do_str6;
  ------------------
  |  Branch (1190:9): [True: 0, False: 0]
  ------------------
 1191|      0|        case state::str7: goto do_str7;
  ------------------
  |  Branch (1191:9): [True: 0, False: 0]
  ------------------
 1192|      0|        case state::str8: goto do_str8;
  ------------------
  |  Branch (1192:9): [True: 0, False: 0]
  ------------------
 1193|      0|        case state::sur1: goto do_sur1;
  ------------------
  |  Branch (1193:9): [True: 0, False: 0]
  ------------------
 1194|      0|        case state::sur2: goto do_sur2;
  ------------------
  |  Branch (1194:9): [True: 0, False: 0]
  ------------------
 1195|      0|        case state::sur3: goto do_sur3;
  ------------------
  |  Branch (1195:9): [True: 0, False: 0]
  ------------------
 1196|      0|        case state::sur4: goto do_sur4;
  ------------------
  |  Branch (1196:9): [True: 0, False: 0]
  ------------------
 1197|      0|        case state::sur5: goto do_sur5;
  ------------------
  |  Branch (1197:9): [True: 0, False: 0]
  ------------------
 1198|      0|        case state::sur6: goto do_sur6;
  ------------------
  |  Branch (1198:9): [True: 0, False: 0]
  ------------------
 1199|      0|        }
 1200|      0|    }
 1201|       |    // Unescaped JSON is never larger than its escaped version.
 1202|       |    // To efficiently process only what will fit in the temporary buffer,
 1203|       |    // the size of the input stream is temporarily "clipped" to the size
 1204|       |    // of the temporary buffer.
 1205|       |    // handle escaped character
 1206|  19.6k|    BOOST_ASSERT(*cs == '\\');
  ------------------
  |  |   60|  19.6k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1207|  19.6k|    ++cs;
 1208|  2.85M|do_str3:
 1209|  2.85M|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.85M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 873, False: 2.85M]
  |  |  ------------------
  ------------------
 1210|    873|    {
 1211|    873|        if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|    873|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 832, False: 41]
  |  |  ------------------
  ------------------
 1212|    832|        {
 1213|    832|            BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|    832|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1214|    832|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    832|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 832]
  |  |  ------------------
  ------------------
 1215|    832|                temp.size() > max_size - total))
 1216|      0|            {
 1217|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1218|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1219|      0|                return fail(cs.begin(), ev_too_large, &loc);
 1220|      0|            }
 1221|    832|            total += temp.size();
 1222|    832|            {
 1223|    832|                bool r = is_key
  ------------------
  |  Branch (1223:26): [True: 37, False: 795]
  ------------------
 1224|    832|                    ? h_.on_key_part(temp.get(), total, ec_)
 1225|    832|                    : h_.on_string_part(temp.get(), total, ec_);
 1226|       |
 1227|    832|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|    832|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 832]
  |  |  ------------------
  ------------------
 1228|      0|                {
 1229|      0|                    return fail(cs.begin());
 1230|      0|                }
 1231|    832|            }
 1232|    832|            temp.clear();
 1233|    832|        }
 1234|    873|        cs.clip(temp.max_size());
 1235|    873|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    873|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 84, False: 789]
  |  |  ------------------
  ------------------
 1236|     84|            return maybe_suspend(cs.begin(), state::str3, total);
 1237|    873|    }
 1238|  2.85M|    switch(*cs)
 1239|  2.85M|    {
 1240|     34|    default:
  ------------------
  |  Branch (1240:5): [True: 34, False: 2.85M]
  ------------------
 1241|     34|        {
 1242|     34|            BOOST_STATIC_CONSTEXPR source_location loc
 1243|     34|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     34|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1244|     34|            return fail(cs.begin(), error::syntax, &loc);
 1245|      0|        }
 1246|  8.68k|    case '\x22': // '"'
  ------------------
  |  Branch (1246:5): [True: 8.68k, False: 2.84M]
  ------------------
 1247|  8.68k|        temp.push_back('\x22');
 1248|  8.68k|        ++cs;
 1249|  8.68k|        break;
 1250|  2.00M|    case '\\':
  ------------------
  |  Branch (1250:5): [True: 2.00M, False: 843k]
  ------------------
 1251|  2.00M|        temp.push_back('\\');
 1252|  2.00M|        ++cs;
 1253|  2.00M|        break;
 1254|  1.50k|    case '/':
  ------------------
  |  Branch (1254:5): [True: 1.50k, False: 2.85M]
  ------------------
 1255|  1.50k|        temp.push_back('/');
 1256|  1.50k|        ++cs;
 1257|  1.50k|        break;
 1258|  9.40k|    case 'b':
  ------------------
  |  Branch (1258:5): [True: 9.40k, False: 2.84M]
  ------------------
 1259|  9.40k|        temp.push_back('\x08');
 1260|  9.40k|        ++cs;
 1261|  9.40k|        break;
 1262|  48.7k|    case 'f':
  ------------------
  |  Branch (1262:5): [True: 48.7k, False: 2.80M]
  ------------------
 1263|  48.7k|        temp.push_back('\x0c');
 1264|  48.7k|        ++cs;
 1265|  48.7k|        break;
 1266|  3.34k|    case 'n':
  ------------------
  |  Branch (1266:5): [True: 3.34k, False: 2.84M]
  ------------------
 1267|  3.34k|        temp.push_back('\x0a');
 1268|  3.34k|        ++cs;
 1269|  3.34k|        break;
 1270|    869|    case 'r':
  ------------------
  |  Branch (1270:5): [True: 869, False: 2.85M]
  ------------------
 1271|    869|        temp.push_back('\x0d');
 1272|    869|        ++cs;
 1273|    869|        break;
 1274|  1.85k|    case 't':
  ------------------
  |  Branch (1274:5): [True: 1.85k, False: 2.84M]
  ------------------
 1275|  1.85k|        temp.push_back('\x09');
 1276|  1.85k|        ++cs;
 1277|  1.85k|        break;
 1278|   769k|    case 'u':
  ------------------
  |  Branch (1278:5): [True: 769k, False: 2.08M]
  ------------------
 1279|       |        // utf16 escape
 1280|       |        //
 1281|       |        // fast path only when the buffer
 1282|       |        // is large enough for 2 surrogates
 1283|   769k|        if(BOOST_JSON_LIKELY(cs.remain() > 10))
  ------------------
  |  |  171|   769k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 767k, False: 2.27k]
  |  |  ------------------
  ------------------
 1284|   767k|        {
 1285|       |            // KRYSTIAN TODO: this could be done
 1286|       |            // with fewer instructions
 1287|   767k|            digit = detail::load_little_endian<4>(
 1288|   767k|                cs.begin() + 1);
 1289|   767k|            int d4 = detail::hex_digit(static_cast<
 1290|   767k|                unsigned char>(digit >> 24));
 1291|   767k|            int d3 = detail::hex_digit(static_cast<
 1292|   767k|                unsigned char>(digit >> 16));
 1293|   767k|            int d2 = detail::hex_digit(static_cast<
 1294|   767k|                unsigned char>(digit >> 8));
 1295|   767k|            int d1 = detail::hex_digit(static_cast<
 1296|   767k|                unsigned char>(digit));
 1297|   767k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|   767k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 73, False: 767k]
  |  |  ------------------
  ------------------
 1298|   767k|                (d1 | d2 | d3 | d4) == -1))
 1299|     73|            {
 1300|     73|                if(d1 != -1)
  ------------------
  |  Branch (1300:20): [True: 40, False: 33]
  ------------------
 1301|     40|                    ++cs;
 1302|     73|                if(d2 != -1)
  ------------------
  |  Branch (1302:20): [True: 27, False: 46]
  ------------------
 1303|     27|                    ++cs;
 1304|     73|                if(d3 != -1)
  ------------------
  |  Branch (1304:20): [True: 23, False: 50]
  ------------------
 1305|     23|                    ++cs;
 1306|     73|                BOOST_STATIC_CONSTEXPR source_location loc
 1307|     73|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     73|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1308|     73|                return fail(cs.begin(), error::expected_hex_digit, &loc);
 1309|     73|            }
 1310|       |            // 32 bit unicode scalar value
 1311|   767k|            unsigned const u1 =
 1312|   767k|                (d1 << 12) + (d2 << 8) +
 1313|   767k|                (d3 << 4) + d4;
 1314|       |            // valid unicode scalar values are
 1315|       |            // [0, D7FF] and [E000, 10FFFF]
 1316|       |            // values within this range are valid utf-8
 1317|       |            // code points and invalid leading surrogates.
 1318|   767k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|   906k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 750k, False: 16.9k]
  |  |  |  Branch (171:52): [True: 627k, False: 139k]
  |  |  |  Branch (171:52): [True: 122k, False: 16.9k]
  |  |  ------------------
  ------------------
 1319|   767k|                u1 < 0xd800 || u1 > 0xdfff))
 1320|   750k|            {
 1321|   750k|                cs += 5;
 1322|   750k|                temp.append_utf8(u1);
 1323|   750k|                break;
 1324|   750k|            }
 1325|  16.9k|            if(BOOST_JSON_UNLIKELY(u1 > 0xdbff))
  ------------------
  |  |  179|  16.9k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 13, False: 16.9k]
  |  |  ------------------
  ------------------
 1326|     13|            {
 1327|     13|                BOOST_STATIC_CONSTEXPR source_location loc
 1328|     13|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     13|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1329|     13|                return fail(cs.begin(), error::illegal_leading_surrogate,
 1330|     13|                    &loc);
 1331|     13|            }
 1332|  16.9k|            cs += 5;
 1333|       |            // KRYSTIAN TODO: this can be a two byte load
 1334|       |            // and a single comparison. We lose error information,
 1335|       |            // but it's faster.
 1336|  16.9k|            if(BOOST_JSON_UNLIKELY(*cs != '\\'))
  ------------------
  |  |  179|  16.9k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 16.9k]
  |  |  ------------------
  ------------------
 1337|      4|            {
 1338|      4|                BOOST_STATIC_CONSTEXPR source_location loc
 1339|      4|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      4|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1340|      4|                return fail(cs.begin(), error::syntax, &loc);
 1341|      4|            }
 1342|  16.9k|            ++cs;
 1343|  16.9k|            if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|  16.9k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 16.8k]
  |  |  ------------------
  ------------------
 1344|      5|            {
 1345|      5|                BOOST_STATIC_CONSTEXPR source_location loc
 1346|      5|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      5|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1347|      5|                return fail(cs.begin(), error::syntax, &loc);
 1348|      5|            }
 1349|  16.8k|            ++cs;
 1350|  16.8k|            digit = detail::load_little_endian<4>(cs.begin());
 1351|  16.8k|            d4 = detail::hex_digit(static_cast<
 1352|  16.8k|                unsigned char>(digit >> 24));
 1353|  16.8k|            d3 = detail::hex_digit(static_cast<
 1354|  16.8k|                unsigned char>(digit >> 16));
 1355|  16.8k|            d2 = detail::hex_digit(static_cast<
 1356|  16.8k|                unsigned char>(digit >> 8));
 1357|  16.8k|            d1 = detail::hex_digit(static_cast<
 1358|  16.8k|                unsigned char>(digit));
 1359|  16.8k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  16.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 48, False: 16.8k]
  |  |  ------------------
  ------------------
 1360|  16.8k|                (d1 | d2 | d3 | d4) == -1))
 1361|     48|            {
 1362|     48|                if(d1 != -1)
  ------------------
  |  Branch (1362:20): [True: 20, False: 28]
  ------------------
 1363|     20|                    ++cs;
 1364|     48|                if(d2 != -1)
  ------------------
  |  Branch (1364:20): [True: 22, False: 26]
  ------------------
 1365|     22|                    ++cs;
 1366|     48|                if(d3 != -1)
  ------------------
  |  Branch (1366:20): [True: 23, False: 25]
  ------------------
 1367|     23|                    ++cs;
 1368|     48|                BOOST_STATIC_CONSTEXPR source_location loc
 1369|     48|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     48|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1370|     48|                return fail(cs.begin(), error::expected_hex_digit, &loc);
 1371|     48|            }
 1372|  16.8k|            unsigned const u2 =
 1373|  16.8k|                (d1 << 12) + (d2 << 8) +
 1374|  16.8k|                (d3 << 4) + d4;
 1375|       |            // valid trailing surrogates are [DC00, DFFF]
 1376|  16.8k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  33.6k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 32, False: 16.8k]
  |  |  |  Branch (179:54): [True: 25, False: 16.8k]
  |  |  |  Branch (179:54): [True: 7, False: 16.8k]
  |  |  ------------------
  ------------------
 1377|  16.8k|                u2 < 0xdc00 || u2 > 0xdfff))
 1378|     32|            {
 1379|     32|                BOOST_STATIC_CONSTEXPR source_location loc
 1380|     32|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     32|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1381|     32|                return fail(cs.begin(), error::illegal_trailing_surrogate,
 1382|     32|                    &loc);
 1383|     32|            }
 1384|  16.8k|            cs += 4;
 1385|  16.8k|            unsigned cp =
 1386|  16.8k|                ((u1 - 0xd800) << 10) +
 1387|  16.8k|                ((u2 - 0xdc00)) +
 1388|  16.8k|                    0x10000;
 1389|       |            // utf-16 surrogate pair
 1390|  16.8k|            temp.append_utf8(cp);
 1391|  16.8k|            break;
 1392|  16.8k|        }
 1393|       |        // flush
 1394|  2.27k|        if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|  2.27k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.97k, False: 303]
  |  |  ------------------
  ------------------
 1395|  1.97k|        {
 1396|  1.97k|            BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|  1.97k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1397|  1.97k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  1.97k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 1.97k]
  |  |  ------------------
  ------------------
 1398|  1.97k|                temp.size() > max_size - total))
 1399|      0|            {
 1400|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1401|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1402|      0|                return fail(cs.begin(), ev_too_large, &loc);
 1403|      0|            }
 1404|  1.97k|            total += temp.size();
 1405|  1.97k|            {
 1406|  1.97k|                bool r = is_key
  ------------------
  |  Branch (1406:26): [True: 470, False: 1.50k]
  ------------------
 1407|  1.97k|                    ? h_.on_key_part(temp.get(), total, ec_)
 1408|  1.97k|                    : h_.on_string_part(temp.get(), total, ec_);
 1409|       |
 1410|  1.97k|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|  1.97k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 1.97k]
  |  |  ------------------
  ------------------
 1411|      0|                {
 1412|      0|                    return fail(cs.begin());
 1413|      0|                }
 1414|  1.97k|            }
 1415|  1.97k|            temp.clear();
 1416|  1.97k|            cs.clip(temp.max_size());
 1417|  1.97k|        }
 1418|  2.27k|        ++cs;
 1419|       |        // utf-16 escape
 1420|  2.27k|do_str4:
 1421|  2.27k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.27k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 24, False: 2.25k]
  |  |  ------------------
  ------------------
 1422|     24|            return maybe_suspend(cs.begin(), state::str4, total);
 1423|  2.25k|        digit = detail::hex_digit(*cs);
 1424|  2.25k|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|  2.25k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 13, False: 2.23k]
  |  |  ------------------
  ------------------
 1425|     13|        {
 1426|     13|            BOOST_STATIC_CONSTEXPR source_location loc
 1427|     13|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     13|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1428|     13|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1429|     13|        }
 1430|  2.23k|        ++cs;
 1431|  2.23k|        u1_ = digit << 12;
 1432|  2.23k|do_str5:
 1433|  2.23k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.23k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 17, False: 2.22k]
  |  |  ------------------
  ------------------
 1434|     17|            return maybe_suspend(cs.begin(), state::str5, total);
 1435|  2.22k|        digit = detail::hex_digit(*cs);
 1436|  2.22k|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|  2.22k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 19, False: 2.20k]
  |  |  ------------------
  ------------------
 1437|     19|        {
 1438|     19|            BOOST_STATIC_CONSTEXPR source_location loc
 1439|     19|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     19|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1440|     19|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1441|     19|        }
 1442|  2.20k|        ++cs;
 1443|  2.20k|        u1_ += digit << 8;
 1444|  2.20k|do_str6:
 1445|  2.20k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.20k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 20, False: 2.18k]
  |  |  ------------------
  ------------------
 1446|     20|            return maybe_suspend(cs.begin(), state::str6, total);
 1447|  2.18k|        digit = detail::hex_digit(*cs);
 1448|  2.18k|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|  2.18k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 22, False: 2.15k]
  |  |  ------------------
  ------------------
 1449|     22|        {
 1450|     22|            BOOST_STATIC_CONSTEXPR source_location loc
 1451|     22|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     22|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1452|     22|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1453|     22|        }
 1454|  2.15k|        ++cs;
 1455|  2.15k|        u1_ += digit << 4;
 1456|  2.15k|do_str7:
 1457|  2.15k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.15k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 22, False: 2.13k]
  |  |  ------------------
  ------------------
 1458|     22|            return maybe_suspend(cs.begin(), state::str7, total);
 1459|  2.13k|        digit = detail::hex_digit(*cs);
 1460|  2.13k|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|  2.13k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 11, False: 2.12k]
  |  |  ------------------
  ------------------
 1461|     11|        {
 1462|     11|            BOOST_STATIC_CONSTEXPR source_location loc
 1463|     11|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     11|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1464|     11|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1465|     11|        }
 1466|  2.12k|        ++cs;
 1467|  2.12k|        u1_ += digit;
 1468|  2.12k|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  3.09k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.38k, False: 744]
  |  |  |  Branch (171:52): [True: 1.15k, False: 970]
  |  |  |  Branch (171:52): [True: 226, False: 744]
  |  |  ------------------
  ------------------
 1469|  2.12k|            u1_ < 0xd800 || u1_ > 0xdfff))
 1470|  1.38k|        {
 1471|  1.38k|            BOOST_ASSERT(temp.empty());
  ------------------
  |  |   60|  1.38k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1472|       |            // utf-8 codepoint
 1473|  1.38k|            temp.append_utf8(u1_);
 1474|  1.38k|            break;
 1475|  1.38k|        }
 1476|    744|        if(BOOST_JSON_UNLIKELY(u1_ > 0xdbff))
  ------------------
  |  |  179|    744|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 7, False: 737]
  |  |  ------------------
  ------------------
 1477|      7|        {
 1478|      7|            BOOST_STATIC_CONSTEXPR source_location loc
 1479|      7|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      7|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1480|      7|            return fail(cs.begin(), error::illegal_trailing_surrogate, &loc);
 1481|      7|        }
 1482|    737|do_sur1:
 1483|    737|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    737|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 728]
  |  |  ------------------
  ------------------
 1484|      9|            return maybe_suspend(cs.begin(), state::sur1, total);
 1485|    728|        if(BOOST_JSON_UNLIKELY(*cs != '\\'))
  ------------------
  |  |  179|    728|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 13, False: 715]
  |  |  ------------------
  ------------------
 1486|     13|        {
 1487|     13|            BOOST_STATIC_CONSTEXPR source_location loc
 1488|     13|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     13|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1489|     13|            return fail(cs.begin(), error::syntax, &loc);
 1490|     13|        }
 1491|    715|        ++cs;
 1492|    715|do_sur2:
 1493|    715|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    715|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 713]
  |  |  ------------------
  ------------------
 1494|      2|            return maybe_suspend(cs.begin(), state::sur2, total);
 1495|    713|        if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|    713|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 711]
  |  |  ------------------
  ------------------
 1496|      2|        {
 1497|      2|            BOOST_STATIC_CONSTEXPR source_location loc
 1498|      2|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      2|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1499|      2|            return fail(cs.begin(), error::syntax, &loc);
 1500|      2|        }
 1501|    711|        ++cs;
 1502|    711|do_sur3:
 1503|    711|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    711|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 709]
  |  |  ------------------
  ------------------
 1504|      2|            return maybe_suspend(cs.begin(), state::sur3, total);
 1505|    709|        digit = detail::hex_digit(*cs);
 1506|    709|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|    709|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 705]
  |  |  ------------------
  ------------------
 1507|      4|        {
 1508|      4|            BOOST_STATIC_CONSTEXPR source_location loc
 1509|      4|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      4|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1510|      4|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1511|      4|        }
 1512|    705|        ++cs;
 1513|    705|        u2_ = digit << 12;
 1514|    705|do_sur4:
 1515|    705|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    705|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 696]
  |  |  ------------------
  ------------------
 1516|      9|            return maybe_suspend(cs.begin(), state::sur4, total);
 1517|    696|        digit = detail::hex_digit(*cs);
 1518|    696|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|    696|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 14, False: 682]
  |  |  ------------------
  ------------------
 1519|     14|        {
 1520|     14|            BOOST_STATIC_CONSTEXPR source_location loc
 1521|     14|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     14|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1522|     14|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1523|     14|        }
 1524|    682|        ++cs;
 1525|    682|        u2_ += digit << 8;
 1526|    682|do_sur5:
 1527|    682|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    682|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 7, False: 675]
  |  |  ------------------
  ------------------
 1528|      7|            return maybe_suspend(cs.begin(), state::sur5, total);
 1529|    675|        digit = detail::hex_digit(*cs);
 1530|    675|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|    675|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 10, False: 665]
  |  |  ------------------
  ------------------
 1531|     10|        {
 1532|     10|            BOOST_STATIC_CONSTEXPR source_location loc
 1533|     10|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     10|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1534|     10|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1535|     10|        }
 1536|    665|        ++cs;
 1537|    665|        u2_ += digit << 4;
 1538|    665|do_sur6:
 1539|    665|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    665|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 15, False: 650]
  |  |  ------------------
  ------------------
 1540|     15|            return maybe_suspend(cs.begin(), state::sur6, total);
 1541|    650|        digit = detail::hex_digit(*cs);
 1542|    650|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|    650|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 646]
  |  |  ------------------
  ------------------
 1543|      4|        {
 1544|      4|            BOOST_STATIC_CONSTEXPR source_location loc
 1545|      4|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      4|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1546|      4|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1547|      4|        }
 1548|    646|        ++cs;
 1549|    646|        u2_ += digit;
 1550|    646|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  1.28k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 637]
  |  |  |  Branch (179:54): [True: 4, False: 642]
  |  |  |  Branch (179:54): [True: 5, False: 637]
  |  |  ------------------
  ------------------
 1551|    646|            u2_ < 0xdc00 || u2_ > 0xdfff))
 1552|      9|        {
 1553|      9|            BOOST_STATIC_CONSTEXPR source_location loc
 1554|      9|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      9|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1555|      9|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1556|      9|        }
 1557|    637|        unsigned cp =
 1558|    637|            ((u1_ - 0xd800) << 10) +
 1559|    637|            ((u2_ - 0xdc00)) +
 1560|    637|                0x10000;
 1561|    637|        BOOST_ASSERT(temp.empty());
  ------------------
  |  |   60|    637|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1562|       |        // utf-16 surrogate pair
 1563|    637|        temp.append_utf8(cp);
 1564|  2.85M|    }
 1565|  2.85M|do_str2:
 1566|       |    // KRYSTIAN TODO: we can append the characters
 1567|       |    // all at once instead of one at a time
 1568|  2.85M|    for(;;)
 1569|  22.4M|    {
 1570|  22.4M|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  22.4M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 3.84k, False: 22.4M]
  |  |  ------------------
  ------------------
 1571|  3.84k|        {
 1572|       |            // flush
 1573|  3.84k|            if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|  3.84k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 3.84k, False: 0]
  |  |  ------------------
  ------------------
 1574|  3.84k|            {
 1575|  3.84k|                BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|  3.84k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1576|  3.84k|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  3.84k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 3.84k]
  |  |  ------------------
  ------------------
 1577|  3.84k|                    temp.size() > max_size - total))
 1578|      0|                {
 1579|      0|                    BOOST_STATIC_CONSTEXPR source_location loc
 1580|      0|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1581|      0|                    return fail(cs.begin(), ev_too_large, &loc);
 1582|      0|                }
 1583|  3.84k|                total += temp.size();
 1584|  3.84k|                {
 1585|  3.84k|                    bool r = is_key
  ------------------
  |  Branch (1585:30): [True: 517, False: 3.32k]
  ------------------
 1586|  3.84k|                        ? h_.on_key_part(temp.get(), total, ec_)
 1587|  3.84k|                        : h_.on_string_part(temp.get(), total, ec_);
 1588|       |
 1589|  3.84k|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|  3.84k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 3.84k]
  |  |  ------------------
  ------------------
 1590|      0|                    {
 1591|      0|                        return fail(cs.begin());
 1592|      0|                    }
 1593|  3.84k|                }
 1594|  3.84k|                temp.clear();
 1595|  3.84k|            }
 1596|  3.84k|            cs.clip(temp.max_size());
 1597|  3.84k|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  3.84k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 341, False: 3.49k]
  |  |  ------------------
  ------------------
 1598|    341|                return maybe_suspend(cs.begin(), state::str2, total);
 1599|  3.84k|        }
 1600|  22.4M|        c = *cs;
 1601|  22.4M|        if(BOOST_JSON_LIKELY(c == '\x22')) // '"'
  ------------------
  |  |  171|  22.4M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 18.5k, False: 22.4M]
  |  |  ------------------
  ------------------
 1602|  18.5k|        {
 1603|  18.5k|            BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|  18.5k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1604|  18.5k|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  18.5k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 18.5k]
  |  |  ------------------
  ------------------
 1605|  18.5k|                temp.size() > max_size - total))
 1606|      0|            {
 1607|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1608|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1609|      0|                return fail(cs.begin(), ev_too_large, &loc);
 1610|      0|            }
 1611|  18.5k|            total += temp.size();
 1612|  18.5k|            {
 1613|  18.5k|                bool r = is_key
  ------------------
  |  Branch (1613:26): [True: 3.97k, False: 14.6k]
  ------------------
 1614|  18.5k|                    ? h_.on_key(temp.get(), total, ec_)
 1615|  18.5k|                    : h_.on_string(temp.get(), total, ec_);
 1616|       |
 1617|  18.5k|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|  18.5k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 18.5k]
  |  |  ------------------
  ------------------
 1618|      0|                {
 1619|      0|                    return fail(cs.begin());
 1620|      0|                }
 1621|  18.5k|            }
 1622|  18.5k|            ++cs;
 1623|  18.5k|            return cs.begin();
 1624|  18.5k|        }
 1625|  22.4M|        else if((c & 0x80) && !allow_bad_utf8)
  ------------------
  |  Branch (1625:17): [True: 1.02M, False: 21.4M]
  |  Branch (1625:31): [True: 275k, False: 751k]
  ------------------
 1626|   275k|        {
 1627|   275k|            seq_.save(cs.begin(), cs.remain());
 1628|   275k|            if(BOOST_JSON_UNLIKELY(! seq_.complete()))
  ------------------
  |  |  179|   275k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 609, False: 275k]
  |  |  ------------------
  ------------------
 1629|    609|            {
 1630|    609|                if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|    609|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 606, False: 3]
  |  |  ------------------
  ------------------
 1631|    606|                {
 1632|    606|                    BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|    606|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1633|    606|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    606|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 606]
  |  |  ------------------
  ------------------
 1634|    606|                        temp.size() > max_size - total))
 1635|      0|                    {
 1636|      0|                        BOOST_STATIC_CONSTEXPR source_location loc
 1637|      0|                            = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1638|      0|                        return fail(cs.begin(), ev_too_large, &loc);
 1639|      0|                    }
 1640|    606|                    total += temp.size();
 1641|    606|                    {
 1642|    606|                        bool r = is_key
  ------------------
  |  Branch (1642:34): [True: 75, False: 531]
  ------------------
 1643|    606|                            ? h_.on_key_part(temp.get(), total, ec_)
 1644|    606|                            : h_.on_string_part(temp.get(), total, ec_);
 1645|       |
 1646|    606|                        if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|    606|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 606]
  |  |  ------------------
  ------------------
 1647|      0|                        {
 1648|      0|                            return fail(cs.begin());
 1649|      0|                        }
 1650|    606|                    }
 1651|    606|                    temp.clear();
 1652|    606|                }
 1653|    609|                cs = cs.end();
 1654|       |                // ensure there is room for the saved byte sequence
 1655|    609|                cs.clip(temp.max_size() - seq_.length());
 1656|    609|                goto do_str8;
 1657|    609|            }
 1658|   275k|            if(BOOST_JSON_UNLIKELY(! seq_.valid()))
  ------------------
  |  |  179|   275k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 141, False: 275k]
  |  |  ------------------
  ------------------
 1659|    141|            {
 1660|    141|                BOOST_STATIC_CONSTEXPR source_location loc
 1661|    141|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|    141|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1662|    141|                return fail(cs.begin(), error::syntax, &loc);
 1663|    141|            }
 1664|   275k|            temp.append(seq_.data(), seq_.length());
 1665|   275k|            cs += seq_.length();
 1666|   275k|            continue;
 1667|   275k|        }
 1668|  22.1M|        else if(BOOST_JSON_LIKELY(c == '\\'))
  ------------------
  |  |  171|  22.1M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.83M, False: 19.3M]
  |  |  ------------------
  ------------------
 1669|  2.83M|        {
 1670|  2.83M|            ++cs;
 1671|  2.83M|            goto do_str3;
 1672|  2.83M|        }
 1673|  19.3M|        else if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  19.3M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 49, False: 19.3M]
  |  |  ------------------
  ------------------
 1674|  19.3M|            detail::is_control(c)))
 1675|     49|        {
 1676|     49|            BOOST_STATIC_CONSTEXPR source_location loc
 1677|     49|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     49|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1678|     49|            return fail(cs.begin(), error::syntax, &loc);
 1679|     49|        }
 1680|  19.3M|        temp.push_back(c);
 1681|  19.3M|        ++cs;
 1682|  19.3M|    }
 1683|    609|do_str8:
 1684|    609|    uint8_t needed = seq_.needed();
 1685|    609|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    609|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 24, False: 585]
  |  |  ------------------
  ------------------
 1686|    609|        ! seq_.append(cs.begin(), cs.remain())))
 1687|     24|        return maybe_suspend(cs.end(), state::str8, total);
 1688|    585|    if(BOOST_JSON_UNLIKELY(! seq_.valid()))
  ------------------
  |  |  179|    585|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 11, False: 574]
  |  |  ------------------
  ------------------
 1689|     11|    {
 1690|     11|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     11|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1691|     11|        return fail(cs.begin(), error::syntax, &loc);
 1692|     11|    }
 1693|    574|    temp.append(seq_.data(), seq_.length());
 1694|    574|    cs += needed;
 1695|    574|    goto do_str2;
 1696|    585|}
_ZN5boost4json6detail9hex_digitEh:
  176|  3.14M|{
  177|       |    // by Peter Dimov
  178|  3.14M|    if( c >= '0' && c <= '9' )
  ------------------
  |  Branch (178:9): [True: 3.14M, False: 147]
  |  Branch (178:21): [True: 1.77M, False: 1.37M]
  ------------------
  179|  1.77M|        return c - '0';
  180|  1.37M|    c &= ~0x20;
  181|  1.37M|    if( c >= 'A' && c <= 'F' )
  ------------------
  |  Branch (181:9): [True: 1.37M, False: 173]
  |  Branch (181:21): [True: 1.37M, False: 212]
  ------------------
  182|  1.37M|        return 10 + c - 'A';
  183|    385|    return -1;
  184|  1.37M|}
_ZN5boost4json6detail10is_controlEc:
  169|  19.3M|{
  170|  19.3M|    return static_cast<unsigned char>(c) < 32;
  171|  19.3M|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_arrayILb1ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1881|  9.75k|{
 1882|  9.75k|    detail::const_stream_wrapper cs(p, end_);
 1883|  9.75k|    std::size_t size;
 1884|  9.75k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1884:8): [Folded - Ignored]
  |  Branch (1884:25): [True: 0, False: 0]
  ------------------
 1885|      0|    {
 1886|       |        // resume
 1887|      0|        state st;
 1888|      0|        st_.pop(st);
 1889|      0|        st_.pop(size);
 1890|      0|        switch(st)
 1891|      0|        {
 1892|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1892:9): [True: 0, False: 0]
  ------------------
 1893|      0|        case state::arr1: goto do_arr1;
  ------------------
  |  Branch (1893:9): [True: 0, False: 0]
  ------------------
 1894|      0|        case state::arr2: goto do_arr2;
  ------------------
  |  Branch (1894:9): [True: 0, False: 0]
  ------------------
 1895|      0|        case state::arr3: goto do_arr3;
  ------------------
  |  Branch (1895:9): [True: 0, False: 0]
  ------------------
 1896|      0|        case state::arr4: goto do_arr4;
  ------------------
  |  Branch (1896:9): [True: 0, False: 0]
  ------------------
 1897|      0|        case state::arr5: goto do_arr5;
  ------------------
  |  Branch (1897:9): [True: 0, False: 0]
  ------------------
 1898|      0|        case state::arr6: goto do_arr6;
  ------------------
  |  Branch (1898:9): [True: 0, False: 0]
  ------------------
 1899|      0|        }
 1900|      0|    }
 1901|  9.75k|    BOOST_ASSERT(*cs == '[');
  ------------------
  |  |   60|  9.75k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1902|  9.75k|    size = 0;
 1903|  9.75k|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|  9.75k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 9.75k]
  |  |  ------------------
  ------------------
 1904|      5|    {
 1905|      5|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      5|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1906|      5|        return fail(cs.begin(), error::too_deep, &loc);
 1907|      5|    }
 1908|  9.75k|    --depth_;
 1909|  9.75k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  9.75k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 9.75k]
  |  |  ------------------
  ------------------
 1910|  9.75k|        ! h_.on_array_begin(ec_)))
 1911|      0|        return fail(cs.begin());
 1912|  9.75k|    ++cs;
 1913|       |    // array:
 1914|       |    //     '[' *ws ']'
 1915|       |    //     '[' *ws value *ws *[ ',' *ws value *ws ] ']'
 1916|  9.75k|do_arr1:
 1917|  9.75k|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1918|  9.75k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  9.75k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 44, False: 9.70k]
  |  |  ------------------
  ------------------
 1919|     44|        return maybe_suspend(cs.begin(), state::arr1, size);
 1920|  9.70k|    if(BOOST_JSON_LIKELY(*cs != ']'))
  ------------------
  |  |  171|  9.70k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.35k, False: 5.34k]
  |  |  ------------------
  ------------------
 1921|  4.35k|    {
 1922|  2.89M|loop:
 1923|  2.89M|        if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1923:12): [Folded - Ignored]
  |  Branch (1923:30): [True: 0, False: 0]
  ------------------
 1924|      0|        {
 1925|      0|do_arr2:
 1926|      0|            cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1927|      0|            if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1928|      0|                return suspend_or_fail(state::arr2, size);
 1929|      0|            goto do_arr1;
 1930|      0|        }
 1931|  2.89M|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|  2.89M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 2.89M]
  |  |  ------------------
  ------------------
 1932|  2.89M|            Handler::max_array_size))
 1933|      0|        {
 1934|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1935|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1936|      0|            return fail(cs.begin(), error::array_too_large, &loc);
 1937|      0|        }
 1938|  2.89M|do_arr3:
 1939|       |        // array is not empty, value required
 1940|  2.89M|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1941|  2.89M|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|  2.89M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 923, False: 2.89M]
  |  |  ------------------
  ------------------
 1942|    923|            return suspend_or_fail(state::arr3, size);
 1943|  2.89M|do_arr4:
 1944|  2.89M|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1945|  2.89M|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.89M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 118, False: 2.89M]
  |  |  ------------------
  ------------------
 1946|    118|            return maybe_suspend(cs.begin(), state::arr4, size);
 1947|  2.89M|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|  2.89M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.89M, False: 2.95k]
  |  |  ------------------
  ------------------
 1948|  2.89M|        {
 1949|  2.89M|            ++cs;
 1950|  2.89M|do_arr5:
 1951|  2.89M|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1952|  2.89M|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  2.89M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 70, False: 2.89M]
  |  |  ------------------
  ------------------
 1953|     70|                return maybe_suspend(cs.begin(), state::arr5, size);
 1954|       |            // loop for next element
 1955|  2.89M|            if(! allow_trailing || *cs != ']')
  ------------------
  |  Branch (1955:16): [True: 411k, False: 2.48M]
  |  Branch (1955:36): [True: 2.48M, False: 290]
  ------------------
 1956|  2.89M|                goto loop;
 1957|  2.89M|        }
 1958|  2.95k|        else if(BOOST_JSON_UNLIKELY(*cs != ']'))
  ------------------
  |  |  179|  2.95k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 232, False: 2.72k]
  |  |  ------------------
  ------------------
 1959|    232|        {
 1960|    232|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1960:16): [Folded - Ignored]
  |  Branch (1960:34): [True: 0, False: 0]
  ------------------
 1961|      0|            {
 1962|      0|do_arr6:
 1963|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1964|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1965|      0|                    return suspend_or_fail(state::arr6, size);
 1966|      0|                goto do_arr4;
 1967|      0|            }
 1968|    232|            BOOST_STATIC_CONSTEXPR source_location loc
 1969|    232|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|    232|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1970|    232|            return fail(cs.begin(), error::syntax, &loc);
 1971|    232|        }
 1972|       |        // got closing bracket; fall through
 1973|  2.89M|    }
 1974|  8.36k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  8.36k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 8.36k]
  |  |  ------------------
  ------------------
 1975|  8.36k|        ! h_.on_array_end(size, ec_)))
 1976|      0|        return fail(cs.begin());
 1977|  8.36k|    ++depth_;
 1978|  8.36k|    ++cs;
 1979|  8.36k|    return cs.begin();
 1980|  8.36k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE15suspend_or_failENS4_5stateEm:
  265|  5.22k|{
  266|  5.22k|    if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  8.95k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.19k, False: 3.03k]
  |  |  |  Branch (171:52): [True: 3.72k, False: 1.50k]
  |  |  |  Branch (171:52): [True: 2.19k, False: 1.52k]
  |  |  ------------------
  ------------------
  267|  5.22k|        ! ec_ && more_))
  268|  2.19k|    {
  269|       |        // suspend
  270|  2.19k|        reserve();
  271|  2.19k|        st_.push_unchecked(n);
  272|  2.19k|        st_.push_unchecked(st);
  273|  2.19k|    }
  274|  5.22k|    return sentinel();
  275|  5.22k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_objectILb1ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1713|  4.91k|{
 1714|  4.91k|    detail::const_stream_wrapper cs(p, end_);
 1715|  4.91k|    std::size_t size;
 1716|  4.91k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1716:8): [Folded - Ignored]
  |  Branch (1716:25): [True: 0, False: 0]
  ------------------
 1717|      0|    {
 1718|       |        // resume
 1719|      0|        state st;
 1720|      0|        st_.pop(st);
 1721|      0|        st_.pop(size);
 1722|      0|        switch(st)
 1723|      0|        {
 1724|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1724:9): [True: 0, False: 0]
  ------------------
 1725|      0|        case state::obj1: goto do_obj1;
  ------------------
  |  Branch (1725:9): [True: 0, False: 0]
  ------------------
 1726|      0|        case state::obj2: goto do_obj2;
  ------------------
  |  Branch (1726:9): [True: 0, False: 0]
  ------------------
 1727|      0|        case state::obj3: goto do_obj3;
  ------------------
  |  Branch (1727:9): [True: 0, False: 0]
  ------------------
 1728|      0|        case state::obj4: goto do_obj4;
  ------------------
  |  Branch (1728:9): [True: 0, False: 0]
  ------------------
 1729|      0|        case state::obj5: goto do_obj5;
  ------------------
  |  Branch (1729:9): [True: 0, False: 0]
  ------------------
 1730|      0|        case state::obj6: goto do_obj6;
  ------------------
  |  Branch (1730:9): [True: 0, False: 0]
  ------------------
 1731|      0|        case state::obj7: goto do_obj7;
  ------------------
  |  Branch (1731:9): [True: 0, False: 0]
  ------------------
 1732|      0|        case state::obj8: goto do_obj8;
  ------------------
  |  Branch (1732:9): [True: 0, False: 0]
  ------------------
 1733|      0|        case state::obj9: goto do_obj9;
  ------------------
  |  Branch (1733:9): [True: 0, False: 0]
  ------------------
 1734|      0|        case state::obj10: goto do_obj10;
  ------------------
  |  Branch (1734:9): [True: 0, False: 0]
  ------------------
 1735|      0|        case state::obj11: goto do_obj11;
  ------------------
  |  Branch (1735:9): [True: 0, False: 0]
  ------------------
 1736|      0|        }
 1737|      0|    }
 1738|  4.91k|    BOOST_ASSERT(*cs == '{');
  ------------------
  |  |   60|  4.91k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1739|  4.91k|    size = 0;
 1740|  4.91k|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|  4.91k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 4.91k]
  |  |  ------------------
  ------------------
 1741|      2|    {
 1742|      2|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      2|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1743|      2|        return fail(cs.begin(), error::too_deep, &loc);
 1744|      2|    }
 1745|  4.91k|    --depth_;
 1746|  4.91k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  4.91k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4.91k]
  |  |  ------------------
  ------------------
 1747|  4.91k|        ! h_.on_object_begin(ec_)))
 1748|      0|        return fail(cs.begin());
 1749|  4.91k|    ++cs;
 1750|       |    // object:
 1751|       |    //     '{' *ws '}'
 1752|       |    //     '{' *ws string *ws ':' *ws value *ws *[ ',' *ws string *ws ':' *ws value *ws ] '}'
 1753|  4.91k|do_obj1:
 1754|  4.91k|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1755|  4.91k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.91k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 45, False: 4.86k]
  |  |  ------------------
  ------------------
 1756|     45|        return maybe_suspend(cs.begin(), state::obj1, size);
 1757|  4.86k|    if(BOOST_JSON_LIKELY(*cs != '}'))
  ------------------
  |  |  171|  4.86k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 3.92k, False: 937]
  |  |  ------------------
  ------------------
 1758|  3.92k|    {
 1759|  3.92k|        if(BOOST_JSON_UNLIKELY(*cs != '\x22'))
  ------------------
  |  |  179|  3.92k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 49, False: 3.88k]
  |  |  ------------------
  ------------------
 1760|     49|        {
 1761|     49|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1761:16): [Folded - Ignored]
  |  Branch (1761:34): [True: 0, False: 0]
  ------------------
 1762|      0|            {
 1763|      0|do_obj2:
 1764|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1765|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1766|      0|                    return suspend_or_fail(state::obj2, size);
 1767|      0|                goto do_obj1;
 1768|      0|            }
 1769|     49|            BOOST_STATIC_CONSTEXPR source_location loc
 1770|     49|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     49|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1771|     49|            return fail(cs.begin(), error::syntax, &loc);
 1772|     49|        }
 1773|   212k|loop:
 1774|   212k|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|   212k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 212k]
  |  |  ------------------
  ------------------
 1775|   212k|            Handler::max_object_size))
 1776|      0|        {
 1777|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1778|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1779|      0|            return fail(cs.begin(), error::object_too_large, &loc);
 1780|      0|        }
 1781|   212k|do_obj3:
 1782|   212k|        cs = parse_string(cs.begin(), stack_empty, std::true_type(), allow_bad_utf8);
 1783|   212k|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|   212k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 172, False: 212k]
  |  |  ------------------
  ------------------
 1784|    172|            return suspend_or_fail(state::obj3, size);
 1785|   212k|do_obj4:
 1786|   212k|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1787|   212k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|   212k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 55, False: 211k]
  |  |  ------------------
  ------------------
 1788|     55|            return maybe_suspend(cs.begin(), state::obj4, size);
 1789|   211k|        if(BOOST_JSON_UNLIKELY(*cs != ':'))
  ------------------
  |  |  179|   211k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 54, False: 211k]
  |  |  ------------------
  ------------------
 1790|     54|        {
 1791|     54|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1791:16): [Folded - Ignored]
  |  Branch (1791:34): [True: 0, False: 0]
  ------------------
 1792|      0|            {
 1793|      0|do_obj5:
 1794|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1795|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1796|      0|                    return suspend_or_fail(state::obj5, size);
 1797|      0|                goto do_obj4;
 1798|      0|            }
 1799|     54|            BOOST_STATIC_CONSTEXPR source_location loc
 1800|     54|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     54|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1801|     54|            return fail(cs.begin(), error::syntax, &loc);
 1802|     54|        }
 1803|   211k|        ++cs;
 1804|   211k|do_obj6:
 1805|   211k|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1806|   211k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|   211k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 29, False: 211k]
  |  |  ------------------
  ------------------
 1807|     29|            return maybe_suspend(cs.begin(), state::obj6, size);
 1808|   211k|do_obj7:
 1809|   211k|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1810|   211k|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|   211k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 626, False: 211k]
  |  |  ------------------
  ------------------
 1811|    626|            return suspend_or_fail(state::obj7, size);
 1812|   211k|do_obj8:
 1813|   211k|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1814|   211k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|   211k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 29, False: 211k]
  |  |  ------------------
  ------------------
 1815|     29|            return maybe_suspend(cs.begin(), state::obj8, size);
 1816|   211k|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|   211k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 208k, False: 2.61k]
  |  |  ------------------
  ------------------
 1817|   208k|        {
 1818|   208k|            ++cs;
 1819|   208k|do_obj9:
 1820|   208k|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1821|   208k|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|   208k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 30, False: 208k]
  |  |  ------------------
  ------------------
 1822|     30|                return maybe_suspend(cs.begin(), state::obj9, size);
 1823|       |
 1824|       |            // loop for next element
 1825|   208k|            if(BOOST_JSON_LIKELY(*cs == '\x22'))
  ------------------
  |  |  171|   208k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 208k, False: 262]
  |  |  ------------------
  ------------------
 1826|   208k|                goto loop;
 1827|    262|            if(! allow_trailing || *cs != '}')
  ------------------
  |  Branch (1827:16): [True: 12, False: 250]
  |  Branch (1827:36): [True: 22, False: 228]
  ------------------
 1828|     34|            {
 1829|     34|                if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1829:20): [Folded - Ignored]
  |  Branch (1829:38): [True: 0, False: 0]
  ------------------
 1830|      0|                {
 1831|      0|do_obj10:
 1832|      0|                    cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1833|      0|                    if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1834|      0|                        return suspend_or_fail(state::obj10, size);
 1835|      0|                    goto do_obj9;
 1836|      0|                }
 1837|     34|                BOOST_STATIC_CONSTEXPR source_location loc
 1838|     34|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     34|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1839|     34|                return fail(cs.begin(), error::syntax, &loc);
 1840|     34|            }
 1841|    262|        }
 1842|  2.61k|        else if(BOOST_JSON_UNLIKELY(*cs != '}'))
  ------------------
  |  |  179|  2.61k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 83, False: 2.53k]
  |  |  ------------------
  ------------------
 1843|     83|        {
 1844|     83|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1844:16): [Folded - Ignored]
  |  Branch (1844:34): [True: 0, False: 0]
  ------------------
 1845|      0|            {
 1846|      0|do_obj11:
 1847|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1848|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1849|      0|                    return suspend_or_fail(state::obj11, size);
 1850|      0|                goto do_obj8;
 1851|      0|            }
 1852|     83|            BOOST_STATIC_CONSTEXPR source_location loc
 1853|     83|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     83|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1854|     83|            return fail(cs.begin(), error::syntax, &loc);
 1855|     83|        }
 1856|       |        // got closing brace, fall through
 1857|   211k|    }
 1858|  3.69k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  3.69k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 3.69k]
  |  |  ------------------
  ------------------
 1859|  3.69k|        ! h_.on_object_end(size, ec_)))
 1860|      0|        return fail(cs.begin());
 1861|  3.69k|    ++depth_;
 1862|  3.69k|    ++cs;
 1863|  3.69k|    return cs.begin();
 1864|  3.69k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_stringILb1ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEb:
  977|   227k|{
  978|   227k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (978:8): [Folded - Ignored]
  |  Branch (978:25): [True: 0, False: 0]
  ------------------
  979|      0|    {
  980|      0|        state st;
  981|      0|        st_.peek(st);
  982|      0|        switch(st)
  983|      0|        {
  984|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (984:9): [True: 0, False: 0]
  ------------------
  985|      0|        case state::str1:
  ------------------
  |  Branch (985:9): [True: 0, False: 0]
  ------------------
  986|      0|            return parse_unescaped(p, stack_empty, is_key, allow_bad_utf8);
  987|       |
  988|      0|        case state::str2: case state::str3:
  ------------------
  |  Branch (988:9): [True: 0, False: 0]
  |  Branch (988:27): [True: 0, False: 0]
  ------------------
  989|      0|        case state::str4: case state::str5:
  ------------------
  |  Branch (989:9): [True: 0, False: 0]
  |  Branch (989:27): [True: 0, False: 0]
  ------------------
  990|      0|        case state::str6: case state::str7:
  ------------------
  |  Branch (990:9): [True: 0, False: 0]
  |  Branch (990:27): [True: 0, False: 0]
  ------------------
  991|      0|        case state::str8:
  ------------------
  |  Branch (991:9): [True: 0, False: 0]
  ------------------
  992|      0|        case state::sur1: case state::sur2:
  ------------------
  |  Branch (992:9): [True: 0, False: 0]
  |  Branch (992:27): [True: 0, False: 0]
  ------------------
  993|      0|        case state::sur3: case state::sur4:
  ------------------
  |  Branch (993:9): [True: 0, False: 0]
  |  Branch (993:27): [True: 0, False: 0]
  ------------------
  994|      0|        case state::sur5: case state::sur6:
  ------------------
  |  Branch (994:9): [True: 0, False: 0]
  |  Branch (994:27): [True: 0, False: 0]
  ------------------
  995|      0|            return parse_escaped(p, 0, stack_empty, is_key, allow_bad_utf8);
  996|      0|        }
  997|      0|    }
  998|       |
  999|   227k|    return parse_unescaped(p, std::true_type(), is_key, allow_bad_utf8);
 1000|   227k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE15parse_unescapedILb1ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEb:
 1013|   227k|{
 1014|   227k|    detail::const_stream_wrapper cs(p, end_);
 1015|   227k|    std::size_t total;
 1016|   227k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (1016:8): [Folded - Ignored]
  |  Branch (1016:23): [True: 0, False: 0]
  ------------------
 1017|   227k|    {
 1018|   227k|        BOOST_ASSERT(*cs == '\x22'); // '"'
  ------------------
  |  |   60|   227k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1019|   227k|        ++cs;
 1020|   227k|        total = 0;
 1021|   227k|    }
 1022|      0|    else
 1023|      0|    {
 1024|      0|        state st;
 1025|      0|        st_.pop(st);
 1026|      0|        st_.pop(total);
 1027|      0|    }
 1028|   227k|    char const* start = cs.begin();
 1029|   227k|    cs = allow_bad_utf8?
  ------------------
  |  Branch (1029:10): [True: 219k, False: 8.15k]
  ------------------
 1030|   219k|        detail::count_valid<true>(cs.begin(), cs.end()):
 1031|   227k|        detail::count_valid<false>(cs.begin(), cs.end());
 1032|   227k|    std::size_t size = cs.used(start);
 1033|   227k|    if(is_key)
  ------------------
  |  Branch (1033:8): [Folded - Ignored]
  ------------------
 1034|   227k|    {
 1035|   227k|        BOOST_ASSERT(total <= Handler::max_key_size);
  ------------------
  |  |   60|   227k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1036|   227k|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|   227k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 227k]
  |  |  ------------------
  ------------------
 1037|   227k|            Handler::max_key_size - total))
 1038|      0|        {
 1039|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1040|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1041|      0|            return fail(cs.begin(), error::key_too_large, &loc);
 1042|      0|        }
 1043|   227k|    }
 1044|      0|    else
 1045|      0|    {
 1046|      0|        BOOST_ASSERT(total <= Handler::max_string_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1047|      0|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1048|      0|            Handler::max_string_size - total))
 1049|      0|        {
 1050|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1051|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1052|      0|            return fail(cs.begin(), error::string_too_large, &loc);
 1053|      0|        }
 1054|      0|    }
 1055|   227k|    total += size;
 1056|   227k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|   227k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 144, False: 227k]
  |  |  ------------------
  ------------------
 1057|    144|    {
 1058|       |        // call handler if the string isn't empty
 1059|    144|        if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|    144|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 116, False: 28]
  |  |  ------------------
  ------------------
 1060|    116|        {
 1061|    116|            {
 1062|    116|                bool r = is_key?
  ------------------
  |  Branch (1062:26): [Folded - Ignored]
  ------------------
 1063|    116|                    h_.on_key_part( {start, size}, total, ec_ ):
 1064|    116|                    h_.on_string_part( {start, size}, total, ec_ );
 1065|       |
 1066|    116|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|    116|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 116]
  |  |  ------------------
  ------------------
 1067|      0|                {
 1068|      0|                    return fail(cs.begin());
 1069|      0|                }
 1070|    116|            }
 1071|    116|        }
 1072|    144|        return maybe_suspend(cs.begin(), state::str1, total);
 1073|    144|    }
 1074|       |    // at this point all valid characters have been skipped, so any remaining
 1075|       |    // if there are any more characters, they are either escaped, or incomplete
 1076|       |    // utf8, or invalid utf8
 1077|   227k|    if(BOOST_JSON_UNLIKELY(*cs != '\x22')) // '"'
  ------------------
  |  |  179|   227k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4.20k, False: 223k]
  |  |  ------------------
  ------------------
 1078|  4.20k|    {
 1079|       |        // sequence is invalid or incomplete
 1080|  4.20k|        if((*cs & 0x80) && !allow_bad_utf8)
  ------------------
  |  Branch (1080:12): [True: 139, False: 4.06k]
  |  Branch (1080:28): [True: 139, False: 0]
  ------------------
 1081|    139|        {
 1082|    139|            seq_.save(cs.begin(), cs.remain());
 1083|    139|            if(BOOST_JSON_UNLIKELY(seq_.complete()))
  ------------------
  |  |  179|    139|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 115, False: 24]
  |  |  ------------------
  ------------------
 1084|    115|            {
 1085|    115|                BOOST_STATIC_CONSTEXPR source_location loc
 1086|    115|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|    115|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1087|    115|                return fail(cs.begin(), error::syntax, &loc);
 1088|    115|            }
 1089|     24|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|     24|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 16, False: 8]
  |  |  ------------------
  ------------------
 1090|     16|            {
 1091|     16|                {
 1092|     16|                    bool r = is_key?
  ------------------
  |  Branch (1092:30): [Folded - Ignored]
  ------------------
 1093|     16|                        h_.on_key_part( {start, size}, total, ec_ ):
 1094|     16|                        h_.on_string_part( {start, size}, total, ec_ );
 1095|       |
 1096|     16|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|     16|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 16]
  |  |  ------------------
  ------------------
 1097|      0|                    {
 1098|      0|                        return fail(cs.begin());
 1099|      0|                    }
 1100|     16|                }
 1101|     16|            }
 1102|     24|            return maybe_suspend(cs.end(), state::str8, total);
 1103|     24|        }
 1104|  4.06k|        else if(BOOST_JSON_LIKELY(*cs == '\\'))
  ------------------
  |  |  171|  4.06k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.04k, False: 26]
  |  |  ------------------
  ------------------
 1105|  4.04k|        {
 1106|       |            // flush unescaped run from input
 1107|  4.04k|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|  4.04k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 3.45k, False: 588]
  |  |  ------------------
  ------------------
 1108|  3.45k|            {
 1109|  3.45k|                {
 1110|  3.45k|                    bool r = is_key?
  ------------------
  |  Branch (1110:30): [Folded - Ignored]
  ------------------
 1111|  3.45k|                        h_.on_key_part( {start, size}, total, ec_ ):
 1112|  3.45k|                        h_.on_string_part( {start, size}, total, ec_ );
 1113|       |
 1114|  3.45k|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|  3.45k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 3.45k]
  |  |  ------------------
  ------------------
 1115|      0|                    {
 1116|      0|                        return fail(cs.begin());
 1117|      0|                    }
 1118|  3.45k|                }
 1119|  3.45k|            }
 1120|  4.04k|            return parse_escaped(cs.begin(), total, stack_empty, is_key, allow_bad_utf8);
 1121|  4.04k|        }
 1122|       |        // illegal control
 1123|     26|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     26|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1124|     26|        return fail(cs.begin(), error::syntax, &loc);
 1125|  4.20k|    }
 1126|       |
 1127|   223k|    {
 1128|   223k|        bool r = is_key?
  ------------------
  |  Branch (1128:18): [Folded - Ignored]
  ------------------
 1129|   223k|            h_.on_key( {start, size}, total, ec_ ):
 1130|   223k|            h_.on_string( {start, size}, total, ec_ );
 1131|       |
 1132|   223k|        if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|   223k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 223k]
  |  |  ------------------
  ------------------
 1133|      0|        {
 1134|      0|            return fail(cs.begin());
 1135|      0|        }
 1136|   223k|    }
 1137|       |
 1138|   223k|    ++cs;
 1139|   223k|    return cs.begin();
 1140|   223k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE4failEPKcNS0_5errorEPKNS_15source_locationE:
  294|  2.69k|{
  295|  2.69k|    end_ = p;
  296|  2.69k|    ec_.assign(ev, loc);
  297|  2.69k|    return sentinel();
  298|  2.69k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_valueILb1ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
  588|  4.45M|{
  589|  4.45M|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (589:8): [Folded - Ignored]
  |  Branch (589:23): [True: 0, False: 0]
  ------------------
  590|  4.45M|    {
  591|  4.45M|loop:
  592|  4.45M|        switch(*p)
  593|  4.45M|        {
  594|  30.2k|        case '0':
  ------------------
  |  Branch (594:9): [True: 30.2k, False: 4.42M]
  ------------------
  595|  30.2k|            return parse_number(p, std::true_type(), std::integral_constant<char, '0'>());
  596|  7.64k|        case '-':
  ------------------
  |  Branch (596:9): [True: 7.64k, False: 4.44M]
  ------------------
  597|  7.64k|            return parse_number(p, std::true_type(), std::integral_constant<char, '-'>());
  598|  3.40M|        case '1': case '2': case '3':
  ------------------
  |  Branch (598:9): [True: 32.6k, False: 4.41M]
  |  Branch (598:19): [True: 7.11k, False: 4.44M]
  |  Branch (598:29): [True: 3.36M, False: 1.08M]
  ------------------
  599|  3.46M|        case '4': case '5': case '6':
  ------------------
  |  Branch (599:9): [True: 15.8k, False: 4.43M]
  |  Branch (599:19): [True: 36.6k, False: 4.41M]
  |  Branch (599:29): [True: 5.64k, False: 4.44M]
  ------------------
  600|  4.37M|        case '7': case '8': case '9':
  ------------------
  |  Branch (600:9): [True: 806k, False: 3.64M]
  |  Branch (600:19): [True: 97.6k, False: 4.35M]
  |  Branch (600:29): [True: 10.3k, False: 4.44M]
  ------------------
  601|  4.37M|            return parse_number(p, std::true_type(), std::integral_constant<char, '+'>());
  602|  5.08k|        case 't':
  ------------------
  |  Branch (602:9): [True: 5.08k, False: 4.44M]
  ------------------
  603|  5.08k|            return parse_true(p, std::true_type());
  604|  1.12k|        case 'f':
  ------------------
  |  Branch (604:9): [True: 1.12k, False: 4.45M]
  ------------------
  605|  1.12k|            return parse_false(p, std::true_type());
  606|  4.05k|        case 'n':
  ------------------
  |  Branch (606:9): [True: 4.05k, False: 4.44M]
  ------------------
  607|  4.05k|            return parse_null(p, std::true_type());
  608|  7.69k|        case '"':
  ------------------
  |  Branch (608:9): [True: 7.69k, False: 4.44M]
  ------------------
  609|  7.69k|            return parse_unescaped(p, std::true_type(), std::false_type(), allow_bad_utf8);
  610|  7.38k|        case '[':
  ------------------
  |  Branch (610:9): [True: 7.38k, False: 4.44M]
  ------------------
  611|  7.38k|            return parse_array(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  612|  8.76k|        case '{':
  ------------------
  |  Branch (612:9): [True: 8.76k, False: 4.44M]
  ------------------
  613|  8.76k|            return parse_object(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  614|  1.19k|        case '/':
  ------------------
  |  Branch (614:9): [True: 1.19k, False: 4.45M]
  ------------------
  615|  1.19k|            if(! allow_comments)
  ------------------
  |  Branch (615:16): [Folded - Ignored]
  ------------------
  616|      0|            {
  617|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  618|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  619|      0|                return fail(p, error::syntax, &loc);
  620|      0|            }
  621|  1.19k|            p = parse_comment(p, stack_empty, std::false_type());
  622|       |            // KRYSTIAN NOTE: incomplete takes const_stream, we either
  623|       |            // can add an overload, change the existing one to take a pointer,
  624|       |            // or just leave it as is
  625|  1.19k|            if(BOOST_JSON_UNLIKELY(p == sentinel()))
  ------------------
  |  |  179|  1.19k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 88, False: 1.11k]
  |  |  ------------------
  ------------------
  626|     88|                return maybe_suspend(p, state::val2);
  627|       |            // intentional fallthrough
  628|  1.11k|        case ' ':
  ------------------
  |  Branch (628:9): [True: 0, False: 4.45M]
  ------------------
  629|  1.11k|        case '\t':
  ------------------
  |  Branch (629:9): [True: 0, False: 4.45M]
  ------------------
  630|  1.11k|        case '\n':
  ------------------
  |  Branch (630:9): [True: 0, False: 4.45M]
  ------------------
  631|  1.11k|        case '\r':
  ------------------
  |  Branch (631:9): [True: 0, False: 4.45M]
  ------------------
  632|  1.11k|            p = detail::count_whitespace(p, end_);
  633|  1.11k|            if(BOOST_JSON_UNLIKELY(p == end_))
  ------------------
  |  |  179|  1.11k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 41, False: 1.07k]
  |  |  ------------------
  ------------------
  634|     41|                return maybe_suspend(p, state::val1);
  635|  1.07k|            goto loop;
  636|  1.07k|        default:
  ------------------
  |  Branch (636:9): [True: 245, False: 4.45M]
  ------------------
  637|    245|            {
  638|    245|                BOOST_STATIC_CONSTEXPR source_location loc
  639|    245|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|    245|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  640|    245|                return fail(p, error::syntax, &loc);
  641|  1.11k|            }
  642|  4.45M|        }
  643|  4.45M|    }
  644|      0|    return resume_value(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  645|  4.45M|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_arrayILb1ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1881|  7.38k|{
 1882|  7.38k|    detail::const_stream_wrapper cs(p, end_);
 1883|  7.38k|    std::size_t size;
 1884|  7.38k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1884:8): [Folded - Ignored]
  |  Branch (1884:25): [True: 0, False: 0]
  ------------------
 1885|      0|    {
 1886|       |        // resume
 1887|      0|        state st;
 1888|      0|        st_.pop(st);
 1889|      0|        st_.pop(size);
 1890|      0|        switch(st)
 1891|      0|        {
 1892|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1892:9): [True: 0, False: 0]
  ------------------
 1893|      0|        case state::arr1: goto do_arr1;
  ------------------
  |  Branch (1893:9): [True: 0, False: 0]
  ------------------
 1894|      0|        case state::arr2: goto do_arr2;
  ------------------
  |  Branch (1894:9): [True: 0, False: 0]
  ------------------
 1895|      0|        case state::arr3: goto do_arr3;
  ------------------
  |  Branch (1895:9): [True: 0, False: 0]
  ------------------
 1896|      0|        case state::arr4: goto do_arr4;
  ------------------
  |  Branch (1896:9): [True: 0, False: 0]
  ------------------
 1897|      0|        case state::arr5: goto do_arr5;
  ------------------
  |  Branch (1897:9): [True: 0, False: 0]
  ------------------
 1898|      0|        case state::arr6: goto do_arr6;
  ------------------
  |  Branch (1898:9): [True: 0, False: 0]
  ------------------
 1899|      0|        }
 1900|      0|    }
 1901|  7.38k|    BOOST_ASSERT(*cs == '[');
  ------------------
  |  |   60|  7.38k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1902|  7.38k|    size = 0;
 1903|  7.38k|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|  7.38k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 6, False: 7.37k]
  |  |  ------------------
  ------------------
 1904|      6|    {
 1905|      6|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      6|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1906|      6|        return fail(cs.begin(), error::too_deep, &loc);
 1907|      6|    }
 1908|  7.37k|    --depth_;
 1909|  7.37k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  7.37k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 7.37k]
  |  |  ------------------
  ------------------
 1910|  7.37k|        ! h_.on_array_begin(ec_)))
 1911|      0|        return fail(cs.begin());
 1912|  7.37k|    ++cs;
 1913|       |    // array:
 1914|       |    //     '[' *ws ']'
 1915|       |    //     '[' *ws value *ws *[ ',' *ws value *ws ] ']'
 1916|  7.98k|do_arr1:
 1917|  7.98k|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1918|  7.98k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  7.98k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 52, False: 7.93k]
  |  |  ------------------
  ------------------
 1919|     52|        return maybe_suspend(cs.begin(), state::arr1, size);
 1920|  7.93k|    if(BOOST_JSON_LIKELY(*cs != ']'))
  ------------------
  |  |  171|  7.93k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 6.92k, False: 1.01k]
  |  |  ------------------
  ------------------
 1921|  6.92k|    {
 1922|  4.43M|loop:
 1923|  4.43M|        if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1923:12): [Folded - Ignored]
  |  Branch (1923:30): [True: 627, False: 4.43M]
  ------------------
 1924|    627|        {
 1925|    627|do_arr2:
 1926|    627|            cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1927|    627|            if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    627|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 17, False: 610]
  |  |  ------------------
  ------------------
 1928|     17|                return suspend_or_fail(state::arr2, size);
 1929|    610|            goto do_arr1;
 1930|    627|        }
 1931|  4.43M|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|  4.43M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4.43M]
  |  |  ------------------
  ------------------
 1932|  4.43M|            Handler::max_array_size))
 1933|      0|        {
 1934|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1935|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1936|      0|            return fail(cs.begin(), error::array_too_large, &loc);
 1937|      0|        }
 1938|  4.43M|do_arr3:
 1939|       |        // array is not empty, value required
 1940|  4.43M|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1941|  4.43M|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|  4.43M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1.07k, False: 4.43M]
  |  |  ------------------
  ------------------
 1942|  1.07k|            return suspend_or_fail(state::arr3, size);
 1943|  4.43M|do_arr4:
 1944|  4.43M|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1945|  4.43M|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.43M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 146, False: 4.43M]
  |  |  ------------------
  ------------------
 1946|    146|            return maybe_suspend(cs.begin(), state::arr4, size);
 1947|  4.43M|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|  4.43M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.42M, False: 4.88k]
  |  |  ------------------
  ------------------
 1948|  4.42M|        {
 1949|  4.42M|            ++cs;
 1950|  4.42M|do_arr5:
 1951|  4.42M|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1952|  4.42M|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.42M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 51, False: 4.42M]
  |  |  ------------------
  ------------------
 1953|     51|                return maybe_suspend(cs.begin(), state::arr5, size);
 1954|       |            // loop for next element
 1955|  4.42M|            if(! allow_trailing || *cs != ']')
  ------------------
  |  Branch (1955:16): [True: 47.3k, False: 4.37M]
  |  Branch (1955:36): [True: 4.37M, False: 325]
  ------------------
 1956|  4.42M|                goto loop;
 1957|  4.42M|        }
 1958|  4.88k|        else if(BOOST_JSON_UNLIKELY(*cs != ']'))
  ------------------
  |  |  179|  4.88k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 417, False: 4.47k]
  |  |  ------------------
  ------------------
 1959|    417|        {
 1960|    417|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1960:16): [Folded - Ignored]
  |  Branch (1960:34): [True: 202, False: 215]
  ------------------
 1961|    202|            {
 1962|    202|do_arr6:
 1963|    202|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1964|    202|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    202|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 7, False: 195]
  |  |  ------------------
  ------------------
 1965|      7|                    return suspend_or_fail(state::arr6, size);
 1966|    195|                goto do_arr4;
 1967|    202|            }
 1968|    215|            BOOST_STATIC_CONSTEXPR source_location loc
 1969|    215|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|    215|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1970|    215|            return fail(cs.begin(), error::syntax, &loc);
 1971|    417|        }
 1972|       |        // got closing bracket; fall through
 1973|  4.43M|    }
 1974|  5.80k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  5.80k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 5.80k]
  |  |  ------------------
  ------------------
 1975|  5.80k|        ! h_.on_array_end(size, ec_)))
 1976|      0|        return fail(cs.begin());
 1977|  5.80k|    ++depth_;
 1978|  5.80k|    ++cs;
 1979|  5.80k|    return cs.begin();
 1980|  5.80k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_objectILb1ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1713|  8.76k|{
 1714|  8.76k|    detail::const_stream_wrapper cs(p, end_);
 1715|  8.76k|    std::size_t size;
 1716|  8.76k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1716:8): [Folded - Ignored]
  |  Branch (1716:25): [True: 0, False: 0]
  ------------------
 1717|      0|    {
 1718|       |        // resume
 1719|      0|        state st;
 1720|      0|        st_.pop(st);
 1721|      0|        st_.pop(size);
 1722|      0|        switch(st)
 1723|      0|        {
 1724|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1724:9): [True: 0, False: 0]
  ------------------
 1725|      0|        case state::obj1: goto do_obj1;
  ------------------
  |  Branch (1725:9): [True: 0, False: 0]
  ------------------
 1726|      0|        case state::obj2: goto do_obj2;
  ------------------
  |  Branch (1726:9): [True: 0, False: 0]
  ------------------
 1727|      0|        case state::obj3: goto do_obj3;
  ------------------
  |  Branch (1727:9): [True: 0, False: 0]
  ------------------
 1728|      0|        case state::obj4: goto do_obj4;
  ------------------
  |  Branch (1728:9): [True: 0, False: 0]
  ------------------
 1729|      0|        case state::obj5: goto do_obj5;
  ------------------
  |  Branch (1729:9): [True: 0, False: 0]
  ------------------
 1730|      0|        case state::obj6: goto do_obj6;
  ------------------
  |  Branch (1730:9): [True: 0, False: 0]
  ------------------
 1731|      0|        case state::obj7: goto do_obj7;
  ------------------
  |  Branch (1731:9): [True: 0, False: 0]
  ------------------
 1732|      0|        case state::obj8: goto do_obj8;
  ------------------
  |  Branch (1732:9): [True: 0, False: 0]
  ------------------
 1733|      0|        case state::obj9: goto do_obj9;
  ------------------
  |  Branch (1733:9): [True: 0, False: 0]
  ------------------
 1734|      0|        case state::obj10: goto do_obj10;
  ------------------
  |  Branch (1734:9): [True: 0, False: 0]
  ------------------
 1735|      0|        case state::obj11: goto do_obj11;
  ------------------
  |  Branch (1735:9): [True: 0, False: 0]
  ------------------
 1736|      0|        }
 1737|      0|    }
 1738|  8.76k|    BOOST_ASSERT(*cs == '{');
  ------------------
  |  |   60|  8.76k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1739|  8.76k|    size = 0;
 1740|  8.76k|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|  8.76k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 3, False: 8.76k]
  |  |  ------------------
  ------------------
 1741|      3|    {
 1742|      3|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      3|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1743|      3|        return fail(cs.begin(), error::too_deep, &loc);
 1744|      3|    }
 1745|  8.76k|    --depth_;
 1746|  8.76k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  8.76k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 8.76k]
  |  |  ------------------
  ------------------
 1747|  8.76k|        ! h_.on_object_begin(ec_)))
 1748|      0|        return fail(cs.begin());
 1749|  8.76k|    ++cs;
 1750|       |    // object:
 1751|       |    //     '{' *ws '}'
 1752|       |    //     '{' *ws string *ws ':' *ws value *ws *[ ',' *ws string *ws ':' *ws value *ws ] '}'
 1753|  9.09k|do_obj1:
 1754|  9.09k|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1755|  9.09k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  9.09k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 51, False: 9.04k]
  |  |  ------------------
  ------------------
 1756|     51|        return maybe_suspend(cs.begin(), state::obj1, size);
 1757|  9.04k|    if(BOOST_JSON_LIKELY(*cs != '}'))
  ------------------
  |  |  171|  9.04k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 7.16k, False: 1.88k]
  |  |  ------------------
  ------------------
 1758|  7.16k|    {
 1759|  7.16k|        if(BOOST_JSON_UNLIKELY(*cs != '\x22'))
  ------------------
  |  |  179|  7.16k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 420, False: 6.74k]
  |  |  ------------------
  ------------------
 1760|    420|        {
 1761|    420|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1761:16): [Folded - Ignored]
  |  Branch (1761:34): [True: 350, False: 70]
  ------------------
 1762|    350|            {
 1763|    350|do_obj2:
 1764|    350|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1765|    350|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    350|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 13, False: 337]
  |  |  ------------------
  ------------------
 1766|     13|                    return suspend_or_fail(state::obj2, size);
 1767|    337|                goto do_obj1;
 1768|    350|            }
 1769|     70|            BOOST_STATIC_CONSTEXPR source_location loc
 1770|     70|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     70|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1771|     70|            return fail(cs.begin(), error::syntax, &loc);
 1772|    420|        }
 1773|  15.1k|loop:
 1774|  15.1k|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|  15.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 15.1k]
  |  |  ------------------
  ------------------
 1775|  15.1k|            Handler::max_object_size))
 1776|      0|        {
 1777|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1778|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1779|      0|            return fail(cs.begin(), error::object_too_large, &loc);
 1780|      0|        }
 1781|  15.1k|do_obj3:
 1782|  15.1k|        cs = parse_string(cs.begin(), stack_empty, std::true_type(), allow_bad_utf8);
 1783|  15.1k|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|  15.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 198, False: 14.9k]
  |  |  ------------------
  ------------------
 1784|    198|            return suspend_or_fail(state::obj3, size);
 1785|  15.5k|do_obj4:
 1786|  15.5k|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1787|  15.5k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  15.5k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 62, False: 15.4k]
  |  |  ------------------
  ------------------
 1788|     62|            return maybe_suspend(cs.begin(), state::obj4, size);
 1789|  15.4k|        if(BOOST_JSON_UNLIKELY(*cs != ':'))
  ------------------
  |  |  179|  15.4k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 645, False: 14.8k]
  |  |  ------------------
  ------------------
 1790|    645|        {
 1791|    645|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1791:16): [Folded - Ignored]
  |  Branch (1791:34): [True: 572, False: 73]
  ------------------
 1792|    572|            {
 1793|    572|do_obj5:
 1794|    572|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1795|    572|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    572|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 563]
  |  |  ------------------
  ------------------
 1796|      9|                    return suspend_or_fail(state::obj5, size);
 1797|    563|                goto do_obj4;
 1798|    572|            }
 1799|     73|            BOOST_STATIC_CONSTEXPR source_location loc
 1800|     73|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     73|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1801|     73|            return fail(cs.begin(), error::syntax, &loc);
 1802|    645|        }
 1803|  14.8k|        ++cs;
 1804|  14.8k|do_obj6:
 1805|  14.8k|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1806|  14.8k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  14.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 27, False: 14.8k]
  |  |  ------------------
  ------------------
 1807|     27|            return maybe_suspend(cs.begin(), state::obj6, size);
 1808|  14.8k|do_obj7:
 1809|  14.8k|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1810|  14.8k|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|  14.8k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 589, False: 14.2k]
  |  |  ------------------
  ------------------
 1811|    589|            return suspend_or_fail(state::obj7, size);
 1812|  14.6k|do_obj8:
 1813|  14.6k|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1814|  14.6k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  14.6k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 34, False: 14.6k]
  |  |  ------------------
  ------------------
 1815|     34|            return maybe_suspend(cs.begin(), state::obj8, size);
 1816|  14.6k|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|  14.6k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 8.83k, False: 5.76k]
  |  |  ------------------
  ------------------
 1817|  8.83k|        {
 1818|  8.83k|            ++cs;
 1819|  9.48k|do_obj9:
 1820|  9.48k|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1821|  9.48k|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  9.48k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 37, False: 9.45k]
  |  |  ------------------
  ------------------
 1822|     37|                return maybe_suspend(cs.begin(), state::obj9, size);
 1823|       |
 1824|       |            // loop for next element
 1825|  9.45k|            if(BOOST_JSON_LIKELY(*cs == '\x22'))
  ------------------
  |  |  171|  9.45k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 8.44k, False: 1.01k]
  |  |  ------------------
  ------------------
 1826|  8.44k|                goto loop;
 1827|  1.01k|            if(! allow_trailing || *cs != '}')
  ------------------
  |  Branch (1827:16): [True: 460, False: 550]
  |  Branch (1827:36): [True: 282, False: 268]
  ------------------
 1828|    742|            {
 1829|    742|                if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1829:20): [Folded - Ignored]
  |  Branch (1829:38): [True: 661, False: 81]
  ------------------
 1830|    661|                {
 1831|    661|do_obj10:
 1832|    661|                    cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1833|    661|                    if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    661|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 11, False: 650]
  |  |  ------------------
  ------------------
 1834|     11|                        return suspend_or_fail(state::obj10, size);
 1835|    650|                    goto do_obj9;
 1836|    661|                }
 1837|     81|                BOOST_STATIC_CONSTEXPR source_location loc
 1838|     81|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     81|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1839|     81|                return fail(cs.begin(), error::syntax, &loc);
 1840|    742|            }
 1841|  1.01k|        }
 1842|  5.76k|        else if(BOOST_JSON_UNLIKELY(*cs != '}'))
  ------------------
  |  |  179|  5.76k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 492, False: 5.27k]
  |  |  ------------------
  ------------------
 1843|    492|        {
 1844|    492|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1844:16): [Folded - Ignored]
  |  Branch (1844:34): [True: 424, False: 68]
  ------------------
 1845|    424|            {
 1846|    424|do_obj11:
 1847|    424|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1848|    424|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    424|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 419]
  |  |  ------------------
  ------------------
 1849|      5|                    return suspend_or_fail(state::obj11, size);
 1850|    419|                goto do_obj8;
 1851|    424|            }
 1852|     68|            BOOST_STATIC_CONSTEXPR source_location loc
 1853|     68|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     68|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1854|     68|            return fail(cs.begin(), error::syntax, &loc);
 1855|    492|        }
 1856|       |        // got closing brace, fall through
 1857|  14.6k|    }
 1858|  7.42k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  7.42k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 7.42k]
  |  |  ------------------
  ------------------
 1859|  7.42k|        ! h_.on_object_end(size, ec_)))
 1860|      0|        return fail(cs.begin());
 1861|  7.42k|    ++depth_;
 1862|  7.42k|    ++cs;
 1863|  7.42k|    return cs.begin();
 1864|  7.42k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE10incompleteERKNS2_20const_stream_wrapperE:
  233|  7.81M|{
  234|  7.81M|    return cs.begin() == sentinel();
  235|  7.81M|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE15suspend_or_failENS4_5stateE:
  248|  10.3k|{
  249|  10.3k|    if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  18.0k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 5.14k, False: 5.21k]
  |  |  |  Branch (171:52): [True: 7.66k, False: 2.69k]
  |  |  |  Branch (171:52): [True: 5.14k, False: 2.52k]
  |  |  ------------------
  ------------------
  250|  10.3k|        ! ec_ && more_))
  251|  5.14k|    {
  252|       |        // suspend
  253|  5.14k|        reserve();
  254|  5.14k|        st_.push_unchecked(st);
  255|  5.14k|    }
  256|  10.3k|    return sentinel();
  257|  10.3k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE7suspendEPKcNS4_5stateE:
  361|  2.02k|{
  362|  2.02k|    end_ = p;
  363|       |    // suspend
  364|  2.02k|    reserve();
  365|  2.02k|    st_.push_unchecked(st);
  366|  2.02k|    return sentinel();
  367|  2.02k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE13parse_commentILb1EEEPKcS7_NSt3__117integral_constantIbXT_EEEb:
  394|  4.51k|{
  395|  4.51k|    detail::const_stream_wrapper cs(p, end_);
  396|  4.51k|    const char* start = cs.begin();
  397|  4.51k|    std::size_t remain;
  398|  4.51k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (398:8): [Folded - Ignored]
  |  Branch (398:25): [True: 0, False: 0]
  ------------------
  399|      0|    {
  400|      0|        state st;
  401|      0|        st_.pop(st);
  402|      0|        switch(st)
  403|      0|        {
  404|      0|            default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (404:13): [True: 0, False: 0]
  ------------------
  405|      0|            case state::com1: goto do_com1;
  ------------------
  |  Branch (405:13): [True: 0, False: 0]
  ------------------
  406|      0|            case state::com2: goto do_com2;
  ------------------
  |  Branch (406:13): [True: 0, False: 0]
  ------------------
  407|      0|            case state::com3: goto do_com3;
  ------------------
  |  Branch (407:13): [True: 0, False: 0]
  ------------------
  408|      0|            case state::com4: goto do_com4;
  ------------------
  |  Branch (408:13): [True: 0, False: 0]
  ------------------
  409|      0|        }
  410|      0|    }
  411|  4.51k|    BOOST_ASSERT(*cs == '/');
  ------------------
  |  |   60|  4.51k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  412|  4.51k|    ++cs;
  413|  4.51k|do_com1:
  414|  4.51k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.51k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 81, False: 4.43k]
  |  |  ------------------
  ------------------
  415|     81|        return maybe_suspend(cs.begin(), state::com1);
  416|  4.43k|    switch(*cs)
  417|  4.43k|    {
  418|     24|    default:
  ------------------
  |  Branch (418:5): [True: 24, False: 4.40k]
  ------------------
  419|     24|        {
  420|     24|            BOOST_STATIC_CONSTEXPR source_location loc
  421|     24|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     24|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  422|     24|            return fail(cs.begin(), error::syntax, &loc);
  423|      0|        }
  424|  4.14k|    case '/':
  ------------------
  |  Branch (424:5): [True: 4.14k, False: 291]
  ------------------
  425|  4.14k|        ++cs;
  426|  4.14k|do_com2:
  427|       |        // KRYSTIAN TODO: this is a mess, we have to fix this
  428|  4.14k|        remain = cs.remain();
  429|  4.14k|        cs = remain ? static_cast<const char*>(
  ------------------
  |  Branch (429:14): [True: 4.13k, False: 9]
  ------------------
  430|  4.13k|            std::memchr(cs.begin(), '\n', remain)) : sentinel();
  431|  4.14k|        if(! cs.begin())
  ------------------
  |  Branch (431:12): [True: 22, False: 4.11k]
  ------------------
  432|     22|            cs = sentinel();
  433|  4.14k|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|  4.14k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 31, False: 4.11k]
  |  |  ------------------
  ------------------
  434|     31|        {
  435|       |            // if the doc does not terminate
  436|       |            // with a newline, treat it as the
  437|       |            // end of the comment
  438|     31|            if(terminal && ! more_)
  ------------------
  |  Branch (438:16): [True: 2, False: 29]
  |  Branch (438:28): [True: 0, False: 2]
  ------------------
  439|      0|            {
  440|      0|                if(BOOST_JSON_UNLIKELY(! h_.on_comment(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  441|      0|                    {start, cs.remain(start)}, ec_)))
  442|      0|                    return fail(cs.end());
  443|      0|                return cs.end();
  444|      0|            }
  445|     31|            if(BOOST_JSON_UNLIKELY(! h_.on_comment_part(
  ------------------
  |  |  179|     31|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 31]
  |  |  ------------------
  ------------------
  446|     31|                {start, cs.remain(start)}, ec_)))
  447|      0|                return fail(cs.end());
  448|     31|            if(terminal)
  ------------------
  |  Branch (448:16): [True: 2, False: 29]
  ------------------
  449|      2|                return suspend(cs.end(), state::com2);
  450|     29|            return maybe_suspend(cs.end(), state::com2);
  451|     31|        }
  452|  4.11k|        break;
  453|  4.11k|    case '*':
  ------------------
  |  Branch (453:5): [True: 267, False: 4.16k]
  ------------------
  454|    267|        do
  455|    935|        {
  456|    935|            ++cs;
  457|    935|do_com3:
  458|       |            // KRYSTIAN TODO: this is a mess, we have to fix this
  459|    935|            remain = cs.remain();
  460|    935|            cs = remain ? static_cast<const char*>(
  ------------------
  |  Branch (460:18): [True: 922, False: 13]
  ------------------
  461|    922|                std::memchr(cs.begin(), '*', remain)) : sentinel();
  462|    935|            if(! cs.begin())
  ------------------
  |  Branch (462:16): [True: 20, False: 915]
  ------------------
  463|     20|                cs = sentinel();
  464|       |            // stopped inside a c comment
  465|    935|            if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    935|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 902]
  |  |  ------------------
  ------------------
  466|     33|            {
  467|     33|                if(BOOST_JSON_UNLIKELY(! h_.on_comment_part(
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 33]
  |  |  ------------------
  ------------------
  468|     33|                    {start, cs.remain(start)}, ec_)))
  469|      0|                    return fail(cs.end());
  470|     33|                return maybe_suspend(cs.end(), state::com3);
  471|     33|            }
  472|       |            // found a asterisk, check if the next char is a slash
  473|    902|            ++cs;
  474|    902|do_com4:
  475|    902|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    902|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 898]
  |  |  ------------------
  ------------------
  476|      4|            {
  477|      4|                if(BOOST_JSON_UNLIKELY(! h_.on_comment_part(
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  478|      4|                    {start, cs.used(start)}, ec_)))
  479|      0|                    return fail(cs.begin());
  480|      4|                return maybe_suspend(cs.begin(), state::com4);
  481|      4|            }
  482|    902|        }
  483|    898|        while(*cs != '/');
  ------------------
  |  Branch (483:15): [True: 668, False: 230]
  ------------------
  484|  4.43k|    }
  485|  4.34k|    ++cs;
  486|  4.34k|    if(BOOST_JSON_UNLIKELY(! h_.on_comment(
  ------------------
  |  |  179|  4.34k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4.34k]
  |  |  ------------------
  ------------------
  487|  4.34k|        {start, cs.used(start)}, ec_)))
  488|      0|        return fail(cs.begin());
  489|  4.34k|    return cs.begin();
  490|  4.34k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE14parse_documentILb0EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  498|  7.21k|{
  499|  7.21k|    detail::const_stream_wrapper cs(p, end_);
  500|  7.21k|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (500:8): [Folded - Ignored]
  |  Branch (500:25): [True: 7.21k, False: 0]
  ------------------
  501|  7.21k|    {
  502|  7.21k|        state st;
  503|  7.21k|        st_.pop(st);
  504|  7.21k|        switch(st)
  505|  7.21k|        {
  506|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (506:9): [True: 0, False: 7.21k]
  ------------------
  507|     49|        case state::doc1: goto do_doc1;
  ------------------
  |  Branch (507:9): [True: 49, False: 7.16k]
  ------------------
  508|  5.12k|        case state::doc2: goto do_doc2;
  ------------------
  |  Branch (508:9): [True: 5.12k, False: 2.08k]
  ------------------
  509|  2.01k|        case state::doc3: goto do_doc3;
  ------------------
  |  Branch (509:9): [True: 2.01k, False: 5.19k]
  ------------------
  510|     18|        case state::doc4: goto do_doc4;
  ------------------
  |  Branch (510:9): [True: 18, False: 7.19k]
  ------------------
  511|  7.21k|        }
  512|  7.21k|    }
  513|     49|do_doc1:
  514|     49|    cs = detail::count_whitespace(cs.begin(), cs.end());
  515|     49|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     49|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 49, False: 0]
  |  |  ------------------
  ------------------
  516|     49|        return maybe_suspend(cs.begin(), state::doc1);
  517|  5.12k|do_doc2:
  518|  5.12k|    switch(+opt_.allow_comments |
  519|  5.12k|        (opt_.allow_trailing_commas << 1) |
  520|  5.12k|        (opt_.allow_invalid_utf8 << 2))
  521|  5.12k|    {
  522|       |    // no extensions
  523|    673|    default:
  ------------------
  |  Branch (523:5): [True: 673, False: 4.45k]
  ------------------
  524|    673|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::false_type(), std::false_type());
  525|    673|        break;
  526|       |    // comments
  527|    609|    case 1:
  ------------------
  |  Branch (527:5): [True: 609, False: 4.51k]
  ------------------
  528|    609|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::false_type(), std::false_type());
  529|    609|        break;
  530|       |    // trailing
  531|    533|    case 2:
  ------------------
  |  Branch (531:5): [True: 533, False: 4.59k]
  ------------------
  532|    533|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::true_type(), std::false_type());
  533|    533|        break;
  534|       |    // comments & trailing
  535|    592|    case 3:
  ------------------
  |  Branch (535:5): [True: 592, False: 4.53k]
  ------------------
  536|    592|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::true_type(), std::false_type());
  537|    592|        break;
  538|       |    // skip validation
  539|    454|    case 4:
  ------------------
  |  Branch (539:5): [True: 454, False: 4.67k]
  ------------------
  540|    454|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::false_type(), std::true_type());
  541|    454|        break;
  542|       |    // comments & skip validation
  543|    540|    case 5:
  ------------------
  |  Branch (543:5): [True: 540, False: 4.58k]
  ------------------
  544|    540|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::false_type(), std::true_type());
  545|    540|        break;
  546|       |    // trailing & skip validation
  547|    859|    case 6:
  ------------------
  |  Branch (547:5): [True: 859, False: 4.26k]
  ------------------
  548|    859|        cs = parse_value(cs.begin(), stack_empty, std::false_type(), std::true_type(), std::true_type());
  549|    859|        break;
  550|       |    // comments & trailing & skip validation
  551|    866|    case 7:
  ------------------
  |  Branch (551:5): [True: 866, False: 4.26k]
  ------------------
  552|    866|        cs = parse_value(cs.begin(), stack_empty, std::true_type(), std::true_type(), std::true_type());
  553|    866|        break;
  554|  5.12k|    }
  555|  5.09k|    if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|  5.09k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2.58k, False: 2.50k]
  |  |  ------------------
  ------------------
  556|  2.58k|        return suspend_or_fail(state::doc2);
  557|  4.52k|do_doc3:
  558|  4.52k|    cs = detail::count_whitespace(cs.begin(), cs.end());
  559|  4.52k|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  4.52k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4.52k, False: 0]
  |  |  ------------------
  ------------------
  560|  4.52k|    {
  561|  4.52k|        if(more_)
  ------------------
  |  Branch (561:12): [True: 0, False: 4.52k]
  ------------------
  562|      0|            return suspend(cs.begin(), state::doc3);
  563|  4.52k|    }
  564|      0|    else if(opt_.allow_comments && *cs == '/')
  ------------------
  |  Branch (564:13): [True: 0, False: 0]
  |  Branch (564:36): [True: 0, False: 0]
  ------------------
  565|      0|    {
  566|     18|do_doc4:
  567|     18|        cs = parse_comment(cs.begin(), stack_empty, std::true_type());
  568|     18|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|     18|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 16, False: 2]
  |  |  ------------------
  ------------------
  569|     16|            return suspend_or_fail(state::doc4);
  570|      2|        goto do_doc3;
  571|     18|    }
  572|  4.52k|    return cs.begin();
  573|  4.52k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_valueILb0ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
  588|  3.33k|{
  589|  3.33k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (589:8): [Folded - Ignored]
  |  Branch (589:23): [True: 0, False: 3.33k]
  ------------------
  590|      0|    {
  591|      0|loop:
  592|      0|        switch(*p)
  593|      0|        {
  594|      0|        case '0':
  ------------------
  |  Branch (594:9): [True: 0, False: 0]
  ------------------
  595|      0|            return parse_number(p, std::true_type(), std::integral_constant<char, '0'>());
  596|      0|        case '-':
  ------------------
  |  Branch (596:9): [True: 0, False: 0]
  ------------------
  597|      0|            return parse_number(p, std::true_type(), std::integral_constant<char, '-'>());
  598|      0|        case '1': case '2': case '3':
  ------------------
  |  Branch (598:9): [True: 0, False: 0]
  |  Branch (598:19): [True: 0, False: 0]
  |  Branch (598:29): [True: 0, False: 0]
  ------------------
  599|      0|        case '4': case '5': case '6':
  ------------------
  |  Branch (599:9): [True: 0, False: 0]
  |  Branch (599:19): [True: 0, False: 0]
  |  Branch (599:29): [True: 0, False: 0]
  ------------------
  600|      0|        case '7': case '8': case '9':
  ------------------
  |  Branch (600:9): [True: 0, False: 0]
  |  Branch (600:19): [True: 0, False: 0]
  |  Branch (600:29): [True: 0, False: 0]
  ------------------
  601|      0|            return parse_number(p, std::true_type(), std::integral_constant<char, '+'>());
  602|      0|        case 't':
  ------------------
  |  Branch (602:9): [True: 0, False: 0]
  ------------------
  603|      0|            return parse_true(p, std::true_type());
  604|      0|        case 'f':
  ------------------
  |  Branch (604:9): [True: 0, False: 0]
  ------------------
  605|      0|            return parse_false(p, std::true_type());
  606|      0|        case 'n':
  ------------------
  |  Branch (606:9): [True: 0, False: 0]
  ------------------
  607|      0|            return parse_null(p, std::true_type());
  608|      0|        case '"':
  ------------------
  |  Branch (608:9): [True: 0, False: 0]
  ------------------
  609|      0|            return parse_unescaped(p, std::true_type(), std::false_type(), allow_bad_utf8);
  610|      0|        case '[':
  ------------------
  |  Branch (610:9): [True: 0, False: 0]
  ------------------
  611|      0|            return parse_array(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  612|      0|        case '{':
  ------------------
  |  Branch (612:9): [True: 0, False: 0]
  ------------------
  613|      0|            return parse_object(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  614|      0|        case '/':
  ------------------
  |  Branch (614:9): [True: 0, False: 0]
  ------------------
  615|      0|            if(! allow_comments)
  ------------------
  |  Branch (615:16): [Folded - Ignored]
  ------------------
  616|      0|            {
  617|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  618|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  619|      0|                return fail(p, error::syntax, &loc);
  620|      0|            }
  621|      0|            p = parse_comment(p, stack_empty, std::false_type());
  622|       |            // KRYSTIAN NOTE: incomplete takes const_stream, we either
  623|       |            // can add an overload, change the existing one to take a pointer,
  624|       |            // or just leave it as is
  625|      0|            if(BOOST_JSON_UNLIKELY(p == sentinel()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  626|      0|                return maybe_suspend(p, state::val2);
  627|       |            // intentional fallthrough
  628|      0|        case ' ':
  ------------------
  |  Branch (628:9): [True: 0, False: 0]
  ------------------
  629|      0|        case '\t':
  ------------------
  |  Branch (629:9): [True: 0, False: 0]
  ------------------
  630|      0|        case '\n':
  ------------------
  |  Branch (630:9): [True: 0, False: 0]
  ------------------
  631|      0|        case '\r':
  ------------------
  |  Branch (631:9): [True: 0, False: 0]
  ------------------
  632|      0|            p = detail::count_whitespace(p, end_);
  633|      0|            if(BOOST_JSON_UNLIKELY(p == end_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  634|      0|                return maybe_suspend(p, state::val1);
  635|      0|            goto loop;
  636|      0|        default:
  ------------------
  |  Branch (636:9): [True: 0, False: 0]
  ------------------
  637|      0|            {
  638|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  639|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  640|      0|                return fail(p, error::syntax, &loc);
  641|      0|            }
  642|      0|        }
  643|      0|    }
  644|  3.33k|    return resume_value(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  645|  3.33k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12resume_valueILb0ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
  660|  3.33k|{
  661|  3.33k|    state st;
  662|  3.33k|    st_.peek(st);
  663|  3.33k|    switch(st)
  664|  3.33k|    {
  665|      0|    default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (665:5): [True: 0, False: 3.33k]
  ------------------
  666|     10|    case state::nul1: case state::nul2:
  ------------------
  |  Branch (666:5): [True: 9, False: 3.32k]
  |  Branch (666:23): [True: 1, False: 3.33k]
  ------------------
  667|     11|    case state::nul3:
  ------------------
  |  Branch (667:5): [True: 1, False: 3.33k]
  ------------------
  668|     11|        return parse_null(p, stack_empty);
  669|       |
  670|     11|    case state::tru1: case state::tru2:
  ------------------
  |  Branch (670:5): [True: 10, False: 3.32k]
  |  Branch (670:23): [True: 1, False: 3.33k]
  ------------------
  671|     12|    case state::tru3:
  ------------------
  |  Branch (671:5): [True: 1, False: 3.33k]
  ------------------
  672|     12|        return parse_true(p, stack_empty);
  673|       |
  674|      9|    case state::fal1: case state::fal2:
  ------------------
  |  Branch (674:5): [True: 8, False: 3.32k]
  |  Branch (674:23): [True: 1, False: 3.33k]
  ------------------
  675|     11|    case state::fal3: case state::fal4:
  ------------------
  |  Branch (675:5): [True: 1, False: 3.33k]
  |  Branch (675:23): [True: 1, False: 3.33k]
  ------------------
  676|     11|        return parse_false(p, stack_empty);
  677|       |
  678|     86|    case state::str1:
  ------------------
  |  Branch (678:5): [True: 86, False: 3.24k]
  ------------------
  679|     86|        return parse_unescaped(p, stack_empty, std::false_type(), allow_bad_utf8);
  680|       |
  681|    197|    case state::str2: case state::str3:
  ------------------
  |  Branch (681:5): [True: 163, False: 3.17k]
  |  Branch (681:23): [True: 34, False: 3.30k]
  ------------------
  682|    215|    case state::str4: case state::str5:
  ------------------
  |  Branch (682:5): [True: 12, False: 3.32k]
  |  Branch (682:23): [True: 6, False: 3.32k]
  ------------------
  683|    236|    case state::str6: case state::str7:
  ------------------
  |  Branch (683:5): [True: 11, False: 3.32k]
  |  Branch (683:23): [True: 10, False: 3.32k]
  ------------------
  684|    249|    case state::str8:
  ------------------
  |  Branch (684:5): [True: 13, False: 3.32k]
  ------------------
  685|    252|    case state::sur1: case state::sur2:
  ------------------
  |  Branch (685:5): [True: 2, False: 3.33k]
  |  Branch (685:23): [True: 1, False: 3.33k]
  ------------------
  686|    256|    case state::sur3: case state::sur4:
  ------------------
  |  Branch (686:5): [True: 1, False: 3.33k]
  |  Branch (686:23): [True: 3, False: 3.33k]
  ------------------
  687|    264|    case state::sur5: case state::sur6:
  ------------------
  |  Branch (687:5): [True: 2, False: 3.33k]
  |  Branch (687:23): [True: 6, False: 3.32k]
  ------------------
  688|    264|        return parse_escaped(p, 0, stack_empty, std::false_type(), allow_bad_utf8);
  689|       |
  690|     44|    case state::arr1: case state::arr2:
  ------------------
  |  Branch (690:5): [True: 44, False: 3.29k]
  |  Branch (690:23): [True: 0, False: 3.33k]
  ------------------
  691|    680|    case state::arr3: case state::arr4:
  ------------------
  |  Branch (691:5): [True: 518, False: 2.81k]
  |  Branch (691:23): [True: 118, False: 3.21k]
  ------------------
  692|    750|    case state::arr5: case state::arr6:
  ------------------
  |  Branch (692:5): [True: 70, False: 3.26k]
  |  Branch (692:23): [True: 0, False: 3.33k]
  ------------------
  693|    750|        return parse_array(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  694|       |
  695|     45|    case state::obj1: case state::obj2:
  ------------------
  |  Branch (695:5): [True: 45, False: 3.28k]
  |  Branch (695:23): [True: 0, False: 3.33k]
  ------------------
  696|    194|    case state::obj3: case state::obj4:
  ------------------
  |  Branch (696:5): [True: 94, False: 3.24k]
  |  Branch (696:23): [True: 55, False: 3.27k]
  ------------------
  697|    223|    case state::obj5: case state::obj6:
  ------------------
  |  Branch (697:5): [True: 0, False: 3.33k]
  |  Branch (697:23): [True: 29, False: 3.30k]
  ------------------
  698|    549|    case state::obj7: case state::obj8:
  ------------------
  |  Branch (698:5): [True: 297, False: 3.03k]
  |  Branch (698:23): [True: 29, False: 3.30k]
  ------------------
  699|    579|    case state::obj9: case state::obj10:
  ------------------
  |  Branch (699:5): [True: 30, False: 3.30k]
  |  Branch (699:23): [True: 0, False: 3.33k]
  ------------------
  700|    579|    case state::obj11:
  ------------------
  |  Branch (700:5): [True: 0, False: 3.33k]
  ------------------
  701|    579|        return parse_object(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  702|       |
  703|    453|    case state::num1: case state::num2:
  ------------------
  |  Branch (703:5): [True: 14, False: 3.32k]
  |  Branch (703:23): [True: 439, False: 2.89k]
  ------------------
  704|    492|    case state::num3: case state::num4:
  ------------------
  |  Branch (704:5): [True: 37, False: 3.29k]
  |  Branch (704:23): [True: 2, False: 3.33k]
  ------------------
  705|    572|    case state::num5: case state::num6:
  ------------------
  |  Branch (705:5): [True: 62, False: 3.27k]
  |  Branch (705:23): [True: 18, False: 3.31k]
  ------------------
  706|  1.11k|    case state::num7: case state::num8:
  ------------------
  |  Branch (706:5): [True: 11, False: 3.32k]
  |  Branch (706:23): [True: 535, False: 2.79k]
  ------------------
  707|  1.18k|    case state::exp1: case state::exp2:
  ------------------
  |  Branch (707:5): [True: 47, False: 3.28k]
  |  Branch (707:23): [True: 18, False: 3.31k]
  ------------------
  708|  1.62k|    case state::exp3:
  ------------------
  |  Branch (708:5): [True: 438, False: 2.89k]
  ------------------
  709|  1.62k|        return parse_number(p, stack_empty, std::integral_constant<char, 0>());
  710|       |
  711|      0|    case state::com1: case state::com2:
  ------------------
  |  Branch (711:5): [True: 0, False: 3.33k]
  |  Branch (711:23): [True: 0, False: 3.33k]
  ------------------
  712|      0|    case state::com3: case state::com4:
  ------------------
  |  Branch (712:5): [True: 0, False: 3.33k]
  |  Branch (712:23): [True: 0, False: 3.33k]
  ------------------
  713|      0|        return parse_comment(p, stack_empty, std::false_type());
  714|       |
  715|       |    // KRYSTIAN NOTE: these are special cases
  716|      0|    case state::val1:
  ------------------
  |  Branch (716:5): [True: 0, False: 3.33k]
  ------------------
  717|      0|    {
  718|      0|        st_.pop(st);
  719|      0|        BOOST_ASSERT(st_.empty());
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  720|      0|        p = detail::count_whitespace(p, end_);
  721|      0|        if(BOOST_JSON_UNLIKELY(p == end_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  722|      0|            return maybe_suspend(p, state::val1);
  723|      0|        return parse_value(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  724|      0|    }
  725|       |
  726|      0|    case state::val2:
  ------------------
  |  Branch (726:5): [True: 0, False: 3.33k]
  ------------------
  727|      0|    {
  728|      0|        st_.pop(st);
  729|      0|        p = parse_comment(p, stack_empty, std::false_type());
  730|      0|        if(BOOST_JSON_UNLIKELY(p == sentinel()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  731|      0|            return maybe_suspend(p, state::val2);
  732|      0|        BOOST_ASSERT(st_.empty());
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  733|      0|        return parse_value(p, std::true_type(), std::true_type(), allow_trailing, allow_bad_utf8);
  734|      0|    }
  735|  3.33k|    }
  736|  3.33k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE10parse_nullILb0EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  744|     22|{
  745|     22|    detail::const_stream_wrapper cs(p, end_);
  746|     22|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (746:8): [Folded - Ignored]
  |  Branch (746:23): [True: 0, False: 22]
  ------------------
  747|      0|    {
  748|      0|        if(BOOST_JSON_LIKELY(cs.remain() >= 4))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  749|      0|        {
  750|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  751|      0|                std::memcmp(cs.begin(), "null", 4) != 0))
  752|      0|            {
  753|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  754|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  755|      0|                return fail(cs.begin(), error::syntax, &loc);
  756|      0|            }
  757|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  758|      0|                ! h_.on_null(ec_)))
  759|      0|                return fail(cs.begin());
  760|      0|            cs += 4;
  761|      0|            return cs.begin();
  762|      0|        }
  763|      0|    }
  764|     22|    else
  765|     22|    {
  766|     22|        state st;
  767|     22|        st_.pop(st);
  768|     22|        switch(st)
  769|     22|        {
  770|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (770:9): [True: 0, False: 22]
  ------------------
  771|     18|        case state::nul1: goto do_nul1;
  ------------------
  |  Branch (771:9): [True: 18, False: 4]
  ------------------
  772|      2|        case state::nul2: goto do_nul2;
  ------------------
  |  Branch (772:9): [True: 2, False: 20]
  ------------------
  773|      2|        case state::nul3: goto do_nul3;
  ------------------
  |  Branch (773:9): [True: 2, False: 20]
  ------------------
  774|     22|        }
  775|     22|    }
  776|      0|    ++cs;
  777|     18|do_nul1:
  778|     18|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     18|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 18, False: 0]
  |  |  ------------------
  ------------------
  779|     18|        return maybe_suspend(cs.begin(), state::nul1);
  780|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  781|      0|    {
  782|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  783|      0|        return fail(cs.begin(), error::syntax, &loc);
  784|      0|    }
  785|      0|    ++cs;
  786|      2|do_nul2:
  787|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  788|      2|        return maybe_suspend(cs.begin(), state::nul2);
  789|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'l'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  790|      0|    {
  791|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  792|      0|        return fail(cs.begin(), error::syntax, &loc);
  793|      0|    }
  794|      0|    ++cs;
  795|      2|do_nul3:
  796|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  797|      2|        return maybe_suspend(cs.begin(), state::nul3);
  798|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'l'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  799|      0|    {
  800|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  801|      0|        return fail(cs.begin(), error::syntax, &loc);
  802|      0|    }
  803|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  804|      0|        ! h_.on_null(ec_)))
  805|      0|        return fail(cs.begin());
  806|      0|    ++cs;
  807|      0|    return cs.begin();
  808|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE10parse_trueILb0EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  816|     23|{
  817|     23|    detail::const_stream_wrapper cs(p, end_);
  818|     23|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (818:8): [Folded - Ignored]
  |  Branch (818:23): [True: 0, False: 23]
  ------------------
  819|      0|    {
  820|      0|        if(BOOST_JSON_LIKELY(cs.remain() >= 4))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  821|      0|        {
  822|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  823|      0|                std::memcmp(cs.begin(), "true", 4) != 0))
  824|      0|            {
  825|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  826|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  827|      0|                return fail(cs.begin(), error::syntax, &loc);
  828|      0|            }
  829|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  830|      0|                ! h_.on_bool(true, ec_)))
  831|      0|                return fail(cs.begin());
  832|      0|            cs += 4;
  833|      0|            return cs.begin();
  834|      0|        }
  835|      0|    }
  836|     23|    else
  837|     23|    {
  838|     23|        state st;
  839|     23|        st_.pop(st);
  840|     23|        switch(st)
  841|     23|        {
  842|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (842:9): [True: 0, False: 23]
  ------------------
  843|     19|        case state::tru1: goto do_tru1;
  ------------------
  |  Branch (843:9): [True: 19, False: 4]
  ------------------
  844|      2|        case state::tru2: goto do_tru2;
  ------------------
  |  Branch (844:9): [True: 2, False: 21]
  ------------------
  845|      2|        case state::tru3: goto do_tru3;
  ------------------
  |  Branch (845:9): [True: 2, False: 21]
  ------------------
  846|     23|        }
  847|     23|    }
  848|      0|    ++cs;
  849|     19|do_tru1:
  850|     19|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     19|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 19, False: 0]
  |  |  ------------------
  ------------------
  851|     19|        return maybe_suspend(cs.begin(), state::tru1);
  852|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'r'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  853|      0|    {
  854|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  855|      0|        return fail(cs.begin(), error::syntax, &loc);
  856|      0|    }
  857|      0|    ++cs;
  858|      2|do_tru2:
  859|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  860|      2|        return maybe_suspend(cs.begin(), state::tru2);
  861|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  862|      0|    {
  863|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  864|      0|        return fail(cs.begin(), error::syntax, &loc);
  865|      0|    }
  866|      0|    ++cs;
  867|      2|do_tru3:
  868|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  869|      2|        return maybe_suspend(cs.begin(), state::tru3);
  870|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'e'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  871|      0|    {
  872|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  873|      0|        return fail(cs.begin(), error::syntax, &loc);
  874|      0|    }
  875|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  876|      0|        ! h_.on_bool(true, ec_)))
  877|      0|        return fail(cs.begin());
  878|      0|    ++cs;
  879|      0|    return cs.begin();
  880|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_falseILb0EEEPKcS7_NSt3__117integral_constantIbXT_EEE:
  888|     23|{
  889|     23|    detail::const_stream_wrapper cs(p, end_);
  890|     23|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (890:8): [Folded - Ignored]
  |  Branch (890:23): [True: 0, False: 23]
  ------------------
  891|      0|    {
  892|      0|        if(BOOST_JSON_LIKELY(cs.remain() >= 5))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  893|      0|        {
  894|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  895|      0|                std::memcmp(cs.begin() + 1, "alse", 4) != 0))
  896|      0|            {
  897|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  898|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  899|      0|                return fail(cs.begin(), error::syntax, &loc);
  900|      0|            }
  901|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  902|      0|                ! h_.on_bool(false, ec_)))
  903|      0|                return fail(cs.begin());
  904|      0|            cs += 5;
  905|      0|            return cs.begin();
  906|      0|        }
  907|      0|    }
  908|     23|    else
  909|     23|    {
  910|     23|        state st;
  911|     23|        st_.pop(st);
  912|     23|        switch(st)
  913|     23|        {
  914|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (914:9): [True: 0, False: 23]
  ------------------
  915|     17|        case state::fal1: goto do_fal1;
  ------------------
  |  Branch (915:9): [True: 17, False: 6]
  ------------------
  916|      2|        case state::fal2: goto do_fal2;
  ------------------
  |  Branch (916:9): [True: 2, False: 21]
  ------------------
  917|      2|        case state::fal3: goto do_fal3;
  ------------------
  |  Branch (917:9): [True: 2, False: 21]
  ------------------
  918|      2|        case state::fal4: goto do_fal4;
  ------------------
  |  Branch (918:9): [True: 2, False: 21]
  ------------------
  919|     23|        }
  920|     23|    }
  921|      0|    ++cs;
  922|     17|do_fal1:
  923|     17|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     17|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 17, False: 0]
  |  |  ------------------
  ------------------
  924|     17|        return maybe_suspend(cs.begin(), state::fal1);
  925|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'a'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  926|      0|    {
  927|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  928|      0|        return fail(cs.begin(), error::syntax, &loc);
  929|      0|    }
  930|      0|    ++cs;
  931|      2|do_fal2:
  932|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  933|      2|        return maybe_suspend(cs.begin(), state::fal2);
  934|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'l'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  935|      0|    {
  936|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  937|      0|        return fail(cs.begin(), error::syntax, &loc);
  938|      0|    }
  939|      0|    ++cs;
  940|      2|do_fal3:
  941|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  942|      2|        return maybe_suspend(cs.begin(), state::fal3);
  943|      0|    if(BOOST_JSON_UNLIKELY(*cs != 's'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  944|      0|    {
  945|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  946|      0|        return fail(cs.begin(), error::syntax, &loc);
  947|      0|    }
  948|      0|    ++cs;
  949|      2|do_fal4:
  950|      2|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
  951|      2|        return maybe_suspend(cs.begin(), state::fal4);
  952|      0|    if(BOOST_JSON_UNLIKELY(*cs != 'e'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  953|      0|    {
  954|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  955|      0|        return fail(cs.begin(), error::syntax, &loc);
  956|      0|    }
  957|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  958|      0|        ! h_.on_bool(false, ec_)))
  959|      0|        return fail(cs.begin());
  960|      0|    ++cs;
  961|      0|    return cs.begin();
  962|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE15parse_unescapedILb0ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEb:
 1013|    163|{
 1014|    163|    detail::const_stream_wrapper cs(p, end_);
 1015|    163|    std::size_t total;
 1016|    163|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (1016:8): [Folded - Ignored]
  |  Branch (1016:23): [True: 0, False: 163]
  ------------------
 1017|      0|    {
 1018|      0|        BOOST_ASSERT(*cs == '\x22'); // '"'
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1019|      0|        ++cs;
 1020|      0|        total = 0;
 1021|      0|    }
 1022|    163|    else
 1023|    163|    {
 1024|    163|        state st;
 1025|    163|        st_.pop(st);
 1026|    163|        st_.pop(total);
 1027|    163|    }
 1028|    163|    char const* start = cs.begin();
 1029|    163|    cs = allow_bad_utf8?
  ------------------
  |  Branch (1029:10): [True: 80, False: 83]
  ------------------
 1030|     80|        detail::count_valid<true>(cs.begin(), cs.end()):
 1031|    163|        detail::count_valid<false>(cs.begin(), cs.end());
 1032|    163|    std::size_t size = cs.used(start);
 1033|    163|    if(is_key)
  ------------------
  |  Branch (1033:8): [Folded - Ignored]
  ------------------
 1034|      0|    {
 1035|      0|        BOOST_ASSERT(total <= Handler::max_key_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1036|      0|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1037|      0|            Handler::max_key_size - total))
 1038|      0|        {
 1039|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1040|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1041|      0|            return fail(cs.begin(), error::key_too_large, &loc);
 1042|      0|        }
 1043|      0|    }
 1044|    163|    else
 1045|    163|    {
 1046|    163|        BOOST_ASSERT(total <= Handler::max_string_size);
  ------------------
  |  |   60|    163|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1047|    163|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|    163|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 163]
  |  |  ------------------
  ------------------
 1048|    163|            Handler::max_string_size - total))
 1049|      0|        {
 1050|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1051|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1052|      0|            return fail(cs.begin(), error::string_too_large, &loc);
 1053|      0|        }
 1054|    163|    }
 1055|    163|    total += size;
 1056|    163|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    163|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 163, False: 0]
  |  |  ------------------
  ------------------
 1057|    163|    {
 1058|       |        // call handler if the string isn't empty
 1059|    163|        if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|    163|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 163]
  |  |  ------------------
  ------------------
 1060|      0|        {
 1061|      0|            {
 1062|      0|                bool r = is_key?
  ------------------
  |  Branch (1062:26): [Folded - Ignored]
  ------------------
 1063|      0|                    h_.on_key_part( {start, size}, total, ec_ ):
 1064|      0|                    h_.on_string_part( {start, size}, total, ec_ );
 1065|       |
 1066|      0|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1067|      0|                {
 1068|      0|                    return fail(cs.begin());
 1069|      0|                }
 1070|      0|            }
 1071|      0|        }
 1072|    163|        return maybe_suspend(cs.begin(), state::str1, total);
 1073|    163|    }
 1074|       |    // at this point all valid characters have been skipped, so any remaining
 1075|       |    // if there are any more characters, they are either escaped, or incomplete
 1076|       |    // utf8, or invalid utf8
 1077|      0|    if(BOOST_JSON_UNLIKELY(*cs != '\x22')) // '"'
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1078|      0|    {
 1079|       |        // sequence is invalid or incomplete
 1080|      0|        if((*cs & 0x80) && !allow_bad_utf8)
  ------------------
  |  Branch (1080:12): [True: 0, False: 0]
  |  Branch (1080:28): [True: 0, False: 0]
  ------------------
 1081|      0|        {
 1082|      0|            seq_.save(cs.begin(), cs.remain());
 1083|      0|            if(BOOST_JSON_UNLIKELY(seq_.complete()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1084|      0|            {
 1085|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1086|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1087|      0|                return fail(cs.begin(), error::syntax, &loc);
 1088|      0|            }
 1089|      0|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1090|      0|            {
 1091|      0|                {
 1092|      0|                    bool r = is_key?
  ------------------
  |  Branch (1092:30): [Folded - Ignored]
  ------------------
 1093|      0|                        h_.on_key_part( {start, size}, total, ec_ ):
 1094|      0|                        h_.on_string_part( {start, size}, total, ec_ );
 1095|       |
 1096|      0|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1097|      0|                    {
 1098|      0|                        return fail(cs.begin());
 1099|      0|                    }
 1100|      0|                }
 1101|      0|            }
 1102|      0|            return maybe_suspend(cs.end(), state::str8, total);
 1103|      0|        }
 1104|      0|        else if(BOOST_JSON_LIKELY(*cs == '\\'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1105|      0|        {
 1106|       |            // flush unescaped run from input
 1107|      0|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1108|      0|            {
 1109|      0|                {
 1110|      0|                    bool r = is_key?
  ------------------
  |  Branch (1110:30): [Folded - Ignored]
  ------------------
 1111|      0|                        h_.on_key_part( {start, size}, total, ec_ ):
 1112|      0|                        h_.on_string_part( {start, size}, total, ec_ );
 1113|       |
 1114|      0|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1115|      0|                    {
 1116|      0|                        return fail(cs.begin());
 1117|      0|                    }
 1118|      0|                }
 1119|      0|            }
 1120|      0|            return parse_escaped(cs.begin(), total, stack_empty, is_key, allow_bad_utf8);
 1121|      0|        }
 1122|       |        // illegal control
 1123|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1124|      0|        return fail(cs.begin(), error::syntax, &loc);
 1125|      0|    }
 1126|       |
 1127|      0|    {
 1128|      0|        bool r = is_key?
  ------------------
  |  Branch (1128:18): [Folded - Ignored]
  ------------------
 1129|      0|            h_.on_key( {start, size}, total, ec_ ):
 1130|      0|            h_.on_string( {start, size}, total, ec_ );
 1131|       |
 1132|      0|        if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1133|      0|        {
 1134|      0|            return fail(cs.begin());
 1135|      0|        }
 1136|      0|    }
 1137|       |
 1138|      0|    ++cs;
 1139|      0|    return cs.begin();
 1140|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE13parse_escapedILb0EEEPKcS7_mNSt3__117integral_constantIbXT_EEEbb:
 1155|    606|{
 1156|       |    //---------------------------------------------------------------
 1157|       |    //
 1158|       |    // To handle escapes, a local temporary buffer accumulates
 1159|       |    // the unescaped result. The algorithm attempts to fill the
 1160|       |    // buffer to capacity before invoking the handler.
 1161|       |    // In some cases the temporary buffer needs to be flushed
 1162|       |    // before it is full:
 1163|       |    // * When the closing double quote is seen
 1164|       |    // * When there in no more input (and more is expected later)
 1165|       |    // A goal of the algorithm is to call the handler as few times
 1166|       |    // as possible. Thus, when the first escape is encountered,
 1167|       |    // the algorithm attempts to fill the temporary buffer first.
 1168|       |    //
 1169|    606|    auto const ev_too_large = is_key?
  ------------------
  |  Branch (1169:31): [True: 65, False: 541]
  ------------------
 1170|    541|        error::key_too_large : error::string_too_large;
 1171|    606|    auto const max_size = is_key?
  ------------------
  |  Branch (1171:27): [True: 65, False: 541]
  ------------------
 1172|    541|        Handler::max_key_size : Handler::max_string_size;
 1173|    606|    detail::clipped_const_stream cs(p, end_);
 1174|    606|    detail::buffer<BOOST_JSON_STACK_BUFFER_SIZE> temp;
 1175|    606|    int digit;
 1176|    606|    char c;
 1177|    606|    cs.clip(temp.max_size());
 1178|    606|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1178:8): [Folded - Ignored]
  |  Branch (1178:25): [True: 606, False: 0]
  ------------------
 1179|    606|    {
 1180|    606|        state st;
 1181|    606|        st_.pop(st);
 1182|    606|        st_.pop(total);
 1183|    606|        switch(st)
 1184|    606|        {
 1185|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1185:9): [True: 0, False: 606]
  ------------------
 1186|    341|        case state::str2: goto do_str2;
  ------------------
  |  Branch (1186:9): [True: 341, False: 265]
  ------------------
 1187|     84|        case state::str3: goto do_str3;
  ------------------
  |  Branch (1187:9): [True: 84, False: 522]
  ------------------
 1188|     24|        case state::str4: goto do_str4;
  ------------------
  |  Branch (1188:9): [True: 24, False: 582]
  ------------------
 1189|     17|        case state::str5: goto do_str5;
  ------------------
  |  Branch (1189:9): [True: 17, False: 589]
  ------------------
 1190|     20|        case state::str6: goto do_str6;
  ------------------
  |  Branch (1190:9): [True: 20, False: 586]
  ------------------
 1191|     22|        case state::str7: goto do_str7;
  ------------------
  |  Branch (1191:9): [True: 22, False: 584]
  ------------------
 1192|     54|        case state::str8: goto do_str8;
  ------------------
  |  Branch (1192:9): [True: 54, False: 552]
  ------------------
 1193|      9|        case state::sur1: goto do_sur1;
  ------------------
  |  Branch (1193:9): [True: 9, False: 597]
  ------------------
 1194|      2|        case state::sur2: goto do_sur2;
  ------------------
  |  Branch (1194:9): [True: 2, False: 604]
  ------------------
 1195|      2|        case state::sur3: goto do_sur3;
  ------------------
  |  Branch (1195:9): [True: 2, False: 604]
  ------------------
 1196|      9|        case state::sur4: goto do_sur4;
  ------------------
  |  Branch (1196:9): [True: 9, False: 597]
  ------------------
 1197|      7|        case state::sur5: goto do_sur5;
  ------------------
  |  Branch (1197:9): [True: 7, False: 599]
  ------------------
 1198|     15|        case state::sur6: goto do_sur6;
  ------------------
  |  Branch (1198:9): [True: 15, False: 591]
  ------------------
 1199|    606|        }
 1200|    606|    }
 1201|       |    // Unescaped JSON is never larger than its escaped version.
 1202|       |    // To efficiently process only what will fit in the temporary buffer,
 1203|       |    // the size of the input stream is temporarily "clipped" to the size
 1204|       |    // of the temporary buffer.
 1205|       |    // handle escaped character
 1206|      0|    BOOST_ASSERT(*cs == '\\');
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1207|      0|    ++cs;
 1208|     84|do_str3:
 1209|     84|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     84|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 84, False: 0]
  |  |  ------------------
  ------------------
 1210|     84|    {
 1211|     84|        if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|     84|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 84]
  |  |  ------------------
  ------------------
 1212|      0|        {
 1213|      0|            BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1214|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1215|      0|                temp.size() > max_size - total))
 1216|      0|            {
 1217|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1218|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1219|      0|                return fail(cs.begin(), ev_too_large, &loc);
 1220|      0|            }
 1221|      0|            total += temp.size();
 1222|      0|            {
 1223|      0|                bool r = is_key
  ------------------
  |  Branch (1223:26): [True: 0, False: 0]
  ------------------
 1224|      0|                    ? h_.on_key_part(temp.get(), total, ec_)
 1225|      0|                    : h_.on_string_part(temp.get(), total, ec_);
 1226|       |
 1227|      0|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1228|      0|                {
 1229|      0|                    return fail(cs.begin());
 1230|      0|                }
 1231|      0|            }
 1232|      0|            temp.clear();
 1233|      0|        }
 1234|     84|        cs.clip(temp.max_size());
 1235|     84|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     84|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 84, False: 0]
  |  |  ------------------
  ------------------
 1236|     84|            return maybe_suspend(cs.begin(), state::str3, total);
 1237|     84|    }
 1238|      0|    switch(*cs)
 1239|      0|    {
 1240|      0|    default:
  ------------------
  |  Branch (1240:5): [True: 0, False: 0]
  ------------------
 1241|      0|        {
 1242|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1243|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1244|      0|            return fail(cs.begin(), error::syntax, &loc);
 1245|      0|        }
 1246|      0|    case '\x22': // '"'
  ------------------
  |  Branch (1246:5): [True: 0, False: 0]
  ------------------
 1247|      0|        temp.push_back('\x22');
 1248|      0|        ++cs;
 1249|      0|        break;
 1250|      0|    case '\\':
  ------------------
  |  Branch (1250:5): [True: 0, False: 0]
  ------------------
 1251|      0|        temp.push_back('\\');
 1252|      0|        ++cs;
 1253|      0|        break;
 1254|      0|    case '/':
  ------------------
  |  Branch (1254:5): [True: 0, False: 0]
  ------------------
 1255|      0|        temp.push_back('/');
 1256|      0|        ++cs;
 1257|      0|        break;
 1258|      0|    case 'b':
  ------------------
  |  Branch (1258:5): [True: 0, False: 0]
  ------------------
 1259|      0|        temp.push_back('\x08');
 1260|      0|        ++cs;
 1261|      0|        break;
 1262|      0|    case 'f':
  ------------------
  |  Branch (1262:5): [True: 0, False: 0]
  ------------------
 1263|      0|        temp.push_back('\x0c');
 1264|      0|        ++cs;
 1265|      0|        break;
 1266|      0|    case 'n':
  ------------------
  |  Branch (1266:5): [True: 0, False: 0]
  ------------------
 1267|      0|        temp.push_back('\x0a');
 1268|      0|        ++cs;
 1269|      0|        break;
 1270|      0|    case 'r':
  ------------------
  |  Branch (1270:5): [True: 0, False: 0]
  ------------------
 1271|      0|        temp.push_back('\x0d');
 1272|      0|        ++cs;
 1273|      0|        break;
 1274|      0|    case 't':
  ------------------
  |  Branch (1274:5): [True: 0, False: 0]
  ------------------
 1275|      0|        temp.push_back('\x09');
 1276|      0|        ++cs;
 1277|      0|        break;
 1278|      0|    case 'u':
  ------------------
  |  Branch (1278:5): [True: 0, False: 0]
  ------------------
 1279|       |        // utf16 escape
 1280|       |        //
 1281|       |        // fast path only when the buffer
 1282|       |        // is large enough for 2 surrogates
 1283|      0|        if(BOOST_JSON_LIKELY(cs.remain() > 10))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1284|      0|        {
 1285|       |            // KRYSTIAN TODO: this could be done
 1286|       |            // with fewer instructions
 1287|      0|            digit = detail::load_little_endian<4>(
 1288|      0|                cs.begin() + 1);
 1289|      0|            int d4 = detail::hex_digit(static_cast<
 1290|      0|                unsigned char>(digit >> 24));
 1291|      0|            int d3 = detail::hex_digit(static_cast<
 1292|      0|                unsigned char>(digit >> 16));
 1293|      0|            int d2 = detail::hex_digit(static_cast<
 1294|      0|                unsigned char>(digit >> 8));
 1295|      0|            int d1 = detail::hex_digit(static_cast<
 1296|      0|                unsigned char>(digit));
 1297|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1298|      0|                (d1 | d2 | d3 | d4) == -1))
 1299|      0|            {
 1300|      0|                if(d1 != -1)
  ------------------
  |  Branch (1300:20): [True: 0, False: 0]
  ------------------
 1301|      0|                    ++cs;
 1302|      0|                if(d2 != -1)
  ------------------
  |  Branch (1302:20): [True: 0, False: 0]
  ------------------
 1303|      0|                    ++cs;
 1304|      0|                if(d3 != -1)
  ------------------
  |  Branch (1304:20): [True: 0, False: 0]
  ------------------
 1305|      0|                    ++cs;
 1306|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1307|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1308|      0|                return fail(cs.begin(), error::expected_hex_digit, &loc);
 1309|      0|            }
 1310|       |            // 32 bit unicode scalar value
 1311|      0|            unsigned const u1 =
 1312|      0|                (d1 << 12) + (d2 << 8) +
 1313|      0|                (d3 << 4) + d4;
 1314|       |            // valid unicode scalar values are
 1315|       |            // [0, D7FF] and [E000, 10FFFF]
 1316|       |            // values within this range are valid utf-8
 1317|       |            // code points and invalid leading surrogates.
 1318|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1319|      0|                u1 < 0xd800 || u1 > 0xdfff))
 1320|      0|            {
 1321|      0|                cs += 5;
 1322|      0|                temp.append_utf8(u1);
 1323|      0|                break;
 1324|      0|            }
 1325|      0|            if(BOOST_JSON_UNLIKELY(u1 > 0xdbff))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1326|      0|            {
 1327|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1328|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1329|      0|                return fail(cs.begin(), error::illegal_leading_surrogate,
 1330|      0|                    &loc);
 1331|      0|            }
 1332|      0|            cs += 5;
 1333|       |            // KRYSTIAN TODO: this can be a two byte load
 1334|       |            // and a single comparison. We lose error information,
 1335|       |            // but it's faster.
 1336|      0|            if(BOOST_JSON_UNLIKELY(*cs != '\\'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1337|      0|            {
 1338|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1339|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1340|      0|                return fail(cs.begin(), error::syntax, &loc);
 1341|      0|            }
 1342|      0|            ++cs;
 1343|      0|            if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1344|      0|            {
 1345|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1346|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1347|      0|                return fail(cs.begin(), error::syntax, &loc);
 1348|      0|            }
 1349|      0|            ++cs;
 1350|      0|            digit = detail::load_little_endian<4>(cs.begin());
 1351|      0|            d4 = detail::hex_digit(static_cast<
 1352|      0|                unsigned char>(digit >> 24));
 1353|      0|            d3 = detail::hex_digit(static_cast<
 1354|      0|                unsigned char>(digit >> 16));
 1355|      0|            d2 = detail::hex_digit(static_cast<
 1356|      0|                unsigned char>(digit >> 8));
 1357|      0|            d1 = detail::hex_digit(static_cast<
 1358|      0|                unsigned char>(digit));
 1359|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1360|      0|                (d1 | d2 | d3 | d4) == -1))
 1361|      0|            {
 1362|      0|                if(d1 != -1)
  ------------------
  |  Branch (1362:20): [True: 0, False: 0]
  ------------------
 1363|      0|                    ++cs;
 1364|      0|                if(d2 != -1)
  ------------------
  |  Branch (1364:20): [True: 0, False: 0]
  ------------------
 1365|      0|                    ++cs;
 1366|      0|                if(d3 != -1)
  ------------------
  |  Branch (1366:20): [True: 0, False: 0]
  ------------------
 1367|      0|                    ++cs;
 1368|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1369|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1370|      0|                return fail(cs.begin(), error::expected_hex_digit, &loc);
 1371|      0|            }
 1372|      0|            unsigned const u2 =
 1373|      0|                (d1 << 12) + (d2 << 8) +
 1374|      0|                (d3 << 4) + d4;
 1375|       |            // valid trailing surrogates are [DC00, DFFF]
 1376|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1377|      0|                u2 < 0xdc00 || u2 > 0xdfff))
 1378|      0|            {
 1379|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1380|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1381|      0|                return fail(cs.begin(), error::illegal_trailing_surrogate,
 1382|      0|                    &loc);
 1383|      0|            }
 1384|      0|            cs += 4;
 1385|      0|            unsigned cp =
 1386|      0|                ((u1 - 0xd800) << 10) +
 1387|      0|                ((u2 - 0xdc00)) +
 1388|      0|                    0x10000;
 1389|       |            // utf-16 surrogate pair
 1390|      0|            temp.append_utf8(cp);
 1391|      0|            break;
 1392|      0|        }
 1393|       |        // flush
 1394|      0|        if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1395|      0|        {
 1396|      0|            BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1397|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1398|      0|                temp.size() > max_size - total))
 1399|      0|            {
 1400|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1401|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1402|      0|                return fail(cs.begin(), ev_too_large, &loc);
 1403|      0|            }
 1404|      0|            total += temp.size();
 1405|      0|            {
 1406|      0|                bool r = is_key
  ------------------
  |  Branch (1406:26): [True: 0, False: 0]
  ------------------
 1407|      0|                    ? h_.on_key_part(temp.get(), total, ec_)
 1408|      0|                    : h_.on_string_part(temp.get(), total, ec_);
 1409|       |
 1410|      0|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1411|      0|                {
 1412|      0|                    return fail(cs.begin());
 1413|      0|                }
 1414|      0|            }
 1415|      0|            temp.clear();
 1416|      0|            cs.clip(temp.max_size());
 1417|      0|        }
 1418|      0|        ++cs;
 1419|       |        // utf-16 escape
 1420|     24|do_str4:
 1421|     24|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     24|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 24, False: 0]
  |  |  ------------------
  ------------------
 1422|     24|            return maybe_suspend(cs.begin(), state::str4, total);
 1423|      0|        digit = detail::hex_digit(*cs);
 1424|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1425|      0|        {
 1426|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1427|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1428|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1429|      0|        }
 1430|      0|        ++cs;
 1431|      0|        u1_ = digit << 12;
 1432|     17|do_str5:
 1433|     17|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     17|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 17, False: 0]
  |  |  ------------------
  ------------------
 1434|     17|            return maybe_suspend(cs.begin(), state::str5, total);
 1435|      0|        digit = detail::hex_digit(*cs);
 1436|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1437|      0|        {
 1438|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1439|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1440|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1441|      0|        }
 1442|      0|        ++cs;
 1443|      0|        u1_ += digit << 8;
 1444|     20|do_str6:
 1445|     20|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     20|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 20, False: 0]
  |  |  ------------------
  ------------------
 1446|     20|            return maybe_suspend(cs.begin(), state::str6, total);
 1447|      0|        digit = detail::hex_digit(*cs);
 1448|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1449|      0|        {
 1450|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1451|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1452|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1453|      0|        }
 1454|      0|        ++cs;
 1455|      0|        u1_ += digit << 4;
 1456|     22|do_str7:
 1457|     22|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     22|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 22, False: 0]
  |  |  ------------------
  ------------------
 1458|     22|            return maybe_suspend(cs.begin(), state::str7, total);
 1459|      0|        digit = detail::hex_digit(*cs);
 1460|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1461|      0|        {
 1462|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1463|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1464|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1465|      0|        }
 1466|      0|        ++cs;
 1467|      0|        u1_ += digit;
 1468|      0|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1469|      0|            u1_ < 0xd800 || u1_ > 0xdfff))
 1470|      0|        {
 1471|      0|            BOOST_ASSERT(temp.empty());
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1472|       |            // utf-8 codepoint
 1473|      0|            temp.append_utf8(u1_);
 1474|      0|            break;
 1475|      0|        }
 1476|      0|        if(BOOST_JSON_UNLIKELY(u1_ > 0xdbff))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1477|      0|        {
 1478|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1479|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1480|      0|            return fail(cs.begin(), error::illegal_trailing_surrogate, &loc);
 1481|      0|        }
 1482|      9|do_sur1:
 1483|      9|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      9|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 0]
  |  |  ------------------
  ------------------
 1484|      9|            return maybe_suspend(cs.begin(), state::sur1, total);
 1485|      0|        if(BOOST_JSON_UNLIKELY(*cs != '\\'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1486|      0|        {
 1487|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1488|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1489|      0|            return fail(cs.begin(), error::syntax, &loc);
 1490|      0|        }
 1491|      0|        ++cs;
 1492|      2|do_sur2:
 1493|      2|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
 1494|      2|            return maybe_suspend(cs.begin(), state::sur2, total);
 1495|      0|        if(BOOST_JSON_UNLIKELY(*cs != 'u'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1496|      0|        {
 1497|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1498|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1499|      0|            return fail(cs.begin(), error::syntax, &loc);
 1500|      0|        }
 1501|      0|        ++cs;
 1502|      2|do_sur3:
 1503|      2|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2, False: 0]
  |  |  ------------------
  ------------------
 1504|      2|            return maybe_suspend(cs.begin(), state::sur3, total);
 1505|      0|        digit = detail::hex_digit(*cs);
 1506|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1507|      0|        {
 1508|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1509|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1510|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1511|      0|        }
 1512|      0|        ++cs;
 1513|      0|        u2_ = digit << 12;
 1514|      9|do_sur4:
 1515|      9|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      9|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 0]
  |  |  ------------------
  ------------------
 1516|      9|            return maybe_suspend(cs.begin(), state::sur4, total);
 1517|      0|        digit = detail::hex_digit(*cs);
 1518|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1519|      0|        {
 1520|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1521|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1522|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1523|      0|        }
 1524|      0|        ++cs;
 1525|      0|        u2_ += digit << 8;
 1526|      7|do_sur5:
 1527|      7|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      7|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 7, False: 0]
  |  |  ------------------
  ------------------
 1528|      7|            return maybe_suspend(cs.begin(), state::sur5, total);
 1529|      0|        digit = detail::hex_digit(*cs);
 1530|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1531|      0|        {
 1532|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1533|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1534|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1535|      0|        }
 1536|      0|        ++cs;
 1537|      0|        u2_ += digit << 4;
 1538|     15|do_sur6:
 1539|     15|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     15|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 15, False: 0]
  |  |  ------------------
  ------------------
 1540|     15|            return maybe_suspend(cs.begin(), state::sur6, total);
 1541|      0|        digit = detail::hex_digit(*cs);
 1542|      0|        if(BOOST_JSON_UNLIKELY(digit == -1))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1543|      0|        {
 1544|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1545|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1546|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1547|      0|        }
 1548|      0|        ++cs;
 1549|      0|        u2_ += digit;
 1550|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1551|      0|            u2_ < 0xdc00 || u2_ > 0xdfff))
 1552|      0|        {
 1553|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1554|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1555|      0|            return fail(cs.begin(), error::expected_hex_digit, &loc);
 1556|      0|        }
 1557|      0|        unsigned cp =
 1558|      0|            ((u1_ - 0xd800) << 10) +
 1559|      0|            ((u2_ - 0xdc00)) +
 1560|      0|                0x10000;
 1561|      0|        BOOST_ASSERT(temp.empty());
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1562|       |        // utf-16 surrogate pair
 1563|      0|        temp.append_utf8(cp);
 1564|      0|    }
 1565|    341|do_str2:
 1566|       |    // KRYSTIAN TODO: we can append the characters
 1567|       |    // all at once instead of one at a time
 1568|    341|    for(;;)
 1569|    341|    {
 1570|    341|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    341|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 341, False: 0]
  |  |  ------------------
  ------------------
 1571|    341|        {
 1572|       |            // flush
 1573|    341|            if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|    341|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 341]
  |  |  ------------------
  ------------------
 1574|      0|            {
 1575|      0|                BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1576|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1577|      0|                    temp.size() > max_size - total))
 1578|      0|                {
 1579|      0|                    BOOST_STATIC_CONSTEXPR source_location loc
 1580|      0|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1581|      0|                    return fail(cs.begin(), ev_too_large, &loc);
 1582|      0|                }
 1583|      0|                total += temp.size();
 1584|      0|                {
 1585|      0|                    bool r = is_key
  ------------------
  |  Branch (1585:30): [True: 0, False: 0]
  ------------------
 1586|      0|                        ? h_.on_key_part(temp.get(), total, ec_)
 1587|      0|                        : h_.on_string_part(temp.get(), total, ec_);
 1588|       |
 1589|      0|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1590|      0|                    {
 1591|      0|                        return fail(cs.begin());
 1592|      0|                    }
 1593|      0|                }
 1594|      0|                temp.clear();
 1595|      0|            }
 1596|    341|            cs.clip(temp.max_size());
 1597|    341|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    341|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 341, False: 0]
  |  |  ------------------
  ------------------
 1598|    341|                return maybe_suspend(cs.begin(), state::str2, total);
 1599|    341|        }
 1600|      0|        c = *cs;
 1601|      0|        if(BOOST_JSON_LIKELY(c == '\x22')) // '"'
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1602|      0|        {
 1603|      0|            BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1604|      0|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1605|      0|                temp.size() > max_size - total))
 1606|      0|            {
 1607|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1608|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1609|      0|                return fail(cs.begin(), ev_too_large, &loc);
 1610|      0|            }
 1611|      0|            total += temp.size();
 1612|      0|            {
 1613|      0|                bool r = is_key
  ------------------
  |  Branch (1613:26): [True: 0, False: 0]
  ------------------
 1614|      0|                    ? h_.on_key(temp.get(), total, ec_)
 1615|      0|                    : h_.on_string(temp.get(), total, ec_);
 1616|       |
 1617|      0|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1618|      0|                {
 1619|      0|                    return fail(cs.begin());
 1620|      0|                }
 1621|      0|            }
 1622|      0|            ++cs;
 1623|      0|            return cs.begin();
 1624|      0|        }
 1625|      0|        else if((c & 0x80) && !allow_bad_utf8)
  ------------------
  |  Branch (1625:17): [True: 0, False: 0]
  |  Branch (1625:31): [True: 0, False: 0]
  ------------------
 1626|      0|        {
 1627|      0|            seq_.save(cs.begin(), cs.remain());
 1628|      0|            if(BOOST_JSON_UNLIKELY(! seq_.complete()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1629|      0|            {
 1630|      0|                if(BOOST_JSON_LIKELY(! temp.empty()))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1631|      0|                {
 1632|      0|                    BOOST_ASSERT(total <= max_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1633|      0|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1634|      0|                        temp.size() > max_size - total))
 1635|      0|                    {
 1636|      0|                        BOOST_STATIC_CONSTEXPR source_location loc
 1637|      0|                            = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1638|      0|                        return fail(cs.begin(), ev_too_large, &loc);
 1639|      0|                    }
 1640|      0|                    total += temp.size();
 1641|      0|                    {
 1642|      0|                        bool r = is_key
  ------------------
  |  Branch (1642:34): [True: 0, False: 0]
  ------------------
 1643|      0|                            ? h_.on_key_part(temp.get(), total, ec_)
 1644|      0|                            : h_.on_string_part(temp.get(), total, ec_);
 1645|       |
 1646|      0|                        if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1647|      0|                        {
 1648|      0|                            return fail(cs.begin());
 1649|      0|                        }
 1650|      0|                    }
 1651|      0|                    temp.clear();
 1652|      0|                }
 1653|      0|                cs = cs.end();
 1654|       |                // ensure there is room for the saved byte sequence
 1655|      0|                cs.clip(temp.max_size() - seq_.length());
 1656|      0|                goto do_str8;
 1657|      0|            }
 1658|      0|            if(BOOST_JSON_UNLIKELY(! seq_.valid()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1659|      0|            {
 1660|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1661|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1662|      0|                return fail(cs.begin(), error::syntax, &loc);
 1663|      0|            }
 1664|      0|            temp.append(seq_.data(), seq_.length());
 1665|      0|            cs += seq_.length();
 1666|      0|            continue;
 1667|      0|        }
 1668|      0|        else if(BOOST_JSON_LIKELY(c == '\\'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1669|      0|        {
 1670|      0|            ++cs;
 1671|      0|            goto do_str3;
 1672|      0|        }
 1673|      0|        else if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1674|      0|            detail::is_control(c)))
 1675|      0|        {
 1676|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1677|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1678|      0|            return fail(cs.begin(), error::syntax, &loc);
 1679|      0|        }
 1680|      0|        temp.push_back(c);
 1681|      0|        ++cs;
 1682|      0|    }
 1683|     54|do_str8:
 1684|     54|    uint8_t needed = seq_.needed();
 1685|     54|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     54|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 54, False: 0]
  |  |  ------------------
  ------------------
 1686|     54|        ! seq_.append(cs.begin(), cs.remain())))
 1687|     54|        return maybe_suspend(cs.end(), state::str8, total);
 1688|      0|    if(BOOST_JSON_UNLIKELY(! seq_.valid()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1689|      0|    {
 1690|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1691|      0|        return fail(cs.begin(), error::syntax, &loc);
 1692|      0|    }
 1693|      0|    temp.append(seq_.data(), seq_.length());
 1694|      0|    cs += needed;
 1695|      0|    goto do_str2;
 1696|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_arrayILb0ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1881|    750|{
 1882|    750|    detail::const_stream_wrapper cs(p, end_);
 1883|    750|    std::size_t size;
 1884|    750|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1884:8): [Folded - Ignored]
  |  Branch (1884:25): [True: 750, False: 0]
  ------------------
 1885|    750|    {
 1886|       |        // resume
 1887|    750|        state st;
 1888|    750|        st_.pop(st);
 1889|    750|        st_.pop(size);
 1890|    750|        switch(st)
 1891|    750|        {
 1892|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1892:9): [True: 0, False: 750]
  ------------------
 1893|     44|        case state::arr1: goto do_arr1;
  ------------------
  |  Branch (1893:9): [True: 44, False: 706]
  ------------------
 1894|      0|        case state::arr2: goto do_arr2;
  ------------------
  |  Branch (1894:9): [True: 0, False: 750]
  ------------------
 1895|    518|        case state::arr3: goto do_arr3;
  ------------------
  |  Branch (1895:9): [True: 518, False: 232]
  ------------------
 1896|    118|        case state::arr4: goto do_arr4;
  ------------------
  |  Branch (1896:9): [True: 118, False: 632]
  ------------------
 1897|     70|        case state::arr5: goto do_arr5;
  ------------------
  |  Branch (1897:9): [True: 70, False: 680]
  ------------------
 1898|      0|        case state::arr6: goto do_arr6;
  ------------------
  |  Branch (1898:9): [True: 0, False: 750]
  ------------------
 1899|    750|        }
 1900|    750|    }
 1901|      0|    BOOST_ASSERT(*cs == '[');
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1902|      0|    size = 0;
 1903|      0|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1904|      0|    {
 1905|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1906|      0|        return fail(cs.begin(), error::too_deep, &loc);
 1907|      0|    }
 1908|      0|    --depth_;
 1909|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1910|      0|        ! h_.on_array_begin(ec_)))
 1911|      0|        return fail(cs.begin());
 1912|      0|    ++cs;
 1913|       |    // array:
 1914|       |    //     '[' *ws ']'
 1915|       |    //     '[' *ws value *ws *[ ',' *ws value *ws ] ']'
 1916|     44|do_arr1:
 1917|     44|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1918|     44|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     44|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 44, False: 0]
  |  |  ------------------
  ------------------
 1919|     44|        return maybe_suspend(cs.begin(), state::arr1, size);
 1920|      0|    if(BOOST_JSON_LIKELY(*cs != ']'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1921|      0|    {
 1922|      0|loop:
 1923|      0|        if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1923:12): [Folded - Ignored]
  |  Branch (1923:30): [True: 0, False: 0]
  ------------------
 1924|      0|        {
 1925|      0|do_arr2:
 1926|      0|            cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1927|      0|            if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1928|      0|                return suspend_or_fail(state::arr2, size);
 1929|      0|            goto do_arr1;
 1930|      0|        }
 1931|      0|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1932|      0|            Handler::max_array_size))
 1933|      0|        {
 1934|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1935|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1936|      0|            return fail(cs.begin(), error::array_too_large, &loc);
 1937|      0|        }
 1938|    518|do_arr3:
 1939|       |        // array is not empty, value required
 1940|    518|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1941|    518|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    518|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 287, False: 231]
  |  |  ------------------
  ------------------
 1942|    287|            return suspend_or_fail(state::arr3, size);
 1943|    305|do_arr4:
 1944|    305|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1945|    305|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    305|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 305, False: 0]
  |  |  ------------------
  ------------------
 1946|    305|            return maybe_suspend(cs.begin(), state::arr4, size);
 1947|      0|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1948|      0|        {
 1949|      0|            ++cs;
 1950|     70|do_arr5:
 1951|     70|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1952|     70|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     70|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 70, False: 0]
  |  |  ------------------
  ------------------
 1953|     70|                return maybe_suspend(cs.begin(), state::arr5, size);
 1954|       |            // loop for next element
 1955|      0|            if(! allow_trailing || *cs != ']')
  ------------------
  |  Branch (1955:16): [True: 0, False: 0]
  |  Branch (1955:36): [True: 0, False: 0]
  ------------------
 1956|      0|                goto loop;
 1957|      0|        }
 1958|      0|        else if(BOOST_JSON_UNLIKELY(*cs != ']'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1959|      0|        {
 1960|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1960:16): [Folded - Ignored]
  |  Branch (1960:34): [True: 0, False: 0]
  ------------------
 1961|      0|            {
 1962|      0|do_arr6:
 1963|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1964|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1965|      0|                    return suspend_or_fail(state::arr6, size);
 1966|      0|                goto do_arr4;
 1967|      0|            }
 1968|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1969|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1970|      0|            return fail(cs.begin(), error::syntax, &loc);
 1971|      0|        }
 1972|       |        // got closing bracket; fall through
 1973|      0|    }
 1974|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1975|      0|        ! h_.on_array_end(size, ec_)))
 1976|      0|        return fail(cs.begin());
 1977|      0|    ++depth_;
 1978|      0|    ++cs;
 1979|      0|    return cs.begin();
 1980|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_objectILb0ELb0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1713|    579|{
 1714|    579|    detail::const_stream_wrapper cs(p, end_);
 1715|    579|    std::size_t size;
 1716|    579|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1716:8): [Folded - Ignored]
  |  Branch (1716:25): [True: 579, False: 0]
  ------------------
 1717|    579|    {
 1718|       |        // resume
 1719|    579|        state st;
 1720|    579|        st_.pop(st);
 1721|    579|        st_.pop(size);
 1722|    579|        switch(st)
 1723|    579|        {
 1724|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1724:9): [True: 0, False: 579]
  ------------------
 1725|     45|        case state::obj1: goto do_obj1;
  ------------------
  |  Branch (1725:9): [True: 45, False: 534]
  ------------------
 1726|      0|        case state::obj2: goto do_obj2;
  ------------------
  |  Branch (1726:9): [True: 0, False: 579]
  ------------------
 1727|     94|        case state::obj3: goto do_obj3;
  ------------------
  |  Branch (1727:9): [True: 94, False: 485]
  ------------------
 1728|     55|        case state::obj4: goto do_obj4;
  ------------------
  |  Branch (1728:9): [True: 55, False: 524]
  ------------------
 1729|      0|        case state::obj5: goto do_obj5;
  ------------------
  |  Branch (1729:9): [True: 0, False: 579]
  ------------------
 1730|     29|        case state::obj6: goto do_obj6;
  ------------------
  |  Branch (1730:9): [True: 29, False: 550]
  ------------------
 1731|    297|        case state::obj7: goto do_obj7;
  ------------------
  |  Branch (1731:9): [True: 297, False: 282]
  ------------------
 1732|     29|        case state::obj8: goto do_obj8;
  ------------------
  |  Branch (1732:9): [True: 29, False: 550]
  ------------------
 1733|     30|        case state::obj9: goto do_obj9;
  ------------------
  |  Branch (1733:9): [True: 30, False: 549]
  ------------------
 1734|      0|        case state::obj10: goto do_obj10;
  ------------------
  |  Branch (1734:9): [True: 0, False: 579]
  ------------------
 1735|      0|        case state::obj11: goto do_obj11;
  ------------------
  |  Branch (1735:9): [True: 0, False: 579]
  ------------------
 1736|    579|        }
 1737|    579|    }
 1738|      0|    BOOST_ASSERT(*cs == '{');
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1739|      0|    size = 0;
 1740|      0|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1741|      0|    {
 1742|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1743|      0|        return fail(cs.begin(), error::too_deep, &loc);
 1744|      0|    }
 1745|      0|    --depth_;
 1746|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1747|      0|        ! h_.on_object_begin(ec_)))
 1748|      0|        return fail(cs.begin());
 1749|      0|    ++cs;
 1750|       |    // object:
 1751|       |    //     '{' *ws '}'
 1752|       |    //     '{' *ws string *ws ':' *ws value *ws *[ ',' *ws string *ws ':' *ws value *ws ] '}'
 1753|     45|do_obj1:
 1754|     45|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1755|     45|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     45|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 45, False: 0]
  |  |  ------------------
  ------------------
 1756|     45|        return maybe_suspend(cs.begin(), state::obj1, size);
 1757|      0|    if(BOOST_JSON_LIKELY(*cs != '}'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1758|      0|    {
 1759|      0|        if(BOOST_JSON_UNLIKELY(*cs != '\x22'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1760|      0|        {
 1761|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1761:16): [Folded - Ignored]
  |  Branch (1761:34): [True: 0, False: 0]
  ------------------
 1762|      0|            {
 1763|      0|do_obj2:
 1764|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1765|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1766|      0|                    return suspend_or_fail(state::obj2, size);
 1767|      0|                goto do_obj1;
 1768|      0|            }
 1769|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1770|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1771|      0|            return fail(cs.begin(), error::syntax, &loc);
 1772|      0|        }
 1773|      0|loop:
 1774|      0|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1775|      0|            Handler::max_object_size))
 1776|      0|        {
 1777|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1778|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1779|      0|            return fail(cs.begin(), error::object_too_large, &loc);
 1780|      0|        }
 1781|     94|do_obj3:
 1782|     94|        cs = parse_string(cs.begin(), stack_empty, std::true_type(), allow_bad_utf8);
 1783|     94|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|     94|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 94, False: 0]
  |  |  ------------------
  ------------------
 1784|     94|            return suspend_or_fail(state::obj3, size);
 1785|     55|do_obj4:
 1786|     55|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1787|     55|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     55|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 55, False: 0]
  |  |  ------------------
  ------------------
 1788|     55|            return maybe_suspend(cs.begin(), state::obj4, size);
 1789|      0|        if(BOOST_JSON_UNLIKELY(*cs != ':'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1790|      0|        {
 1791|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1791:16): [Folded - Ignored]
  |  Branch (1791:34): [True: 0, False: 0]
  ------------------
 1792|      0|            {
 1793|      0|do_obj5:
 1794|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1795|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1796|      0|                    return suspend_or_fail(state::obj5, size);
 1797|      0|                goto do_obj4;
 1798|      0|            }
 1799|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1800|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1801|      0|            return fail(cs.begin(), error::syntax, &loc);
 1802|      0|        }
 1803|      0|        ++cs;
 1804|     29|do_obj6:
 1805|     29|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1806|     29|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     29|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 29, False: 0]
  |  |  ------------------
  ------------------
 1807|     29|            return maybe_suspend(cs.begin(), state::obj6, size);
 1808|    297|do_obj7:
 1809|    297|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1810|    297|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    297|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 294, False: 3]
  |  |  ------------------
  ------------------
 1811|    294|            return suspend_or_fail(state::obj7, size);
 1812|     32|do_obj8:
 1813|     32|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1814|     32|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     32|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 32, False: 0]
  |  |  ------------------
  ------------------
 1815|     32|            return maybe_suspend(cs.begin(), state::obj8, size);
 1816|      0|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1817|      0|        {
 1818|      0|            ++cs;
 1819|     30|do_obj9:
 1820|     30|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1821|     30|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     30|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 30, False: 0]
  |  |  ------------------
  ------------------
 1822|     30|                return maybe_suspend(cs.begin(), state::obj9, size);
 1823|       |
 1824|       |            // loop for next element
 1825|      0|            if(BOOST_JSON_LIKELY(*cs == '\x22'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1826|      0|                goto loop;
 1827|      0|            if(! allow_trailing || *cs != '}')
  ------------------
  |  Branch (1827:16): [True: 0, False: 0]
  |  Branch (1827:36): [True: 0, False: 0]
  ------------------
 1828|      0|            {
 1829|      0|                if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1829:20): [Folded - Ignored]
  |  Branch (1829:38): [True: 0, False: 0]
  ------------------
 1830|      0|                {
 1831|      0|do_obj10:
 1832|      0|                    cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1833|      0|                    if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1834|      0|                        return suspend_or_fail(state::obj10, size);
 1835|      0|                    goto do_obj9;
 1836|      0|                }
 1837|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1838|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1839|      0|                return fail(cs.begin(), error::syntax, &loc);
 1840|      0|            }
 1841|      0|        }
 1842|      0|        else if(BOOST_JSON_UNLIKELY(*cs != '}'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1843|      0|        {
 1844|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1844:16): [Folded - Ignored]
  |  Branch (1844:34): [True: 0, False: 0]
  ------------------
 1845|      0|            {
 1846|      0|do_obj11:
 1847|      0|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1848|      0|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1849|      0|                    return suspend_or_fail(state::obj11, size);
 1850|      0|                goto do_obj8;
 1851|      0|            }
 1852|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1853|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1854|      0|            return fail(cs.begin(), error::syntax, &loc);
 1855|      0|        }
 1856|       |        // got closing brace, fall through
 1857|      0|    }
 1858|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1859|      0|        ! h_.on_object_end(size, ec_)))
 1860|      0|        return fail(cs.begin());
 1861|      0|    ++depth_;
 1862|      0|    ++cs;
 1863|      0|    return cs.begin();
 1864|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_stringILb0ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEb:
  977|    204|{
  978|    204|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (978:8): [Folded - Ignored]
  |  Branch (978:25): [True: 204, False: 0]
  ------------------
  979|    204|    {
  980|    204|        state st;
  981|    204|        st_.peek(st);
  982|    204|        switch(st)
  983|    204|        {
  984|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (984:9): [True: 0, False: 204]
  ------------------
  985|    139|        case state::str1:
  ------------------
  |  Branch (985:9): [True: 139, False: 65]
  ------------------
  986|    139|            return parse_unescaped(p, stack_empty, is_key, allow_bad_utf8);
  987|       |
  988|     29|        case state::str2: case state::str3:
  ------------------
  |  Branch (988:9): [True: 13, False: 191]
  |  Branch (988:27): [True: 16, False: 188]
  ------------------
  989|     29|        case state::str4: case state::str5:
  ------------------
  |  Branch (989:9): [True: 0, False: 204]
  |  Branch (989:27): [True: 0, False: 204]
  ------------------
  990|     31|        case state::str6: case state::str7:
  ------------------
  |  Branch (990:9): [True: 0, False: 204]
  |  Branch (990:27): [True: 2, False: 202]
  ------------------
  991|     57|        case state::str8:
  ------------------
  |  Branch (991:9): [True: 26, False: 178]
  ------------------
  992|     59|        case state::sur1: case state::sur2:
  ------------------
  |  Branch (992:9): [True: 2, False: 202]
  |  Branch (992:27): [True: 0, False: 204]
  ------------------
  993|     60|        case state::sur3: case state::sur4:
  ------------------
  |  Branch (993:9): [True: 0, False: 204]
  |  Branch (993:27): [True: 1, False: 203]
  ------------------
  994|     65|        case state::sur5: case state::sur6:
  ------------------
  |  Branch (994:9): [True: 1, False: 203]
  |  Branch (994:27): [True: 4, False: 200]
  ------------------
  995|     65|            return parse_escaped(p, 0, stack_empty, is_key, allow_bad_utf8);
  996|    204|        }
  997|    204|    }
  998|       |
  999|      0|    return parse_unescaped(p, std::true_type(), is_key, allow_bad_utf8);
 1000|    204|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE15parse_unescapedILb0ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEb:
 1013|    139|{
 1014|    139|    detail::const_stream_wrapper cs(p, end_);
 1015|    139|    std::size_t total;
 1016|    139|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (1016:8): [Folded - Ignored]
  |  Branch (1016:23): [True: 0, False: 139]
  ------------------
 1017|      0|    {
 1018|      0|        BOOST_ASSERT(*cs == '\x22'); // '"'
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1019|      0|        ++cs;
 1020|      0|        total = 0;
 1021|      0|    }
 1022|    139|    else
 1023|    139|    {
 1024|    139|        state st;
 1025|    139|        st_.pop(st);
 1026|    139|        st_.pop(total);
 1027|    139|    }
 1028|    139|    char const* start = cs.begin();
 1029|    139|    cs = allow_bad_utf8?
  ------------------
  |  Branch (1029:10): [True: 70, False: 69]
  ------------------
 1030|     70|        detail::count_valid<true>(cs.begin(), cs.end()):
 1031|    139|        detail::count_valid<false>(cs.begin(), cs.end());
 1032|    139|    std::size_t size = cs.used(start);
 1033|    139|    if(is_key)
  ------------------
  |  Branch (1033:8): [Folded - Ignored]
  ------------------
 1034|    139|    {
 1035|    139|        BOOST_ASSERT(total <= Handler::max_key_size);
  ------------------
  |  |   60|    139|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1036|    139|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|    139|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 139]
  |  |  ------------------
  ------------------
 1037|    139|            Handler::max_key_size - total))
 1038|      0|        {
 1039|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1040|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1041|      0|            return fail(cs.begin(), error::key_too_large, &loc);
 1042|      0|        }
 1043|    139|    }
 1044|      0|    else
 1045|      0|    {
 1046|      0|        BOOST_ASSERT(total <= Handler::max_string_size);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1047|      0|        if(BOOST_JSON_UNLIKELY(size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1048|      0|            Handler::max_string_size - total))
 1049|      0|        {
 1050|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1051|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1052|      0|            return fail(cs.begin(), error::string_too_large, &loc);
 1053|      0|        }
 1054|      0|    }
 1055|    139|    total += size;
 1056|    139|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    139|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 139, False: 0]
  |  |  ------------------
  ------------------
 1057|    139|    {
 1058|       |        // call handler if the string isn't empty
 1059|    139|        if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|    139|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 139]
  |  |  ------------------
  ------------------
 1060|      0|        {
 1061|      0|            {
 1062|      0|                bool r = is_key?
  ------------------
  |  Branch (1062:26): [Folded - Ignored]
  ------------------
 1063|      0|                    h_.on_key_part( {start, size}, total, ec_ ):
 1064|      0|                    h_.on_string_part( {start, size}, total, ec_ );
 1065|       |
 1066|      0|                if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1067|      0|                {
 1068|      0|                    return fail(cs.begin());
 1069|      0|                }
 1070|      0|            }
 1071|      0|        }
 1072|    139|        return maybe_suspend(cs.begin(), state::str1, total);
 1073|    139|    }
 1074|       |    // at this point all valid characters have been skipped, so any remaining
 1075|       |    // if there are any more characters, they are either escaped, or incomplete
 1076|       |    // utf8, or invalid utf8
 1077|      0|    if(BOOST_JSON_UNLIKELY(*cs != '\x22')) // '"'
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1078|      0|    {
 1079|       |        // sequence is invalid or incomplete
 1080|      0|        if((*cs & 0x80) && !allow_bad_utf8)
  ------------------
  |  Branch (1080:12): [True: 0, False: 0]
  |  Branch (1080:28): [True: 0, False: 0]
  ------------------
 1081|      0|        {
 1082|      0|            seq_.save(cs.begin(), cs.remain());
 1083|      0|            if(BOOST_JSON_UNLIKELY(seq_.complete()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1084|      0|            {
 1085|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1086|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1087|      0|                return fail(cs.begin(), error::syntax, &loc);
 1088|      0|            }
 1089|      0|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1090|      0|            {
 1091|      0|                {
 1092|      0|                    bool r = is_key?
  ------------------
  |  Branch (1092:30): [Folded - Ignored]
  ------------------
 1093|      0|                        h_.on_key_part( {start, size}, total, ec_ ):
 1094|      0|                        h_.on_string_part( {start, size}, total, ec_ );
 1095|       |
 1096|      0|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1097|      0|                    {
 1098|      0|                        return fail(cs.begin());
 1099|      0|                    }
 1100|      0|                }
 1101|      0|            }
 1102|      0|            return maybe_suspend(cs.end(), state::str8, total);
 1103|      0|        }
 1104|      0|        else if(BOOST_JSON_LIKELY(*cs == '\\'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1105|      0|        {
 1106|       |            // flush unescaped run from input
 1107|      0|            if(BOOST_JSON_LIKELY(size))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1108|      0|            {
 1109|      0|                {
 1110|      0|                    bool r = is_key?
  ------------------
  |  Branch (1110:30): [Folded - Ignored]
  ------------------
 1111|      0|                        h_.on_key_part( {start, size}, total, ec_ ):
 1112|      0|                        h_.on_string_part( {start, size}, total, ec_ );
 1113|       |
 1114|      0|                    if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1115|      0|                    {
 1116|      0|                        return fail(cs.begin());
 1117|      0|                    }
 1118|      0|                }
 1119|      0|            }
 1120|      0|            return parse_escaped(cs.begin(), total, stack_empty, is_key, allow_bad_utf8);
 1121|      0|        }
 1122|       |        // illegal control
 1123|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1124|      0|        return fail(cs.begin(), error::syntax, &loc);
 1125|      0|    }
 1126|       |
 1127|      0|    {
 1128|      0|        bool r = is_key?
  ------------------
  |  Branch (1128:18): [Folded - Ignored]
  ------------------
 1129|      0|            h_.on_key( {start, size}, total, ec_ ):
 1130|      0|            h_.on_string( {start, size}, total, ec_ );
 1131|       |
 1132|      0|        if(BOOST_JSON_UNLIKELY(!r))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1133|      0|        {
 1134|      0|            return fail(cs.begin());
 1135|      0|        }
 1136|      0|    }
 1137|       |
 1138|      0|    ++cs;
 1139|      0|    return cs.begin();
 1140|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_numberILb0ELc0EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IcXT0_EEE:
 1991|  3.09k|{
 1992|       |    // only one of these will be true if we are not resuming
 1993|       |    // if negative then !zero_first && !nonzero_first
 1994|       |    // if zero_first then !nonzero_first && !negative
 1995|       |    // if nonzero_first then !zero_first && !negative
 1996|  3.09k|    bool const negative = first == '-';
 1997|  3.09k|    bool const zero_first = first == '0';
 1998|  3.09k|    bool const nonzero_first = first == '+';
 1999|  3.09k|    detail::const_stream_wrapper cs(p, end_);
 2000|  3.09k|    number num;
 2001|  3.09k|    const char* begin = cs.begin();
 2002|  3.09k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (2002:8): [Folded - Ignored]
  |  Branch (2002:23): [True: 0, False: 3.09k]
  ------------------
 2003|      0|    {
 2004|      0|        num.bias = 0;
 2005|      0|        num.exp = 0;
 2006|      0|        num.frac = false;
 2007|       |
 2008|       |        //----------------------------------
 2009|       |        //
 2010|       |        // '-'
 2011|       |        // leading minus sign
 2012|       |        //
 2013|      0|        BOOST_ASSERT(cs);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2014|      0|        if(negative)
  ------------------
  |  Branch (2014:12): [Folded - Ignored]
  ------------------
 2015|      0|            ++cs;
 2016|       |
 2017|      0|        num.neg = negative;
 2018|      0|        num.frac = false;
 2019|      0|        num.exp = 0;
 2020|      0|        num.bias = 0;
 2021|       |
 2022|       |        // fast path
 2023|      0|        if( cs.remain() >= 16 + 1 + 16 ) // digits . digits
  ------------------
  |  Branch (2023:13): [True: 0, False: 0]
  ------------------
 2024|      0|        {
 2025|      0|            int n1;
 2026|       |
 2027|      0|            if( nonzero_first ||
  ------------------
  |  Branch (2027:17): [Folded - Ignored]
  ------------------
 2028|      0|                (negative && *cs != '0') )
  ------------------
  |  Branch (2028:18): [Folded - Ignored]
  |  Branch (2028:30): [True: 0, False: 0]
  ------------------
 2029|      0|            {
 2030|      0|                n1 = detail::count_digits( cs.begin() );
 2031|      0|                BOOST_ASSERT(n1 >= 0 && n1 <= 16);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2032|       |
 2033|      0|                if( ! nonzero_first && n1 == 0 )
  ------------------
  |  Branch (2033:21): [Folded - Ignored]
  |  Branch (2033:40): [True: 0, False: 0]
  ------------------
 2034|      0|                {
 2035|       |                    // digit required
 2036|      0|                    BOOST_STATIC_CONSTEXPR source_location loc
 2037|      0|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2038|      0|                    return fail(cs.begin(), error::syntax, &loc);
 2039|      0|                }
 2040|       |
 2041|      0|                num.mant = detail::parse_unsigned( 0, cs.begin(), n1 );
 2042|       |
 2043|      0|                cs += n1;
 2044|       |
 2045|       |                // integer or floating-point with
 2046|       |                // >= 16 leading digits
 2047|      0|                if( n1 == 16 )
  ------------------
  |  Branch (2047:21): [True: 0, False: 0]
  ------------------
 2048|      0|                {
 2049|      0|                    goto do_num2;
 2050|      0|                }
 2051|      0|            }
 2052|      0|            else
 2053|      0|            {
 2054|       |                // 0. floating-point or 0e integer
 2055|      0|                num.mant = 0;
 2056|      0|                n1 = 0;
 2057|      0|                ++cs;
 2058|      0|            }
 2059|       |
 2060|      0|            {
 2061|      0|                const char c = *cs;
 2062|      0|                if(c != '.')
  ------------------
  |  Branch (2062:20): [True: 0, False: 0]
  ------------------
 2063|      0|                {
 2064|      0|                    if((c | 32) == 'e')
  ------------------
  |  Branch (2064:24): [True: 0, False: 0]
  ------------------
 2065|      0|                    {
 2066|      0|                        ++cs;
 2067|      0|                        goto do_exp1;
 2068|      0|                    }
 2069|      0|                    if(negative)
  ------------------
  |  Branch (2069:24): [Folded - Ignored]
  ------------------
 2070|      0|                        num.mant = ~num.mant + 1;
 2071|      0|                    goto finish_signed;
 2072|      0|                }
 2073|      0|            }
 2074|       |
 2075|       |            // floating-point number
 2076|       |
 2077|      0|            ++cs;
 2078|       |
 2079|      0|            int n2 = detail::count_digits( cs.begin() );
 2080|      0|            BOOST_ASSERT(n2 >= 0 && n2 <= 16);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2081|       |
 2082|      0|            if( n2 == 0 )
  ------------------
  |  Branch (2082:17): [True: 0, False: 0]
  ------------------
 2083|      0|            {
 2084|       |                // digit required
 2085|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 2086|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2087|      0|                return fail(cs.begin(), error::syntax, &loc);
 2088|      0|            }
 2089|       |
 2090|       |            // floating-point mantissa overflow
 2091|      0|            if( n1 + n2 >= 19 )
  ------------------
  |  Branch (2091:17): [True: 0, False: 0]
  ------------------
 2092|      0|            {
 2093|      0|                goto do_num7;
 2094|      0|            }
 2095|       |
 2096|      0|            num.mant = detail::parse_unsigned( num.mant, cs.begin(), n2 );
 2097|       |
 2098|      0|            BOOST_ASSERT(num.bias == 0);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2099|       |
 2100|      0|            num.bias -= n2;
 2101|       |
 2102|      0|            cs += n2;
 2103|       |
 2104|      0|            char ch = *cs;
 2105|       |
 2106|      0|            if( (ch | 32) == 'e' )
  ------------------
  |  Branch (2106:17): [True: 0, False: 0]
  ------------------
 2107|      0|            {
 2108|      0|                ++cs;
 2109|      0|                goto do_exp1;
 2110|      0|            }
 2111|      0|            else if( ch >= '0' && ch <= '9' )
  ------------------
  |  Branch (2111:22): [True: 0, False: 0]
  |  Branch (2111:35): [True: 0, False: 0]
  ------------------
 2112|      0|            {
 2113|      0|                goto do_num8;
 2114|      0|            }
 2115|       |
 2116|      0|            goto finish_dub;
 2117|      0|        }
 2118|      0|    }
 2119|  3.09k|    else
 2120|  3.09k|    {
 2121|  3.09k|        num = num_;
 2122|  3.09k|        state st;
 2123|  3.09k|        st_.pop(st);
 2124|  3.09k|        switch(st)
 2125|  3.09k|        {
 2126|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (2126:9): [True: 0, False: 3.09k]
  ------------------
 2127|     23|        case state::num1: goto do_num1;
  ------------------
  |  Branch (2127:9): [True: 23, False: 3.07k]
  ------------------
 2128|    826|        case state::num2: goto do_num2;
  ------------------
  |  Branch (2128:9): [True: 826, False: 2.27k]
  ------------------
 2129|     61|        case state::num3: goto do_num3;
  ------------------
  |  Branch (2129:9): [True: 61, False: 3.03k]
  ------------------
 2130|      5|        case state::num4: goto do_num4;
  ------------------
  |  Branch (2130:9): [True: 5, False: 3.09k]
  ------------------
 2131|    106|        case state::num5: goto do_num5;
  ------------------
  |  Branch (2131:9): [True: 106, False: 2.99k]
  ------------------
 2132|     38|        case state::num6: goto do_num6;
  ------------------
  |  Branch (2132:9): [True: 38, False: 3.06k]
  ------------------
 2133|     16|        case state::num7: goto do_num7;
  ------------------
  |  Branch (2133:9): [True: 16, False: 3.08k]
  ------------------
 2134|  1.02k|        case state::num8: goto do_num8;
  ------------------
  |  Branch (2134:9): [True: 1.02k, False: 2.07k]
  ------------------
 2135|     84|        case state::exp1: goto do_exp1;
  ------------------
  |  Branch (2135:9): [True: 84, False: 3.01k]
  ------------------
 2136|     42|        case state::exp2: goto do_exp2;
  ------------------
  |  Branch (2136:9): [True: 42, False: 3.05k]
  ------------------
 2137|    870|        case state::exp3: goto do_exp3;
  ------------------
  |  Branch (2137:9): [True: 870, False: 2.22k]
  ------------------
 2138|  3.09k|        }
 2139|  3.09k|    }
 2140|       |
 2141|       |    //----------------------------------
 2142|       |    //
 2143|       |    // DIGIT
 2144|       |    // first digit
 2145|       |    //
 2146|     23|do_num1:
 2147|     23|    if(zero_first || nonzero_first ||
  ------------------
  |  Branch (2147:8): [Folded - Ignored]
  |  Branch (2147:22): [Folded - Ignored]
  ------------------
 2148|     23|        BOOST_JSON_LIKELY(cs))
  ------------------
  |  |  171|     23|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 23]
  |  |  ------------------
  ------------------
 2149|      0|    {
 2150|      0|        char const c = *cs;
 2151|      0|        if(zero_first)
  ------------------
  |  Branch (2151:12): [Folded - Ignored]
  ------------------
 2152|      0|        {
 2153|      0|            ++cs;
 2154|      0|            num.mant = 0;
 2155|      0|            goto do_num6;
 2156|      0|        }
 2157|      0|        else if(nonzero_first || BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (2157:17): [Folded - Ignored]
  ------------------
 2158|      0|            c >= '1' && c <= '9'))
 2159|      0|        {
 2160|      0|            ++cs;
 2161|      0|            num.mant = c - '0';
 2162|      0|        }
 2163|      0|        else if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2164|      0|            c == '0'))
 2165|      0|        {
 2166|      0|            ++cs;
 2167|      0|            num.mant = 0;
 2168|      0|            goto do_num6;
 2169|      0|        }
 2170|      0|        else
 2171|      0|        {
 2172|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2173|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2174|      0|            return fail(cs.begin(), error::syntax, &loc);
 2175|      0|        }
 2176|      0|    }
 2177|     23|    else
 2178|     23|    {
 2179|     23|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     23|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 23]
  |  |  ------------------
  ------------------
 2180|     23|            ! h_.on_number_part(
 2181|     23|                {begin, cs.used(begin)}, ec_)))
 2182|      0|            return fail(cs.begin());
 2183|     23|        return maybe_suspend(
 2184|     23|            cs.begin(), state::num1, num);
 2185|     23|    }
 2186|       |
 2187|       |    //----------------------------------
 2188|       |    //
 2189|       |    // 1*DIGIT
 2190|       |    // significant digits left of decimal
 2191|       |    //
 2192|    826|do_num2:
 2193|    826|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2193:8): [Folded - Ignored]
  |  Branch (2193:21): [Folded - Ignored]
  |  Branch (2193:37): [True: 286, False: 540]
  ------------------
 2194|    286|    {
 2195|    286|        for(;;)
 2196|    286|        {
 2197|    286|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    286|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 286, False: 0]
  |  |  ------------------
  ------------------
 2198|    286|            {
 2199|    286|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    286|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 286]
  |  |  ------------------
  ------------------
 2200|      0|                {
 2201|      0|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2202|      0|                        ! h_.on_number_part(
 2203|      0|                            {begin, cs.used(begin)}, ec_)))
 2204|      0|                        return fail(cs.begin());
 2205|      0|                    return suspend(cs.begin(), state::num2, num);
 2206|      0|                }
 2207|    286|                goto finish_int;
 2208|    286|            }
 2209|      0|            char const c = *cs;
 2210|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2211|      0|                c >= '0' && c <= '9'))
 2212|      0|            {
 2213|      0|                ++cs;
 2214|       |                //              9223372036854775808 INT64_MIN
 2215|      0|                if( num.mant  > 922337203685477580 || (
  ------------------
  |  Branch (2215:21): [True: 0, False: 0]
  ------------------
 2216|      0|                    num.mant == 922337203685477580 && c > '8'))
  ------------------
  |  Branch (2216:21): [True: 0, False: 0]
  |  Branch (2216:55): [True: 0, False: 0]
  ------------------
 2217|      0|                    break;
 2218|      0|                num.mant = 10 * num.mant + ( c - '0' );
 2219|      0|                continue;
 2220|      0|            }
 2221|      0|            goto do_num6; // [.eE]
 2222|      0|        }
 2223|    286|    }
 2224|    540|    else
 2225|    540|    {
 2226|    540|        for(;;)
 2227|    540|        {
 2228|    540|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    540|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 540, False: 0]
  |  |  ------------------
  ------------------
 2229|    540|            {
 2230|    540|                if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    540|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 540]
  |  |  ------------------
  ------------------
 2231|      0|                {
 2232|      0|                    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2233|      0|                        ! h_.on_number_part(
 2234|      0|                            {begin, cs.used(begin)}, ec_)))
 2235|      0|                        return fail(cs.begin());
 2236|      0|                    return suspend(cs.begin(), state::num2, num);
 2237|      0|                }
 2238|    540|                goto finish_int;
 2239|    540|            }
 2240|      0|            char const c = *cs;
 2241|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2242|      0|                c >= '0' && c <= '9'))
 2243|      0|            {
 2244|      0|                ++cs;
 2245|       |                //              18446744073709551615 UINT64_MAX
 2246|      0|                if( num.mant  > 1844674407370955161 || (
  ------------------
  |  Branch (2246:21): [True: 0, False: 0]
  ------------------
 2247|      0|                    num.mant == 1844674407370955161 && c > '5'))
  ------------------
  |  Branch (2247:21): [True: 0, False: 0]
  |  Branch (2247:56): [True: 0, False: 0]
  ------------------
 2248|      0|                    break;
 2249|      0|                num.mant = 10 * num.mant + ( c - '0' );
 2250|      0|            }
 2251|      0|            else
 2252|      0|            {
 2253|      0|                goto do_num6; // [.eE]
 2254|      0|            }
 2255|      0|        }
 2256|    540|    }
 2257|      0|    ++num.bias;
 2258|       |
 2259|       |    //----------------------------------
 2260|       |    //
 2261|       |    // 1*DIGIT
 2262|       |    // non-significant digits left of decimal
 2263|       |    //
 2264|     61|do_num3:
 2265|     61|    for(;;)
 2266|     61|    {
 2267|     61|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     61|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 61, False: 0]
  |  |  ------------------
  ------------------
 2268|     61|        {
 2269|     61|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     61|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 61]
  |  |  ------------------
  ------------------
 2270|      0|            {
 2271|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2272|      0|                    ! h_.on_number_part(
 2273|      0|                        {begin, cs.used(begin)}, ec_)))
 2274|      0|                    return fail(cs.begin());
 2275|      0|                return suspend(cs.begin(), state::num3, num);
 2276|      0|            }
 2277|     61|            goto finish_dub;
 2278|     61|        }
 2279|      0|        char const c = *cs;
 2280|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2281|      0|            c >= '0' && c <= '9'))
 2282|      0|        {
 2283|      0|            ++cs;
 2284|       |            // VFALCO check overflow
 2285|      0|            ++num.bias;
 2286|      0|        }
 2287|      0|        else if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2288|      0|            c == '.'))
 2289|      0|        {
 2290|      0|            ++cs;
 2291|      0|            break;
 2292|      0|        }
 2293|      0|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2293:17): [True: 0, False: 0]
  ------------------
 2294|      0|        {
 2295|      0|            ++cs;
 2296|      0|            goto do_exp1;
 2297|      0|        }
 2298|      0|        else
 2299|      0|        {
 2300|      0|            goto finish_dub;
 2301|      0|        }
 2302|      0|    }
 2303|       |
 2304|       |    //----------------------------------
 2305|       |    //
 2306|       |    // DIGIT
 2307|       |    // first non-significant digit
 2308|       |    // to the right of decimal
 2309|       |    //
 2310|      5|do_num4:
 2311|      5|    {
 2312|      5|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      5|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 0]
  |  |  ------------------
  ------------------
 2313|      5|        {
 2314|      5|            if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      5|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 5]
  |  |  ------------------
  ------------------
 2315|      5|                ! h_.on_number_part(
 2316|      5|                    {begin, cs.used(begin)}, ec_)))
 2317|      0|                return fail(cs.begin());
 2318|      5|            return maybe_suspend(
 2319|      5|                cs.begin(), state::num4, num);
 2320|      5|        }
 2321|      0|        char const c = *cs;
 2322|      0|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2323|       |            //static_cast<unsigned char>(c - '0') < 10))
 2324|      0|            c >= '0' && c <= '9'))
 2325|      0|        {
 2326|      0|            ++cs;
 2327|      0|        }
 2328|      0|        else
 2329|      0|        {
 2330|       |            // digit required
 2331|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2332|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2333|      0|            return fail(cs.begin(), error::syntax, &loc);
 2334|      0|        }
 2335|      0|    }
 2336|       |
 2337|       |    //----------------------------------
 2338|       |    //
 2339|       |    // 1*DIGIT
 2340|       |    // non-significant digits
 2341|       |    // to the right of decimal
 2342|       |    //
 2343|    106|do_num5:
 2344|    106|    for(;;)
 2345|    106|    {
 2346|    106|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    106|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 106, False: 0]
  |  |  ------------------
  ------------------
 2347|    106|        {
 2348|    106|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    106|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 106]
  |  |  ------------------
  ------------------
 2349|      0|            {
 2350|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2351|      0|                    ! h_.on_number_part(
 2352|      0|                        {begin, cs.used(begin)}, ec_)))
 2353|      0|                    return fail(cs.begin());
 2354|      0|                return suspend(cs.begin(), state::num5, num);
 2355|      0|            }
 2356|    106|            goto finish_dub;
 2357|    106|        }
 2358|      0|        char const c = *cs;
 2359|      0|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2360|      0|            c >= '0' && c <= '9'))
 2361|      0|        {
 2362|      0|            ++cs;
 2363|      0|        }
 2364|      0|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2364:17): [True: 0, False: 0]
  ------------------
 2365|      0|        {
 2366|      0|            ++cs;
 2367|      0|            goto do_exp1;
 2368|      0|        }
 2369|      0|        else
 2370|      0|        {
 2371|      0|            goto finish_dub;
 2372|      0|        }
 2373|      0|    }
 2374|       |
 2375|       |    //----------------------------------
 2376|       |    //
 2377|       |    // [.eE]
 2378|       |    //
 2379|     38|do_num6:
 2380|     38|    {
 2381|     38|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     38|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 38, False: 0]
  |  |  ------------------
  ------------------
 2382|     38|        {
 2383|     38|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     38|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 38]
  |  |  ------------------
  ------------------
 2384|      0|            {
 2385|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2386|      0|                    ! h_.on_number_part(
 2387|      0|                        {begin, cs.used(begin)}, ec_)))
 2388|      0|                    return fail(cs.begin());
 2389|      0|                return suspend(cs.begin(), state::num6, num);
 2390|      0|            }
 2391|     38|            goto finish_int;
 2392|     38|        }
 2393|      0|        char const c = *cs;
 2394|      0|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2395|      0|            c == '.'))
 2396|      0|        {
 2397|      0|            ++cs;
 2398|      0|        }
 2399|      0|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2399:17): [True: 0, False: 0]
  ------------------
 2400|      0|        {
 2401|      0|            ++cs;
 2402|      0|            goto do_exp1;
 2403|      0|        }
 2404|      0|        else
 2405|      0|        {
 2406|      0|            goto finish_int;
 2407|      0|        }
 2408|      0|    }
 2409|       |
 2410|       |    //----------------------------------
 2411|       |    //
 2412|       |    // DIGIT
 2413|       |    // first significant digit
 2414|       |    // to the right of decimal
 2415|       |    //
 2416|     16|do_num7:
 2417|     16|    {
 2418|     16|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     16|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 16, False: 0]
  |  |  ------------------
  ------------------
 2419|     16|        {
 2420|     16|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     16|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 16]
  |  |  ------------------
  ------------------
 2421|      0|            {
 2422|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2423|      0|                    ! h_.on_number_part(
 2424|      0|                        {begin, cs.used(begin)}, ec_)))
 2425|      0|                    return fail(cs.begin());
 2426|      0|                return suspend(cs.begin(), state::num7, num);
 2427|      0|            }
 2428|       |            // digit required
 2429|     16|            BOOST_STATIC_CONSTEXPR source_location loc
 2430|     16|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     16|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2431|     16|            return fail(cs.begin(), error::syntax, &loc);
 2432|     16|        }
 2433|      0|        char const c = *cs;
 2434|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2435|      0|            c < '0' || c > '9'))
 2436|      0|        {
 2437|       |            // digit required
 2438|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2439|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2440|      0|            return fail(cs.begin(), error::syntax, &loc);
 2441|      0|        }
 2442|      0|    }
 2443|       |
 2444|       |    //----------------------------------
 2445|       |    //
 2446|       |    // 1*DIGIT
 2447|       |    // significant digits
 2448|       |    // to the right of decimal
 2449|       |    //
 2450|  1.02k|do_num8:
 2451|  1.02k|    for(;;)
 2452|  1.02k|    {
 2453|  1.02k|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|  1.02k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1.02k, False: 0]
  |  |  ------------------
  ------------------
 2454|  1.02k|        {
 2455|  1.02k|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|  1.02k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 1.02k]
  |  |  ------------------
  ------------------
 2456|      0|            {
 2457|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2458|      0|                    ! h_.on_number_part(
 2459|      0|                        {begin, cs.used(begin)}, ec_)))
 2460|      0|                    return fail(cs.begin());
 2461|      0|                return suspend(cs.begin(), state::num8, num);
 2462|      0|            }
 2463|  1.02k|            goto finish_dub;
 2464|  1.02k|        }
 2465|      0|        char const c = *cs;
 2466|      0|        if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2467|      0|            c >= '0' && c <= '9'))
 2468|      0|        {
 2469|      0|            ++cs;
 2470|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2471|      0|                num.mant <= 9007199254740991)) // 2^53-1
 2472|      0|            {
 2473|      0|                --num.bias;
 2474|      0|                num.mant = 10 * num.mant + ( c - '0' );
 2475|      0|            }
 2476|      0|            else
 2477|      0|            {
 2478|      0|                goto do_num5;
 2479|      0|            }
 2480|      0|        }
 2481|      0|        else if((c | 32) == 'e')
  ------------------
  |  Branch (2481:17): [True: 0, False: 0]
  ------------------
 2482|      0|        {
 2483|      0|            ++cs;
 2484|      0|            goto do_exp1;
 2485|      0|        }
 2486|      0|        else
 2487|      0|        {
 2488|      0|            goto finish_dub;
 2489|      0|        }
 2490|      0|    }
 2491|       |
 2492|       |    //----------------------------------
 2493|       |    //
 2494|       |    // *[+-]
 2495|       |    //
 2496|     84|do_exp1:
 2497|     84|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     84|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 84, False: 0]
  |  |  ------------------
  ------------------
 2498|     84|    {
 2499|     84|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     84|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 84]
  |  |  ------------------
  ------------------
 2500|     84|            ! h_.on_number_part(
 2501|     84|                {begin, cs.used(begin)}, ec_)))
 2502|      0|            return fail(cs.begin());
 2503|     84|        return maybe_suspend(
 2504|     84|            cs.begin(), state::exp1, num);
 2505|     84|    }
 2506|      0|    if(*cs == '+')
  ------------------
  |  Branch (2506:8): [True: 0, False: 0]
  ------------------
 2507|      0|    {
 2508|      0|        ++cs;
 2509|      0|    }
 2510|      0|    else if(*cs == '-')
  ------------------
  |  Branch (2510:13): [True: 0, False: 0]
  ------------------
 2511|      0|    {
 2512|      0|        ++cs;
 2513|      0|        num.frac = true;
 2514|      0|    }
 2515|       |
 2516|       |    //----------------------------------
 2517|       |    //
 2518|       |    // DIGIT
 2519|       |    // first digit of the exponent
 2520|       |    //
 2521|     42|do_exp2:
 2522|     42|    {
 2523|     42|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     42|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 42, False: 0]
  |  |  ------------------
  ------------------
 2524|     42|        {
 2525|     42|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|     42|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 42]
  |  |  ------------------
  ------------------
 2526|      0|            {
 2527|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2528|      0|                    ! h_.on_number_part(
 2529|      0|                        {begin, cs.used(begin)}, ec_)))
 2530|      0|                    return fail(cs.begin());
 2531|      0|                return suspend(cs.begin(), state::exp2, num);
 2532|      0|            }
 2533|       |            // digit required
 2534|     42|            BOOST_STATIC_CONSTEXPR source_location loc
 2535|     42|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     42|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2536|     42|            return fail(cs.begin(), error::syntax, &loc);
 2537|     42|        }
 2538|      0|        char const c = *cs;
 2539|      0|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2540|      0|            c < '0' || c > '9'))
 2541|      0|        {
 2542|       |            // digit required
 2543|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 2544|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2545|      0|            return fail(cs.begin(), error::syntax, &loc);
 2546|      0|        }
 2547|      0|        ++cs;
 2548|      0|        num.exp = c - '0';
 2549|      0|    }
 2550|       |
 2551|       |    //----------------------------------
 2552|       |    //
 2553|       |    // 1*DIGIT
 2554|       |    // subsequent digits in the exponent
 2555|       |    //
 2556|    870|do_exp3:
 2557|    870|    for(;;)
 2558|    870|    {
 2559|    870|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    870|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 870, False: 0]
  |  |  ------------------
  ------------------
 2560|    870|        {
 2561|    870|            if(BOOST_JSON_UNLIKELY(more_))
  ------------------
  |  |  179|    870|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 870]
  |  |  ------------------
  ------------------
 2562|      0|            {
 2563|      0|                if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2564|      0|                    ! h_.on_number_part(
 2565|      0|                        {begin, cs.used(begin)}, ec_)))
 2566|      0|                    return fail(cs.begin());
 2567|      0|                return suspend(cs.begin(), state::exp3, num);
 2568|      0|            }
 2569|    870|        }
 2570|      0|        else
 2571|      0|        {
 2572|      0|            char const c = *cs;
 2573|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  |  Branch (171:52): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2574|      0|                c >= '0' && c <= '9'))
 2575|      0|            {
 2576|      0|                if(BOOST_JSON_UNLIKELY
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  |  Branch (179:54): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2577|       |                //              2147483647 INT_MAX
 2578|      0|                    (num.exp  > 214748364 || (
 2579|      0|                        num.exp == 214748364 && c > '7')))
 2580|      0|                {
 2581|      0|                    BOOST_STATIC_CONSTEXPR source_location loc
 2582|      0|                        = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2583|      0|                    return fail(cs.begin(), error::exponent_overflow, &loc);
 2584|      0|                }
 2585|      0|                ++cs;
 2586|      0|                num.exp = 10 * num.exp + ( c - '0' );
 2587|      0|                continue;
 2588|      0|            }
 2589|      0|        }
 2590|    870|        BOOST_ASSERT(num.exp >= 0);
  ------------------
  |  |   60|    870|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2591|    870|        if ( num.frac )
  ------------------
  |  Branch (2591:14): [True: 222, False: 648]
  ------------------
 2592|    222|        {
 2593|    222|            if (BOOST_JSON_UNLIKELY( num.bias  < (INT_MIN + num.exp) ))
  ------------------
  |  |  179|    222|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1, False: 221]
  |  |  ------------------
  ------------------
 2594|      1|            {
 2595|      1|                BOOST_STATIC_CONSTEXPR source_location loc
 2596|      1|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      1|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2597|      1|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2598|      1|            }
 2599|    222|        }
 2600|    648|        else
 2601|    648|        {
 2602|    648|            if (BOOST_JSON_UNLIKELY( num.bias > (INT_MAX - num.exp) ))
  ------------------
  |  |  179|    648|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 21, False: 627]
  |  |  ------------------
  ------------------
 2603|     21|            {
 2604|     21|                BOOST_STATIC_CONSTEXPR source_location loc
 2605|     21|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|     21|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 2606|     21|                return fail(cs.begin(), error::exponent_overflow, &loc);
 2607|     21|            }
 2608|    648|        }
 2609|    848|        goto finish_dub;
 2610|    870|    }
 2611|       |
 2612|    864|finish_int:
 2613|    864|    if(negative || (!stack_empty && num.neg))
  ------------------
  |  Branch (2613:8): [Folded - Ignored]
  |  Branch (2613:21): [Folded - Ignored]
  |  Branch (2613:37): [True: 291, False: 573]
  ------------------
 2614|    291|    {
 2615|    291|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    291|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 291]
  |  |  ------------------
  ------------------
 2616|    291|            ! h_.on_int64(static_cast<
 2617|    291|                int64_t>(~num.mant + 1), {begin, cs.used(begin)}, ec_)))
 2618|      0|            return fail(cs.begin());
 2619|    291|        return cs.begin();
 2620|    291|    }
 2621|    573|    if(num.mant <= INT64_MAX)
  ------------------
  |  Branch (2621:8): [True: 408, False: 165]
  ------------------
 2622|    408|    {
 2623|    408|finish_signed:
 2624|    408|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    408|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 408]
  |  |  ------------------
  ------------------
 2625|    408|            ! h_.on_int64(static_cast<
 2626|    408|                int64_t>(num.mant), {begin, cs.used(begin)}, ec_)))
 2627|      0|            return fail(cs.begin());
 2628|    408|        return cs.begin();
 2629|    408|    }
 2630|    165|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|    165|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 165]
  |  |  ------------------
  ------------------
 2631|    165|        ! h_.on_uint64(num.mant, {begin, cs.used(begin)}, ec_)))
 2632|      0|        return fail(cs.begin());
 2633|    165|    return cs.begin();
 2634|  2.04k|finish_dub:
 2635|  2.04k|    double const d = detail::dec_to_float(
 2636|  2.04k|        num.mant,
 2637|  2.04k|        num.bias + (num.frac ?
  ------------------
  |  Branch (2637:21): [True: 221, False: 1.82k]
  ------------------
 2638|  1.82k|            -num.exp : num.exp),
 2639|  2.04k|        num.neg);
 2640|  2.04k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  2.04k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 2.04k]
  |  |  ------------------
  ------------------
 2641|  2.04k|        ! h_.on_double(d, {begin, cs.used(begin)}, ec_)))
 2642|      0|        return fail(cs.begin());
 2643|  2.04k|    return cs.begin();
 2644|  2.04k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_valueILb0ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
  588|  3.73k|{
  589|  3.73k|    if(stack_empty || st_.empty())
  ------------------
  |  Branch (589:8): [Folded - Ignored]
  |  Branch (589:23): [True: 0, False: 3.73k]
  ------------------
  590|      0|    {
  591|      0|loop:
  592|      0|        switch(*p)
  593|      0|        {
  594|      0|        case '0':
  ------------------
  |  Branch (594:9): [True: 0, False: 0]
  ------------------
  595|      0|            return parse_number(p, std::true_type(), std::integral_constant<char, '0'>());
  596|      0|        case '-':
  ------------------
  |  Branch (596:9): [True: 0, False: 0]
  ------------------
  597|      0|            return parse_number(p, std::true_type(), std::integral_constant<char, '-'>());
  598|      0|        case '1': case '2': case '3':
  ------------------
  |  Branch (598:9): [True: 0, False: 0]
  |  Branch (598:19): [True: 0, False: 0]
  |  Branch (598:29): [True: 0, False: 0]
  ------------------
  599|      0|        case '4': case '5': case '6':
  ------------------
  |  Branch (599:9): [True: 0, False: 0]
  |  Branch (599:19): [True: 0, False: 0]
  |  Branch (599:29): [True: 0, False: 0]
  ------------------
  600|      0|        case '7': case '8': case '9':
  ------------------
  |  Branch (600:9): [True: 0, False: 0]
  |  Branch (600:19): [True: 0, False: 0]
  |  Branch (600:29): [True: 0, False: 0]
  ------------------
  601|      0|            return parse_number(p, std::true_type(), std::integral_constant<char, '+'>());
  602|      0|        case 't':
  ------------------
  |  Branch (602:9): [True: 0, False: 0]
  ------------------
  603|      0|            return parse_true(p, std::true_type());
  604|      0|        case 'f':
  ------------------
  |  Branch (604:9): [True: 0, False: 0]
  ------------------
  605|      0|            return parse_false(p, std::true_type());
  606|      0|        case 'n':
  ------------------
  |  Branch (606:9): [True: 0, False: 0]
  ------------------
  607|      0|            return parse_null(p, std::true_type());
  608|      0|        case '"':
  ------------------
  |  Branch (608:9): [True: 0, False: 0]
  ------------------
  609|      0|            return parse_unescaped(p, std::true_type(), std::false_type(), allow_bad_utf8);
  610|      0|        case '[':
  ------------------
  |  Branch (610:9): [True: 0, False: 0]
  ------------------
  611|      0|            return parse_array(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  612|      0|        case '{':
  ------------------
  |  Branch (612:9): [True: 0, False: 0]
  ------------------
  613|      0|            return parse_object(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  614|      0|        case '/':
  ------------------
  |  Branch (614:9): [True: 0, False: 0]
  ------------------
  615|      0|            if(! allow_comments)
  ------------------
  |  Branch (615:16): [Folded - Ignored]
  ------------------
  616|      0|            {
  617|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  618|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  619|      0|                return fail(p, error::syntax, &loc);
  620|      0|            }
  621|      0|            p = parse_comment(p, stack_empty, std::false_type());
  622|       |            // KRYSTIAN NOTE: incomplete takes const_stream, we either
  623|       |            // can add an overload, change the existing one to take a pointer,
  624|       |            // or just leave it as is
  625|      0|            if(BOOST_JSON_UNLIKELY(p == sentinel()))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  626|      0|                return maybe_suspend(p, state::val2);
  627|       |            // intentional fallthrough
  628|      0|        case ' ':
  ------------------
  |  Branch (628:9): [True: 0, False: 0]
  ------------------
  629|      0|        case '\t':
  ------------------
  |  Branch (629:9): [True: 0, False: 0]
  ------------------
  630|      0|        case '\n':
  ------------------
  |  Branch (630:9): [True: 0, False: 0]
  ------------------
  631|      0|        case '\r':
  ------------------
  |  Branch (631:9): [True: 0, False: 0]
  ------------------
  632|      0|            p = detail::count_whitespace(p, end_);
  633|      0|            if(BOOST_JSON_UNLIKELY(p == end_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  634|      0|                return maybe_suspend(p, state::val1);
  635|      0|            goto loop;
  636|      0|        default:
  ------------------
  |  Branch (636:9): [True: 0, False: 0]
  ------------------
  637|      0|            {
  638|      0|                BOOST_STATIC_CONSTEXPR source_location loc
  639|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  640|      0|                return fail(p, error::syntax, &loc);
  641|      0|            }
  642|      0|        }
  643|      0|    }
  644|  3.73k|    return resume_value(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  645|  3.73k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12resume_valueILb0ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
  660|  3.73k|{
  661|  3.73k|    state st;
  662|  3.73k|    st_.peek(st);
  663|  3.73k|    switch(st)
  664|  3.73k|    {
  665|      0|    default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (665:5): [True: 0, False: 3.73k]
  ------------------
  666|     10|    case state::nul1: case state::nul2:
  ------------------
  |  Branch (666:5): [True: 9, False: 3.73k]
  |  Branch (666:23): [True: 1, False: 3.73k]
  ------------------
  667|     11|    case state::nul3:
  ------------------
  |  Branch (667:5): [True: 1, False: 3.73k]
  ------------------
  668|     11|        return parse_null(p, stack_empty);
  669|       |
  670|     10|    case state::tru1: case state::tru2:
  ------------------
  |  Branch (670:5): [True: 9, False: 3.73k]
  |  Branch (670:23): [True: 1, False: 3.73k]
  ------------------
  671|     11|    case state::tru3:
  ------------------
  |  Branch (671:5): [True: 1, False: 3.73k]
  ------------------
  672|     11|        return parse_true(p, stack_empty);
  673|       |
  674|     10|    case state::fal1: case state::fal2:
  ------------------
  |  Branch (674:5): [True: 9, False: 3.73k]
  |  Branch (674:23): [True: 1, False: 3.73k]
  ------------------
  675|     12|    case state::fal3: case state::fal4:
  ------------------
  |  Branch (675:5): [True: 1, False: 3.73k]
  |  Branch (675:23): [True: 1, False: 3.73k]
  ------------------
  676|     12|        return parse_false(p, stack_empty);
  677|       |
  678|     77|    case state::str1:
  ------------------
  |  Branch (678:5): [True: 77, False: 3.66k]
  ------------------
  679|     77|        return parse_unescaped(p, stack_empty, std::false_type(), allow_bad_utf8);
  680|       |
  681|    199|    case state::str2: case state::str3:
  ------------------
  |  Branch (681:5): [True: 165, False: 3.57k]
  |  Branch (681:23): [True: 34, False: 3.70k]
  ------------------
  682|    222|    case state::str4: case state::str5:
  ------------------
  |  Branch (682:5): [True: 12, False: 3.72k]
  |  Branch (682:23): [True: 11, False: 3.72k]
  ------------------
  683|    241|    case state::str6: case state::str7:
  ------------------
  |  Branch (683:5): [True: 9, False: 3.73k]
  |  Branch (683:23): [True: 10, False: 3.72k]
  ------------------
  684|    256|    case state::str8:
  ------------------
  |  Branch (684:5): [True: 15, False: 3.72k]
  ------------------
  685|    262|    case state::sur1: case state::sur2:
  ------------------
  |  Branch (685:5): [True: 5, False: 3.73k]
  |  Branch (685:23): [True: 1, False: 3.73k]
  ------------------
  686|    268|    case state::sur3: case state::sur4:
  ------------------
  |  Branch (686:5): [True: 1, False: 3.73k]
  |  Branch (686:23): [True: 5, False: 3.73k]
  ------------------
  687|    277|    case state::sur5: case state::sur6:
  ------------------
  |  Branch (687:5): [True: 4, False: 3.73k]
  |  Branch (687:23): [True: 5, False: 3.73k]
  ------------------
  688|    277|        return parse_escaped(p, 0, stack_empty, std::false_type(), allow_bad_utf8);
  689|       |
  690|     69|    case state::arr1: case state::arr2:
  ------------------
  |  Branch (690:5): [True: 52, False: 3.68k]
  |  Branch (690:23): [True: 17, False: 3.72k]
  ------------------
  691|    935|    case state::arr3: case state::arr4:
  ------------------
  |  Branch (691:5): [True: 720, False: 3.01k]
  |  Branch (691:23): [True: 146, False: 3.59k]
  ------------------
  692|    990|    case state::arr5: case state::arr6:
  ------------------
  |  Branch (692:5): [True: 51, False: 3.68k]
  |  Branch (692:23): [True: 4, False: 3.73k]
  ------------------
  693|    990|        return parse_array(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  694|       |
  695|     60|    case state::obj1: case state::obj2:
  ------------------
  |  Branch (695:5): [True: 51, False: 3.68k]
  |  Branch (695:23): [True: 9, False: 3.73k]
  ------------------
  696|    232|    case state::obj3: case state::obj4:
  ------------------
  |  Branch (696:5): [True: 110, False: 3.62k]
  |  Branch (696:23): [True: 62, False: 3.67k]
  ------------------
  697|    264|    case state::obj5: case state::obj6:
  ------------------
  |  Branch (697:5): [True: 5, False: 3.73k]
  |  Branch (697:23): [True: 27, False: 3.71k]
  ------------------
  698|    710|    case state::obj7: case state::obj8:
  ------------------
  |  Branch (698:5): [True: 412, False: 3.32k]
  |  Branch (698:23): [True: 34, False: 3.70k]
  ------------------
  699|    756|    case state::obj9: case state::obj10:
  ------------------
  |  Branch (699:5): [True: 37, False: 3.70k]
  |  Branch (699:23): [True: 9, False: 3.73k]
  ------------------
  700|    760|    case state::obj11:
  ------------------
  |  Branch (700:5): [True: 4, False: 3.73k]
  ------------------
  701|    760|        return parse_object(p, stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
  702|       |
  703|    396|    case state::num1: case state::num2:
  ------------------
  |  Branch (703:5): [True: 9, False: 3.73k]
  |  Branch (703:23): [True: 387, False: 3.35k]
  ------------------
  704|    423|    case state::num3: case state::num4:
  ------------------
  |  Branch (704:5): [True: 24, False: 3.71k]
  |  Branch (704:23): [True: 3, False: 3.73k]
  ------------------
  705|    487|    case state::num5: case state::num6:
  ------------------
  |  Branch (705:5): [True: 44, False: 3.69k]
  |  Branch (705:23): [True: 20, False: 3.71k]
  ------------------
  706|    984|    case state::num7: case state::num8:
  ------------------
  |  Branch (706:5): [True: 5, False: 3.73k]
  |  Branch (706:23): [True: 492, False: 3.24k]
  ------------------
  707|  1.04k|    case state::exp1: case state::exp2:
  ------------------
  |  Branch (707:5): [True: 37, False: 3.70k]
  |  Branch (707:23): [True: 24, False: 3.71k]
  ------------------
  708|  1.47k|    case state::exp3:
  ------------------
  |  Branch (708:5): [True: 432, False: 3.30k]
  ------------------
  709|  1.47k|        return parse_number(p, stack_empty, std::integral_constant<char, 0>());
  710|       |
  711|      0|    case state::com1: case state::com2:
  ------------------
  |  Branch (711:5): [True: 0, False: 3.73k]
  |  Branch (711:23): [True: 0, False: 3.73k]
  ------------------
  712|      0|    case state::com3: case state::com4:
  ------------------
  |  Branch (712:5): [True: 0, False: 3.73k]
  |  Branch (712:23): [True: 0, False: 3.73k]
  ------------------
  713|      0|        return parse_comment(p, stack_empty, std::false_type());
  714|       |
  715|       |    // KRYSTIAN NOTE: these are special cases
  716|     41|    case state::val1:
  ------------------
  |  Branch (716:5): [True: 41, False: 3.69k]
  ------------------
  717|     41|    {
  718|     41|        st_.pop(st);
  719|     41|        BOOST_ASSERT(st_.empty());
  ------------------
  |  |   60|     41|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  720|     41|        p = detail::count_whitespace(p, end_);
  721|     41|        if(BOOST_JSON_UNLIKELY(p == end_))
  ------------------
  |  |  179|     41|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 41, False: 0]
  |  |  ------------------
  ------------------
  722|     41|            return maybe_suspend(p, state::val1);
  723|      0|        return parse_value(p, std::true_type(), allow_comments, allow_trailing, allow_bad_utf8);
  724|     41|    }
  725|       |
  726|     83|    case state::val2:
  ------------------
  |  Branch (726:5): [True: 83, False: 3.65k]
  ------------------
  727|     83|    {
  728|     83|        st_.pop(st);
  729|     83|        p = parse_comment(p, stack_empty, std::false_type());
  730|     83|        if(BOOST_JSON_UNLIKELY(p == sentinel()))
  ------------------
  |  |  179|     83|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 83, False: 0]
  |  |  ------------------
  ------------------
  731|     83|            return maybe_suspend(p, state::val2);
  732|      0|        BOOST_ASSERT(st_.empty());
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  733|      0|        return parse_value(p, std::true_type(), std::true_type(), allow_trailing, allow_bad_utf8);
  734|     83|    }
  735|  3.73k|    }
  736|  3.73k|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE11parse_arrayILb0ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1881|    990|{
 1882|    990|    detail::const_stream_wrapper cs(p, end_);
 1883|    990|    std::size_t size;
 1884|    990|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1884:8): [Folded - Ignored]
  |  Branch (1884:25): [True: 990, False: 0]
  ------------------
 1885|    990|    {
 1886|       |        // resume
 1887|    990|        state st;
 1888|    990|        st_.pop(st);
 1889|    990|        st_.pop(size);
 1890|    990|        switch(st)
 1891|    990|        {
 1892|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1892:9): [True: 0, False: 990]
  ------------------
 1893|     52|        case state::arr1: goto do_arr1;
  ------------------
  |  Branch (1893:9): [True: 52, False: 938]
  ------------------
 1894|     17|        case state::arr2: goto do_arr2;
  ------------------
  |  Branch (1894:9): [True: 17, False: 973]
  ------------------
 1895|    720|        case state::arr3: goto do_arr3;
  ------------------
  |  Branch (1895:9): [True: 720, False: 270]
  ------------------
 1896|    146|        case state::arr4: goto do_arr4;
  ------------------
  |  Branch (1896:9): [True: 146, False: 844]
  ------------------
 1897|     51|        case state::arr5: goto do_arr5;
  ------------------
  |  Branch (1897:9): [True: 51, False: 939]
  ------------------
 1898|      4|        case state::arr6: goto do_arr6;
  ------------------
  |  Branch (1898:9): [True: 4, False: 986]
  ------------------
 1899|    990|        }
 1900|    990|    }
 1901|      0|    BOOST_ASSERT(*cs == '[');
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1902|      0|    size = 0;
 1903|      0|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1904|      0|    {
 1905|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1906|      0|        return fail(cs.begin(), error::too_deep, &loc);
 1907|      0|    }
 1908|      0|    --depth_;
 1909|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1910|      0|        ! h_.on_array_begin(ec_)))
 1911|      0|        return fail(cs.begin());
 1912|      0|    ++cs;
 1913|       |    // array:
 1914|       |    //     '[' *ws ']'
 1915|       |    //     '[' *ws value *ws *[ ',' *ws value *ws ] ']'
 1916|     52|do_arr1:
 1917|     52|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1918|     52|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     52|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 52, False: 0]
  |  |  ------------------
  ------------------
 1919|     52|        return maybe_suspend(cs.begin(), state::arr1, size);
 1920|      0|    if(BOOST_JSON_LIKELY(*cs != ']'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1921|      0|    {
 1922|      0|loop:
 1923|      0|        if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1923:12): [Folded - Ignored]
  |  Branch (1923:30): [True: 0, False: 0]
  ------------------
 1924|      0|        {
 1925|     17|do_arr2:
 1926|     17|            cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1927|     17|            if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|     17|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 17, False: 0]
  |  |  ------------------
  ------------------
 1928|     17|                return suspend_or_fail(state::arr2, size);
 1929|      0|            goto do_arr1;
 1930|     17|        }
 1931|      0|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1932|      0|            Handler::max_array_size))
 1933|      0|        {
 1934|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1935|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1936|      0|            return fail(cs.begin(), error::array_too_large, &loc);
 1937|      0|        }
 1938|    720|do_arr3:
 1939|       |        // array is not empty, value required
 1940|    720|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1941|    720|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    720|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 338, False: 382]
  |  |  ------------------
  ------------------
 1942|    338|            return suspend_or_fail(state::arr3, size);
 1943|    382|do_arr4:
 1944|    322|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1945|    322|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|    322|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 322, False: 0]
  |  |  ------------------
  ------------------
 1946|    322|            return maybe_suspend(cs.begin(), state::arr4, size);
 1947|      0|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1948|      0|        {
 1949|      0|            ++cs;
 1950|     51|do_arr5:
 1951|     51|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1952|     51|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     51|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 51, False: 0]
  |  |  ------------------
  ------------------
 1953|     51|                return maybe_suspend(cs.begin(), state::arr5, size);
 1954|       |            // loop for next element
 1955|      0|            if(! allow_trailing || *cs != ']')
  ------------------
  |  Branch (1955:16): [True: 0, False: 0]
  |  Branch (1955:36): [True: 0, False: 0]
  ------------------
 1956|      0|                goto loop;
 1957|      0|        }
 1958|      0|        else if(BOOST_JSON_UNLIKELY(*cs != ']'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1959|      0|        {
 1960|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1960:16): [Folded - Ignored]
  |  Branch (1960:34): [True: 0, False: 0]
  ------------------
 1961|      0|            {
 1962|      4|do_arr6:
 1963|      4|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1964|      4|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 0]
  |  |  ------------------
  ------------------
 1965|      4|                    return suspend_or_fail(state::arr6, size);
 1966|      0|                goto do_arr4;
 1967|      4|            }
 1968|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1969|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1970|      0|            return fail(cs.begin(), error::syntax, &loc);
 1971|      0|        }
 1972|       |        // got closing bracket; fall through
 1973|      0|    }
 1974|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1975|      0|        ! h_.on_array_end(size, ec_)))
 1976|      0|        return fail(cs.begin());
 1977|      0|    ++depth_;
 1978|      0|    ++cs;
 1979|      0|    return cs.begin();
 1980|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE12parse_objectILb0ELb1EEEPKcS7_NSt3__117integral_constantIbXT_EEENS9_IbXT0_EEEbb:
 1713|    760|{
 1714|    760|    detail::const_stream_wrapper cs(p, end_);
 1715|    760|    std::size_t size;
 1716|    760|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (1716:8): [Folded - Ignored]
  |  Branch (1716:25): [True: 760, False: 0]
  ------------------
 1717|    760|    {
 1718|       |        // resume
 1719|    760|        state st;
 1720|    760|        st_.pop(st);
 1721|    760|        st_.pop(size);
 1722|    760|        switch(st)
 1723|    760|        {
 1724|      0|        default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (1724:9): [True: 0, False: 760]
  ------------------
 1725|     51|        case state::obj1: goto do_obj1;
  ------------------
  |  Branch (1725:9): [True: 51, False: 709]
  ------------------
 1726|      9|        case state::obj2: goto do_obj2;
  ------------------
  |  Branch (1726:9): [True: 9, False: 751]
  ------------------
 1727|    110|        case state::obj3: goto do_obj3;
  ------------------
  |  Branch (1727:9): [True: 110, False: 650]
  ------------------
 1728|     62|        case state::obj4: goto do_obj4;
  ------------------
  |  Branch (1728:9): [True: 62, False: 698]
  ------------------
 1729|      5|        case state::obj5: goto do_obj5;
  ------------------
  |  Branch (1729:9): [True: 5, False: 755]
  ------------------
 1730|     27|        case state::obj6: goto do_obj6;
  ------------------
  |  Branch (1730:9): [True: 27, False: 733]
  ------------------
 1731|    412|        case state::obj7: goto do_obj7;
  ------------------
  |  Branch (1731:9): [True: 412, False: 348]
  ------------------
 1732|     34|        case state::obj8: goto do_obj8;
  ------------------
  |  Branch (1732:9): [True: 34, False: 726]
  ------------------
 1733|     37|        case state::obj9: goto do_obj9;
  ------------------
  |  Branch (1733:9): [True: 37, False: 723]
  ------------------
 1734|      9|        case state::obj10: goto do_obj10;
  ------------------
  |  Branch (1734:9): [True: 9, False: 751]
  ------------------
 1735|      4|        case state::obj11: goto do_obj11;
  ------------------
  |  Branch (1735:9): [True: 4, False: 756]
  ------------------
 1736|    760|        }
 1737|    760|    }
 1738|      0|    BOOST_ASSERT(*cs == '{');
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 1739|      0|    size = 0;
 1740|      0|    if(BOOST_JSON_UNLIKELY(! depth_))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1741|      0|    {
 1742|      0|        BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1743|      0|        return fail(cs.begin(), error::too_deep, &loc);
 1744|      0|    }
 1745|      0|    --depth_;
 1746|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1747|      0|        ! h_.on_object_begin(ec_)))
 1748|      0|        return fail(cs.begin());
 1749|      0|    ++cs;
 1750|       |    // object:
 1751|       |    //     '{' *ws '}'
 1752|       |    //     '{' *ws string *ws ':' *ws value *ws *[ ',' *ws string *ws ':' *ws value *ws ] '}'
 1753|     51|do_obj1:
 1754|     51|    cs = detail::count_whitespace(cs.begin(), cs.end());
 1755|     51|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     51|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 51, False: 0]
  |  |  ------------------
  ------------------
 1756|     51|        return maybe_suspend(cs.begin(), state::obj1, size);
 1757|      0|    if(BOOST_JSON_LIKELY(*cs != '}'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1758|      0|    {
 1759|      0|        if(BOOST_JSON_UNLIKELY(*cs != '\x22'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1760|      0|        {
 1761|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1761:16): [Folded - Ignored]
  |  Branch (1761:34): [True: 0, False: 0]
  ------------------
 1762|      0|            {
 1763|      9|do_obj2:
 1764|      9|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1765|      9|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      9|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 0]
  |  |  ------------------
  ------------------
 1766|      9|                    return suspend_or_fail(state::obj2, size);
 1767|      0|                goto do_obj1;
 1768|      9|            }
 1769|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1770|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1771|      0|            return fail(cs.begin(), error::syntax, &loc);
 1772|      0|        }
 1773|      0|loop:
 1774|      0|        if(BOOST_JSON_UNLIKELY(++size >
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1775|      0|            Handler::max_object_size))
 1776|      0|        {
 1777|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1778|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1779|      0|            return fail(cs.begin(), error::object_too_large, &loc);
 1780|      0|        }
 1781|    110|do_obj3:
 1782|    110|        cs = parse_string(cs.begin(), stack_empty, std::true_type(), allow_bad_utf8);
 1783|    110|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    110|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 110, False: 0]
  |  |  ------------------
  ------------------
 1784|    110|            return suspend_or_fail(state::obj3, size);
 1785|     62|do_obj4:
 1786|     62|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1787|     62|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     62|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 62, False: 0]
  |  |  ------------------
  ------------------
 1788|     62|            return maybe_suspend(cs.begin(), state::obj4, size);
 1789|      0|        if(BOOST_JSON_UNLIKELY(*cs != ':'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1790|      0|        {
 1791|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1791:16): [Folded - Ignored]
  |  Branch (1791:34): [True: 0, False: 0]
  ------------------
 1792|      0|            {
 1793|      5|do_obj5:
 1794|      5|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1795|      5|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      5|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5, False: 0]
  |  |  ------------------
  ------------------
 1796|      5|                    return suspend_or_fail(state::obj5, size);
 1797|      0|                goto do_obj4;
 1798|      5|            }
 1799|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1800|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1801|      0|            return fail(cs.begin(), error::syntax, &loc);
 1802|      0|        }
 1803|      0|        ++cs;
 1804|     27|do_obj6:
 1805|     27|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1806|     27|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     27|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 27, False: 0]
  |  |  ------------------
  ------------------
 1807|     27|            return maybe_suspend(cs.begin(), state::obj6, size);
 1808|    412|do_obj7:
 1809|    412|        cs = parse_value(cs.begin(), stack_empty, allow_comments, allow_trailing, allow_bad_utf8);
 1810|    412|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|    412|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 409, False: 3]
  |  |  ------------------
  ------------------
 1811|    409|            return suspend_or_fail(state::obj7, size);
 1812|     37|do_obj8:
 1813|     37|        cs = detail::count_whitespace(cs.begin(), cs.end());
 1814|     37|        if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     37|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 37, False: 0]
  |  |  ------------------
  ------------------
 1815|     37|            return maybe_suspend(cs.begin(), state::obj8, size);
 1816|      0|        if(BOOST_JSON_LIKELY(*cs == ','))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1817|      0|        {
 1818|      0|            ++cs;
 1819|     37|do_obj9:
 1820|     37|            cs = detail::count_whitespace(cs.begin(), cs.end());
 1821|     37|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     37|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 37, False: 0]
  |  |  ------------------
  ------------------
 1822|     37|                return maybe_suspend(cs.begin(), state::obj9, size);
 1823|       |
 1824|       |            // loop for next element
 1825|      0|            if(BOOST_JSON_LIKELY(*cs == '\x22'))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1826|      0|                goto loop;
 1827|      0|            if(! allow_trailing || *cs != '}')
  ------------------
  |  Branch (1827:16): [True: 0, False: 0]
  |  Branch (1827:36): [True: 0, False: 0]
  ------------------
 1828|      0|            {
 1829|      0|                if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1829:20): [Folded - Ignored]
  |  Branch (1829:38): [True: 0, False: 0]
  ------------------
 1830|      0|                {
 1831|      9|do_obj10:
 1832|      9|                    cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1833|      9|                    if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      9|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 9, False: 0]
  |  |  ------------------
  ------------------
 1834|      9|                        return suspend_or_fail(state::obj10, size);
 1835|      0|                    goto do_obj9;
 1836|      9|                }
 1837|      0|                BOOST_STATIC_CONSTEXPR source_location loc
 1838|      0|                    = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1839|      0|                return fail(cs.begin(), error::syntax, &loc);
 1840|      0|            }
 1841|      0|        }
 1842|      0|        else if(BOOST_JSON_UNLIKELY(*cs != '}'))
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1843|      0|        {
 1844|      0|            if(allow_comments && *cs == '/')
  ------------------
  |  Branch (1844:16): [Folded - Ignored]
  |  Branch (1844:34): [True: 0, False: 0]
  ------------------
 1845|      0|            {
 1846|      4|do_obj11:
 1847|      4|                cs = parse_comment(cs.begin(), stack_empty, std::false_type());
 1848|      4|                if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 0]
  |  |  ------------------
  ------------------
 1849|      4|                    return suspend_or_fail(state::obj11, size);
 1850|      0|                goto do_obj8;
 1851|      4|            }
 1852|      0|            BOOST_STATIC_CONSTEXPR source_location loc
 1853|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
 1854|      0|            return fail(cs.begin(), error::syntax, &loc);
 1855|      0|        }
 1856|       |        // got closing brace, fall through
 1857|      0|    }
 1858|      0|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1859|      0|        ! h_.on_object_end(size, ec_)))
 1860|      0|        return fail(cs.begin());
 1861|      0|    ++depth_;
 1862|      0|    ++cs;
 1863|      0|    return cs.begin();
 1864|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE13parse_commentILb0EEEPKcS7_NSt3__117integral_constantIbXT_EEEb:
  394|    149|{
  395|    149|    detail::const_stream_wrapper cs(p, end_);
  396|    149|    const char* start = cs.begin();
  397|    149|    std::size_t remain;
  398|    149|    if(! stack_empty && ! st_.empty())
  ------------------
  |  Branch (398:8): [Folded - Ignored]
  |  Branch (398:25): [True: 149, False: 0]
  ------------------
  399|    149|    {
  400|    149|        state st;
  401|    149|        st_.pop(st);
  402|    149|        switch(st)
  403|    149|        {
  404|      0|            default: BOOST_JSON_UNREACHABLE();
  ------------------
  |  |  189|      0|#  define BOOST_JSON_UNREACHABLE() __builtin_unreachable()
  ------------------
  |  Branch (404:13): [True: 0, False: 149]
  ------------------
  405|     81|            case state::com1: goto do_com1;
  ------------------
  |  Branch (405:13): [True: 81, False: 68]
  ------------------
  406|     31|            case state::com2: goto do_com2;
  ------------------
  |  Branch (406:13): [True: 31, False: 118]
  ------------------
  407|     33|            case state::com3: goto do_com3;
  ------------------
  |  Branch (407:13): [True: 33, False: 116]
  ------------------
  408|      4|            case state::com4: goto do_com4;
  ------------------
  |  Branch (408:13): [True: 4, False: 145]
  ------------------
  409|    149|        }
  410|    149|    }
  411|      0|    BOOST_ASSERT(*cs == '/');
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  412|      0|    ++cs;
  413|     81|do_com1:
  414|     81|    if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|     81|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 81, False: 0]
  |  |  ------------------
  ------------------
  415|     81|        return maybe_suspend(cs.begin(), state::com1);
  416|      0|    switch(*cs)
  417|      0|    {
  418|      0|    default:
  ------------------
  |  Branch (418:5): [True: 0, False: 0]
  ------------------
  419|      0|        {
  420|      0|            BOOST_STATIC_CONSTEXPR source_location loc
  421|      0|                = BOOST_CURRENT_LOCATION;
  ------------------
  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  ------------------
  422|      0|            return fail(cs.begin(), error::syntax, &loc);
  423|      0|        }
  424|      0|    case '/':
  ------------------
  |  Branch (424:5): [True: 0, False: 0]
  ------------------
  425|      0|        ++cs;
  426|     31|do_com2:
  427|       |        // KRYSTIAN TODO: this is a mess, we have to fix this
  428|     31|        remain = cs.remain();
  429|     31|        cs = remain ? static_cast<const char*>(
  ------------------
  |  Branch (429:14): [True: 0, False: 31]
  ------------------
  430|     31|            std::memchr(cs.begin(), '\n', remain)) : sentinel();
  431|     31|        if(! cs.begin())
  ------------------
  |  Branch (431:12): [True: 0, False: 31]
  ------------------
  432|      0|            cs = sentinel();
  433|     31|        if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|     31|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 31, False: 0]
  |  |  ------------------
  ------------------
  434|     31|        {
  435|       |            // if the doc does not terminate
  436|       |            // with a newline, treat it as the
  437|       |            // end of the comment
  438|     31|            if(terminal && ! more_)
  ------------------
  |  Branch (438:16): [True: 2, False: 29]
  |  Branch (438:28): [True: 2, False: 0]
  ------------------
  439|      2|            {
  440|      2|                if(BOOST_JSON_UNLIKELY(! h_.on_comment(
  ------------------
  |  |  179|      2|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  441|      2|                    {start, cs.remain(start)}, ec_)))
  442|      0|                    return fail(cs.end());
  443|      2|                return cs.end();
  444|      2|            }
  445|     29|            if(BOOST_JSON_UNLIKELY(! h_.on_comment_part(
  ------------------
  |  |  179|     29|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 29]
  |  |  ------------------
  ------------------
  446|     29|                {start, cs.remain(start)}, ec_)))
  447|      0|                return fail(cs.end());
  448|     29|            if(terminal)
  ------------------
  |  Branch (448:16): [True: 0, False: 29]
  ------------------
  449|      0|                return suspend(cs.end(), state::com2);
  450|     29|            return maybe_suspend(cs.end(), state::com2);
  451|     29|        }
  452|      0|        break;
  453|      0|    case '*':
  ------------------
  |  Branch (453:5): [True: 0, False: 0]
  ------------------
  454|      0|        do
  455|      0|        {
  456|      0|            ++cs;
  457|     33|do_com3:
  458|       |            // KRYSTIAN TODO: this is a mess, we have to fix this
  459|     33|            remain = cs.remain();
  460|     33|            cs = remain ? static_cast<const char*>(
  ------------------
  |  Branch (460:18): [True: 0, False: 33]
  ------------------
  461|     33|                std::memchr(cs.begin(), '*', remain)) : sentinel();
  462|     33|            if(! cs.begin())
  ------------------
  |  Branch (462:16): [True: 0, False: 33]
  ------------------
  463|      0|                cs = sentinel();
  464|       |            // stopped inside a c comment
  465|     33|            if(BOOST_JSON_UNLIKELY(incomplete(cs)))
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 33, False: 0]
  |  |  ------------------
  ------------------
  466|     33|            {
  467|     33|                if(BOOST_JSON_UNLIKELY(! h_.on_comment_part(
  ------------------
  |  |  179|     33|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 33]
  |  |  ------------------
  ------------------
  468|     33|                    {start, cs.remain(start)}, ec_)))
  469|      0|                    return fail(cs.end());
  470|     33|                return maybe_suspend(cs.end(), state::com3);
  471|     33|            }
  472|       |            // found a asterisk, check if the next char is a slash
  473|      0|            ++cs;
  474|      4|do_com4:
  475|      4|            if(BOOST_JSON_UNLIKELY(! cs))
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  476|      4|            {
  477|      4|                if(BOOST_JSON_UNLIKELY(! h_.on_comment_part(
  ------------------
  |  |  179|      4|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  478|      4|                    {start, cs.used(start)}, ec_)))
  479|      0|                    return fail(cs.begin());
  480|      4|                return maybe_suspend(cs.begin(), state::com4);
  481|      4|            }
  482|      4|        }
  483|      0|        while(*cs != '/');
  ------------------
  |  Branch (483:15): [True: 0, False: 0]
  ------------------
  484|      0|    }
  485|      0|    ++cs;
  486|      0|    if(BOOST_JSON_UNLIKELY(! h_.on_comment(
  ------------------
  |  |  179|      0|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  487|      0|        {start, cs.used(start)}, ec_)))
  488|      0|        return fail(cs.begin());
  489|      0|    return cs.begin();
  490|      0|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE8sentinelEv:
  220|  7.85M|{
  221|       |    // the "+1" ensures that the returned pointer is unique even if
  222|       |    // the given input buffer borders on this object
  223|  7.85M|    return reinterpret_cast<
  224|  7.85M|        const char*>(this) + 1;
  225|      0|    return nullptr;
  226|  7.85M|}
_ZN5boost4json12basic_parserINS0_6detail7handlerEE4failENS_6system10error_codeE:
 2677|    948|{
 2678|    948|    if(! ec)
  ------------------
  |  Branch (2678:8): [True: 0, False: 948]
  ------------------
 2679|      0|    {
 2680|       |        // assign an arbitrary
 2681|       |        // error code to prevent UB
 2682|      0|        BOOST_JSON_FAIL(ec_, error::incomplete);
  ------------------
  |  |   20|      0|    BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION; \
  |  |  ------------------
  |  |  |  |  170|      0|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  |  |  ------------------
  |  |   21|      0|    (ec).assign(e, &loc);
  ------------------
 2683|      0|    }
 2684|    948|    else
 2685|    948|    {
 2686|    948|        ec_ = ec;
 2687|    948|    }
 2688|    948|    done_ = false;
 2689|    948|}

_ZN5boost4json6detail15unchecked_arrayC2EPNS0_5valueEmRKNS0_11storage_ptrE:
   41|  14.1k|    {
   42|  14.1k|    }
_ZNK5boost4json6detail15unchecked_array7storageEv:
   55|  14.1k|    {
   56|  14.1k|        return sp_;
   57|  14.1k|    }
_ZNK5boost4json6detail15unchecked_array4sizeEv:
   61|  29.7k|    {
   62|  29.7k|        return size_;
   63|  29.7k|    }

_ZN5boost4json6detail6bufferILm4096EEC2Ev:
   28|  20.2k|    buffer() = default;
_ZNK5boost4json6detail6bufferILm4096EE8max_sizeEv:
   67|  28.0k|    {
   68|  28.0k|        return N;
   69|  28.0k|    }
_ZNK5boost4json6detail6bufferILm4096EE5emptyEv:
   32|  8.02k|    {
   33|  8.02k|        return size_ == 0;
   34|  8.02k|    }
_ZNK5boost4json6detail6bufferILm4096EE4sizeEv:
   55|  51.6k|    {
   56|  51.6k|        return size_;
   57|  51.6k|    }
_ZNK5boost4json6detail6bufferILm4096EE3getEv:
   38|  25.8k|    {
   39|  25.8k|        return {buf_, size_};
   40|  25.8k|    }
_ZN5boost4json6detail6bufferILm4096EE5clearEv:
   73|  7.24k|    {
   74|  7.24k|        size_ = 0;
   75|  7.24k|    }
_ZN5boost4json6detail6bufferILm4096EE9push_backEc:
   79|  21.4M|    {
   80|  21.4M|        BOOST_ASSERT(capacity() > 0);
  ------------------
  |  |   60|  21.4M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   81|  21.4M|        buf_[size_++] = ch;
   82|  21.4M|    }
_ZN5boost4json6detail6bufferILm4096EE11append_utf8Em:
   99|   768k|    {
  100|   768k|        auto dest = buf_ + size_;
  101|   768k|        if(cp < 0x80)
  ------------------
  |  Branch (101:12): [True: 221k, False: 547k]
  ------------------
  102|   221k|        {
  103|   221k|            BOOST_ASSERT(size_ <= N - 1);
  ------------------
  |  |   60|   221k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  104|   221k|            dest[0] = static_cast<char>(cp);
  105|   221k|            size_ += 1;
  106|   221k|            return;
  107|   221k|        }
  108|       |
  109|   547k|        if(cp < 0x800)
  ------------------
  |  Branch (109:12): [True: 180k, False: 366k]
  ------------------
  110|   180k|        {
  111|   180k|            BOOST_ASSERT(size_ <= N - 2);
  ------------------
  |  |   60|   180k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  112|   180k|            dest[0] = static_cast<char>( (cp >> 6)          | 0xc0);
  113|   180k|            dest[1] = static_cast<char>( (cp & 0x3f)        | 0x80);
  114|   180k|            size_ += 2;
  115|   180k|            return;
  116|   180k|        }
  117|       |
  118|   366k|        if(cp < 0x10000)
  ------------------
  |  Branch (118:12): [True: 349k, False: 17.4k]
  ------------------
  119|   349k|        {
  120|   349k|            BOOST_ASSERT(size_ <= N - 3);
  ------------------
  |  |   60|   349k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  121|   349k|            dest[0] = static_cast<char>( (cp >> 12)         | 0xe0);
  122|   349k|            dest[1] = static_cast<char>(((cp >> 6) & 0x3f)  | 0x80);
  123|   349k|            dest[2] = static_cast<char>( (cp       & 0x3f)  | 0x80);
  124|   349k|            size_ += 3;
  125|   349k|            return;
  126|   349k|        }
  127|       |
  128|  17.4k|        {
  129|  17.4k|            BOOST_ASSERT(size_ <= N - 4);
  ------------------
  |  |   60|  17.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  130|  17.4k|            dest[0] = static_cast<char>( (cp >> 18)         | 0xf0);
  131|  17.4k|            dest[1] = static_cast<char>(((cp >> 12) & 0x3f) | 0x80);
  132|  17.4k|            dest[2] = static_cast<char>(((cp >> 6)  & 0x3f) | 0x80);
  133|  17.4k|            dest[3] = static_cast<char>( (cp        & 0x3f) | 0x80);
  134|  17.4k|            size_ += 4;
  135|  17.4k|        }
  136|  17.4k|    }
_ZN5boost4json6detail6bufferILm4096EE6appendEPKcm:
   89|   275k|    {
   90|   275k|        BOOST_ASSERT(n <= N - size_);
  ------------------
  |  |   60|   275k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   91|   275k|        std::memcpy(buf_ + size_, s, n);
   92|   275k|        size_ += n;
   93|   275k|    }

_ZN5boost4json6detail8exchangeImiEET_RS3_T0_:
  286|  15.7M|{
  287|  15.7M|    T v = std::move(t);
  288|  15.7M|    t = std::move(u);
  289|  15.7M|    return v;
  290|  15.7M|}

_ZN5boost4json6detail16default_resource3getEv:
   48|   536k|    {
   49|       |    #ifdef BOOST_JSON_WEAK_CONSTINIT
   50|       |        static default_resource instance_;
   51|       |    #endif
   52|   536k|        return reinterpret_cast<memory_resource*>(
   53|   536k|            reinterpret_cast<std::uintptr_t*>(
   54|   536k|                &instance_));
   55|   536k|    }

_ZN5boost4json6detail6digestIPKcEEmT_S5_m:
   24|   172k|{
   25|   172k|#if BOOST_JSON_ARCH == 64
   26|   172k|    std::uint64_t const prime = 0x100000001B3ULL;
   27|   172k|    std::uint64_t hash  = 0xcbf29ce484222325ULL;
   28|       |#else
   29|       |    std::uint32_t const prime = 0x01000193UL;
   30|       |    std::uint32_t hash  = 0x811C9DC5UL;
   31|       |#endif
   32|   172k|    hash += salt;
   33|  5.77M|    for(; b != e; ++b)
  ------------------
  |  Branch (33:11): [True: 5.59M, False: 172k]
  ------------------
   34|  5.59M|        hash = (*b ^ hash) * prime;
   35|   172k|    return hash;
   36|   172k|}

_ZN5boost4json6detail15unchecked_array8relocateEPNS0_5valueE:
   31|  7.80k|{
   32|  7.80k|    if(size_ > 0)
  ------------------
  |  Branch (32:8): [True: 7.80k, False: 0]
  ------------------
   33|  7.80k|        std::memcpy(
   34|  7.80k|            static_cast<void*>(dest),
   35|  7.80k|            data_, size_ * sizeof(value));
   36|  7.80k|    data_ = nullptr;
   37|  7.80k|}
_ZN5boost4json6detail15unchecked_arrayD2Ev:
   19|  14.1k|{
   20|  14.1k|    if(! data_ ||
  ------------------
  |  Branch (20:8): [True: 7.80k, False: 6.36k]
  ------------------
   21|  14.1k|        sp_.is_not_shared_and_deallocate_is_trivial())
  ------------------
  |  Branch (21:9): [True: 479, False: 5.88k]
  ------------------
   22|  8.28k|        return;
   23|  5.88k|    for(unsigned long i = 0;
   24|  5.88k|        i < size_; ++i)
  ------------------
  |  Branch (24:9): [True: 0, False: 5.88k]
  ------------------
   25|      0|        data_[i].~value();
   26|  5.88k|}

_ZN5boost4json6detail16default_resource11do_allocateEmm:
   42|   268k|{
   43|   268k|    return ::operator new(n);
   44|   268k|}
_ZN5boost4json6detail16default_resource13do_deallocateEPvmm:
   52|   268k|{
   53|   268k|    ::operator delete(p);
   54|   268k|}

_ZN5boost4json6detail15throw_bad_allocERKNS_15source_locationE:
   26|    100|{
   27|    100|    throw_exception(
   28|    100|        std::bad_alloc(),
   29|    100|        loc);
   30|    100|}

_ZN5boost4json6detail13format_uint64EPcm:
   63|  1.63M|{
   64|  1.63M|    if(v < 10)
  ------------------
  |  Branch (64:8): [True: 1.53M, False: 100k]
  ------------------
   65|  1.53M|    {
   66|  1.53M|        *dest = static_cast<char>( '0' + v );
   67|  1.53M|        return 1;
   68|  1.53M|    }
   69|       |
   70|   100k|    char buffer[ 24 ];
   71|       |
   72|   100k|    char * p = buffer + 24;
   73|       |
   74|   228k|    while( v >= 1000 )
  ------------------
  |  Branch (74:12): [True: 128k, False: 100k]
  ------------------
   75|   128k|    {
   76|   128k|        p -= 4;
   77|   128k|        format_four_digits( p, v % 10000 );
   78|   128k|        v /= 10000;
   79|   128k|    }
   80|       |
   81|   100k|    if( v >= 10 )
  ------------------
  |  Branch (81:9): [True: 67.9k, False: 32.9k]
  ------------------
   82|  67.9k|    {
   83|  67.9k|        p -= 2;
   84|  67.9k|        format_two_digits( p, v % 100 );
   85|  67.9k|        v /= 100;
   86|  67.9k|    }
   87|       |
   88|   100k|    if( v )
  ------------------
  |  Branch (88:9): [True: 32.7k, False: 68.1k]
  ------------------
   89|  32.7k|    {
   90|  32.7k|        p -= 1;
   91|  32.7k|        format_digit( p, static_cast<unsigned>(v) );
   92|  32.7k|    }
   93|       |
   94|   100k|    unsigned const n = static_cast<unsigned>( buffer + 24 - p );
   95|   100k|    std::memcpy( dest, p, n );
   96|       |
   97|   100k|    return n;
   98|  1.63M|}
_ZN5boost4json6detail12format_int64EPcl:
  103|  1.62M|{
  104|  1.62M|    std::uint64_t ui = static_cast<
  105|  1.62M|        std::uint64_t>(i);
  106|  1.62M|    if(i >= 0)
  ------------------
  |  Branch (106:8): [True: 1.61M, False: 4.70k]
  ------------------
  107|  1.61M|        return format_uint64(dest, ui);
  108|  4.70k|    *dest++ = '-';
  109|  4.70k|    ui = ~ui + 1;
  110|  4.70k|    return 1 + format_uint64(dest, ui);
  111|  1.62M|}
_ZN5boost4json6detail13format_doubleEPcd:
  116|  4.91M|{
  117|  4.91M|    return static_cast<int>(
  118|  4.91M|        ryu::d2s_buffered_n(d, dest));
  119|  4.91M|}
_ZN5boost4json6detail18format_four_digitsEPcj:
   44|   128k|{
   45|   128k|    std::memcpy( dest + 2, digits_lut() + (v % 100) * 2, 2 );
   46|   128k|    std::memcpy( dest    , digits_lut() + (v / 100) * 2, 2 );
   47|   128k|}
_ZN5boost4json6detail10digits_lutEv:
   29|   323k|{
   30|   323k|    return
   31|   323k|        "00010203040506070809"
   32|   323k|        "10111213141516171819"
   33|   323k|        "20212223242526272829"
   34|   323k|        "30313233343536373839"
   35|   323k|        "40414243444546474849"
   36|   323k|        "50515253545556575859"
   37|   323k|        "60616263646566676869"
   38|   323k|        "70717273747576777879"
   39|   323k|        "80818283848586878889"
   40|   323k|        "90919293949596979899";
   41|   323k|}
_ZN5boost4json6detail17format_two_digitsEPcj:
   50|  67.9k|{
   51|  67.9k|    std::memcpy( dest, digits_lut() + v * 2, 2 );
   52|  67.9k|}
_ZN5boost4json6detail12format_digitEPcj:
   55|  32.7k|{
   56|  32.7k|    *dest = static_cast<char>( v + '0' );
   57|  32.7k|}

_ZN5boost4json6detail7handlerC2IJNS0_11storage_ptrERPhRmEEEDpOT_:
   24|  4.78k|{
   25|  4.78k|}
_ZN5boost4json6detail7handlerC2IJNS0_11storage_ptrEDniEEEDpOT_:
   24|  6.05k|{
   25|  6.05k|}
_ZN5boost4json6detail7handler17on_document_beginERNS_6system10error_codeE:
   31|  10.8k|{
   32|  10.8k|    return true;
   33|  10.8k|}
_ZN5boost4json6detail7handler14on_number_partENS_4core17basic_string_viewIcEERNS_6system10error_codeE:
  128|  3.21k|{
  129|  3.21k|    return true;
  130|  3.21k|}
_ZN5boost4json6detail7handler8on_int64ElNS_4core17basic_string_viewIcEERNS_6system10error_codeE:
  138|  2.48M|{
  139|  2.48M|    st.push_int64(i);
  140|  2.48M|    return true;
  141|  2.48M|}
_ZN5boost4json6detail7handler9on_uint64EmNS_4core17basic_string_viewIcEERNS_6system10error_codeE:
  149|  17.5k|{
  150|  17.5k|    st.push_uint64(u);
  151|  17.5k|    return true;
  152|  17.5k|}
_ZN5boost4json6detail7handler9on_doubleEdNS_4core17basic_string_viewIcEERNS_6system10error_codeE:
  160|  4.96M|{
  161|  4.96M|    st.push_double(d);
  162|  4.96M|    return true;
  163|  4.96M|}
_ZN5boost4json6detail7handler7on_boolEbRNS_6system10error_codeE:
  170|  19.4k|{
  171|  19.4k|    st.push_bool(b);
  172|  19.4k|    return true;
  173|  19.4k|}
_ZN5boost4json6detail7handler7on_nullERNS_6system10error_codeE:
  178|  11.7k|{
  179|  11.7k|    st.push_null();
  180|  11.7k|    return true;
  181|  11.7k|}
_ZN5boost4json6detail7handler14on_string_partENS_4core17basic_string_viewIcEEmRNS_6system10error_codeE:
  107|  19.7k|{
  108|  19.7k|    st.push_chars(s);
  109|  19.7k|    return true;
  110|  19.7k|}
_ZN5boost4json6detail7handler11on_key_partENS_4core17basic_string_viewIcEEmRNS_6system10error_codeE:
   85|  4.68k|{
   86|  4.68k|    st.push_chars(s);
   87|  4.68k|    return true;
   88|  4.68k|}
_ZN5boost4json6detail7handler6on_keyENS_4core17basic_string_viewIcEEmRNS_6system10error_codeE:
   96|   227k|{
   97|   227k|    st.push_key(s);
   98|   227k|    return true;
   99|   227k|}
_ZN5boost4json6detail7handler9on_stringENS_4core17basic_string_viewIcEEmRNS_6system10error_codeE:
  118|  32.7k|{
  119|  32.7k|    st.push_string(s);
  120|  32.7k|    return true;
  121|  32.7k|}
_ZN5boost4json6detail7handler14on_array_beginERNS_6system10error_codeE:
   65|  17.1k|{
   66|  17.1k|    return true;
   67|  17.1k|}
_ZN5boost4json6detail7handler12on_array_endEmRNS_6system10error_codeE:
   74|  14.1k|{
   75|  14.1k|    st.push_array(n);
   76|  14.1k|    return true;
   77|  14.1k|}
_ZN5boost4json6detail7handler15on_object_beginERNS_6system10error_codeE:
   47|  13.6k|{
   48|  13.6k|    return true;
   49|  13.6k|}
_ZN5boost4json6detail7handler13on_object_endEmRNS_6system10error_codeE:
   56|  11.1k|{
   57|  11.1k|    st.push_object(n);
   58|  11.1k|    return true;
   59|  11.1k|}
_ZN5boost4json6detail7handler10on_commentENS_4core17basic_string_viewIcEERNS_6system10error_codeE:
  196|  4.34k|{
  197|  4.34k|    return true;
  198|  4.34k|}
_ZN5boost4json6detail7handler15on_comment_partENS_4core17basic_string_viewIcEERNS_6system10error_codeE:
  188|    134|{
  189|    134|    return true;
  190|    134|}
_ZN5boost4json6detail7handler15on_document_endERNS_6system10error_codeE:
   39|  5.47k|{
   40|  5.47k|    return true;
   41|  5.47k|}

_ZN5boost4json6detail5stackD2Ev:
   21|  15.3k|{
   22|  15.3k|    if(base_ != buf_)
  ------------------
  |  Branch (22:8): [True: 7.27k, False: 8.07k]
  ------------------
   23|  7.27k|        sp_->deallocate(
   24|  7.27k|            base_, cap_);
   25|  15.3k|}
_ZN5boost4json6detail5stackC2ENS0_11storage_ptrEPhm:
   36|  4.52k|{
   37|  4.52k|}
_ZN5boost4json6detail5stack7reserveEm:
   42|  35.5k|{
   43|  35.5k|    if(cap_ >= n)
  ------------------
  |  Branch (43:8): [True: 26.4k, False: 9.07k]
  ------------------
   44|  26.4k|        return;
   45|  9.07k|    auto const base = static_cast<
   46|  9.07k|        unsigned char*>(sp_->allocate(n));
   47|  9.07k|    if(base_)
  ------------------
  |  Branch (47:8): [True: 1.85k, False: 7.21k]
  ------------------
   48|  1.85k|    {
   49|  1.85k|        if(size_ > 0)
  ------------------
  |  Branch (49:12): [True: 1.85k, False: 0]
  ------------------
   50|  1.85k|            std::memcpy(base, base_, size_);
   51|  1.85k|        if(base_ != buf_)
  ------------------
  |  Branch (51:12): [True: 1.79k, False: 61]
  ------------------
   52|  1.79k|            sp_->deallocate(base_, cap_);
   53|  1.85k|    }
   54|  9.07k|    base_ = base;
   55|  9.07k|    cap_ = n;
   56|  9.07k|}

_ZN5boost4json6detail11string_implC2Ev:
   36|  32.7k|{
   37|  32.7k|    s_.k = short_string_;
   38|  32.7k|    s_.buf[sbo_chars_] =
   39|  32.7k|        static_cast<char>(
   40|  32.7k|            sbo_chars_);
   41|  32.7k|    s_.buf[0] = 0;
   42|  32.7k|}
_ZN5boost4json6detail11string_implC2EmRKNS0_11storage_ptrE:
   48|  15.1k|{
   49|  15.1k|    if(size <= sbo_chars_)
  ------------------
  |  Branch (49:8): [True: 0, False: 15.1k]
  ------------------
   50|      0|    {
   51|      0|        s_.k = short_string_;
   52|      0|        s_.buf[sbo_chars_] =
   53|      0|            static_cast<char>(
   54|      0|                sbo_chars_ - size);
   55|      0|        s_.buf[size] = 0;
   56|      0|    }
   57|  15.1k|    else
   58|  15.1k|    {
   59|  15.1k|        s_.k = kind::string;
   60|  15.1k|        auto const n = growth(
   61|  15.1k|            size, sbo_chars_ + 1);
   62|  15.1k|        p_.t = ::new(sp->allocate(
   63|  15.1k|            sizeof(table) +
   64|  15.1k|                n + 1,
   65|  15.1k|            alignof(table))) table{
   66|  15.1k|                static_cast<
   67|  15.1k|                    std::uint32_t>(size),
   68|  15.1k|                static_cast<
   69|  15.1k|                    std::uint32_t>(n)};
   70|  15.1k|        data()[n] = 0;
   71|  15.1k|    }
   72|  15.1k|}
_ZN5boost4json6detail11string_implC2ENS1_5key_tENS_4core17basic_string_viewIcEERKNS0_11storage_ptrE:
   80|   223k|{
   81|   223k|    BOOST_ASSERT(
  ------------------
  |  |   60|   223k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   82|   223k|        s.size() <= max_size());
   83|   223k|    k_.k = key_string_;
   84|   223k|    k_.n = static_cast<
   85|   223k|        std::uint32_t>(s.size());
   86|   223k|    k_.s = reinterpret_cast<char*>(
   87|   223k|        sp->allocate(s.size() + 1,
   88|   223k|            alignof(char)));
   89|   223k|    k_.s[s.size()] = 0; // null term
   90|   223k|    std::memcpy(&k_.s[0],
   91|   223k|        s.data(), s.size());
   92|   223k|}
_ZN5boost4json6detail11string_implC2ENS1_5key_tENS_4core17basic_string_viewIcEES6_RKNS0_11storage_ptrE:
  101|  3.41k|{
  102|  3.41k|    auto len = s1.size() + s2.size();
  103|  3.41k|    BOOST_ASSERT(len <= max_size());
  ------------------
  |  |   60|  3.41k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  104|  3.41k|    k_.k = key_string_;
  105|  3.41k|    k_.n = static_cast<
  106|  3.41k|        std::uint32_t>(len);
  107|  3.41k|    k_.s = reinterpret_cast<char*>(
  108|  3.41k|        sp->allocate(len + 1,
  109|  3.41k|            alignof(char)));
  110|  3.41k|    k_.s[len] = 0; // null term
  111|  3.41k|    std::memcpy(&k_.s[0],
  112|  3.41k|        s1.data(), s1.size());
  113|  3.41k|    std::memcpy(&k_.s[s1.size()],
  114|  3.41k|        s2.data(), s2.size());
  115|  3.41k|}
_ZN5boost4json6detail11string_impl6growthEmm:
  122|  30.2k|{
  123|  30.2k|    if(new_size > max_size())
  ------------------
  |  Branch (123:8): [True: 0, False: 30.2k]
  ------------------
  124|      0|        detail::throw_length_error( "string too large" );
  125|       |    // growth factor 2
  126|  30.2k|    if( capacity >
  ------------------
  |  Branch (126:9): [True: 0, False: 30.2k]
  ------------------
  127|  30.2k|        max_size() - capacity)
  128|      0|        return static_cast<
  129|      0|            std::uint32_t>(max_size()); // overflow
  130|  30.2k|    return static_cast<std::uint32_t>(
  131|  30.2k|        (std::max)(capacity * 2, new_size));
  132|  30.2k|}
_ZN5boost4json6detail11string_impl6assignEmRKNS0_11storage_ptrE:
  139|  19.3k|{
  140|  19.3k|    if(new_size > capacity())
  ------------------
  |  Branch (140:8): [True: 2.32k, False: 16.9k]
  ------------------
  141|  2.32k|    {
  142|  2.32k|        string_impl tmp(growth(
  143|  2.32k|            new_size,
  144|  2.32k|            capacity()), sp);
  145|  2.32k|        destroy(sp);
  146|  2.32k|        *this = tmp;
  147|  2.32k|    }
  148|  19.3k|    term(new_size);
  149|  19.3k|    return data();
  150|  19.3k|}

_ZN5boost4json6detail16unchecked_objectC2EPNS0_5valueEmRKNS0_11storage_ptrE:
   46|  11.1k|    {
   47|  11.1k|    }
_ZNK5boost4json6detail16unchecked_object7storageEv:
   60|  11.1k|    {
   61|  11.1k|        return sp_;
   62|  11.1k|    }
_ZNK5boost4json6detail16unchecked_object4sizeEv:
   66|  27.7k|    {
   67|  27.7k|        return size_;
   68|  27.7k|    }
_ZN5boost4json6detail16unchecked_object7releaseEv:
   72|  8.30k|    {
   73|  8.30k|        auto const data = data_;
   74|  8.30k|        data_ = nullptr;
   75|  8.30k|        return data;
   76|  8.30k|    }

_ZN5boost4json6detail3ryu6detail14double_to_bitsEd:
  107|  4.91M|inline uint64_t double_to_bits(const double d) {
  108|  4.91M|  uint64_t bits = 0;
  109|  4.91M|  memcpy(&bits, &d, sizeof(double));
  110|  4.91M|  return bits;
  111|  4.91M|}
_ZN5boost4json6detail3ryu6detail16copy_special_strEPcbbb:
   85|  45.6k|inline int copy_special_str(char * const result, const bool sign, const bool exponent, const bool mantissa) {
   86|  45.6k|  if (mantissa) {
  ------------------
  |  Branch (86:7): [True: 464, False: 45.1k]
  ------------------
   87|    464|    memcpy(result, "NaN", 3);
   88|    464|    return 3;
   89|    464|  }
   90|  45.1k|  if (sign) {
  ------------------
  |  Branch (90:7): [True: 1.19k, False: 43.9k]
  ------------------
   91|  1.19k|    result[0] = '-';
   92|  1.19k|  }
   93|  45.1k|  if (exponent) {
  ------------------
  |  Branch (93:7): [True: 39.9k, False: 5.17k]
  ------------------
   94|  39.9k|    memcpy(result + sign, "Infinity", 8);
   95|  39.9k|    return sign + 8;
   96|  39.9k|  }
   97|  5.17k|  memcpy(result + sign, "0E0", 3);
   98|  5.17k|  return sign + 3;
   99|  45.1k|}
_ZN5boost4json6detail3ryu6detail9log10Pow2Ei:
   70|  4.76M|inline uint32_t log10Pow2(const int32_t e) {
   71|       |  // The first value this approximation fails for is 2^1651 which is just greater than 10^297.
   72|  4.76M|  BOOST_ASSERT(e >= 0);
  ------------------
  |  |   60|  4.76M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   73|  4.76M|  BOOST_ASSERT(e <= 1650);
  ------------------
  |  |   60|  4.76M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   74|  4.76M|  return (((uint32_t) e) * 78913) >> 18;
   75|  4.76M|}
_ZN5boost4json6detail3ryu6detail8pow5bitsEi:
   60|  4.83M|inline int32_t pow5bits(const int32_t e) {
   61|       |  // This approximation works up to the point that the multiplication overflows at e = 3529.
   62|       |  // If the multiplication were done in 64 bits, it would fail at 5^4004 which is just greater
   63|       |  // than 2^9297.
   64|  4.83M|  BOOST_ASSERT(e >= 0);
  ------------------
  |  |   60|  4.83M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   65|  4.83M|  BOOST_ASSERT(e <= 3528);
  ------------------
  |  |   60|  4.83M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   66|  4.83M|  return (int32_t) (((((uint32_t) e) * 1217359) >> 19) + 1);
   67|  4.83M|}
_ZN5boost4json6detail3ryu6detail9log10Pow5Ei:
   78|  68.6k|inline uint32_t log10Pow5(const int32_t e) {
   79|       |  // The first value this approximation fails for is 5^2621 which is just greater than 10^1832.
   80|  68.6k|  BOOST_ASSERT(e >= 0);
  ------------------
  |  |   60|  68.6k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   81|  68.6k|  BOOST_ASSERT(e <= 2620);
  ------------------
  |  |   60|  68.6k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   82|  68.6k|  return (((uint32_t) e) * 732923) >> 20;
   83|  68.6k|}

_ZN5boost4json6detail3ryu21DOUBLE_POW5_INV_SPLITEv:
   37|  4.76M|{
   38|  4.76M|    static constexpr std::uint64_t arr[292][2] = {
   39|  4.76M|    {                    1u, 288230376151711744u }, {  3689348814741910324u, 230584300921369395u },
   40|  4.76M|    {  2951479051793528259u, 184467440737095516u }, { 17118578500402463900u, 147573952589676412u },
   41|  4.76M|    { 12632330341676300947u, 236118324143482260u }, { 10105864273341040758u, 188894659314785808u },
   42|  4.76M|    { 15463389048156653253u, 151115727451828646u }, { 17362724847566824558u, 241785163922925834u },
   43|  4.76M|    { 17579528692795369969u, 193428131138340667u }, {  6684925324752475329u, 154742504910672534u },
   44|  4.76M|    { 18074578149087781173u, 247588007857076054u }, { 18149011334012135262u, 198070406285660843u },
   45|  4.76M|    {  3451162622983977240u, 158456325028528675u }, {  5521860196774363583u, 253530120045645880u },
   46|  4.76M|    {  4417488157419490867u, 202824096036516704u }, {  7223339340677503017u, 162259276829213363u },
   47|  4.76M|    {  7867994130342094503u, 259614842926741381u }, {  2605046489531765280u, 207691874341393105u },
   48|  4.76M|    {  2084037191625412224u, 166153499473114484u }, { 10713157136084480204u, 265845599156983174u },
   49|  4.76M|    { 12259874523609494487u, 212676479325586539u }, { 13497248433629505913u, 170141183460469231u },
   50|  4.76M|    { 14216899864323388813u, 272225893536750770u }, { 11373519891458711051u, 217780714829400616u },
   51|  4.76M|    {  5409467098425058518u, 174224571863520493u }, {  4965798542738183305u, 278759314981632789u },
   52|  4.76M|    {  7661987648932456967u, 223007451985306231u }, {  2440241304404055250u, 178405961588244985u },
   53|  4.76M|    {  3904386087046488400u, 285449538541191976u }, { 17880904128604832013u, 228359630832953580u },
   54|  4.76M|    { 14304723302883865611u, 182687704666362864u }, { 15133127457049002812u, 146150163733090291u },
   55|  4.76M|    { 16834306301794583852u, 233840261972944466u }, {  9778096226693756759u, 187072209578355573u },
   56|  4.76M|    { 15201174610838826053u, 149657767662684458u }, {  2185786488890659746u, 239452428260295134u },
   57|  4.76M|    {  5437978005854438120u, 191561942608236107u }, { 15418428848909281466u, 153249554086588885u },
   58|  4.76M|    {  6222742084545298729u, 245199286538542217u }, { 16046240111861969953u, 196159429230833773u },
   59|  4.76M|    {  1768945645263844993u, 156927543384667019u }, { 10209010661905972635u, 251084069415467230u },
   60|  4.76M|    {  8167208529524778108u, 200867255532373784u }, { 10223115638361732810u, 160693804425899027u },
   61|  4.76M|    {  1599589762411131202u, 257110087081438444u }, {  4969020624670815285u, 205688069665150755u },
   62|  4.76M|    {  3975216499736652228u, 164550455732120604u }, { 13739044029062464211u, 263280729171392966u },
   63|  4.76M|    {  7301886408508061046u, 210624583337114373u }, { 13220206756290269483u, 168499666669691498u },
   64|  4.76M|    { 17462981995322520850u, 269599466671506397u }, {  6591687966774196033u, 215679573337205118u },
   65|  4.76M|    { 12652048002903177473u, 172543658669764094u }, {  9175230360419352987u, 276069853871622551u },
   66|  4.76M|    {  3650835473593572067u, 220855883097298041u }, { 17678063637842498946u, 176684706477838432u },
   67|  4.76M|    { 13527506561580357021u, 282695530364541492u }, {  3443307619780464970u, 226156424291633194u },
   68|  4.76M|    {  6443994910566282300u, 180925139433306555u }, {  5155195928453025840u, 144740111546645244u },
   69|  4.76M|    { 15627011115008661990u, 231584178474632390u }, { 12501608892006929592u, 185267342779705912u },
   70|  4.76M|    {  2622589484121723027u, 148213874223764730u }, {  4196143174594756843u, 237142198758023568u },
   71|  4.76M|    { 10735612169159626121u, 189713759006418854u }, { 12277838550069611220u, 151771007205135083u },
   72|  4.76M|    { 15955192865369467629u, 242833611528216133u }, {  1696107848069843133u, 194266889222572907u },
   73|  4.76M|    { 12424932722681605476u, 155413511378058325u }, {  1433148282581017146u, 248661618204893321u },
   74|  4.76M|    { 15903913885032455010u, 198929294563914656u }, {  9033782293284053685u, 159143435651131725u },
   75|  4.76M|    { 14454051669254485895u, 254629497041810760u }, { 11563241335403588716u, 203703597633448608u },
   76|  4.76M|    { 16629290697806691620u, 162962878106758886u }, {   781423413297334329u, 260740604970814219u },
   77|  4.76M|    {  4314487545379777786u, 208592483976651375u }, {  3451590036303822229u, 166873987181321100u },
   78|  4.76M|    {  5522544058086115566u, 266998379490113760u }, {  4418035246468892453u, 213598703592091008u },
   79|  4.76M|    { 10913125826658934609u, 170878962873672806u }, { 10082303693170474728u, 273406340597876490u },
   80|  4.76M|    {  8065842954536379782u, 218725072478301192u }, { 17520720807854834795u, 174980057982640953u },
   81|  4.76M|    {  5897060404116273733u, 279968092772225526u }, {  1028299508551108663u, 223974474217780421u },
   82|  4.76M|    { 15580034865808528224u, 179179579374224336u }, { 17549358155809824511u, 286687326998758938u },
   83|  4.76M|    {  2971440080422128639u, 229349861599007151u }, { 17134547323305344204u, 183479889279205720u },
   84|  4.76M|    { 13707637858644275364u, 146783911423364576u }, { 14553522944347019935u, 234854258277383322u },
   85|  4.76M|    {  4264120725993795302u, 187883406621906658u }, { 10789994210278856888u, 150306725297525326u },
   86|  4.76M|    {  9885293106962350374u, 240490760476040522u }, {   529536856086059653u, 192392608380832418u },
   87|  4.76M|    {  7802327114352668369u, 153914086704665934u }, {  1415676938738538420u, 246262538727465495u },
   88|  4.76M|    {  1132541550990830736u, 197010030981972396u }, { 15663428499760305882u, 157608024785577916u },
   89|  4.76M|    { 17682787970132668764u, 252172839656924666u }, { 10456881561364224688u, 201738271725539733u },
   90|  4.76M|    { 15744202878575200397u, 161390617380431786u }, { 17812026976236499989u, 258224987808690858u },
   91|  4.76M|    {  3181575136763469022u, 206579990246952687u }, { 13613306553636506187u, 165263992197562149u },
   92|  4.76M|    { 10713244041592678929u, 264422387516099439u }, { 12259944048016053467u, 211537910012879551u },
   93|  4.76M|    {  6118606423670932450u, 169230328010303641u }, {  2411072648389671274u, 270768524816485826u },
   94|  4.76M|    { 16686253377679378312u, 216614819853188660u }, { 13349002702143502650u, 173291855882550928u },
   95|  4.76M|    { 17669055508687693916u, 277266969412081485u }, { 14135244406950155133u, 221813575529665188u },
   96|  4.76M|    {   240149081334393137u, 177450860423732151u }, { 11452284974360759988u, 283921376677971441u },
   97|  4.76M|    {  5472479164746697667u, 227137101342377153u }, { 11756680961281178780u, 181709681073901722u },
   98|  4.76M|    {  2026647139541122378u, 145367744859121378u }, { 18000030682233437097u, 232588391774594204u },
   99|  4.76M|    { 18089373360528660001u, 186070713419675363u }, {  3403452244197197031u, 148856570735740291u },
  100|  4.76M|    { 16513570034941246220u, 238170513177184465u }, { 13210856027952996976u, 190536410541747572u },
  101|  4.76M|    {  3189987192878576934u, 152429128433398058u }, {  1414630693863812771u, 243886605493436893u },
  102|  4.76M|    {  8510402184574870864u, 195109284394749514u }, { 10497670562401807014u, 156087427515799611u },
  103|  4.76M|    {  9417575270359070576u, 249739884025279378u }, { 14912757845771077107u, 199791907220223502u },
  104|  4.76M|    {  4551508647133041040u, 159833525776178802u }, { 10971762650154775986u, 255733641241886083u },
  105|  4.76M|    { 16156107749607641435u, 204586912993508866u }, {  9235537384944202825u, 163669530394807093u },
  106|  4.76M|    { 11087511001168814197u, 261871248631691349u }, { 12559357615676961681u, 209496998905353079u },
  107|  4.76M|    { 13736834907283479668u, 167597599124282463u }, { 18289587036911657145u, 268156158598851941u },
  108|  4.76M|    { 10942320814787415393u, 214524926879081553u }, { 16132554281313752961u, 171619941503265242u },
  109|  4.76M|    { 11054691591134363444u, 274591906405224388u }, { 16222450902391311402u, 219673525124179510u },
  110|  4.76M|    { 12977960721913049122u, 175738820099343608u }, { 17075388340318968271u, 281182112158949773u },
  111|  4.76M|    {  2592264228029443648u, 224945689727159819u }, {  5763160197165465241u, 179956551781727855u },
  112|  4.76M|    {  9221056315464744386u, 287930482850764568u }, { 14755542681855616155u, 230344386280611654u },
  113|  4.76M|    { 15493782960226403247u, 184275509024489323u }, {  1326979923955391628u, 147420407219591459u },
  114|  4.76M|    {  9501865507812447252u, 235872651551346334u }, { 11290841220991868125u, 188698121241077067u },
  115|  4.76M|    {  1653975347309673853u, 150958496992861654u }, { 10025058185179298811u, 241533595188578646u },
  116|  4.76M|    {  4330697733401528726u, 193226876150862917u }, { 14532604630946953951u, 154581500920690333u },
  117|  4.76M|    {  1116074521063664381u, 247330401473104534u }, {  4582208431592841828u, 197864321178483627u },
  118|  4.76M|    { 14733813189500004432u, 158291456942786901u }, { 16195403473716186445u, 253266331108459042u },
  119|  4.76M|    {  5577625149489128510u, 202613064886767234u }, {  8151448934333213131u, 162090451909413787u },
  120|  4.76M|    { 16731667109675051333u, 259344723055062059u }, { 17074682502481951390u, 207475778444049647u },
  121|  4.76M|    {  6281048372501740465u, 165980622755239718u }, {  6360328581260874421u, 265568996408383549u },
  122|  4.76M|    {  8777611679750609860u, 212455197126706839u }, { 10711438158542398211u, 169964157701365471u },
  123|  4.76M|    {  9759603424184016492u, 271942652322184754u }, { 11497031554089123517u, 217554121857747803u },
  124|  4.76M|    { 16576322872755119460u, 174043297486198242u }, { 11764721337440549842u, 278469275977917188u },
  125|  4.76M|    { 16790474699436260520u, 222775420782333750u }, { 13432379759549008416u, 178220336625867000u },
  126|  4.76M|    {  3045063541568861850u, 285152538601387201u }, { 17193446092222730773u, 228122030881109760u },
  127|  4.76M|    { 13754756873778184618u, 182497624704887808u }, { 18382503128506368341u, 145998099763910246u },
  128|  4.76M|    {  3586563302416817083u, 233596959622256395u }, {  2869250641933453667u, 186877567697805116u },
  129|  4.76M|    { 17052795772514404226u, 149502054158244092u }, { 12527077977055405469u, 239203286653190548u },
  130|  4.76M|    { 17400360011128145022u, 191362629322552438u }, {  2852241564676785048u, 153090103458041951u },
  131|  4.76M|    { 15631632947708587046u, 244944165532867121u }, {  8815957543424959314u, 195955332426293697u },
  132|  4.76M|    { 18120812478965698421u, 156764265941034957u }, { 14235904707377476180u, 250822825505655932u },
  133|  4.76M|    {  4010026136418160298u, 200658260404524746u }, { 17965416168102169531u, 160526608323619796u },
  134|  4.76M|    {  2919224165770098987u, 256842573317791675u }, {  2335379332616079190u, 205474058654233340u },
  135|  4.76M|    {  1868303466092863352u, 164379246923386672u }, {  6678634360490491686u, 263006795077418675u },
  136|  4.76M|    {  5342907488392393349u, 210405436061934940u }, {  4274325990713914679u, 168324348849547952u },
  137|  4.76M|    { 10528270399884173809u, 269318958159276723u }, { 15801313949391159694u, 215455166527421378u },
  138|  4.76M|    {  1573004715287196786u, 172364133221937103u }, { 17274202803427156150u, 275782613155099364u },
  139|  4.76M|    { 17508711057483635243u, 220626090524079491u }, { 10317620031244997871u, 176500872419263593u },
  140|  4.76M|    { 12818843235250086271u, 282401395870821749u }, { 13944423402941979340u, 225921116696657399u },
  141|  4.76M|    { 14844887537095493795u, 180736893357325919u }, { 15565258844418305359u, 144589514685860735u },
  142|  4.76M|    {  6457670077359736959u, 231343223497377177u }, { 16234182506113520537u, 185074578797901741u },
  143|  4.76M|    {  9297997190148906106u, 148059663038321393u }, { 11187446689496339446u, 236895460861314229u },
  144|  4.76M|    { 12639306166338981880u, 189516368689051383u }, { 17490142562555006151u, 151613094951241106u },
  145|  4.76M|    {  2158786396894637579u, 242580951921985771u }, { 16484424376483351356u, 194064761537588616u },
  146|  4.76M|    {  9498190686444770762u, 155251809230070893u }, { 11507756283569722895u, 248402894768113429u },
  147|  4.76M|    { 12895553841597688639u, 198722315814490743u }, { 17695140702761971558u, 158977852651592594u },
  148|  4.76M|    { 17244178680193423523u, 254364564242548151u }, { 10105994129412828495u, 203491651394038521u },
  149|  4.76M|    {  4395446488788352473u, 162793321115230817u }, { 10722063196803274280u, 260469313784369307u },
  150|  4.76M|    {  1198952927958798777u, 208375451027495446u }, { 15716557601334680315u, 166700360821996356u },
  151|  4.76M|    { 17767794532651667857u, 266720577315194170u }, { 14214235626121334286u, 213376461852155336u },
  152|  4.76M|    {  7682039686155157106u, 170701169481724269u }, {  1223217053622520399u, 273121871170758831u },
  153|  4.76M|    { 15735968901865657612u, 218497496936607064u }, { 16278123936234436413u, 174797997549285651u },
  154|  4.76M|    {   219556594781725998u, 279676796078857043u }, {  7554342905309201445u, 223741436863085634u },
  155|  4.76M|    {  9732823138989271479u, 178993149490468507u }, {   815121763415193074u, 286389039184749612u },
  156|  4.76M|    { 11720143854957885429u, 229111231347799689u }, { 13065463898708218666u, 183288985078239751u },
  157|  4.76M|    {  6763022304224664610u, 146631188062591801u }, {  3442138057275642729u, 234609900900146882u },
  158|  4.76M|    { 13821756890046245153u, 187687920720117505u }, { 11057405512036996122u, 150150336576094004u },
  159|  4.76M|    {  6623802375033462826u, 240240538521750407u }, { 16367088344252501231u, 192192430817400325u },
  160|  4.76M|    { 13093670675402000985u, 153753944653920260u }, {  2503129006933649959u, 246006311446272417u },
  161|  4.76M|    { 13070549649772650937u, 196805049157017933u }, { 17835137349301941396u, 157444039325614346u },
  162|  4.76M|    {  2710778055689733971u, 251910462920982955u }, {  2168622444551787177u, 201528370336786364u },
  163|  4.76M|    {  5424246770383340065u, 161222696269429091u }, {  1300097203129523457u, 257956314031086546u },
  164|  4.76M|    { 15797473021471260058u, 206365051224869236u }, {  8948629602435097724u, 165092040979895389u },
  165|  4.76M|    {  3249760919670425388u, 264147265567832623u }, {  9978506365220160957u, 211317812454266098u },
  166|  4.76M|    { 15361502721659949412u, 169054249963412878u }, {  2442311466204457120u, 270486799941460606u },
  167|  4.76M|    { 16711244431931206989u, 216389439953168484u }, { 17058344360286875914u, 173111551962534787u },
  168|  4.76M|    { 12535955717491360170u, 276978483140055660u }, { 10028764573993088136u, 221582786512044528u },
  169|  4.76M|    { 15401709288678291155u, 177266229209635622u }, {  9885339602917624555u, 283625966735416996u },
  170|  4.76M|    {  4218922867592189321u, 226900773388333597u }, { 14443184738299482427u, 181520618710666877u },
  171|  4.76M|    {  4175850161155765295u, 145216494968533502u }, { 10370709072591134795u, 232346391949653603u },
  172|  4.76M|    { 15675264887556728482u, 185877113559722882u }, {  5161514280561562140u, 148701690847778306u },
  173|  4.76M|    {   879725219414678777u, 237922705356445290u }, {   703780175531743021u, 190338164285156232u },
  174|  4.76M|    { 11631070584651125387u, 152270531428124985u }, {   162968861732249003u, 243632850284999977u },
  175|  4.76M|    { 11198421533611530172u, 194906280227999981u }, {  5269388412147313814u, 155925024182399985u },
  176|  4.76M|    {  8431021459435702103u, 249480038691839976u }, {  3055468352806651359u, 199584030953471981u },
  177|  4.76M|    { 17201769941212962380u, 159667224762777584u }, { 16454785461715008838u, 255467559620444135u },
  178|  4.76M|    { 13163828369372007071u, 204374047696355308u }, { 17909760324981426303u, 163499238157084246u },
  179|  4.76M|    {  2830174816776909822u, 261598781051334795u }, {  2264139853421527858u, 209279024841067836u },
  180|  4.76M|    { 16568707141704863579u, 167423219872854268u }, {  4373838538276319787u, 267877151796566830u },
  181|  4.76M|    {  3499070830621055830u, 214301721437253464u }, {  6488605479238754987u, 171441377149802771u },
  182|  4.76M|    {  3003071137298187333u, 274306203439684434u }, {  6091805724580460189u, 219444962751747547u },
  183|  4.76M|    { 15941491023890099121u, 175555970201398037u }, { 10748990379256517301u, 280889552322236860u },
  184|  4.76M|    {  8599192303405213841u, 224711641857789488u }, { 14258051472207991719u, 179769313486231590u }};
  185|  4.76M|    return arr;
  186|  4.76M|}
_ZN5boost4json6detail3ryu17DOUBLE_POW5_SPLITEv:
  191|  68.6k|{
  192|  68.6k|    static constexpr std::uint64_t arr[326][2] = {
  193|  68.6k|    {                    0u,  72057594037927936u }, {                    0u,  90071992547409920u },
  194|  68.6k|    {                    0u, 112589990684262400u }, {                    0u, 140737488355328000u },
  195|  68.6k|    {                    0u,  87960930222080000u }, {                    0u, 109951162777600000u },
  196|  68.6k|    {                    0u, 137438953472000000u }, {                    0u,  85899345920000000u },
  197|  68.6k|    {                    0u, 107374182400000000u }, {                    0u, 134217728000000000u },
  198|  68.6k|    {                    0u,  83886080000000000u }, {                    0u, 104857600000000000u },
  199|  68.6k|    {                    0u, 131072000000000000u }, {                    0u,  81920000000000000u },
  200|  68.6k|    {                    0u, 102400000000000000u }, {                    0u, 128000000000000000u },
  201|  68.6k|    {                    0u,  80000000000000000u }, {                    0u, 100000000000000000u },
  202|  68.6k|    {                    0u, 125000000000000000u }, {                    0u,  78125000000000000u },
  203|  68.6k|    {                    0u,  97656250000000000u }, {                    0u, 122070312500000000u },
  204|  68.6k|    {                    0u,  76293945312500000u }, {                    0u,  95367431640625000u },
  205|  68.6k|    {                    0u, 119209289550781250u }, {  4611686018427387904u,  74505805969238281u },
  206|  68.6k|    { 10376293541461622784u,  93132257461547851u }, {  8358680908399640576u, 116415321826934814u },
  207|  68.6k|    {   612489549322387456u,  72759576141834259u }, { 14600669991935148032u,  90949470177292823u },
  208|  68.6k|    { 13639151471491547136u, 113686837721616029u }, {  3213881284082270208u, 142108547152020037u },
  209|  68.6k|    {  4314518811765112832u,  88817841970012523u }, {   781462496279003136u, 111022302462515654u },
  210|  68.6k|    { 10200200157203529728u, 138777878078144567u }, { 13292654125893287936u,  86736173798840354u },
  211|  68.6k|    {  7392445620511834112u, 108420217248550443u }, {  4628871007212404736u, 135525271560688054u },
  212|  68.6k|    { 16728102434789916672u,  84703294725430033u }, {  7075069988205232128u, 105879118406787542u },
  213|  68.6k|    { 18067209522111315968u, 132348898008484427u }, {  8986162942105878528u,  82718061255302767u },
  214|  68.6k|    {  6621017659204960256u, 103397576569128459u }, {  3664586055578812416u, 129246970711410574u },
  215|  68.6k|    { 16125424340018921472u,  80779356694631608u }, {  1710036351314100224u, 100974195868289511u },
  216|  68.6k|    { 15972603494424788992u, 126217744835361888u }, {  9982877184015493120u,  78886090522101180u },
  217|  68.6k|    { 12478596480019366400u,  98607613152626475u }, { 10986559581596820096u, 123259516440783094u },
  218|  68.6k|    {  2254913720070624656u,  77037197775489434u }, { 12042014186943056628u,  96296497219361792u },
  219|  68.6k|    { 15052517733678820785u, 120370621524202240u }, {  9407823583549262990u,  75231638452626400u },
  220|  68.6k|    { 11759779479436578738u,  94039548065783000u }, { 14699724349295723422u, 117549435082228750u },
  221|  68.6k|    {  4575641699882439235u,  73468396926392969u }, { 10331238143280436948u,  91835496157991211u },
  222|  68.6k|    {  8302361660673158281u, 114794370197489014u }, {  1154580038986672043u, 143492962746861268u },
  223|  68.6k|    {  9944984561221445835u,  89683101716788292u }, { 12431230701526807293u, 112103877145985365u },
  224|  68.6k|    {  1703980321626345405u, 140129846432481707u }, { 17205888765512323542u,  87581154020301066u },
  225|  68.6k|    { 12283988920035628619u, 109476442525376333u }, {  1519928094762372062u, 136845553156720417u },
  226|  68.6k|    { 12479170105294952299u,  85528470722950260u }, { 15598962631618690374u, 106910588403687825u },
  227|  68.6k|    {  5663645234241199255u, 133638235504609782u }, { 17374836326682913246u,  83523897190381113u },
  228|  68.6k|    {  7883487353071477846u, 104404871487976392u }, {  9854359191339347308u, 130506089359970490u },
  229|  68.6k|    { 10770660513014479971u,  81566305849981556u }, { 13463325641268099964u, 101957882312476945u },
  230|  68.6k|    {  2994098996302961243u, 127447352890596182u }, { 15706369927971514489u,  79654595556622613u },
  231|  68.6k|    {  5797904354682229399u,  99568244445778267u }, {  2635694424925398845u, 124460305557222834u },
  232|  68.6k|    {  6258995034005762182u,  77787690973264271u }, {  3212057774079814824u,  97234613716580339u },
  233|  68.6k|    { 17850130272881932242u, 121543267145725423u }, { 18073860448192289507u,  75964541966078389u },
  234|  68.6k|    {  8757267504958198172u,  94955677457597987u }, {  6334898362770359811u, 118694596821997484u },
  235|  68.6k|    { 13182683513586250689u,  74184123013748427u }, { 11866668373555425458u,  92730153767185534u },
  236|  68.6k|    {  5609963430089506015u, 115912692208981918u }, { 17341285199088104971u,  72445432630613698u },
  237|  68.6k|    { 12453234462005355406u,  90556790788267123u }, { 10954857059079306353u, 113195988485333904u },
  238|  68.6k|    { 13693571323849132942u, 141494985606667380u }, { 17781854114260483896u,  88434366004167112u },
  239|  68.6k|    {  3780573569116053255u, 110542957505208891u }, {   114030942967678664u, 138178696881511114u },
  240|  68.6k|    {  4682955357782187069u,  86361685550944446u }, { 15077066234082509644u, 107952106938680557u },
  241|  68.6k|    {  5011274737320973344u, 134940133673350697u }, { 14661261756894078100u,  84337583545844185u },
  242|  68.6k|    {  4491519140835433913u, 105421979432305232u }, {  5614398926044292391u, 131777474290381540u },
  243|  68.6k|    { 12732371365632458552u,  82360921431488462u }, {  6692092170185797382u, 102951151789360578u },
  244|  68.6k|    { 17588487249587022536u, 128688939736700722u }, { 15604490549419276989u,  80430587335437951u },
  245|  68.6k|    { 14893927168346708332u, 100538234169297439u }, { 14005722942005997511u, 125672792711621799u },
  246|  68.6k|    { 15671105866394830300u,  78545495444763624u }, {  1142138259283986260u,  98181869305954531u },
  247|  68.6k|    { 15262730879387146537u, 122727336632443163u }, {  7233363790403272633u,  76704585395276977u },
  248|  68.6k|    { 13653390756431478696u,  95880731744096221u }, {  3231680390257184658u, 119850914680120277u },
  249|  68.6k|    {  4325643253124434363u,  74906821675075173u }, { 10018740084832930858u,  93633527093843966u },
  250|  68.6k|    {  3300053069186387764u, 117041908867304958u }, { 15897591223523656064u,  73151193042065598u },
  251|  68.6k|    { 10648616992549794273u,  91438991302581998u }, {  4087399203832467033u, 114298739128227498u },
  252|  68.6k|    { 14332621041645359599u, 142873423910284372u }, { 18181260187883125557u,  89295889943927732u },
  253|  68.6k|    {  4279831161144355331u, 111619862429909666u }, { 14573160988285219972u, 139524828037387082u },
  254|  68.6k|    { 13719911636105650386u,  87203017523366926u }, {  7926517508277287175u, 109003771904208658u },
  255|  68.6k|    {   684774848491833161u, 136254714880260823u }, {  7345513307948477581u,  85159196800163014u },
  256|  68.6k|    { 18405263671790372785u, 106448996000203767u }, { 18394893571310578077u, 133061245000254709u },
  257|  68.6k|    { 13802651491282805250u,  83163278125159193u }, {  3418256308821342851u, 103954097656448992u },
  258|  68.6k|    {  4272820386026678563u, 129942622070561240u }, {  2670512741266674102u,  81214138794100775u },
  259|  68.6k|    { 17173198981865506339u, 101517673492625968u }, {  3019754653622331308u, 126897091865782461u },
  260|  68.6k|    {  4193189667727651020u,  79310682416114038u }, { 14464859121514339583u,  99138353020142547u },
  261|  68.6k|    { 13469387883465536574u, 123922941275178184u }, {  8418367427165960359u,  77451838296986365u },
  262|  68.6k|    { 15134645302384838353u,  96814797871232956u }, {   471562554271496325u, 121018497339041196u },
  263|  68.6k|    {  9518098633274461011u,  75636560836900747u }, {  7285937273165688360u,  94545701046125934u },
  264|  68.6k|    { 18330793628311886258u, 118182126307657417u }, {  4539216990053847055u,  73863828942285886u },
  265|  68.6k|    { 14897393274422084627u,  92329786177857357u }, {  4786683537745442072u, 115412232722321697u },
  266|  68.6k|    { 14520892257159371055u,  72132645451451060u }, { 18151115321449213818u,  90165806814313825u },
  267|  68.6k|    {  8853836096529353561u, 112707258517892282u }, {  1843923083806916143u, 140884073147365353u },
  268|  68.6k|    { 12681666973447792349u,  88052545717103345u }, {  2017025661527576725u, 110065682146379182u },
  269|  68.6k|    { 11744654113764246714u, 137582102682973977u }, {   422879793461572340u,  85988814176858736u },
  270|  68.6k|    {   528599741826965425u, 107486017721073420u }, {   660749677283706782u, 134357522151341775u },
  271|  68.6k|    {  7330497575943398595u,  83973451344588609u }, { 13774807988356636147u, 104966814180735761u },
  272|  68.6k|    {  3383451930163631472u, 131208517725919702u }, { 15949715511634433382u,  82005323578699813u },
  273|  68.6k|    {  6102086334260878016u, 102506654473374767u }, {  3015921899398709616u, 128133318091718459u },
  274|  68.6k|    { 18025852251620051174u,  80083323807324036u }, {  4085571240815512351u, 100104154759155046u },
  275|  68.6k|    { 14330336087874166247u, 125130193448943807u }, { 15873989082562435760u,  78206370905589879u },
  276|  68.6k|    { 15230800334775656796u,  97757963631987349u }, {  5203442363187407284u, 122197454539984187u },
  277|  68.6k|    {   946308467778435600u,  76373409087490117u }, {  5794571603150432404u,  95466761359362646u },
  278|  68.6k|    { 16466586540792816313u, 119333451699203307u }, {  7985773578781816244u,  74583407312002067u },
  279|  68.6k|    {  5370530955049882401u,  93229259140002584u }, {  6713163693812353001u, 116536573925003230u },
  280|  68.6k|    { 18030785363914884337u,  72835358703127018u }, { 13315109668038829614u,  91044198378908773u },
  281|  68.6k|    {  2808829029766373305u, 113805247973635967u }, { 17346094342490130344u, 142256559967044958u },
  282|  68.6k|    {  6229622945628943561u,  88910349979403099u }, {  3175342663608791547u, 111137937474253874u },
  283|  68.6k|    { 13192550366365765242u, 138922421842817342u }, {  3633657960551215372u,  86826513651760839u },
  284|  68.6k|    { 18377130505971182927u, 108533142064701048u }, {  4524669058754427043u, 135666427580876311u },
  285|  68.6k|    {  9745447189362598758u,  84791517238047694u }, {  2958436949848472639u, 105989396547559618u },
  286|  68.6k|    { 12921418224165366607u, 132486745684449522u }, { 12687572408530742033u,  82804216052780951u },
  287|  68.6k|    { 11247779492236039638u, 103505270065976189u }, {   224666310012885835u, 129381587582470237u },
  288|  68.6k|    {  2446259452971747599u,  80863492239043898u }, { 12281196353069460307u, 101079365298804872u },
  289|  68.6k|    { 15351495441336825384u, 126349206623506090u }, { 14206370669262903769u,  78968254139691306u },
  290|  68.6k|    {  8534591299723853903u,  98710317674614133u }, { 15279925143082205283u, 123387897093267666u },
  291|  68.6k|    { 14161639232853766206u,  77117435683292291u }, { 13090363022639819853u,  96396794604115364u },
  292|  68.6k|    { 16362953778299774816u, 120495993255144205u }, { 12532689120651053212u,  75309995784465128u },
  293|  68.6k|    { 15665861400813816515u,  94137494730581410u }, { 10358954714162494836u, 117671868413226763u },
  294|  68.6k|    {  4168503687137865320u,  73544917758266727u }, {   598943590494943747u,  91931147197833409u },
  295|  68.6k|    {  5360365506546067587u, 114913933997291761u }, { 11312142901609972388u, 143642417496614701u },
  296|  68.6k|    {  9375932322719926695u,  89776510935384188u }, { 11719915403399908368u, 112220638669230235u },
  297|  68.6k|    { 10038208235822497557u, 140275798336537794u }, { 10885566165816448877u,  87672373960336121u },
  298|  68.6k|    { 18218643725697949000u, 109590467450420151u }, { 18161618638695048346u, 136988084313025189u },
  299|  68.6k|    { 13656854658398099168u,  85617552695640743u }, { 12459382304570236056u, 107021940869550929u },
  300|  68.6k|    {  1739169825430631358u, 133777426086938662u }, { 14922039196176308311u,  83610891304336663u },
  301|  68.6k|    { 14040862976792997485u, 104513614130420829u }, {  3716020665709083144u, 130642017663026037u },
  302|  68.6k|    {  4628355925281870917u,  81651261039391273u }, { 10397130925029726550u, 102064076299239091u },
  303|  68.6k|    {  8384727637859770284u, 127580095374048864u }, {  5240454773662356427u,  79737559608780540u },
  304|  68.6k|    {  6550568467077945534u,  99671949510975675u }, {  3576524565420044014u, 124589936888719594u },
  305|  68.6k|    {  6847013871814915412u,  77868710555449746u }, { 17782139376623420074u,  97335888194312182u },
  306|  68.6k|    { 13004302183924499284u, 121669860242890228u }, { 17351060901807587860u,  76043662651806392u },
  307|  68.6k|    {  3242082053549933210u,  95054578314757991u }, { 17887660622219580224u, 118818222893447488u },
  308|  68.6k|    { 11179787888887237640u,  74261389308404680u }, { 13974734861109047050u,  92826736635505850u },
  309|  68.6k|    {  8245046539531533005u, 116033420794382313u }, { 16682369133275677888u,  72520887996488945u },
  310|  68.6k|    {  7017903361312433648u,  90651109995611182u }, { 17995751238495317868u, 113313887494513977u },
  311|  68.6k|    {  8659630992836983623u, 141642359368142472u }, {  5412269370523114764u,  88526474605089045u },
  312|  68.6k|    { 11377022731581281359u, 110658093256361306u }, {  4997906377621825891u, 138322616570451633u },
  313|  68.6k|    { 14652906532082110942u,  86451635356532270u }, {  9092761128247862869u, 108064544195665338u },
  314|  68.6k|    {  2142579373455052779u, 135080680244581673u }, { 12868327154477877747u,  84425425152863545u },
  315|  68.6k|    {  2250350887815183471u, 105531781441079432u }, {  2812938609768979339u, 131914726801349290u },
  316|  68.6k|    {  6369772649532999991u,  82446704250843306u }, { 17185587848771025797u, 103058380313554132u },
  317|  68.6k|    {  3035240737254230630u, 128822975391942666u }, {  6508711479211282048u,  80514359619964166u },
  318|  68.6k|    { 17359261385868878368u, 100642949524955207u }, { 17087390713908710056u, 125803686906194009u },
  319|  68.6k|    {  3762090168551861929u,  78627304316371256u }, {  4702612710689827411u,  98284130395464070u },
  320|  68.6k|    { 15101637925217060072u, 122855162994330087u }, { 16356052730901744401u,  76784476871456304u },
  321|  68.6k|    {  1998321839917628885u,  95980596089320381u }, {  7109588318324424010u, 119975745111650476u },
  322|  68.6k|    { 13666864735807540814u,  74984840694781547u }, { 12471894901332038114u,  93731050868476934u },
  323|  68.6k|    {  6366496589810271835u, 117163813585596168u }, {  3979060368631419896u,  73227383490997605u },
  324|  68.6k|    {  9585511479216662775u,  91534229363747006u }, {  2758517312166052660u, 114417786704683758u },
  325|  68.6k|    { 12671518677062341634u, 143022233380854697u }, {  1002170145522881665u,  89388895863034186u },
  326|  68.6k|    { 10476084718758377889u, 111736119828792732u }, { 13095105898447972362u, 139670149785990915u },
  327|  68.6k|    {  5878598177316288774u,  87293843616244322u }, { 16571619758500136775u, 109117304520305402u },
  328|  68.6k|    { 11491152661270395161u, 136396630650381753u }, {   264441385652915120u,  85247894156488596u },
  329|  68.6k|    {   330551732066143900u, 106559867695610745u }, {  5024875683510067779u, 133199834619513431u },
  330|  68.6k|    { 10058076329834874218u,  83249896637195894u }, {  3349223375438816964u, 104062370796494868u },
  331|  68.6k|    {  4186529219298521205u, 130077963495618585u }, { 14145795808130045513u,  81298727184761615u },
  332|  68.6k|    { 13070558741735168987u, 101623408980952019u }, { 11726512408741573330u, 127029261226190024u },
  333|  68.6k|    {  7329070255463483331u,  79393288266368765u }, { 13773023837756742068u,  99241610332960956u },
  334|  68.6k|    { 17216279797195927585u, 124052012916201195u }, {  8454331864033760789u,  77532508072625747u },
  335|  68.6k|    {  5956228811614813082u,  96915635090782184u }, {  7445286014518516353u, 121144543863477730u },
  336|  68.6k|    {  9264989777501460624u,  75715339914673581u }, { 16192923240304213684u,  94644174893341976u },
  337|  68.6k|    {  1794409976670715490u, 118305218616677471u }, {  8039035263060279037u,  73940761635423419u },
  338|  68.6k|    {  5437108060397960892u,  92425952044279274u }, { 16019757112352226923u, 115532440055349092u },
  339|  68.6k|    {   788976158365366019u,  72207775034593183u }, { 14821278253238871236u,  90259718793241478u },
  340|  68.6k|    {  9303225779693813237u, 112824648491551848u }, { 11629032224617266546u, 141030810614439810u },
  341|  68.6k|    { 11879831158813179495u,  88144256634024881u }, {  1014730893234310657u, 110180320792531102u },
  342|  68.6k|    { 10491785653397664129u, 137725400990663877u }, {  8863209042587234033u,  86078375619164923u },
  343|  68.6k|    {  6467325284806654637u, 107597969523956154u }, { 17307528642863094104u, 134497461904945192u },
  344|  68.6k|    { 10817205401789433815u,  84060913690590745u }, { 18133192770664180173u, 105076142113238431u },
  345|  68.6k|    { 18054804944902837312u, 131345177641548039u }, { 18201782118205355176u,  82090736025967524u },
  346|  68.6k|    {  4305483574047142354u, 102613420032459406u }, { 14605226504413703751u, 128266775040574257u },
  347|  68.6k|    {  2210737537617482988u,  80166734400358911u }, { 16598479977304017447u, 100208418000448638u },
  348|  68.6k|    { 11524727934775246001u, 125260522500560798u }, {  2591268940807140847u,  78287826562850499u },
  349|  68.6k|    { 17074144231291089770u,  97859783203563123u }, { 16730994270686474309u, 122324729004453904u },
  350|  68.6k|    { 10456871419179046443u,  76452955627783690u }, {  3847717237119032246u,  95566194534729613u },
  351|  68.6k|    {  9421332564826178211u, 119457743168412016u }, {  5888332853016361382u,  74661089480257510u },
  352|  68.6k|    { 16583788103125227536u,  93326361850321887u }, { 16118049110479146516u, 116657952312902359u },
  353|  68.6k|    { 16991309721690548428u,  72911220195563974u }, { 12015765115258409727u,  91139025244454968u },
  354|  68.6k|    { 15019706394073012159u, 113923781555568710u }, {  9551260955736489391u, 142404726944460888u },
  355|  68.6k|    {  5969538097335305869u,  89002954340288055u }, {  2850236603241744433u, 111253692925360069u }};
  356|  68.6k|    return arr;
  357|  68.6k|}

_ZN5boost4json6detail3ryu6detail5div10Em:
  173|  13.4M|inline uint64_t div10(const uint64_t x) {
  174|  13.4M|  return x / 10;
  175|  13.4M|}
_ZN5boost4json6detail3ryu6detail4div5Em:
  169|  71.6k|inline uint64_t div5(const uint64_t x) {
  170|  71.6k|  return x / 5;
  171|  71.6k|}
_ZN5boost4json6detail3ryu6detail18multipleOfPowerOf5Emj:
  211|  21.8k|inline bool multipleOfPowerOf5(const uint64_t value, const uint32_t p) {
  212|       |  // I tried a case distinction on p, but there was no performance difference.
  213|  21.8k|  return pow5Factor(value) >= p;
  214|  21.8k|}
_ZN5boost4json6detail3ryu6detail10pow5FactorEm:
  195|  21.8k|inline uint32_t pow5Factor(uint64_t value) {
  196|  21.8k|  uint32_t count = 0;
  197|  49.7k|  for (;;) {
  198|  49.7k|    BOOST_ASSERT(value != 0);
  ------------------
  |  |   60|  49.7k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  199|  49.7k|    const uint64_t q = div5(value);
  200|  49.7k|    const uint32_t r = ((uint32_t) value) - 5 * ((uint32_t) q);
  201|  49.7k|    if (r != 0) {
  ------------------
  |  Branch (201:9): [True: 21.8k, False: 27.9k]
  ------------------
  202|  21.8k|      break;
  203|  21.8k|    }
  204|  27.9k|    value = q;
  205|  27.9k|    ++count;
  206|  27.9k|  }
  207|  21.8k|  return count;
  208|  21.8k|}
_ZN5boost4json6detail3ryu6detail18multipleOfPowerOf2Emj:
  217|  9.65k|inline bool multipleOfPowerOf2(const uint64_t value, const uint32_t p) {
  218|  9.65k|  BOOST_ASSERT(value != 0);
  ------------------
  |  |   60|  9.65k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  219|       |  // return __builtin_ctzll(value) >= p;
  220|  9.65k|  return (value & ((1ull << p) - 1)) == 0;
  221|  9.65k|}
_ZN5boost4json6detail3ryu6detail6div100Em:
  177|  14.4M|inline uint64_t div100(const uint64_t x) {
  178|  14.4M|  return x / 100;
  179|  14.4M|}
_ZN5boost4json6detail3ryu6detail6div1e8Em:
  181|  4.76M|inline uint64_t div1e8(const uint64_t x) {
  182|  4.76M|  return x / 100000000;
  183|  4.76M|}

_ZN5boost4json6detail3ryu6detail11DIGIT_TABLEEv:
   39|  43.0M|{
   40|  43.0M|    static constexpr char arr[200] = {
   41|  43.0M|      '0','0','0','1','0','2','0','3','0','4','0','5','0','6','0','7','0','8','0','9',
   42|  43.0M|      '1','0','1','1','1','2','1','3','1','4','1','5','1','6','1','7','1','8','1','9',
   43|  43.0M|      '2','0','2','1','2','2','2','3','2','4','2','5','2','6','2','7','2','8','2','9',
   44|  43.0M|      '3','0','3','1','3','2','3','3','3','4','3','5','3','6','3','7','3','8','3','9',
   45|  43.0M|      '4','0','4','1','4','2','4','3','4','4','4','5','4','6','4','7','4','8','4','9',
   46|  43.0M|      '5','0','5','1','5','2','5','3','5','4','5','5','5','6','5','7','5','8','5','9',
   47|  43.0M|      '6','0','6','1','6','2','6','3','6','4','6','5','6','6','6','7','6','8','6','9',
   48|  43.0M|      '7','0','7','1','7','2','7','3','7','4','7','5','7','6','7','7','7','8','7','9',
   49|  43.0M|      '8','0','8','1','8','2','8','3','8','4','8','5','8','6','8','7','8','8','8','9',
   50|  43.0M|      '9','0','9','1','9','2','9','3','9','4','9','5','9','6','9','7','9','8','9','9' };
   51|  43.0M|    return arr;
   52|  43.0M|}

_ZN5boost4json6detail3ryu14d2s_buffered_nEdPc:
  675|  4.91M|{
  676|  4.91M|    using namespace detail;
  677|       |    // Step 1: Decode the floating-point number, and unify normalized and subnormal cases.
  678|  4.91M|    std::uint64_t const bits = double_to_bits(f);
  679|       |
  680|       |#ifdef RYU_DEBUG
  681|       |    printf("IN=");
  682|       |    for (std::int32_t bit = 63; bit >= 0; --bit) {
  683|       |        printf("%d", (int)((bits >> bit) & 1));
  684|       |    }
  685|       |    printf("\n");
  686|       |#endif
  687|       |
  688|       |    // Decode bits into sign, mantissa, and exponent.
  689|  4.91M|    const bool ieeeSign = ((bits >> (DOUBLE_MANTISSA_BITS + DOUBLE_EXPONENT_BITS)) & 1) != 0;
  690|  4.91M|    const std::uint64_t ieeeMantissa = bits & ((1ull << DOUBLE_MANTISSA_BITS) - 1);
  691|  4.91M|    const std::uint32_t ieeeExponent = (std::uint32_t)((bits >> DOUBLE_MANTISSA_BITS) & ((1u << DOUBLE_EXPONENT_BITS) - 1));
  692|       |    // Case distinction; exit early for the easy cases.
  693|  4.91M|    if (ieeeExponent == ((1u << DOUBLE_EXPONENT_BITS) - 1u) || (ieeeExponent == 0 && ieeeMantissa == 0)) {
  ------------------
  |  Branch (693:9): [True: 40.4k, False: 4.87M]
  |  Branch (693:65): [True: 5.48k, False: 4.87M]
  |  Branch (693:86): [True: 5.17k, False: 307]
  ------------------
  694|  45.6k|        return copy_special_str(result, ieeeSign, ieeeExponent != 0, ieeeMantissa != 0);
  695|  45.6k|    }
  696|       |
  697|  4.87M|    floating_decimal_64 v;
  698|  4.87M|    const bool isSmallInt = d2d_small_int(ieeeMantissa, ieeeExponent, &v);
  699|  4.87M|    if (isSmallInt) {
  ------------------
  |  Branch (699:9): [True: 40.9k, False: 4.83M]
  ------------------
  700|       |        // For small integers in the range [1, 2^53), v.mantissa might contain trailing (decimal) zeros.
  701|       |        // For scientific notation we need to move these zeros into the exponent.
  702|       |        // (This is not needed for fixed-point notation, so it might be beneficial to trim
  703|       |        // trailing zeros in to_chars only if needed - once fixed-point notation output is implemented.)
  704|   351k|        for (;;) {
  705|   351k|            std::uint64_t const q = div10(v.mantissa);
  706|   351k|            std::uint32_t const r = ((std::uint32_t) v.mantissa) - 10 * ((std::uint32_t) q);
  707|   351k|            if (r != 0)
  ------------------
  |  Branch (707:17): [True: 40.9k, False: 310k]
  ------------------
  708|  40.9k|                break;
  709|   310k|            v.mantissa = q;
  710|   310k|            ++v.exponent;
  711|   310k|        }
  712|  40.9k|    }
  713|  4.83M|    else {
  714|  4.83M|        v = d2d(ieeeMantissa, ieeeExponent);
  715|  4.83M|    }
  716|       |
  717|  4.87M|    return to_chars(v, ieeeSign, result);
  718|  4.91M|}
src.cpp:_ZN5boost4json6detail3ryu6detailL13d2d_small_intEmjPNS3_19floating_decimal_64E:
  638|  4.87M|  floating_decimal_64* const v) {
  639|  4.87M|  const uint64_t m2 = (1ull << DOUBLE_MANTISSA_BITS) | ieeeMantissa;
  640|  4.87M|  const int32_t e2 = (int32_t) ieeeExponent - DOUBLE_BIAS - DOUBLE_MANTISSA_BITS;
  641|       |
  642|  4.87M|  if (e2 > 0) {
  ------------------
  |  Branch (642:7): [True: 4.76M, False: 107k]
  ------------------
  643|       |    // f = m2 * 2^e2 >= 2^53 is an integer.
  644|       |    // Ignore this case for now.
  645|  4.76M|    return false;
  646|  4.76M|  }
  647|       |
  648|   107k|  if (e2 < -52) {
  ------------------
  |  Branch (648:7): [True: 58.3k, False: 49.2k]
  ------------------
  649|       |    // f < 1.
  650|  58.3k|    return false;
  651|  58.3k|  }
  652|       |
  653|       |  // Since 2^52 <= m2 < 2^53 and 0 <= -e2 <= 52: 1 <= f = m2 / 2^-e2 < 2^53.
  654|       |  // Test if the lower -e2 bits of the significand are 0, i.e. whether the fraction is 0.
  655|  49.2k|  const uint64_t mask = (1ull << -e2) - 1;
  656|  49.2k|  const uint64_t fraction = m2 & mask;
  657|  49.2k|  if (fraction != 0) {
  ------------------
  |  Branch (657:7): [True: 8.35k, False: 40.9k]
  ------------------
  658|  8.35k|    return false;
  659|  8.35k|  }
  660|       |
  661|       |  // f is an integer in the range [1, 2^53).
  662|       |  // Note: mantissa might contain trailing (decimal) 0's.
  663|       |  // Note: since 2^53 < 10^16, there is no need to adjust decimalLength17().
  664|  40.9k|  v->mantissa = m2 >> -e2;
  665|  40.9k|  v->exponent = 0;
  666|  40.9k|  return true;
  667|  49.2k|}
_ZN5boost4json6detail3ryu6detail3d2dEmj:
  270|  4.83M|{
  271|  4.83M|    std::int32_t e2;
  272|  4.83M|    std::uint64_t m2;
  273|  4.83M|    if (ieeeExponent == 0)
  ------------------
  |  Branch (273:9): [True: 307, False: 4.83M]
  ------------------
  274|    307|    {
  275|       |        // We subtract 2 so that the bounds computation has 2 additional bits.
  276|    307|        e2 = 1 - DOUBLE_BIAS - DOUBLE_MANTISSA_BITS - 2;
  277|    307|        m2 = ieeeMantissa;
  278|    307|    }
  279|  4.83M|    else
  280|  4.83M|    {
  281|  4.83M|        e2 = (std::int32_t)ieeeExponent - DOUBLE_BIAS - DOUBLE_MANTISSA_BITS - 2;
  282|  4.83M|        m2 = (1ull << DOUBLE_MANTISSA_BITS) | ieeeMantissa;
  283|  4.83M|    }
  284|  4.83M|    const bool even = (m2 & 1) == 0;
  285|  4.83M|    const bool acceptBounds = even;
  286|       |
  287|       |#ifdef RYU_DEBUG
  288|       |    printf("-> %" PRIu64 " * 2^%d\n", m2, e2 + 2);
  289|       |#endif
  290|       |
  291|       |    // Step 2: Determine the interval of valid decimal representations.
  292|  4.83M|    const std::uint64_t mv = 4 * m2;
  293|       |    // Implicit bool -> int conversion. True is 1, false is 0.
  294|  4.83M|    const std::uint32_t mmShift = ieeeMantissa != 0 || ieeeExponent <= 1;
  ------------------
  |  Branch (294:35): [True: 4.83M, False: 627]
  |  Branch (294:56): [True: 0, False: 627]
  ------------------
  295|       |    // We would compute mp and mm like this:
  296|       |    // uint64_t mp = 4 * m2 + 2;
  297|       |    // uint64_t mm = mv - 1 - mmShift;
  298|       |
  299|       |    // Step 3: Convert to a decimal power base using 128-bit arithmetic.
  300|  4.83M|    std::uint64_t vr, vp, vm;
  301|  4.83M|    std::int32_t e10;
  302|  4.83M|    bool vmIsTrailingZeros = false;
  303|  4.83M|    bool vrIsTrailingZeros = false;
  304|  4.83M|    if (e2 >= 0) {
  ------------------
  |  Branch (304:9): [True: 4.76M, False: 68.6k]
  ------------------
  305|       |        // I tried special-casing q == 0, but there was no effect on performance.
  306|       |        // This expression is slightly faster than max(0, log10Pow2(e2) - 1).
  307|  4.76M|        const std::uint32_t q = log10Pow2(e2) - (e2 > 3);
  308|  4.76M|        e10 = (std::int32_t)q;
  309|  4.76M|        const std::int32_t k = DOUBLE_POW5_INV_BITCOUNT + pow5bits((int32_t)q) - 1;
  310|  4.76M|        const std::int32_t i = -e2 + (std::int32_t)q + k;
  311|       |#if defined(BOOST_JSON_RYU_OPTIMIZE_SIZE)
  312|       |        uint64_t pow5[2];
  313|       |        double_computeInvPow5(q, pow5);
  314|       |        vr = mulShiftAll(m2, pow5, i, &vp, &vm, mmShift);
  315|       |#else
  316|  4.76M|        vr = mulShiftAll(m2, DOUBLE_POW5_INV_SPLIT()[q], i, &vp, &vm, mmShift);
  317|  4.76M|#endif
  318|       |#ifdef RYU_DEBUG
  319|       |        printf("%" PRIu64 " * 2^%d / 10^%u\n", mv, e2, q);
  320|       |        printf("V+=%" PRIu64 "\nV =%" PRIu64 "\nV-=%" PRIu64 "\n", vp, vr, vm);
  321|       |#endif
  322|  4.76M|        if (q <= 21)
  ------------------
  |  Branch (322:13): [True: 21.8k, False: 4.74M]
  ------------------
  323|  21.8k|        {
  324|       |            // This should use q <= 22, but I think 21 is also safe. Smaller values
  325|       |            // may still be safe, but it's more difficult to reason about them.
  326|       |            // Only one of mp, mv, and mm can be a multiple of 5, if any.
  327|  21.8k|            const std::uint32_t mvMod5 = ((std::uint32_t)mv) - 5 * ((std::uint32_t)div5(mv));
  328|  21.8k|            if (mvMod5 == 0)
  ------------------
  |  Branch (328:17): [True: 4.50k, False: 17.3k]
  ------------------
  329|  4.50k|            {
  330|  4.50k|                vrIsTrailingZeros = multipleOfPowerOf5(mv, q);
  331|  4.50k|            }
  332|  17.3k|            else if (acceptBounds)
  ------------------
  |  Branch (332:22): [True: 12.9k, False: 4.46k]
  ------------------
  333|  12.9k|            {
  334|       |                // Same as min(e2 + (~mm & 1), pow5Factor(mm)) >= q
  335|       |                // <=> e2 + (~mm & 1) >= q && pow5Factor(mm) >= q
  336|       |                // <=> true && pow5Factor(mm) >= q, since e2 >= q.
  337|  12.9k|                vmIsTrailingZeros = multipleOfPowerOf5(mv - 1 - mmShift, q);
  338|  12.9k|            }
  339|  4.46k|            else
  340|  4.46k|            {
  341|       |                // Same as min(e2 + 1, pow5Factor(mp)) >= q.
  342|  4.46k|                vp -= multipleOfPowerOf5(mv + 2, q);
  343|  4.46k|            }
  344|  21.8k|        }
  345|  4.76M|    }
  346|  68.6k|    else
  347|  68.6k|    {
  348|       |        // This expression is slightly faster than max(0, log10Pow5(-e2) - 1).
  349|  68.6k|        const std::uint32_t q = log10Pow5(-e2) - (-e2 > 1);
  350|  68.6k|        e10 = (std::int32_t)q + e2;
  351|  68.6k|        const std::int32_t i = -e2 - (std::int32_t)q;
  352|  68.6k|        const std::int32_t k = pow5bits(i) - DOUBLE_POW5_BITCOUNT;
  353|  68.6k|        const std::int32_t j = (std::int32_t)q - k;
  354|       |#if defined(BOOST_JSON_RYU_OPTIMIZE_SIZE)
  355|       |        std::uint64_t pow5[2];
  356|       |        double_computePow5(i, pow5);
  357|       |        vr = mulShiftAll(m2, pow5, j, &vp, &vm, mmShift);
  358|       |#else
  359|  68.6k|        vr = mulShiftAll(m2, DOUBLE_POW5_SPLIT()[i], j, &vp, &vm, mmShift);
  360|  68.6k|#endif
  361|       |#ifdef RYU_DEBUG
  362|       |        printf("%" PRIu64 " * 5^%d / 10^%u\n", mv, -e2, q);
  363|       |        printf("%u %d %d %d\n", q, i, k, j);
  364|       |        printf("V+=%" PRIu64 "\nV =%" PRIu64 "\nV-=%" PRIu64 "\n", vp, vr, vm);
  365|       |#endif
  366|  68.6k|        if (q <= 1)
  ------------------
  |  Branch (366:13): [True: 2.77k, False: 65.8k]
  ------------------
  367|  2.77k|        {
  368|       |            // {vr,vp,vm} is trailing zeros if {mv,mp,mm} has at least q trailing 0 bits.
  369|       |            // mv = 4 * m2, so it always has at least two trailing 0 bits.
  370|  2.77k|            vrIsTrailingZeros = true;
  371|  2.77k|            if (acceptBounds)
  ------------------
  |  Branch (371:17): [True: 1.97k, False: 805]
  ------------------
  372|  1.97k|            {
  373|       |                // mm = mv - 1 - mmShift, so it has 1 trailing 0 bit iff mmShift == 1.
  374|  1.97k|                vmIsTrailingZeros = mmShift == 1;
  375|  1.97k|            }
  376|    805|            else
  377|    805|            {
  378|       |                // mp = mv + 2, so it always has at least one trailing 0 bit.
  379|    805|                --vp;
  380|    805|            }
  381|  2.77k|        }
  382|  65.8k|        else if (q < 63)
  ------------------
  |  Branch (382:18): [True: 9.65k, False: 56.2k]
  ------------------
  383|  9.65k|        {
  384|       |            // TODO(ulfjack): Use a tighter bound here.
  385|       |            // We want to know if the full product has at least q trailing zeros.
  386|       |            // We need to compute min(p2(mv), p5(mv) - e2) >= q
  387|       |            // <=> p2(mv) >= q && p5(mv) - e2 >= q
  388|       |            // <=> p2(mv) >= q (because -e2 >= q)
  389|  9.65k|            vrIsTrailingZeros = multipleOfPowerOf2(mv, q);
  390|       |#ifdef RYU_DEBUG
  391|       |            printf("vr is trailing zeros=%s\n", vrIsTrailingZeros ? "true" : "false");
  392|       |#endif
  393|  9.65k|        }
  394|  68.6k|    }
  395|       |#ifdef RYU_DEBUG
  396|       |    printf("e10=%d\n", e10);
  397|       |    printf("V+=%" PRIu64 "\nV =%" PRIu64 "\nV-=%" PRIu64 "\n", vp, vr, vm);
  398|       |    printf("vm is trailing zeros=%s\n", vmIsTrailingZeros ? "true" : "false");
  399|       |    printf("vr is trailing zeros=%s\n", vrIsTrailingZeros ? "true" : "false");
  400|       |#endif
  401|       |
  402|       |    // Step 4: Find the shortest decimal representation in the interval of valid representations.
  403|  4.83M|    std::int32_t removed = 0;
  404|  4.83M|    std::uint8_t lastRemovedDigit = 0;
  405|  4.83M|    std::uint64_t output;
  406|       |    // On average, we remove ~2 digits.
  407|  4.83M|    if (vmIsTrailingZeros || vrIsTrailingZeros)
  ------------------
  |  Branch (407:9): [True: 2.54k, False: 4.83M]
  |  Branch (407:30): [True: 2.99k, False: 4.82M]
  ------------------
  408|  5.54k|    {
  409|       |        // General case, which happens rarely (~0.7%).
  410|  5.54k|        for (;;)
  411|  46.1k|        {
  412|  46.1k|            const std::uint64_t vpDiv10 = div10(vp);
  413|  46.1k|            const std::uint64_t vmDiv10 = div10(vm);
  414|  46.1k|            if (vpDiv10 <= vmDiv10)
  ------------------
  |  Branch (414:17): [True: 5.54k, False: 40.5k]
  ------------------
  415|  5.54k|                break;
  416|  40.5k|            const std::uint32_t vmMod10 = ((std::uint32_t)vm) - 10 * ((std::uint32_t)vmDiv10);
  417|  40.5k|            const std::uint64_t vrDiv10 = div10(vr);
  418|  40.5k|            const std::uint32_t vrMod10 = ((std::uint32_t)vr) - 10 * ((std::uint32_t)vrDiv10);
  419|  40.5k|            vmIsTrailingZeros &= vmMod10 == 0;
  420|  40.5k|            vrIsTrailingZeros &= lastRemovedDigit == 0;
  421|  40.5k|            lastRemovedDigit = (uint8_t)vrMod10;
  422|  40.5k|            vr = vrDiv10;
  423|  40.5k|            vp = vpDiv10;
  424|  40.5k|            vm = vmDiv10;
  425|  40.5k|            ++removed;
  426|  40.5k|        }
  427|       |#ifdef RYU_DEBUG
  428|       |        printf("V+=%" PRIu64 "\nV =%" PRIu64 "\nV-=%" PRIu64 "\n", vp, vr, vm);
  429|       |        printf("d-10=%s\n", vmIsTrailingZeros ? "true" : "false");
  430|       |#endif
  431|  5.54k|        if (vmIsTrailingZeros)
  ------------------
  |  Branch (431:13): [True: 271, False: 5.27k]
  ------------------
  432|    271|        {
  433|    271|            for (;;)
  434|  3.82k|            {
  435|  3.82k|                const std::uint64_t vmDiv10 = div10(vm);
  436|  3.82k|                const std::uint32_t vmMod10 = ((std::uint32_t)vm) - 10 * ((std::uint32_t)vmDiv10);
  437|  3.82k|                if (vmMod10 != 0)
  ------------------
  |  Branch (437:21): [True: 271, False: 3.55k]
  ------------------
  438|    271|                    break;
  439|  3.55k|                const std::uint64_t vpDiv10 = div10(vp);
  440|  3.55k|                const std::uint64_t vrDiv10 = div10(vr);
  441|  3.55k|                const std::uint32_t vrMod10 = ((std::uint32_t)vr) - 10 * ((std::uint32_t)vrDiv10);
  442|  3.55k|                vrIsTrailingZeros &= lastRemovedDigit == 0;
  443|  3.55k|                lastRemovedDigit = (uint8_t)vrMod10;
  444|  3.55k|                vr = vrDiv10;
  445|  3.55k|                vp = vpDiv10;
  446|  3.55k|                vm = vmDiv10;
  447|  3.55k|                ++removed;
  448|  3.55k|            }
  449|    271|        }
  450|       |#ifdef RYU_DEBUG
  451|       |        printf("%" PRIu64 " %d\n", vr, lastRemovedDigit);
  452|       |        printf("vr is trailing zeros=%s\n", vrIsTrailingZeros ? "true" : "false");
  453|       |#endif
  454|  5.54k|        if (vrIsTrailingZeros && lastRemovedDigit == 5 && vr % 2 == 0)
  ------------------
  |  Branch (454:13): [True: 4.69k, False: 855]
  |  Branch (454:34): [True: 1.05k, False: 3.63k]
  |  Branch (454:59): [True: 815, False: 240]
  ------------------
  455|    815|        {
  456|       |            // Round even if the exact number is .....50..0.
  457|    815|            lastRemovedDigit = 4;
  458|    815|        }
  459|       |        // We need to take vr + 1 if vr is outside bounds or we need to round up.
  460|  5.54k|        output = vr + ((vr == vm && (!acceptBounds || !vmIsTrailingZeros)) || lastRemovedDigit >= 5);
  ------------------
  |  Branch (460:25): [True: 711, False: 4.83k]
  |  Branch (460:38): [True: 245, False: 466]
  |  Branch (460:55): [True: 218, False: 248]
  |  Branch (460:79): [True: 245, False: 4.83k]
  ------------------
  461|  5.54k|    }
  462|  4.82M|    else
  463|  4.82M|    {
  464|       |        // Specialized for the common case (~99.3%). Percentages below are relative to this.
  465|  4.82M|        bool roundUp = false;
  466|  4.82M|        const std::uint64_t vpDiv100 = div100(vp);
  467|  4.82M|        const std::uint64_t vmDiv100 = div100(vm);
  468|  4.82M|        if (vpDiv100 > vmDiv100)
  ------------------
  |  Branch (468:13): [True: 4.75M, False: 69.7k]
  ------------------
  469|  4.75M|        {
  470|       |            // Optimization: remove two digits at a time (~86.2%).
  471|  4.75M|            const std::uint64_t vrDiv100 = div100(vr);
  472|  4.75M|            const std::uint32_t vrMod100 = ((std::uint32_t)vr) - 100 * ((std::uint32_t)vrDiv100);
  473|  4.75M|            roundUp = vrMod100 >= 50;
  474|  4.75M|            vr = vrDiv100;
  475|  4.75M|            vp = vpDiv100;
  476|  4.75M|            vm = vmDiv100;
  477|  4.75M|            removed += 2;
  478|  4.75M|        }
  479|       |        // Loop iterations below (approximately), without optimization above:
  480|       |        // 0: 0.03%, 1: 13.8%, 2: 70.6%, 3: 14.0%, 4: 1.40%, 5: 0.14%, 6+: 0.02%
  481|       |        // Loop iterations below (approximately), with optimization above:
  482|       |        // 0: 70.6%, 1: 27.8%, 2: 1.40%, 3: 0.14%, 4+: 0.02%
  483|  4.82M|        for (;;)
  484|  5.93M|        {
  485|  5.93M|            const std::uint64_t vpDiv10 = div10(vp);
  486|  5.93M|            const std::uint64_t vmDiv10 = div10(vm);
  487|  5.93M|            if (vpDiv10 <= vmDiv10)
  ------------------
  |  Branch (487:17): [True: 4.82M, False: 1.11M]
  ------------------
  488|  4.82M|                break;
  489|  1.11M|            const std::uint64_t vrDiv10 = div10(vr);
  490|  1.11M|            const std::uint32_t vrMod10 = ((std::uint32_t)vr) - 10 * ((std::uint32_t)vrDiv10);
  491|  1.11M|            roundUp = vrMod10 >= 5;
  492|  1.11M|            vr = vrDiv10;
  493|  1.11M|            vp = vpDiv10;
  494|  1.11M|            vm = vmDiv10;
  495|  1.11M|            ++removed;
  496|  1.11M|        }
  497|       |#ifdef RYU_DEBUG
  498|       |        printf("%" PRIu64 " roundUp=%s\n", vr, roundUp ? "true" : "false");
  499|       |        printf("vr is trailing zeros=%s\n", vrIsTrailingZeros ? "true" : "false");
  500|       |#endif
  501|       |        // We need to take vr + 1 if vr is outside bounds or we need to round up.
  502|  4.82M|        output = vr + (vr == vm || roundUp);
  ------------------
  |  Branch (502:24): [True: 58.8k, False: 4.76M]
  |  Branch (502:36): [True: 32.9k, False: 4.73M]
  ------------------
  503|  4.82M|    }
  504|  4.83M|    const std::int32_t exp = e10 + removed;
  505|       |
  506|       |#ifdef RYU_DEBUG
  507|       |    printf("V+=%" PRIu64 "\nV =%" PRIu64 "\nV-=%" PRIu64 "\n", vp, vr, vm);
  508|       |    printf("O=%" PRIu64 "\n", output);
  509|       |    printf("EXP=%d\n", exp);
  510|       |#endif
  511|       |
  512|  4.83M|    floating_decimal_64 fd;
  513|  4.83M|    fd.exponent = exp;
  514|  4.83M|    fd.mantissa = output;
  515|  4.83M|    return fd;
  516|  4.83M|}
_ZN5boost4json6detail3ryu6detail11mulShiftAllEmPKmiPmS6_j:
  126|  4.83M|{
  127|       |//  m <<= 2;
  128|       |//  uint128_t b0 = ((uint128_t) m) * mul[0]; // 0
  129|       |//  uint128_t b2 = ((uint128_t) m) * mul[1]; // 64
  130|       |//
  131|       |//  uint128_t hi = (b0 >> 64) + b2;
  132|       |//  uint128_t lo = b0 & 0xffffffffffffffffull;
  133|       |//  uint128_t factor = (((uint128_t) mul[1]) << 64) + mul[0];
  134|       |//  uint128_t vpLo = lo + (factor << 1);
  135|       |//  *vp = (std::uint64_t) ((hi + (vpLo >> 64)) >> (j - 64));
  136|       |//  uint128_t vmLo = lo - (factor << mmShift);
  137|       |//  *vm = (std::uint64_t) ((hi + (vmLo >> 64) - (((uint128_t) 1ull) << 64)) >> (j - 64));
  138|       |//  return (std::uint64_t) (hi >> (j - 64));
  139|  4.83M|    *vp = mulShift(4 * m + 2, mul, j);
  140|  4.83M|    *vm = mulShift(4 * m - 1 - mmShift, mul, j);
  141|  4.83M|    return mulShift(4 * m, mul, j);
  142|  4.83M|}
_ZN5boost4json6detail3ryu6detail8mulShiftEmPKmi:
  111|  14.5M|{
  112|  14.5M|    const uint128_t b0 = ((uint128_t) m) * mul[0];
  113|  14.5M|    const uint128_t b2 = ((uint128_t) m) * mul[1];
  114|  14.5M|    return (std::uint64_t) (((b0 >> 64) + b2) >> (j - 64));
  115|  14.5M|}
_ZN5boost4json6detail3ryu6detail8to_charsENS3_19floating_decimal_64EbPc:
  524|  4.87M|{
  525|       |    // Step 5: Print the decimal representation.
  526|  4.87M|    int index = 0;
  527|  4.87M|    if (sign)
  ------------------
  |  Branch (527:9): [True: 4.84k, False: 4.86M]
  ------------------
  528|  4.84k|        result[index++] = '-';
  529|       |
  530|  4.87M|    std::uint64_t output = v.mantissa;
  531|  4.87M|    std::uint32_t const olength = decimalLength17(output);
  532|       |
  533|       |#ifdef RYU_DEBUG
  534|       |    printf("DIGITS=%" PRIu64 "\n", v.mantissa);
  535|       |    printf("OLEN=%u\n", olength);
  536|       |    printf("EXP=%u\n", v.exponent + olength);
  537|       |#endif
  538|       |
  539|       |    // Print the decimal digits.
  540|       |    // The following code is equivalent to:
  541|       |    // for (uint32_t i = 0; i < olength - 1; ++i) {
  542|       |    //   const uint32_t c = output % 10; output /= 10;
  543|       |    //   result[index + olength - i] = (char) ('0' + c);
  544|       |    // }
  545|       |    // result[index] = '0' + output % 10;
  546|       |
  547|  4.87M|    std::uint32_t i = 0;
  548|       |    // We prefer 32-bit operations, even on 64-bit platforms.
  549|       |    // We have at most 17 digits, and uint32_t can store 9 digits.
  550|       |    // If output doesn't fit into uint32_t, we cut off 8 digits,
  551|       |    // so the rest will fit into uint32_t.
  552|  4.87M|    if ((output >> 32) != 0)
  ------------------
  |  Branch (552:9): [True: 4.76M, False: 114k]
  ------------------
  553|  4.76M|    {
  554|       |        // Expensive 64-bit division.
  555|  4.76M|        std::uint64_t const q = div1e8(output);
  556|  4.76M|        std::uint32_t output2 = ((std::uint32_t)output) - 100000000 * ((std::uint32_t)q);
  557|  4.76M|        output = q;
  558|       |
  559|  4.76M|        const std::uint32_t c = output2 % 10000;
  560|  4.76M|        output2 /= 10000;
  561|  4.76M|        const std::uint32_t d = output2 % 10000;
  562|  4.76M|        const std::uint32_t c0 = (c % 100) << 1;
  563|  4.76M|        const std::uint32_t c1 = (c / 100) << 1;
  564|  4.76M|        const std::uint32_t d0 = (d % 100) << 1;
  565|  4.76M|        const std::uint32_t d1 = (d / 100) << 1;
  566|  4.76M|        std::memcpy(result + index + olength - i - 1, DIGIT_TABLE() + c0, 2);
  567|  4.76M|        std::memcpy(result + index + olength - i - 3, DIGIT_TABLE() + c1, 2);
  568|  4.76M|        std::memcpy(result + index + olength - i - 5, DIGIT_TABLE() + d0, 2);
  569|  4.76M|        std::memcpy(result + index + olength - i - 7, DIGIT_TABLE() + d1, 2);
  570|  4.76M|        i += 8;
  571|  4.76M|    }
  572|  4.87M|    uint32_t output2 = (std::uint32_t)output;
  573|  14.3M|    while (output2 >= 10000)
  ------------------
  |  Branch (573:12): [True: 9.47M, False: 4.87M]
  ------------------
  574|  9.47M|    {
  575|  9.47M|#ifdef __clang__ // https://bugs.llvm.org/show_bug.cgi?id=38217
  576|  9.47M|        const uint32_t c = output2 - 10000 * (output2 / 10000);
  577|       |#else
  578|       |        const uint32_t c = output2 % 10000;
  579|       |#endif
  580|  9.47M|        output2 /= 10000;
  581|  9.47M|        const uint32_t c0 = (c % 100) << 1;
  582|  9.47M|        const uint32_t c1 = (c / 100) << 1;
  583|  9.47M|        memcpy(result + index + olength - i - 1, DIGIT_TABLE() + c0, 2);
  584|  9.47M|        memcpy(result + index + olength - i - 3, DIGIT_TABLE() + c1, 2);
  585|  9.47M|        i += 4;
  586|  9.47M|    }
  587|  4.87M|    if (output2 >= 100) {
  ------------------
  |  Branch (587:9): [True: 52.2k, False: 4.82M]
  ------------------
  588|  52.2k|        const uint32_t c = (output2 % 100) << 1;
  589|  52.2k|        output2 /= 100;
  590|  52.2k|        memcpy(result + index + olength - i - 1, DIGIT_TABLE() + c, 2);
  591|  52.2k|        i += 2;
  592|  52.2k|    }
  593|  4.87M|    if (output2 >= 10) {
  ------------------
  |  Branch (593:9): [True: 66.0k, False: 4.80M]
  ------------------
  594|  66.0k|        const uint32_t c = output2 << 1;
  595|       |        // We can't use memcpy here: the decimal dot goes between these two digits.
  596|  66.0k|        result[index + olength - i] = DIGIT_TABLE()[c + 1];
  597|  66.0k|        result[index] = DIGIT_TABLE()[c];
  598|  66.0k|    }
  599|  4.80M|    else {
  600|  4.80M|        result[index] = (char)('0' + output2);
  601|  4.80M|    }
  602|       |
  603|       |    // Print decimal point if needed.
  604|  4.87M|    if (olength > 1) {
  ------------------
  |  Branch (604:9): [True: 4.78M, False: 87.9k]
  ------------------
  605|  4.78M|        result[index + 1] = '.';
  606|  4.78M|        index += olength + 1;
  607|  4.78M|    }
  608|  87.9k|    else {
  609|  87.9k|        ++index;
  610|  87.9k|    }
  611|       |
  612|       |    // Print the exponent.
  613|  4.87M|    result[index++] = 'E';
  614|  4.87M|    int32_t exp = v.exponent + (int32_t)olength - 1;
  615|  4.87M|    if (exp < 0) {
  ------------------
  |  Branch (615:9): [True: 58.3k, False: 4.81M]
  ------------------
  616|  58.3k|        result[index++] = '-';
  617|  58.3k|        exp = -exp;
  618|  58.3k|    }
  619|       |
  620|  4.87M|    if (exp >= 100) {
  ------------------
  |  Branch (620:9): [True: 2.70k, False: 4.87M]
  ------------------
  621|  2.70k|        const int32_t c = exp % 10;
  622|  2.70k|        memcpy(result + index, DIGIT_TABLE() + 2 * (exp / 10), 2);
  623|  2.70k|        result[index + 2] = (char)('0' + c);
  624|  2.70k|        index += 3;
  625|  2.70k|    }
  626|  4.87M|    else if (exp >= 10) {
  ------------------
  |  Branch (626:14): [True: 4.82M, False: 48.6k]
  ------------------
  627|  4.82M|        memcpy(result + index, DIGIT_TABLE() + 2 * exp, 2);
  628|  4.82M|        index += 2;
  629|  4.82M|    }
  630|  48.6k|    else {
  631|  48.6k|        result[index++] = (char)('0' + exp);
  632|  48.6k|    }
  633|       |
  634|  4.87M|    return index;
  635|  4.87M|}
_ZN5boost4json6detail3ryu6detail15decimalLength17Em:
  231|  4.87M|{
  232|       |    // This is slightly faster than a loop.
  233|       |    // The average output length is 16.38 digits, so we check high-to-low.
  234|       |    // Function precondition: v is not an 18, 19, or 20-digit number.
  235|       |    // (17 digits are sufficient for round-tripping.)
  236|  4.87M|    BOOST_ASSERT(v < 100000000000000000L);
  ------------------
  |  |   60|  4.87M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  237|  4.87M|    if (v >= 10000000000000000L) { return 17; }
  ------------------
  |  Branch (237:9): [True: 4.71M, False: 163k]
  ------------------
  238|   163k|    if (v >= 1000000000000000L) { return 16; }
  ------------------
  |  Branch (238:9): [True: 44.2k, False: 118k]
  ------------------
  239|   118k|    if (v >= 100000000000000L) { return 15; }
  ------------------
  |  Branch (239:9): [True: 637, False: 118k]
  ------------------
  240|   118k|    if (v >= 10000000000000L) { return 14; }
  ------------------
  |  Branch (240:9): [True: 447, False: 117k]
  ------------------
  241|   117k|    if (v >= 1000000000000L) { return 13; }
  ------------------
  |  Branch (241:9): [True: 2.10k, False: 115k]
  ------------------
  242|   115k|    if (v >= 100000000000L) { return 12; }
  ------------------
  |  Branch (242:9): [True: 741, False: 114k]
  ------------------
  243|   114k|    if (v >= 10000000000L) { return 11; }
  ------------------
  |  Branch (243:9): [True: 490, False: 114k]
  ------------------
  244|   114k|    if (v >= 1000000000L) { return 10; }
  ------------------
  |  Branch (244:9): [True: 508, False: 113k]
  ------------------
  245|   113k|    if (v >= 100000000L) { return 9; }
  ------------------
  |  Branch (245:9): [True: 736, False: 113k]
  ------------------
  246|   113k|    if (v >= 10000000L) { return 8; }
  ------------------
  |  Branch (246:9): [True: 663, False: 112k]
  ------------------
  247|   112k|    if (v >= 1000000L) { return 7; }
  ------------------
  |  Branch (247:9): [True: 872, False: 111k]
  ------------------
  248|   111k|    if (v >= 100000L) { return 6; }
  ------------------
  |  Branch (248:9): [True: 1.50k, False: 110k]
  ------------------
  249|   110k|    if (v >= 10000L) { return 5; }
  ------------------
  |  Branch (249:9): [True: 1.66k, False: 108k]
  ------------------
  250|   108k|    if (v >= 1000L) { return 4; }
  ------------------
  |  Branch (250:9): [True: 1.97k, False: 106k]
  ------------------
  251|   106k|    if (v >= 100L) { return 3; }
  ------------------
  |  Branch (251:9): [True: 2.62k, False: 103k]
  ------------------
  252|   103k|    if (v >= 10L) { return 2; }
  ------------------
  |  Branch (252:9): [True: 15.8k, False: 87.9k]
  ------------------
  253|  87.9k|    return 1;
  254|   103k|}

_ZN5boost4json6detail16count_whitespaceEPKcS3_:
  425|  15.6M|{
  426|  15.6M|    if( p == end )
  ------------------
  |  Branch (426:9): [True: 8.30k, False: 15.5M]
  ------------------
  427|  8.30k|    {
  428|  8.30k|        return p;
  429|  8.30k|    }
  430|       |
  431|  15.5M|    if( static_cast<unsigned char>( *p ) > 0x20 )
  ------------------
  |  Branch (431:9): [True: 15.5M, False: 18.0k]
  ------------------
  432|  15.5M|    {
  433|  15.5M|        return p;
  434|  15.5M|    }
  435|       |
  436|  18.0k|    __m128i const q1 = _mm_set1_epi8( ' ' );
  437|  18.0k|    __m128i const q2 = _mm_set1_epi8( '\n' );
  438|  18.0k|    __m128i const q3 = _mm_set1_epi8( 4 ); // '\t' | 4 == '\r'
  439|  18.0k|    __m128i const q4 = _mm_set1_epi8( '\r' );
  440|       |
  441|  22.7k|    while( end - p >= 16 )
  ------------------
  |  Branch (441:12): [True: 21.2k, False: 1.43k]
  ------------------
  442|  21.2k|    {
  443|  21.2k|        __m128i v0 = _mm_loadu_si128( (__m128i const*)p );
  444|       |
  445|  21.2k|        __m128i w0 = _mm_or_si128(
  446|  21.2k|            _mm_cmpeq_epi8( v0, q1 ),
  447|  21.2k|            _mm_cmpeq_epi8( v0, q2 ));
  448|  21.2k|        __m128i v1 = _mm_or_si128( v0, q3 );
  449|  21.2k|        __m128i w1 = _mm_cmpeq_epi8( v1, q4 );
  450|  21.2k|        __m128i w2 = _mm_or_si128( w0, w1 );
  451|       |
  452|  21.2k|        int m = _mm_movemask_epi8( w2 ) ^ 0xFFFF;
  453|       |
  454|  21.2k|        if( m != 0 )
  ------------------
  |  Branch (454:13): [True: 16.5k, False: 4.71k]
  ------------------
  455|  16.5k|        {
  456|  16.5k|#if defined(__GNUC__) || defined(__clang__)
  457|  16.5k|            std::size_t c = __builtin_ffs( m ) - 1;
  458|       |#else
  459|       |            unsigned long index;
  460|       |            _BitScanForward( &index, m );
  461|       |            std::size_t c = index;
  462|       |#endif
  463|       |
  464|  16.5k|            p += c;
  465|  16.5k|            return p;
  466|  16.5k|        }
  467|       |
  468|  4.71k|        p += 16;
  469|  4.71k|    }
  470|       |
  471|  3.74k|    while( p != end )
  ------------------
  |  Branch (471:12): [True: 3.19k, False: 548]
  ------------------
  472|  3.19k|    {
  473|  3.19k|        if( *p != ' ' && *p != '\t' && *p != '\r' && *p != '\n' )
  ------------------
  |  Branch (473:13): [True: 2.51k, False: 674]
  |  Branch (473:26): [True: 1.78k, False: 730]
  |  Branch (473:40): [True: 1.36k, False: 427]
  |  Branch (473:54): [True: 890, False: 472]
  ------------------
  474|    890|        {
  475|    890|            return p;
  476|    890|        }
  477|       |
  478|  2.30k|        ++p;
  479|  2.30k|    }
  480|       |
  481|    548|    return p;
  482|  1.43k|}
_ZN5boost4json6detail12count_digitsEPKc:
  269|  7.23M|{
  270|  7.23M|    __m128i v1 = _mm_loadu_si128( (__m128i const*)p );
  271|  7.23M|    v1 = _mm_add_epi8(v1, _mm_set1_epi8(70));
  272|  7.23M|    v1 = _mm_cmplt_epi8(v1, _mm_set1_epi8(118));
  273|       |
  274|  7.23M|    int m = _mm_movemask_epi8(v1);
  275|       |
  276|  7.23M|    int n;
  277|       |
  278|  7.23M|    if( m == 0 )
  ------------------
  |  Branch (278:9): [True: 35.0k, False: 7.19M]
  ------------------
  279|  35.0k|    {
  280|  35.0k|        n = 16;
  281|  35.0k|    }
  282|  7.19M|    else
  283|  7.19M|    {
  284|  7.19M|#if defined(__GNUC__) || defined(__clang__)
  285|  7.19M|        n = __builtin_ffs( m ) - 1;
  286|       |#else
  287|       |        unsigned long index;
  288|       |        _BitScanForward( &index, m );
  289|       |        n = static_cast<int>(index);
  290|       |#endif
  291|  7.19M|    }
  292|       |
  293|  7.23M|    return n;
  294|  7.23M|}
_ZN5boost4json6detail14parse_unsignedEmPKcm:
  317|  7.22M|{
  318|  7.42M|    while( n >= 4 )
  ------------------
  |  Branch (318:12): [True: 197k, False: 7.22M]
  ------------------
  319|   197k|    {
  320|       |        // faster on on clang for x86,
  321|       |        // slower on gcc
  322|   197k|#ifdef __clang__
  323|   197k|        r = r * 10 + p[0] - '0';
  324|   197k|        r = r * 10 + p[1] - '0';
  325|   197k|        r = r * 10 + p[2] - '0';
  326|   197k|        r = r * 10 + p[3] - '0';
  327|       |#else
  328|       |        uint32_t v;
  329|       |        std::memcpy( &v, p, 4 );
  330|       |
  331|       |        v -= 0x30303030;
  332|       |
  333|       |        unsigned w0 = v & 0xFF;
  334|       |        unsigned w1 = (v >> 8) & 0xFF;
  335|       |        unsigned w2 = (v >> 16) & 0xFF;
  336|       |        unsigned w3 = (v >> 24);
  337|       |
  338|       |#ifdef BOOST_JSON_BIG_ENDIAN
  339|       |        r = (((r * 10 + w3) * 10 + w2) * 10 + w1) * 10 + w0;
  340|       |#else
  341|       |        r = (((r * 10 + w0) * 10 + w1) * 10 + w2) * 10 + w3;
  342|       |#endif
  343|       |#endif
  344|   197k|        p += 4;
  345|   197k|        n -= 4;
  346|   197k|    }
  347|       |
  348|  7.22M|    switch( n )
  ------------------
  |  Branch (348:13): [True: 0, False: 7.22M]
  ------------------
  349|  7.22M|    {
  350|  49.9k|    case 0:
  ------------------
  |  Branch (350:5): [True: 49.9k, False: 7.17M]
  ------------------
  351|  49.9k|        break;
  352|  7.06M|    case 1:
  ------------------
  |  Branch (352:5): [True: 7.06M, False: 169k]
  ------------------
  353|  7.06M|        r = r * 10 + p[0] - '0';
  354|  7.06M|        break;
  355|  83.4k|    case 2:
  ------------------
  |  Branch (355:5): [True: 83.4k, False: 7.14M]
  ------------------
  356|  83.4k|        r = r * 10 + p[0] - '0';
  357|  83.4k|        r = r * 10 + p[1] - '0';
  358|  83.4k|        break;
  359|  36.1k|    case 3:
  ------------------
  |  Branch (359:5): [True: 36.1k, False: 7.19M]
  ------------------
  360|  36.1k|        r = r * 10 + p[0] - '0';
  361|  36.1k|        r = r * 10 + p[1] - '0';
  362|  36.1k|        r = r * 10 + p[2] - '0';
  363|  36.1k|        break;
  364|  7.22M|    }
  365|  7.22M|    return r;
  366|  7.22M|}
_ZN5boost4json6detail11count_validILb1EEEPKcS4_S4_:
   39|   249k|{
   40|   249k|    __m128i const q1 = _mm_set1_epi8( '\x22' ); // '"'
   41|   249k|    __m128i const q2 = _mm_set1_epi8( '\\' ); // '\\'
   42|   249k|    __m128i const q3 = _mm_set1_epi8( 0x1F );
   43|       |
   44|  1.75M|    while(end - p >= 16)
  ------------------
  |  Branch (44:11): [True: 1.75M, False: 2.20k]
  ------------------
   45|  1.75M|    {
   46|  1.75M|        __m128i v1 = _mm_loadu_si128( (__m128i const*)p );
   47|  1.75M|        __m128i v2 = _mm_cmpeq_epi8( v1, q1 ); // quote
   48|  1.75M|        __m128i v3 = _mm_cmpeq_epi8( v1, q2 ); // backslash
   49|  1.75M|        __m128i v4 = _mm_or_si128( v2, v3 ); // combine quotes and backslash
   50|  1.75M|        __m128i v5 = _mm_min_epu8( v1, q3 );
   51|  1.75M|        __m128i v6 = _mm_cmpeq_epi8( v5, v1 ); // controls
   52|  1.75M|        __m128i v7 = _mm_or_si128( v4, v6 ); // combine with control
   53|       |
   54|  1.75M|        int w = _mm_movemask_epi8( v7 );
   55|       |
   56|  1.75M|        if( w != 0 )
  ------------------
  |  Branch (56:13): [True: 247k, False: 1.50M]
  ------------------
   57|   247k|        {
   58|   247k|            int m;
   59|   247k|#if defined(__GNUC__) || defined(__clang__)
   60|   247k|            m = __builtin_ffs( w ) - 1;
   61|       |#else
   62|       |            unsigned long index;
   63|       |            _BitScanForward( &index, w );
   64|       |            m = index;
   65|       |#endif
   66|   247k|            return p + m;
   67|   247k|        }
   68|       |
   69|  1.50M|        p += 16;
   70|  1.50M|    }
   71|       |
   72|  4.80k|    while(p != end)
  ------------------
  |  Branch (72:11): [True: 4.50k, False: 303]
  ------------------
   73|  4.50k|    {
   74|  4.50k|        const unsigned char c = *p;
   75|  4.50k|        if(c == '\x22' || c == '\\' || c < 0x20)
  ------------------
  |  Branch (75:12): [True: 1.37k, False: 3.12k]
  |  Branch (75:27): [True: 503, False: 2.62k]
  |  Branch (75:40): [True: 22, False: 2.59k]
  ------------------
   76|  1.90k|            break;
   77|  2.59k|        ++p;
   78|  2.59k|    }
   79|       |
   80|  2.20k|    return p;
   81|   249k|}
_ZN5boost4json6detail11count_validILb0EEEPKcS4_S4_:
   89|  11.9k|{
   90|  11.9k|    __m128i const q1 = _mm_set1_epi8( '\x22' ); // '"'
   91|  11.9k|    __m128i const q2 = _mm_set1_epi8( '\\' );
   92|  11.9k|    __m128i const q3 = _mm_set1_epi8( 0x20 );
   93|       |
   94|  22.8k|    while(end - p >= 16)
  ------------------
  |  Branch (94:11): [True: 21.5k, False: 1.26k]
  ------------------
   95|  21.5k|    {
   96|  21.5k|        __m128i v1 = _mm_loadu_si128( (__m128i const*)p );
   97|       |
   98|  21.5k|        __m128i v2 = _mm_cmpeq_epi8( v1, q1 );
   99|  21.5k|        __m128i v3 = _mm_cmpeq_epi8( v1, q2 );
  100|  21.5k|        __m128i v4 = _mm_cmplt_epi8( v1, q3 );
  101|       |
  102|  21.5k|        __m128i v5 = _mm_or_si128( v2, v3 );
  103|  21.5k|        __m128i v6 = _mm_or_si128( v5, v4 );
  104|       |
  105|  21.5k|        int w = _mm_movemask_epi8( v6 );
  106|       |
  107|  21.5k|        if( w != 0 )
  ------------------
  |  Branch (107:13): [True: 10.6k, False: 10.9k]
  ------------------
  108|  10.6k|        {
  109|  10.6k|            int m;
  110|  10.6k|#if defined(__GNUC__) || defined(__clang__)
  111|  10.6k|            m = __builtin_ffs( w ) - 1;
  112|       |#else
  113|       |            unsigned long index;
  114|       |            _BitScanForward( &index, w );
  115|       |            m = index;
  116|       |#endif
  117|  10.6k|            p += m;
  118|  10.6k|            break;
  119|  10.6k|        }
  120|       |
  121|  10.9k|        p += 16;
  122|  10.9k|    }
  123|       |
  124|  2.17M|    while(p != end)
  ------------------
  |  Branch (124:11): [True: 2.17M, False: 312]
  ------------------
  125|  2.17M|    {
  126|  2.17M|        const unsigned char c = *p;
  127|  2.17M|        if(c == '\x22' || c == '\\' || c < 0x20)
  ------------------
  |  Branch (127:12): [True: 9.20k, False: 2.16M]
  |  Branch (127:27): [True: 2.11k, False: 2.16M]
  |  Branch (127:40): [True: 21, False: 2.16M]
  ------------------
  128|  11.3k|            break;
  129|  2.16M|        if(c < 0x80)
  ------------------
  |  Branch (129:12): [True: 2.15M, False: 3.32k]
  ------------------
  130|  2.15M|        {
  131|  2.15M|            ++p;
  132|  2.15M|            continue;
  133|  2.15M|        }
  134|       |        // validate utf-8
  135|  3.32k|        uint16_t first = classify_utf8(c);
  136|  3.32k|        uint8_t len = first & 0xFF;
  137|  3.32k|        if(BOOST_JSON_UNLIKELY(end - p < len))
  ------------------
  |  |  179|  3.32k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 31, False: 3.29k]
  |  |  ------------------
  ------------------
  138|     31|            break;
  139|  3.29k|        if(BOOST_JSON_UNLIKELY(! is_valid_utf8(p, first)))
  ------------------
  |  |  179|  3.29k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 221, False: 3.07k]
  |  |  ------------------
  ------------------
  140|    221|            break;
  141|  3.07k|        p += len;
  142|  3.07k|    }
  143|       |
  144|  11.9k|    return p;
  145|  11.9k|}
_ZN5boost4json6detail15count_unescapedEPKcm:
  208|  22.6k|{
  209|       |
  210|  22.6k|    __m128i const q1 = _mm_set1_epi8( '\x22' ); // '"'
  211|  22.6k|    __m128i const q2 = _mm_set1_epi8( '\\' ); // '\\'
  212|  22.6k|    __m128i const q3 = _mm_set1_epi8( 0x1F );
  213|       |
  214|  22.6k|    char const * s0 = s;
  215|       |
  216|   240k|    while( n >= 16 )
  ------------------
  |  Branch (216:12): [True: 223k, False: 16.7k]
  ------------------
  217|   223k|    {
  218|   223k|        __m128i v1 = _mm_loadu_si128( (__m128i const*)s );
  219|   223k|        __m128i v2 = _mm_cmpeq_epi8( v1, q1 ); // quote
  220|   223k|        __m128i v3 = _mm_cmpeq_epi8( v1, q2 ); // backslash
  221|   223k|        __m128i v4 = _mm_or_si128( v2, v3 ); // combine quotes and backslash
  222|   223k|        __m128i v5 = _mm_min_epu8( v1, q3 );
  223|   223k|        __m128i v6 = _mm_cmpeq_epi8( v5, v1 ); // controls
  224|   223k|        __m128i v7 = _mm_or_si128( v4, v6 ); // combine with control
  225|       |
  226|   223k|        int w = _mm_movemask_epi8( v7 );
  227|       |
  228|   223k|        if( w != 0 )
  ------------------
  |  Branch (228:13): [True: 5.86k, False: 218k]
  ------------------
  229|  5.86k|        {
  230|  5.86k|            int m;
  231|  5.86k|#if defined(__GNUC__) || defined(__clang__)
  232|  5.86k|            m = __builtin_ffs( w ) - 1;
  233|       |#else
  234|       |            unsigned long index;
  235|       |            _BitScanForward( &index, w );
  236|       |            m = index;
  237|       |#endif
  238|       |
  239|  5.86k|            s += m;
  240|  5.86k|            break;
  241|  5.86k|        }
  242|       |
  243|   218k|        s += 16;
  244|   218k|        n -= 16;
  245|   218k|    }
  246|       |
  247|  22.6k|    return s - s0;
  248|  22.6k|}

_ZNK5boost4json6detail5stack5emptyEv:
   42|  5.99M|    {
   43|  5.99M|        return size_ == 0;
   44|  5.99M|    }
_ZN5boost4json6detail5stack5clearEv:
   48|  18.0k|    {
   49|  18.0k|        size_ = 0;
   50|  18.0k|    }
_ZN5boost4json6detail5stackC2Ev:
   33|  10.8k|    stack() = default;
_ZN5boost4json6detail5stack4pushINS0_10serializer5stateEEEvRKT_:
   59|  10.8k|    {
   60|  10.8k|        auto const n = sizeof(T);
   61|       |        // If this assert goes off, it
   62|       |        // means the calling code did not
   63|       |        // reserve enough to prevent a
   64|       |        // reallocation.
   65|       |        //BOOST_ASSERT(cap_ >= size_ + n);
   66|  10.8k|        reserve(size_ + n);
   67|  10.8k|        std::memcpy(
   68|  10.8k|            base_ + size_, &t, n);
   69|  10.8k|        size_ += n;
   70|  10.8k|    }
_ZN5boost4json6detail5stack3popINS0_10serializer5stateEEEvRT_:
   96|  10.8k|    {
   97|  10.8k|        auto const n = sizeof(T);
   98|  10.8k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  10.8k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   99|  10.8k|        size_ -= n;
  100|  10.8k|        std::memcpy(
  101|  10.8k|            &t, base_ + size_, n);
  102|  10.8k|    }
_ZN5boost4json6detail5stack14push_uncheckedINS0_12basic_parserINS1_7handlerEE5stateEEEvRKT_:
   75|  14.6k|    {
   76|  14.6k|        auto const n = sizeof(T);
   77|  14.6k|        BOOST_ASSERT(size_ + n <= cap_);
  ------------------
  |  |   60|  14.6k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   78|  14.6k|        std::memcpy(
   79|  14.6k|            base_ + size_, &t, n);
   80|  14.6k|        size_ += n;
   81|  14.6k|    }
_ZN5boost4json6detail5stack14push_uncheckedImEEvRKT_:
   75|  3.98k|    {
   76|  3.98k|        auto const n = sizeof(T);
   77|  3.98k|        BOOST_ASSERT(size_ + n <= cap_);
  ------------------
  |  |   60|  3.98k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   78|  3.98k|        std::memcpy(
   79|  3.98k|            base_ + size_, &t, n);
   80|  3.98k|        size_ += n;
   81|  3.98k|    }
_ZN5boost4json6detail5stack3popINS0_12basic_parserINS1_7handlerEE5stateEEEvRT_:
   96|  14.6k|    {
   97|  14.6k|        auto const n = sizeof(T);
   98|  14.6k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  14.6k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   99|  14.6k|        size_ -= n;
  100|  14.6k|        std::memcpy(
  101|  14.6k|            &t, base_ + size_, n);
  102|  14.6k|    }
_ZN5boost4json6detail5stack3popImEEvRT_:
   96|  3.98k|    {
   97|  3.98k|        auto const n = sizeof(T);
   98|  3.98k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  3.98k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   99|  3.98k|        size_ -= n;
  100|  3.98k|        std::memcpy(
  101|  3.98k|            &t, base_ + size_, n);
  102|  3.98k|    }
_ZN5boost4json6detail5stack4peekINS0_12basic_parserINS1_7handlerEE5stateEEEvRT_:
   86|  14.4k|    {
   87|  14.4k|        auto const n = sizeof(T);
   88|  14.4k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  14.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   89|  14.4k|        std::memcpy(&t,
   90|  14.4k|            base_ + size_ - n, n);
   91|  14.4k|    }
_ZN5boost4json6detail5stack4peekINS0_10serializer5stateEEEvRT_:
   86|  10.4k|    {
   87|  10.4k|        auto const n = sizeof(T);
   88|  10.4k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  10.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   89|  10.4k|        std::memcpy(&t,
   90|  10.4k|            base_ + size_ - n, n);
   91|  10.4k|    }
_ZN5boost4json6detail5stack4pushIPKNS0_5arrayEEEvRKT_:
   59|  4.76k|    {
   60|  4.76k|        auto const n = sizeof(T);
   61|       |        // If this assert goes off, it
   62|       |        // means the calling code did not
   63|       |        // reserve enough to prevent a
   64|       |        // reallocation.
   65|       |        //BOOST_ASSERT(cap_ >= size_ + n);
   66|  4.76k|        reserve(size_ + n);
   67|  4.76k|        std::memcpy(
   68|  4.76k|            base_ + size_, &t, n);
   69|  4.76k|        size_ += n;
   70|  4.76k|    }
_ZN5boost4json6detail5stack4pushIPKNS0_5valueEEEvRKT_:
   59|  4.76k|    {
   60|  4.76k|        auto const n = sizeof(T);
   61|       |        // If this assert goes off, it
   62|       |        // means the calling code did not
   63|       |        // reserve enough to prevent a
   64|       |        // reallocation.
   65|       |        //BOOST_ASSERT(cap_ >= size_ + n);
   66|  4.76k|        reserve(size_ + n);
   67|  4.76k|        std::memcpy(
   68|  4.76k|            base_ + size_, &t, n);
   69|  4.76k|        size_ += n;
   70|  4.76k|    }
_ZN5boost4json6detail5stack3popIPKNS0_5valueEEEvRT_:
   96|  4.76k|    {
   97|  4.76k|        auto const n = sizeof(T);
   98|  4.76k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  4.76k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   99|  4.76k|        size_ -= n;
  100|  4.76k|        std::memcpy(
  101|  4.76k|            &t, base_ + size_, n);
  102|  4.76k|    }
_ZN5boost4json6detail5stack3popIPKNS0_5arrayEEEvRT_:
   96|  4.76k|    {
   97|  4.76k|        auto const n = sizeof(T);
   98|  4.76k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  4.76k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   99|  4.76k|        size_ -= n;
  100|  4.76k|        std::memcpy(
  101|  4.76k|            &t, base_ + size_, n);
  102|  4.76k|    }
_ZN5boost4json6detail5stack4pushIPKNS0_6objectEEEvRKT_:
   59|  3.97k|    {
   60|  3.97k|        auto const n = sizeof(T);
   61|       |        // If this assert goes off, it
   62|       |        // means the calling code did not
   63|       |        // reserve enough to prevent a
   64|       |        // reallocation.
   65|       |        //BOOST_ASSERT(cap_ >= size_ + n);
   66|  3.97k|        reserve(size_ + n);
   67|  3.97k|        std::memcpy(
   68|  3.97k|            base_ + size_, &t, n);
   69|  3.97k|        size_ += n;
   70|  3.97k|    }
_ZN5boost4json6detail5stack4pushIPKNS0_14key_value_pairEEEvRKT_:
   59|  3.97k|    {
   60|  3.97k|        auto const n = sizeof(T);
   61|       |        // If this assert goes off, it
   62|       |        // means the calling code did not
   63|       |        // reserve enough to prevent a
   64|       |        // reallocation.
   65|       |        //BOOST_ASSERT(cap_ >= size_ + n);
   66|  3.97k|        reserve(size_ + n);
   67|  3.97k|        std::memcpy(
   68|  3.97k|            base_ + size_, &t, n);
   69|  3.97k|        size_ += n;
   70|  3.97k|    }
_ZN5boost4json6detail5stack3popIPKNS0_14key_value_pairEEEvRT_:
   96|  3.97k|    {
   97|  3.97k|        auto const n = sizeof(T);
   98|  3.97k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  3.97k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   99|  3.97k|        size_ -= n;
  100|  3.97k|        std::memcpy(
  101|  3.97k|            &t, base_ + size_, n);
  102|  3.97k|    }
_ZN5boost4json6detail5stack3popIPKNS0_6objectEEEvRT_:
   96|  3.97k|    {
   97|  3.97k|        auto const n = sizeof(T);
   98|  3.97k|        BOOST_ASSERT(size_ >= n);
  ------------------
  |  |   60|  3.97k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   99|  3.97k|        size_ -= n;
  100|  3.97k|        std::memcpy(
  101|  3.97k|            &t, base_ + size_, n);
  102|  3.97k|    }

_ZN5boost4json6detail12const_streamC2EPKcm:
   32|  44.8k|    {
   33|  44.8k|    }
_ZNK5boost4json6detail12const_stream6remainEv:
   44|  49.6k|    {
   45|  49.6k|        return end_ - p_;
   46|  49.6k|    }
_ZNK5boost4json6detail12const_stream4dataEv:
   50|  41.7k|    {
   51|  41.7k|        return p_;
   52|  41.7k|    }
_ZNK5boost4json6detail12const_streamcvbEv:
   55|  25.4M|    {
   56|  25.4M|        return p_ < end_;
   57|  25.4M|    }
_ZNK5boost4json6detail12const_streamdeEv:
   62|  25.4M|    {
   63|  25.4M|        BOOST_ASSERT(p_ < end_);
  ------------------
  |  |   60|  25.4M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   64|  25.4M|        return *p_;
   65|  25.4M|    }
_ZN5boost4json6detail12const_streamppEv:
   70|  25.4M|    {
   71|  25.4M|        BOOST_ASSERT(p_ < end_);
  ------------------
  |  |   60|  25.4M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   72|  25.4M|        ++p_;
   73|  25.4M|        return *this;
   74|  25.4M|    }
_ZN5boost4json6detail12const_stream4skipEm:
   78|  15.3k|    {
   79|  15.3k|        BOOST_ASSERT(n <= remain());
  ------------------
  |  |   60|  15.3k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   80|  15.3k|        p_ += n;
   81|  15.3k|    }
_ZN5boost4json6detail18local_const_streamC2ERNS1_12const_streamE:
  102|  42.0k|    {
  103|  42.0k|    }
_ZN5boost4json6detail18local_const_streamD2Ev:
  106|  42.0k|    {
  107|  42.0k|        src_.p_ = p_;
  108|  42.0k|    }
_ZN5boost4json6detail20const_stream_wrapperC2ERPKcS4_:
  133|  7.84M|    {
  134|  7.84M|    }
_ZN5boost4json6detail20const_stream_wrapperppEv:
  137|  51.1M|    {
  138|  51.1M|        ++p_;
  139|  51.1M|    }
_ZN5boost4json6detail20const_stream_wrapperpLEm:
  142|  8.32M|    {
  143|  8.32M|        p_ += n;
  144|  8.32M|    }
_ZN5boost4json6detail20const_stream_wrapperaSEPKc:
  147|  23.6M|    {
  148|  23.6M|        p_ = p;
  149|  23.6M|    }
_ZNK5boost4json6detail20const_stream_wrapperdeEv:
  152|  80.5M|    {
  153|  80.5M|        return *p_;
  154|  80.5M|    }
_ZNK5boost4json6detail20const_stream_wrappercvbEv:
  157|  39.0M|    {
  158|  39.0M|        return p_ < end_;
  159|  39.0M|    }
_ZNK5boost4json6detail20const_stream_wrapper5beginEv:
  162|  62.6M|    {
  163|  62.6M|        return p_;
  164|  62.6M|    }
_ZNK5boost4json6detail20const_stream_wrapper3endEv:
  167|  15.8M|    {
  168|  15.8M|        return end_;
  169|  15.8M|    }
_ZNK5boost4json6detail20const_stream_wrapper6remainEv:
  172|  7.50M|    {
  173|  7.50M|        return end_ - p_;
  174|  7.50M|    }
_ZNK5boost4json6detail20const_stream_wrapper6remainEPKc:
  177|    128|    {
  178|    128|        return end_ - p;
  179|    128|    }
_ZNK5boost4json6detail20const_stream_wrapper4usedEPKc:
  182|  7.74M|    {
  183|  7.74M|        return p_ - p;
  184|  7.74M|    }
_ZN5boost4json6detail20clipped_const_streamC2ERPKcS4_:
  198|  20.2k|    {
  199|  20.2k|    }
_ZN5boost4json6detail20clipped_const_streamaSEPKc:
  202|    609|    {
  203|    609|        p_ = p;
  204|    609|    }
_ZNK5boost4json6detail20clipped_const_stream3endEv:
  207|    687|    {
  208|    687|        return clip_;
  209|    687|    }
_ZNK5boost4json6detail20clipped_const_streamcvbEv:
  212|  25.3M|    {
  213|  25.3M|        return p_ < clip_;
  214|  25.3M|    }
_ZNK5boost4json6detail20clipped_const_stream6remainEv:
  217|  1.04M|    {
  218|  1.04M|        return clip_ - p_;
  219|  1.04M|    }
_ZN5boost4json6detail20clipped_const_stream4clipEm:
  228|  28.0k|    {
  229|  28.0k|        if(static_cast<std::size_t>(
  ------------------
  |  Branch (229:12): [True: 20.8k, False: 7.17k]
  ------------------
  230|  28.0k|            end_ - p_) > n)
  231|  20.8k|            clip_ = p_ + n;
  232|  7.17k|        else
  233|  7.17k|            clip_ = end_;
  234|  28.0k|    }
_ZN5boost4json6detail6streamC2EPcm:
  252|  7.01k|    {
  253|  7.01k|    }
_ZNK5boost4json6detail6stream4usedEPc:
  257|  7.01k|    {
  258|  7.01k|        return static_cast<
  259|  7.01k|            size_t>(p_ - begin);
  260|  7.01k|    }
_ZNK5boost4json6detail6stream6remainEv:
  264|  6.73M|    {
  265|  6.73M|        return end_ - p_;
  266|  6.73M|    }
_ZN5boost4json6detail6stream4dataEv:
  270|  6.55M|    {
  271|  6.55M|        return p_;
  272|  6.55M|    }
_ZNK5boost4json6detail6streamcvbEv:
  275|  32.4M|    {
  276|  32.4M|        return p_ < end_;
  277|  32.4M|    }
_ZN5boost4json6detail6stream6appendEPKcm:
  301|   165k|    {
  302|   165k|        BOOST_ASSERT(remain() >= n);
  ------------------
  |  |   60|   165k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  303|   165k|        std::memcpy(p_, src, n);
  304|   165k|        p_ += n;
  305|   165k|    }
_ZN5boost4json6detail6stream6appendEc:
  310|  32.5M|    {
  311|  32.5M|        BOOST_ASSERT(p_ < end_);
  ------------------
  |  |   60|  32.5M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  312|  32.5M|        *p_++ = c;
  313|  32.5M|    }
_ZN5boost4json6detail6stream7advanceEm:
  317|  6.55M|    {
  318|  6.55M|        BOOST_ASSERT(remain() >= n);
  ------------------
  |  |   60|  6.55M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  319|  6.55M|        p_ += n;
  320|  6.55M|    }
_ZN5boost4json6detail12local_streamC2ERNS1_6streamE:
  334|  6.62M|    {
  335|  6.62M|    }
_ZN5boost4json6detail12local_streamD2Ev:
  338|  6.62M|    {
  339|  6.62M|        src_.p_ = p_;
  340|  6.62M|    }

_ZN5boost4json6detail11string_impl8max_sizeEv:
  102|  60.4k|    {
  103|       |        // max_size depends on the address model
  104|  60.4k|        using min = std::integral_constant<std::size_t,
  105|  60.4k|            std::size_t(-1) - sizeof(table)>;
  106|  60.4k|        return min::value < BOOST_JSON_MAX_STRING_SIZE ?
  ------------------
  |  |  226|  60.4k|# define BOOST_JSON_MAX_STRING_SIZE  0x7ffffffe
  ------------------
  |  Branch (106:16): [Folded - Ignored]
  ------------------
  107|  60.4k|            min::value : BOOST_JSON_MAX_STRING_SIZE;
  ------------------
  |  |  226|  60.4k|# define BOOST_JSON_MAX_STRING_SIZE  0x7ffffffe
  ------------------
  108|  60.4k|    }
_ZNK5boost4json6detail11string_impl4sizeEv:
  190|  66.3k|    {
  191|  66.3k|        return s_.k == kind::string ?
  ------------------
  |  Branch (191:16): [True: 25.4k, False: 40.8k]
  ------------------
  192|  25.4k|            p_.t->size :
  193|  66.3k|            sbo_chars_ -
  194|  40.8k|                s_.buf[sbo_chars_];
  195|  66.3k|    }
_ZNK5boost4json6detail11string_impl8capacityEv:
  199|  60.6k|    {
  200|  60.6k|        return s_.k == kind::string ?
  ------------------
  |  Branch (200:16): [True: 0, False: 60.6k]
  ------------------
  201|      0|            p_.t->capacity :
  202|  60.6k|            sbo_chars_;
  203|  60.6k|    }
_ZN5boost4json6detail11string_impl4sizeEm:
  207|  12.7k|    {
  208|  12.7k|        if(s_.k == kind::string)
  ------------------
  |  Branch (208:12): [True: 12.7k, False: 0]
  ------------------
  209|  12.7k|            p_.t->size = static_cast<
  210|  12.7k|                std::uint32_t>(n);
  211|      0|        else
  212|      0|            s_.buf[sbo_chars_] =
  213|      0|                static_cast<char>(
  214|      0|                    sbo_chars_ - n);
  215|  12.7k|    }
_ZN5boost4json6detail11string_impl11release_keyERm:
  227|   184k|    {
  228|   184k|        BOOST_ASSERT(
  ------------------
  |  |   60|   184k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  229|   184k|            k_.k == key_string_);
  230|   184k|        n = k_.n;
  231|   184k|        auto const s = k_.s;
  232|       |        // prevent deallocate
  233|   184k|        k_.k = short_string_;
  234|   184k|        return s;
  235|   184k|    }
_ZN5boost4json6detail11string_impl7destroyERKNS0_11storage_ptrE:
  240|  88.3k|    {
  241|  88.3k|        if(s_.k == kind::string)
  ------------------
  |  Branch (241:12): [True: 14.3k, False: 74.0k]
  ------------------
  242|  14.3k|        {
  243|  14.3k|            sp->deallocate(p_.t,
  244|  14.3k|                sizeof(table) +
  245|  14.3k|                    p_.t->capacity + 1,
  246|  14.3k|                alignof(table));
  247|  14.3k|        }
  248|  74.0k|        else if(s_.k != key_string_)
  ------------------
  |  Branch (248:17): [True: 32.2k, False: 41.7k]
  ------------------
  249|  32.2k|        {
  250|       |            // do nothing
  251|  32.2k|        }
  252|  41.7k|        else
  253|  41.7k|        {
  254|  41.7k|            BOOST_ASSERT(
  ------------------
  |  |   60|  41.7k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  255|  41.7k|                s_.k == key_string_);
  256|       |            // VFALCO unfortunately the key string
  257|       |            // kind increases the cost of the destructor.
  258|       |            // This function should be skipped when using
  259|       |            // monotonic_resource.
  260|  41.7k|            sp->deallocate(k_.s, k_.n + 1);
  261|  41.7k|        }
  262|  88.3k|    }
_ZN5boost4json6detail11string_impl4termEm:
  315|  32.7k|    {
  316|  32.7k|        if(s_.k == short_string_)
  ------------------
  |  Branch (316:12): [True: 17.6k, False: 15.0k]
  ------------------
  317|  17.6k|        {
  318|  17.6k|            s_.buf[sbo_chars_] =
  319|  17.6k|                static_cast<char>(
  320|  17.6k|                    sbo_chars_ - n);
  321|  17.6k|            s_.buf[n] = 0;
  322|  17.6k|        }
  323|  15.0k|        else
  324|  15.0k|        {
  325|  15.0k|            p_.t->size = static_cast<
  326|  15.0k|                std::uint32_t>(n);
  327|  15.0k|            data()[n] = 0;
  328|  15.0k|        }
  329|  32.7k|    }
_ZN5boost4json6detail11string_impl4dataEv:
  333|   101k|    {
  334|   101k|        if(s_.k == short_string_)
  ------------------
  |  Branch (334:12): [True: 31.0k, False: 70.8k]
  ------------------
  335|  31.0k|            return s_.buf;
  336|  70.8k|        return reinterpret_cast<
  337|  70.8k|            char*>(p_.t + 1);
  338|   101k|    }
_ZNK5boost4json6detail11string_impl4dataEv:
  342|  27.3k|    {
  343|  27.3k|        if(s_.k == short_string_)
  ------------------
  |  Branch (343:12): [True: 14.6k, False: 12.6k]
  ------------------
  344|  14.6k|            return s_.buf;
  345|  12.6k|        return reinterpret_cast<
  346|  12.6k|            char const*>(p_.t + 1);
  347|  27.3k|    }

_ZN5boost4json6detail13utf8_sequence4saveEPKcm:
  131|   276k|    {
  132|   276k|        first_ = classify_utf8(*p );
  133|   276k|        if(remain >= length())
  ------------------
  |  Branch (133:12): [True: 275k, False: 640]
  ------------------
  134|   275k|            size_ = length();
  135|    640|        else
  136|    640|            size_ = static_cast<uint8_t>(remain);
  137|   276k|        std::memcpy(seq_, p, size_);
  138|   276k|    }
_ZNK5boost4json6detail13utf8_sequence6lengthEv:
  142|  1.38M|    {
  143|  1.38M|        return first_ & 0xFF;
  144|  1.38M|    }
_ZNK5boost4json6detail13utf8_sequence8completeEv:
  148|   276k|    {
  149|   276k|        return size_ >= length();
  150|   276k|    }
_ZN5boost4json6detail13utf8_sequence6appendEPKcm:
  157|    663|    {
  158|    663|        if(BOOST_JSON_UNLIKELY(needed() == 0))
  ------------------
  |  |  179|    663|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 0, False: 663]
  |  |  ------------------
  ------------------
  159|      0|            return true;
  160|    663|        if(BOOST_JSON_LIKELY(remain >= needed()))
  ------------------
  |  |  171|    663|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 585, False: 78]
  |  |  ------------------
  ------------------
  161|    585|        {
  162|    585|            std::memcpy(
  163|    585|                seq_ + size_, p, needed());
  164|    585|            size_ = length();
  165|    585|            return true;
  166|    585|        }
  167|     78|        if(BOOST_JSON_LIKELY(remain > 0))
  ------------------
  |  |  171|     78|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 3, False: 75]
  |  |  ------------------
  ------------------
  168|      3|        {
  169|      3|            std::memcpy(seq_ + size_, p, remain);
  170|      3|            size_ += static_cast<uint8_t>(remain);
  171|      3|        }
  172|     78|        return false;
  173|    663|    }
_ZNK5boost4json6detail13utf8_sequence4dataEv:
  177|   275k|    {
  178|   275k|        return seq_;
  179|   275k|    }
_ZNK5boost4json6detail13utf8_sequence6neededEv:
  183|  2.57k|    {
  184|  2.57k|        return length() - size_;
  185|  2.57k|    }
_ZNK5boost4json6detail13utf8_sequence5validEv:
  189|   275k|    {
  190|   275k|        BOOST_ASSERT(size_ >= length());
  ------------------
  |  |   60|   275k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  191|   275k|        return is_valid_utf8(seq_, first_);
  192|   275k|    }
_ZN5boost4json6detail13classify_utf8Ec:
   41|   279k|{
   42|       |    // 0x000 = invalid
   43|       |    // 0x102 = 2 bytes, second byte [80, BF]
   44|       |    // 0x203 = 3 bytes, second byte [A0, BF]
   45|       |    // 0x303 = 3 bytes, second byte [80, BF]
   46|       |    // 0x403 = 3 bytes, second byte [80, 9F]
   47|       |    // 0x504 = 4 bytes, second byte [90, BF]
   48|       |    // 0x604 = 4 bytes, second byte [80, BF]
   49|       |    // 0x704 = 4 bytes, second byte [80, 8F]
   50|   279k|    static constexpr uint16_t first[128]
   51|   279k|    {
   52|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   53|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   54|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   55|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   56|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   57|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   58|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   59|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   60|       |
   61|   279k|       0x000, 0x000, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102,
   62|   279k|       0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102,
   63|   279k|       0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102,
   64|   279k|       0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102, 0x102,
   65|   279k|       0x203, 0x303, 0x303, 0x303, 0x303, 0x303, 0x303, 0x303,
   66|   279k|       0x303, 0x303, 0x303, 0x303, 0x303, 0x403, 0x303, 0x303,
   67|   279k|       0x504, 0x604, 0x604, 0x604, 0x704, 0x000, 0x000, 0x000,
   68|   279k|       0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,
   69|   279k|    };
   70|   279k|    return first[static_cast<unsigned char>(c & 0x7F)];
   71|   279k|}
_ZN5boost4json6detail13is_valid_utf8EPKct:
   76|   279k|{
   77|   279k|    uint32_t v;
   78|   279k|    switch(first >> 8)
   79|   279k|    {
   80|    110|    default:
  ------------------
  |  Branch (80:5): [True: 110, False: 279k]
  ------------------
   81|    110|        return false;
   82|       |
   83|       |    // 2 bytes, second byte [80, BF]
   84|  4.39k|    case 1:
  ------------------
  |  Branch (84:5): [True: 4.39k, False: 274k]
  ------------------
   85|  4.39k|        v = load_little_endian<2>(p);
   86|  4.39k|        return (v & 0xC000) == 0x8000;
   87|       |
   88|       |    // 3 bytes, second byte [A0, BF]
   89|  65.7k|    case 2:
  ------------------
  |  Branch (89:5): [True: 65.7k, False: 213k]
  ------------------
   90|  65.7k|        v = load_little_endian<3>(p);
   91|  65.7k|        return (v & 0xC0E000) == 0x80A000;
   92|       |
   93|       |    // 3 bytes, second byte [80, BF]
   94|   188k|    case 3:
  ------------------
  |  Branch (94:5): [True: 188k, False: 90.7k]
  ------------------
   95|   188k|        v = load_little_endian<3>(p);
   96|   188k|        return (v & 0xC0C000) == 0x808000;
   97|       |
   98|       |    // 3 bytes, second byte [80, 9F]
   99|  8.22k|    case 4:
  ------------------
  |  Branch (99:5): [True: 8.22k, False: 271k]
  ------------------
  100|  8.22k|        v = load_little_endian<3>(p);
  101|  8.22k|        return (v & 0xC0E000) == 0x808000;
  102|       |
  103|       |    // 4 bytes, second byte [90, BF]
  104|  5.88k|    case 5:
  ------------------
  |  Branch (104:5): [True: 5.88k, False: 273k]
  ------------------
  105|  5.88k|        v = load_little_endian<4>(p);
  106|  5.88k|        return (v & 0xC0C0FF00) + 0x7F7F7000 <= 0x2F00;
  107|       |
  108|       |    // 4 bytes, second byte [80, BF]
  109|    844|    case 6:
  ------------------
  |  Branch (109:5): [True: 844, False: 278k]
  ------------------
  110|    844|        v = load_little_endian<4>(p);
  111|    844|        return (v & 0xC0C0C000) == 0x80808000;
  112|       |
  113|       |    // 4 bytes, second byte [80, 8F]
  114|  5.47k|    case 7:
  ------------------
  |  Branch (114:5): [True: 5.47k, False: 273k]
  ------------------
  115|  5.47k|        v = load_little_endian<4>(p);
  116|  5.47k|        return (v & 0xC0C0F000) == 0x80808000;
  117|   279k|    }
  118|   279k|}
_ZN5boost4json6detail18load_little_endianILi2EEEjPKv:
   26|  4.39k|{
   27|  4.39k|    std::uint32_t v = 0;
   28|  4.39k|    std::memcpy(&v, p, N);
   29|       |#ifdef BOOST_JSON_BIG_ENDIAN
   30|       |    v = ((v & 0xFF000000) >> 24) |
   31|       |        ((v & 0x00FF0000) >>  8) |
   32|       |        ((v & 0x0000FF00) <<  8) |
   33|       |        ((v & 0x000000FF) << 24);
   34|       |#endif
   35|  4.39k|    return v;
   36|  4.39k|}
_ZN5boost4json6detail18load_little_endianILi3EEEjPKv:
   26|   262k|{
   27|   262k|    std::uint32_t v = 0;
   28|   262k|    std::memcpy(&v, p, N);
   29|       |#ifdef BOOST_JSON_BIG_ENDIAN
   30|       |    v = ((v & 0xFF000000) >> 24) |
   31|       |        ((v & 0x00FF0000) >>  8) |
   32|       |        ((v & 0x0000FF00) <<  8) |
   33|       |        ((v & 0x000000FF) << 24);
   34|       |#endif
   35|   262k|    return v;
   36|   262k|}
_ZN5boost4json6detail18load_little_endianILi4EEEjPKv:
   26|   796k|{
   27|   796k|    std::uint32_t v = 0;
   28|   796k|    std::memcpy(&v, p, N);
   29|       |#ifdef BOOST_JSON_BIG_ENDIAN
   30|       |    v = ((v & 0xFF000000) >> 24) |
   31|       |        ((v & 0x00FF0000) >>  8) |
   32|       |        ((v & 0x0000FF00) <<  8) |
   33|       |        ((v & 0x000000FF) << 24);
   34|       |#endif
   35|   796k|    return v;
   36|   796k|}

_ZN5boost4json6detail6scalarC2ENS0_11storage_ptrE:
  180|   200k|    {
  181|   200k|    }
_ZN5boost4json6detail6scalarC2EbNS0_11storage_ptrE:
  189|  19.4k|    {
  190|  19.4k|    }
_ZN5boost4json6detail6scalarC2ElNS0_11storage_ptrE:
  198|  2.48M|    {
  199|  2.48M|    }
_ZN5boost4json6detail6scalarC2EmNS0_11storage_ptrE:
  207|  17.5k|    {
  208|  17.5k|    }
_ZN5boost4json6detail6scalarC2EdNS0_11storage_ptrE:
  216|  4.96M|    {
  217|  4.96M|    }
_ZN5boost4json6detail6access4nextINS0_14key_value_pairEEERjRT_:
  262|   343k|    {
  263|   343k|        return e.next_;
  264|   343k|    }
_ZN5boost4json6detail6access24construct_key_value_pairINS0_14key_value_pairEJNS0_8pilferedINS0_5valueEEES7_EEERT_PS8_DpOT0_:
  237|   184k|    {
  238|   184k|        return *reinterpret_cast<
  239|   184k|            KeyValuePair*>(::new(p)
  240|   184k|                KeyValuePair(
  241|   184k|                    std::forward<Args>(args)...));
  242|   184k|    }
_ZN5boost4json6detail6access11release_keyINS0_5valueEEEPKcRT_Rm:
  250|   184k|    {
  251|   184k|        BOOST_ASSERT(jv.is_string());
  ------------------
  |  |   60|   184k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  252|   184k|        jv.str_.sp_.~storage_ptr();
  253|   184k|        return jv.str_.impl_.release_key(len);
  254|   184k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJNS1_15unchecked_arrayEEEERT_PS6_DpOT0_:
  226|  14.1k|    {
  227|  14.1k|        return *reinterpret_cast<
  228|  14.1k|            Value*>(::new(p) Value(
  229|  14.1k|            std::forward<Args>(args)...));
  230|  14.1k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJNS1_16unchecked_objectEEEERT_PS6_DpOT0_:
  226|  11.1k|    {
  227|  11.1k|        return *reinterpret_cast<
  228|  11.1k|            Value*>(::new(p) Value(
  229|  11.1k|            std::forward<Args>(args)...));
  230|  11.1k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJNS1_5key_tERNS_4core17basic_string_viewIcEERNS0_11storage_ptrEEEERT_PSC_DpOT0_:
  226|   223k|    {
  227|   223k|        return *reinterpret_cast<
  228|   223k|            Value*>(::new(p) Value(
  229|   223k|            std::forward<Args>(args)...));
  230|   223k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJNS1_5key_tERNS_4core17basic_string_viewIcEES9_RNS0_11storage_ptrEEEERT_PSC_DpOT0_:
  226|  3.41k|    {
  227|  3.41k|        return *reinterpret_cast<
  228|  3.41k|            Value*>(::new(p) Value(
  229|  3.41k|            std::forward<Args>(args)...));
  230|  3.41k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJRNS_4core17basic_string_viewIcEERNS0_11storage_ptrEEEERT_PSB_DpOT0_:
  226|  19.3k|    {
  227|  19.3k|        return *reinterpret_cast<
  228|  19.3k|            Value*>(::new(p) Value(
  229|  19.3k|            std::forward<Args>(args)...));
  230|  19.3k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJRKNS0_13string_kind_tERNS0_11storage_ptrEEEERT_PSA_DpOT0_:
  226|  13.4k|    {
  227|  13.4k|        return *reinterpret_cast<
  228|  13.4k|            Value*>(::new(p) Value(
  229|  13.4k|            std::forward<Args>(args)...));
  230|  13.4k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJRlRNS0_11storage_ptrEEEERT_PS8_DpOT0_:
  226|  2.48M|    {
  227|  2.48M|        return *reinterpret_cast<
  228|  2.48M|            Value*>(::new(p) Value(
  229|  2.48M|            std::forward<Args>(args)...));
  230|  2.48M|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJRmRNS0_11storage_ptrEEEERT_PS8_DpOT0_:
  226|  17.5k|    {
  227|  17.5k|        return *reinterpret_cast<
  228|  17.5k|            Value*>(::new(p) Value(
  229|  17.5k|            std::forward<Args>(args)...));
  230|  17.5k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJRdRNS0_11storage_ptrEEEERT_PS8_DpOT0_:
  226|  4.96M|    {
  227|  4.96M|        return *reinterpret_cast<
  228|  4.96M|            Value*>(::new(p) Value(
  229|  4.96M|            std::forward<Args>(args)...));
  230|  4.96M|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJRbRNS0_11storage_ptrEEEERT_PS8_DpOT0_:
  226|  19.4k|    {
  227|  19.4k|        return *reinterpret_cast<
  228|  19.4k|            Value*>(::new(p) Value(
  229|  19.4k|            std::forward<Args>(args)...));
  230|  19.4k|    }
_ZN5boost4json6detail6access15construct_valueINS0_5valueEJDnRNS0_11storage_ptrEEEERT_PS7_DpOT0_:
  226|  11.7k|    {
  227|  11.7k|        return *reinterpret_cast<
  228|  11.7k|            Value*>(::new(p) Value(
  229|  11.7k|            std::forward<Args>(args)...));
  230|  11.7k|    }

_ZN5boost4json5array5tableixEm:
   34|  57.7k|    {
   35|  57.7k|        return (reinterpret_cast<
   36|  57.7k|            value*>(this + 1))[pos];
   37|  57.7k|    }
_ZN5boost4json5array4dataEv:
  304|  7.80k|{
  305|  7.80k|    return &(*t_)[0];
  306|  7.80k|}
_ZN5boost4json5array5beginEv:
  345|  12.2k|{
  346|  12.2k|    return &(*t_)[0];
  347|  12.2k|}
_ZNK5boost4json5array5beginEv:
  353|  10.3k|{
  354|  10.3k|    return &(*t_)[0];
  355|  10.3k|}
_ZN5boost4json5array3endEv:
  369|  12.2k|{
  370|  12.2k|    return &(*t_)[t_->size];
  371|  12.2k|}
_ZNK5boost4json5array3endEv:
  377|  15.0k|{
  378|  15.0k|    return &(*t_)[t_->size];
  379|  15.0k|}
_ZN5boost4json5array8max_sizeEv:
  454|  7.81k|{
  455|       |    // max_size depends on the address model
  456|  7.81k|    using min = std::integral_constant<std::size_t,
  457|  7.81k|        (std::size_t(-1) - sizeof(table)) / sizeof(value)>;
  458|  7.81k|    return min::value < BOOST_JSON_MAX_STRUCTURED_SIZE ?
  ------------------
  |  |  230|  7.81k|# define BOOST_JSON_MAX_STRUCTURED_SIZE  0x7ffffffe
  ------------------
  |  Branch (458:12): [Folded - Ignored]
  ------------------
  459|  7.81k|        min::value : BOOST_JSON_MAX_STRUCTURED_SIZE;
  ------------------
  |  |  230|  7.81k|# define BOOST_JSON_MAX_STRUCTURED_SIZE  0x7ffffffe
  ------------------
  460|  7.81k|}

_ZN5boost4json5array5table8allocateEmRKNS0_11storage_ptrE:
   40|  7.81k|{
   41|  7.81k|    BOOST_ASSERT(capacity > 0);
  ------------------
  |  |   60|  7.81k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   42|  7.81k|    if(capacity > array::max_size())
  ------------------
  |  Branch (42:8): [True: 0, False: 7.81k]
  ------------------
   43|      0|        detail::throw_length_error( "array too large" );
   44|  7.81k|    auto p = reinterpret_cast<
   45|  7.81k|        table*>(sp->allocate(
   46|  7.81k|            sizeof(table) +
   47|  7.81k|                capacity * sizeof(value),
   48|  7.81k|            alignof(value)));
   49|  7.81k|    p->capacity = static_cast<
   50|  7.81k|        std::uint32_t>(capacity);
   51|  7.81k|    return p;
   52|  7.81k|}
_ZN5boost4json5array5table10deallocateEPS2_RKNS0_11storage_ptrE:
   60|  12.2k|{
   61|  12.2k|    if(p->capacity == 0)
  ------------------
  |  Branch (61:8): [True: 5.88k, False: 6.35k]
  ------------------
   62|  5.88k|        return;
   63|  6.35k|    sp->deallocate(p,
   64|  6.35k|        sizeof(table) +
   65|  6.35k|            p->capacity * sizeof(value),
   66|  6.35k|        alignof(value));
   67|  6.35k|}
_ZN5boost4json5array7destroyEv:
  155|  12.6k|{
  156|  12.6k|    if(sp_.is_not_shared_and_deallocate_is_trivial())
  ------------------
  |  Branch (156:8): [True: 405, False: 12.2k]
  ------------------
  157|    405|        return;
  158|  12.2k|    auto last = end();
  159|  12.2k|    auto const first = begin();
  160|  7.23M|    while(last-- != first)
  ------------------
  |  Branch (160:11): [True: 7.22M, False: 12.2k]
  ------------------
  161|  7.22M|        last->~value();
  162|  12.2k|    table::deallocate(t_, sp_);
  163|  12.2k|}
_ZN5boost4json5arrayC2EONS0_6detail15unchecked_arrayE:
  174|  14.1k|{
  175|  14.1k|    BOOST_STATIC_ASSERT(
  ------------------
  |  |   71|  14.1k|#     define BOOST_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__)
  ------------------
  176|  14.1k|        alignof(table) == alignof(value));
  177|  14.1k|    if(ua.size() == 0)
  ------------------
  |  Branch (177:8): [True: 6.35k, False: 7.81k]
  ------------------
  178|  6.35k|    {
  179|  6.35k|        t_ = &empty_;
  180|  6.35k|        return;
  181|  6.35k|    }
  182|  7.81k|    t_= table::allocate(
  183|  7.81k|        ua.size(), sp_);
  184|  7.81k|    t_->size = static_cast<
  185|  7.81k|        std::uint32_t>(ua.size());
  186|  7.81k|    ua.relocate(data());
  187|  7.81k|}
_ZN5boost4json5arrayD2Ev:
  191|  12.6k|{
  192|  12.6k|    destroy();
  193|  12.6k|}

_ZN5boost4json15make_error_codeENS0_5errorE:
   20|  6.21k|{
   21|  6.21k|    struct codes : error_category
   22|  6.21k|    {
   23|  6.21k|        const char*
   24|  6.21k|        name() const noexcept override
   25|  6.21k|        {
   26|  6.21k|            return "boost.json";
   27|  6.21k|        }
   28|       |
   29|  6.21k|        char const* message( int ev, char*, std::size_t ) const noexcept
   30|  6.21k|            override
   31|  6.21k|        {
   32|  6.21k|            switch(static_cast<error>(ev))
   33|  6.21k|            {
   34|  6.21k|            default:
   35|  6.21k|case error::syntax: return "syntax error";
   36|  6.21k|case error::extra_data: return "extra data";
   37|  6.21k|case error::incomplete: return "incomplete JSON";
   38|  6.21k|case error::exponent_overflow: return "exponent overflow";
   39|  6.21k|case error::too_deep: return "too deep";
   40|  6.21k|case error::illegal_leading_surrogate: return "illegal leading surrogate";
   41|  6.21k|case error::illegal_trailing_surrogate: return "illegal trailing surrogate";
   42|  6.21k|case error::expected_hex_digit: return "expected hex digit";
   43|  6.21k|case error::expected_utf16_escape: return "expected utf16 escape";
   44|  6.21k|case error::object_too_large: return "object too large";
   45|  6.21k|case error::array_too_large: return "array too large";
   46|  6.21k|case error::key_too_large: return "key too large";
   47|  6.21k|case error::string_too_large: return "string too large";
   48|  6.21k|case error::input_error: return "input error";
   49|       |
   50|  6.21k|case error::exception: return "got exception";
   51|  6.21k|case error::test_failure: return "test failure";
   52|       |
   53|  6.21k|case error::missing_slash: return "missing slash character";
   54|  6.21k|case error::invalid_escape: return "invalid escape sequence";
   55|  6.21k|case error::token_not_number: return "token is not a number";
   56|  6.21k|case error::value_is_scalar: return "current value is scalar";
   57|  6.21k|case error::not_found: return "no referenced value";
   58|  6.21k|case error::token_overflow: return "token overflow";
   59|  6.21k|case error::past_the_end: return "past-the-end token not supported";
   60|       |
   61|  6.21k|case error::not_number: return "not a number";
   62|  6.21k|case error::not_exact: return "not exact";
   63|  6.21k|case error::not_null: return "value is not null";
   64|  6.21k|case error::not_bool: return "value is not boolean";
   65|  6.21k|case error::not_array: return "value is not an array";
   66|  6.21k|case error::not_object: return "value is not an object";
   67|  6.21k|case error::not_string: return "value is not a string";
   68|  6.21k|case error::size_mismatch: return "array size does not match target size";
   69|  6.21k|case error::exhausted_variants: return "exhausted all variants";
   70|  6.21k|case error::unknown_name: return "unknown name";
   71|  6.21k|            }
   72|  6.21k|        }
   73|       |
   74|  6.21k|        std::string
   75|  6.21k|        message( int ev ) const override
   76|  6.21k|        {
   77|  6.21k|            return message( ev, nullptr, 0 );
   78|  6.21k|        }
   79|       |
   80|  6.21k|        error_condition
   81|  6.21k|        default_error_condition(
   82|  6.21k|            int ev) const noexcept override
   83|  6.21k|        {
   84|  6.21k|            switch(static_cast<error>(ev))
   85|  6.21k|            {
   86|  6.21k|            default:
   87|  6.21k|                return {ev, *this};
   88|       |
   89|  6.21k|case error::syntax:
   90|  6.21k|case error::extra_data:
   91|  6.21k|case error::incomplete:
   92|  6.21k|case error::exponent_overflow:
   93|  6.21k|case error::too_deep:
   94|  6.21k|case error::illegal_leading_surrogate:
   95|  6.21k|case error::illegal_trailing_surrogate:
   96|  6.21k|case error::expected_hex_digit:
   97|  6.21k|case error::expected_utf16_escape:
   98|  6.21k|case error::object_too_large:
   99|  6.21k|case error::array_too_large:
  100|  6.21k|case error::key_too_large:
  101|  6.21k|case error::string_too_large:
  102|  6.21k|case error::input_error:
  103|  6.21k|    return condition::parse_error;
  104|       |
  105|  6.21k|case error::missing_slash:
  106|  6.21k|case error::invalid_escape:
  107|  6.21k|    return condition::pointer_parse_error;
  108|       |
  109|  6.21k|case error::token_not_number:
  110|  6.21k|case error::value_is_scalar:
  111|  6.21k|case error::not_found:
  112|  6.21k|case error::token_overflow:
  113|  6.21k|case error::past_the_end:
  114|  6.21k|    return condition::pointer_use_error;
  115|       |
  116|  6.21k|case error::not_number:
  117|  6.21k|case error::not_exact:
  118|  6.21k|case error::not_null:
  119|  6.21k|case error::not_bool:
  120|  6.21k|case error::not_array:
  121|  6.21k|case error::not_object:
  122|  6.21k|case error::not_string:
  123|  6.21k|case error::size_mismatch:
  124|  6.21k|case error::exhausted_variants:
  125|  6.21k|case error::unknown_name:
  126|  6.21k|    return condition::conversion_error;
  127|       |
  128|  6.21k|case error::exception:
  129|  6.21k|    return condition::generic_error;
  130|  6.21k|            }
  131|  6.21k|        }
  132|  6.21k|    };
  133|       |    // on some versions of msvc-14.2 the category is put in RO memory
  134|       |    // erroneusly, if the category object is const,
  135|       |    // and that may result in crash
  136|  6.21k|    static codes cat{};
  137|  6.21k|    return error_code{static_cast<
  138|  6.21k|        std::underlying_type<error>::type>(e), cat};
  139|  6.21k|}

_ZN5boost4json17get_null_resourceEv:
   94|  2.66k|{
   95|  2.66k|    static detail::null_resource mr;
   96|  2.66k|    return &mr;
   97|  2.66k|}
_ZN5boost4json6detail13null_resource11do_allocateEmm:
   68|     80|    {
   69|     80|        detail::throw_bad_alloc();
   70|     80|    }

_ZNK5boost4json6object5table8is_smallEv:
   61|  26.6k|    {
   62|  26.6k|        return capacity <=
   63|  26.6k|            detail::small_object_size_;
   64|  26.6k|    }
_ZN5boost4json6object5tableixEm:
   69|   415k|    {
   70|   415k|        return reinterpret_cast<
   71|   415k|            key_value_pair*>(
   72|   415k|                this + 1)[pos];
   73|   415k|    }
_ZN5boost4json6object5table10deallocateEPS2_RKNS0_11storage_ptrE:
  105|  7.01k|    {
  106|  7.01k|        if(p->capacity == 0)
  ------------------
  |  Branch (106:12): [True: 0, False: 7.01k]
  ------------------
  107|      0|            return;
  108|  7.01k|        if(! p->is_small())
  ------------------
  |  Branch (108:12): [True: 297, False: 6.72k]
  ------------------
  109|    297|            sp->deallocate(p,
  110|    297|                sizeof(table) + p->capacity * (
  111|    297|                    sizeof(key_value_pair) +
  112|    297|                    sizeof(index_t)));
  113|  6.72k|        else
  114|  6.72k|            sp->deallocate(p,
  115|  6.72k|                sizeof(table) + p->capacity *
  116|  6.72k|                    sizeof(key_value_pair));
  117|  7.01k|    }
_ZN5boost4json6object5beginEv:
  198|  20.7k|{
  199|  20.7k|    return &(*t_)[0];
  200|  20.7k|}
_ZNK5boost4json6object5beginEv:
  206|  8.47k|{
  207|  8.47k|    return &(*t_)[0];
  208|  8.47k|}
_ZN5boost4json6object3endEv:
  222|  7.01k|{
  223|  7.01k|    return &(*t_)[t_->size];
  224|  7.01k|}
_ZNK5boost4json6object3endEv:
  230|  12.4k|{
  231|  12.4k|    return &(*t_)[t_->size];
  232|  12.4k|}
_ZN5boost4json6detail16unchecked_objectD2Ev:
  517|  11.1k|{
  518|  11.1k|    if(! data_)
  ------------------
  |  Branch (518:8): [True: 8.30k, False: 2.82k]
  ------------------
  519|  8.30k|        return;
  520|  2.82k|    if(sp_.is_not_shared_and_deallocate_is_trivial())
  ------------------
  |  Branch (520:8): [True: 543, False: 2.27k]
  ------------------
  521|    543|        return;
  522|  2.27k|    value* p = data_;
  523|  2.27k|    while(size_--)
  ------------------
  |  Branch (523:11): [True: 0, False: 2.27k]
  ------------------
  524|      0|    {
  525|      0|        p[0].~value();
  526|      0|        p[1].~value();
  527|      0|        p += 2;
  528|      0|    }
  529|  2.27k|}

_ZN5boost4json6detail14find_in_objectINS_4core17basic_string_viewIcEEEENSt3__14pairIPNS0_14key_value_pairEmEERKNS0_6objectET_:
   34|  11.2k|{
   35|  11.2k|    BOOST_ASSERT(obj.t_->capacity > 0);
  ------------------
  |  |   60|  11.2k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   36|  11.2k|    if(obj.t_->is_small())
  ------------------
  |  Branch (36:8): [True: 11.2k, False: 0]
  ------------------
   37|  11.2k|    {
   38|  11.2k|        auto it = &(*obj.t_)[0];
   39|  11.2k|        auto const last =
   40|  11.2k|            &(*obj.t_)[obj.t_->size];
   41|  18.2k|        for(;it != last; ++it)
  ------------------
  |  Branch (41:14): [True: 7.72k, False: 10.5k]
  ------------------
   42|  7.72k|            if( key == it->key() )
  ------------------
  |  Branch (42:17): [True: 730, False: 6.99k]
  ------------------
   43|    730|                return { it, 0 };
   44|  10.5k|        return { nullptr, 0 };
   45|  11.2k|    }
   46|      0|    std::pair<
   47|      0|        key_value_pair*,
   48|      0|        std::size_t> result;
   49|      0|    BOOST_ASSERT(obj.t_->salt != 0);
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   50|      0|    result.second = detail::digest(key.begin(), key.end(), obj.t_->salt);
   51|      0|    auto i = obj.t_->bucket(
   52|      0|        result.second);
   53|      0|    while(i != object::null_index_)
  ------------------
  |  Branch (53:11): [True: 0, False: 0]
  ------------------
   54|      0|    {
   55|      0|        auto& v = (*obj.t_)[i];
   56|      0|        if( key == v.key() )
  ------------------
  |  Branch (56:13): [True: 0, False: 0]
  ------------------
   57|      0|        {
   58|      0|            result.first = &v;
   59|      0|            return result;
   60|      0|        }
   61|      0|        i = access::next(v);
   62|      0|    }
   63|      0|    result.first = nullptr;
   64|      0|    return result;
   65|      0|}
_ZNK5boost4json6object5table6digestENS_4core17basic_string_viewIcEE:
   87|   172k|{
   88|   172k|    BOOST_ASSERT(salt != 0);
  ------------------
  |  |   60|   172k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   89|   172k|    return detail::digest(
   90|   172k|        key.begin(), key.end(), salt);
   91|   172k|}
_ZN5boost4json6objectC2EONS0_6detail16unchecked_objectE:
  203|  11.1k|{
  204|  11.1k|    if(uo.size() == 0)
  ------------------
  |  Branch (204:8): [True: 2.81k, False: 8.30k]
  ------------------
  205|  2.81k|    {
  206|  2.81k|        t_ = &empty_;
  207|  2.81k|        return;
  208|  2.81k|    }
  209|       |    // should already be checked
  210|  8.30k|    BOOST_ASSERT(
  ------------------
  |  |   60|  8.30k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  211|  8.30k|        uo.size() <= max_size());
  212|  8.30k|    t_ = table::allocate(
  213|  8.30k|        uo.size(), 0, sp_);
  214|       |
  215|       |    // insert all elements, keeping
  216|       |    // the last of any duplicate keys.
  217|  8.30k|    auto dest = begin();
  218|  8.30k|    auto src = uo.release();
  219|  8.30k|    auto const end = src + 2 * uo.size();
  220|  8.30k|    if(t_->is_small())
  ------------------
  |  Branch (220:8): [True: 7.87k, False: 433]
  ------------------
  221|  7.87k|    {
  222|  7.87k|        t_->size = 0;
  223|  19.1k|        while(src != end)
  ------------------
  |  Branch (223:15): [True: 11.2k, False: 7.87k]
  ------------------
  224|  11.2k|        {
  225|  11.2k|            access::construct_key_value_pair(
  226|  11.2k|                dest, pilfer(src[0]), pilfer(src[1]));
  227|  11.2k|            src += 2;
  228|  11.2k|            auto result = detail::find_in_object(*this, dest->key());
  229|  11.2k|            if(! result.first)
  ------------------
  |  Branch (229:16): [True: 10.5k, False: 730]
  ------------------
  230|  10.5k|            {
  231|  10.5k|                ++dest;
  232|  10.5k|                ++t_->size;
  233|  10.5k|                continue;
  234|  10.5k|            }
  235|       |            // handle duplicate
  236|    730|            auto& v = *result.first;
  237|       |            // don't bother to check if
  238|       |            // storage deallocate is trivial
  239|    730|            v.~key_value_pair();
  240|       |            // trivial relocate
  241|    730|            std::memcpy(
  242|    730|                static_cast<void*>(&v),
  243|    730|                    dest, sizeof(v));
  244|    730|        }
  245|  7.87k|        return;
  246|  7.87k|    }
  247|   173k|    while(src != end)
  ------------------
  |  Branch (247:11): [True: 172k, False: 433]
  ------------------
  248|   172k|    {
  249|   172k|        access::construct_key_value_pair(
  250|   172k|            dest, pilfer(src[0]), pilfer(src[1]));
  251|   172k|        src += 2;
  252|   172k|        auto& head = t_->bucket(dest->key());
  253|   172k|        auto i = head;
  254|   172k|        for(;;)
  255|   175k|        {
  256|   175k|            if(i == null_index_)
  ------------------
  |  Branch (256:16): [True: 4.98k, False: 170k]
  ------------------
  257|  4.98k|            {
  258|       |                // end of bucket
  259|  4.98k|                access::next(
  260|  4.98k|                    *dest) = head;
  261|  4.98k|                head = static_cast<index_t>(
  262|  4.98k|                    dest - begin());
  263|  4.98k|                ++dest;
  264|  4.98k|                break;
  265|  4.98k|            }
  266|   170k|            auto& v = (*t_)[i];
  267|   170k|            if(v.key() != dest->key())
  ------------------
  |  Branch (267:16): [True: 3.04k, False: 167k]
  ------------------
  268|  3.04k|            {
  269|  3.04k|                i = access::next(v);
  270|  3.04k|                continue;
  271|  3.04k|            }
  272|       |
  273|       |            // handle duplicate
  274|   167k|            access::next(*dest) =
  275|   167k|                access::next(v);
  276|       |            // don't bother to check if
  277|       |            // storage deallocate is trivial
  278|   167k|            v.~key_value_pair();
  279|       |            // trivial relocate
  280|   167k|            std::memcpy(
  281|   167k|                static_cast<void*>(&v),
  282|   167k|                    dest, sizeof(v));
  283|   167k|            break;
  284|   170k|        }
  285|   172k|    }
  286|    433|    t_->size = static_cast<
  287|    433|        index_t>(dest - begin());
  288|    433|}
_ZN5boost4json6objectD2Ev:
  292|  9.74k|{
  293|  9.74k|    if(sp_.is_not_shared_and_deallocate_is_trivial())
  ------------------
  |  Branch (293:8): [True: 450, False: 9.29k]
  ------------------
  294|    450|        return;
  295|  9.29k|    if(t_->capacity == 0)
  ------------------
  |  Branch (295:8): [True: 2.27k, False: 7.01k]
  ------------------
  296|  2.27k|        return;
  297|  7.01k|    destroy();
  298|  7.01k|}
_ZN5boost4json6object5table6bucketEm:
   97|   172k|{
   98|   172k|    return reinterpret_cast<
   99|   172k|        index_t*>(&(*this)[capacity])[
  100|   172k|            hash % capacity];
  101|   172k|}
_ZN5boost4json6object5table8allocateEmmRKNS0_11storage_ptrE:
  130|  8.30k|{
  131|  8.30k|    BOOST_STATIC_ASSERT(
  ------------------
  |  |   71|  8.30k|#     define BOOST_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__)
  ------------------
  132|  8.30k|        alignof(key_value_pair) >=
  133|  8.30k|        alignof(index_t));
  134|  8.30k|    BOOST_ASSERT(capacity > 0);
  ------------------
  |  |   60|  8.30k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  135|  8.30k|    BOOST_ASSERT(capacity <= max_size());
  ------------------
  |  |   60|  8.30k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  136|  8.30k|    table* p;
  137|  8.30k|    if(capacity <= detail::small_object_size_)
  ------------------
  |  Branch (137:8): [True: 7.87k, False: 431]
  ------------------
  138|  7.87k|    {
  139|  7.87k|        p = reinterpret_cast<
  140|  7.87k|            table*>(sp->allocate(
  141|  7.87k|                sizeof(table) + capacity *
  142|  7.87k|                    sizeof(key_value_pair)));
  143|  7.87k|        p->capacity = static_cast<
  144|  7.87k|            std::uint32_t>(capacity);
  145|  7.87k|    }
  146|    431|    else
  147|    431|    {
  148|    431|        p = reinterpret_cast<
  149|    431|            table*>(sp->allocate(
  150|    431|                sizeof(table) + capacity * (
  151|    431|                    sizeof(key_value_pair) +
  152|    431|                    sizeof(index_t))));
  153|    431|        p->capacity = static_cast<
  154|    431|            std::uint32_t>(capacity);
  155|    431|        p->clear();
  156|    431|    }
  157|  8.30k|    if(salt)
  ------------------
  |  Branch (157:8): [True: 0, False: 8.30k]
  ------------------
  158|      0|    {
  159|      0|        p->salt = salt;
  160|      0|    }
  161|  8.30k|    else
  162|  8.30k|    {
  163|       |        // VFALCO This would be better if it
  164|       |        //        was random, but maybe this
  165|       |        //        is good enough.
  166|  8.30k|        p->salt = reinterpret_cast<
  167|  8.30k|            std::uintptr_t>(p);
  168|  8.30k|    }
  169|  8.30k|    return p;
  170|  8.30k|}
_ZN5boost4json6object5table6bucketENS_4core17basic_string_viewIcEE:
  107|   172k|{
  108|   172k|    return bucket(digest(key));
  109|   172k|}
_ZN5boost4json6object5table5clearEv:
  114|    430|{
  115|    430|    BOOST_ASSERT(! is_small());
  ------------------
  |  |   60|    430|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  116|       |    // initialize buckets
  117|    430|    std::memset(
  118|    430|        reinterpret_cast<index_t*>(
  119|    430|            &(*this)[capacity]),
  120|    430|        0xff, // null_index_
  121|    430|        capacity * sizeof(index_t));
  122|    430|}
_ZN5boost4json6object7destroyEv:
  822|  7.01k|{
  823|  7.01k|    BOOST_ASSERT(t_->capacity > 0);
  ------------------
  |  |   60|  7.01k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  824|  7.01k|    BOOST_ASSERT(! sp_.is_not_shared_and_deallocate_is_trivial());
  ------------------
  |  |   60|  7.01k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  825|  7.01k|    destroy(begin(), end());
  826|  7.01k|    table::deallocate(t_, sp_);
  827|  7.01k|}
_ZN5boost4json6object7destroyEPNS0_14key_value_pairES3_:
  834|  7.01k|{
  835|  7.01k|    BOOST_ASSERT(! sp_.is_not_shared_and_deallocate_is_trivial());
  ------------------
  |  |   60|  7.01k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  836|  19.7k|    while(last != first)
  ------------------
  |  Branch (836:11): [True: 12.7k, False: 7.01k]
  ------------------
  837|  12.7k|        (--last)->~key_value_pair();
  838|  7.01k|}

_ZN5boost4json9serializeERKNS0_5valueE:
   67|  4.52k|{
   68|  4.52k|    unsigned char buf[256];
   69|  4.52k|    serializer sr(
   70|  4.52k|        storage_ptr(),
   71|  4.52k|        buf,
   72|  4.52k|        sizeof(buf));
   73|  4.52k|    sr.reset(&jv);
   74|  4.52k|    std::string s;
   75|  4.52k|    serialize_impl(s, sr);
   76|  4.52k|    return s;
   77|  4.52k|}
src.cpp:_ZN5boost4jsonL14serialize_implERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERNS0_10serializerE:
   25|  4.52k|{
   26|       |    // serialize to a small buffer to avoid
   27|       |    // the first few allocations in std::string
   28|  4.52k|    char buf[BOOST_JSON_STACK_BUFFER_SIZE];
   29|  4.52k|    string_view sv;
   30|  4.52k|    sv = sr.read(buf);
   31|  4.52k|    if(sr.done())
  ------------------
  |  Branch (31:8): [True: 3.71k, False: 809]
  ------------------
   32|  3.71k|    {
   33|       |        // fast path
   34|  3.71k|        s.append(
   35|  3.71k|            sv.data(), sv.size());
   36|  3.71k|        return;
   37|  3.71k|    }
   38|    809|    std::size_t len = sv.size();
   39|    809|    s.reserve(len * 2);
   40|    809|    s.resize(s.capacity());
   41|    809|    BOOST_ASSERT(
  ------------------
  |  |   60|    809|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
   42|    809|        s.size() >= len * 2);
   43|    809|    std::memcpy(&s[0],
   44|    809|        sv.data(), sv.size());
   45|    809|    auto const lim =
   46|    809|        s.max_size() / 2;
   47|    809|    for(;;)
   48|  2.49k|    {
   49|  2.49k|        sv = sr.read(
   50|  2.49k|            &s[0] + len,
   51|  2.49k|            s.size() - len);
   52|  2.49k|        len += sv.size();
   53|  2.49k|        if(sr.done())
  ------------------
  |  Branch (53:12): [True: 809, False: 1.68k]
  ------------------
   54|    809|            break;
   55|       |        // growth factor 2x
   56|  1.68k|        if(s.size() < lim)
  ------------------
  |  Branch (56:12): [True: 1.68k, False: 0]
  ------------------
   57|  1.68k|            s.resize(s.size() * 2);
   58|      0|        else
   59|      0|            s.resize(2 * lim);
   60|  1.68k|    }
   61|    809|    s.resize(len);
   62|    809|}

_ZN5boost4json10serializerD2Ev:
   41|  4.52k|~serializer() noexcept = default;
_ZN5boost4json10serializerC2ENS0_11storage_ptrEPhm:
   52|  4.52k|{
   53|  4.52k|}
_ZN5boost4json10serializer5resetEPKNS0_5valueE:
  763|  4.52k|{
  764|  4.52k|    pv_ = p;
  765|  4.52k|    fn0_ = &serializer::write_value<true>;
  766|  4.52k|    fn1_ = &serializer::write_value<false>;
  767|       |
  768|  4.52k|    jv_ = p;
  769|  4.52k|    st_.clear();
  770|  4.52k|    done_ = false;
  771|  4.52k|}
_ZN5boost4json10serializer4readEPcm:
  820|  7.01k|{
  821|  7.01k|    if(! jv_)
  ------------------
  |  Branch (821:8): [True: 0, False: 7.01k]
  ------------------
  822|      0|    {
  823|      0|        static value const null;
  824|      0|        jv_ = &null;
  825|      0|    }
  826|  7.01k|    return read_some(dest, size);
  827|  7.01k|}
_ZN5boost4json10serializer9read_someEPcm:
  729|  7.01k|{
  730|       |    // If this goes off it means you forgot
  731|       |    // to call reset() before seriailzing a
  732|       |    // new value, or you never checked done()
  733|       |    // to see if you should stop.
  734|  7.01k|    BOOST_ASSERT(! done_);
  ------------------
  |  |   60|  7.01k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  735|       |
  736|  7.01k|    stream ss(dest, size);
  737|  7.01k|    if(st_.empty())
  ------------------
  |  Branch (737:8): [True: 4.52k, False: 2.49k]
  ------------------
  738|  4.52k|        (this->*fn0_)(ss);
  739|  2.49k|    else
  740|  2.49k|        (this->*fn1_)(ss);
  741|  7.01k|    if(st_.empty())
  ------------------
  |  Branch (741:8): [True: 4.52k, False: 2.49k]
  ------------------
  742|  4.52k|    {
  743|  4.52k|        done_ = true;
  744|  4.52k|        jv_ = nullptr;
  745|  4.52k|    }
  746|  7.01k|    return string_view(
  747|  7.01k|        dest, ss.used(dest));
  748|  7.01k|}
_ZN5boost4json10serializer10write_nullILb1EEEbRNS0_6detail6streamE:
   93|     65|{
   94|     65|    local_stream ss(ss0);
   95|     65|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (95:8): [Folded - Ignored]
  |  Branch (95:24): [True: 0, False: 0]
  ------------------
   96|      0|    {
   97|      0|        state st;
   98|      0|        st_.pop(st);
   99|      0|        switch(st)
  100|      0|        {
  101|      0|        default:
  ------------------
  |  Branch (101:9): [True: 0, False: 0]
  ------------------
  102|      0|        case state::nul1: goto do_nul1;
  ------------------
  |  Branch (102:9): [True: 0, False: 0]
  ------------------
  103|      0|        case state::nul2: goto do_nul2;
  ------------------
  |  Branch (103:9): [True: 0, False: 0]
  ------------------
  104|      0|        case state::nul3: goto do_nul3;
  ------------------
  |  Branch (104:9): [True: 0, False: 0]
  ------------------
  105|      0|        case state::nul4: goto do_nul4;
  ------------------
  |  Branch (105:9): [True: 0, False: 0]
  ------------------
  106|      0|        }
  107|      0|    }
  108|     65|do_nul1:
  109|     65|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     65|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 42, False: 23]
  |  |  ------------------
  ------------------
  110|     42|        ss.append('n');
  111|     23|    else
  112|     23|        return suspend(state::nul1);
  113|     42|do_nul2:
  114|     42|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     42|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 28, False: 14]
  |  |  ------------------
  ------------------
  115|     28|        ss.append('u');
  116|     14|    else
  117|     14|        return suspend(state::nul2);
  118|     28|do_nul3:
  119|     28|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     28|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 13, False: 15]
  |  |  ------------------
  ------------------
  120|     13|        ss.append('l');
  121|     15|    else
  122|     15|        return suspend(state::nul3);
  123|     13|do_nul4:
  124|     13|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     13|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  125|      0|        ss.append('l');
  126|     13|    else
  127|     13|        return suspend(state::nul4);
  128|      0|    return true;
  129|     13|}
_ZN5boost4json10serializer7suspendENS1_5stateE:
   58|  2.10k|{
   59|  2.10k|    st_.push(st);
   60|  2.10k|    return false;
   61|  2.10k|}
_ZN5boost4json10serializer10write_nullILb0EEEbRNS0_6detail6streamE:
   93|     65|{
   94|     65|    local_stream ss(ss0);
   95|     65|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (95:8): [Folded - Ignored]
  |  Branch (95:24): [True: 65, False: 0]
  ------------------
   96|     65|    {
   97|     65|        state st;
   98|     65|        st_.pop(st);
   99|     65|        switch(st)
  100|     65|        {
  101|      0|        default:
  ------------------
  |  Branch (101:9): [True: 0, False: 65]
  ------------------
  102|     23|        case state::nul1: goto do_nul1;
  ------------------
  |  Branch (102:9): [True: 23, False: 42]
  ------------------
  103|     14|        case state::nul2: goto do_nul2;
  ------------------
  |  Branch (103:9): [True: 14, False: 51]
  ------------------
  104|     15|        case state::nul3: goto do_nul3;
  ------------------
  |  Branch (104:9): [True: 15, False: 50]
  ------------------
  105|     13|        case state::nul4: goto do_nul4;
  ------------------
  |  Branch (105:9): [True: 13, False: 52]
  ------------------
  106|     65|        }
  107|     65|    }
  108|     23|do_nul1:
  109|     23|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     23|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 23, False: 0]
  |  |  ------------------
  ------------------
  110|     23|        ss.append('n');
  111|      0|    else
  112|      0|        return suspend(state::nul1);
  113|     37|do_nul2:
  114|     37|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     37|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 37, False: 0]
  |  |  ------------------
  ------------------
  115|     37|        ss.append('u');
  116|      0|    else
  117|      0|        return suspend(state::nul2);
  118|     52|do_nul3:
  119|     52|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     52|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 52, False: 0]
  |  |  ------------------
  ------------------
  120|     52|        ss.append('l');
  121|      0|    else
  122|      0|        return suspend(state::nul3);
  123|     65|do_nul4:
  124|     65|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     65|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 65, False: 0]
  |  |  ------------------
  ------------------
  125|     65|        ss.append('l');
  126|      0|    else
  127|      0|        return suspend(state::nul4);
  128|     65|    return true;
  129|     65|}
_ZN5boost4json10serializer11write_valueILb1EEEbRNS0_6detail6streamE:
  623|   738k|{
  624|   738k|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (624:8): [Folded - Ignored]
  |  Branch (624:22): [True: 0, False: 0]
  ------------------
  625|   738k|    {
  626|   738k|        auto const& jv(*jv_);
  627|   738k|        switch(jv.kind())
  628|   738k|        {
  629|      0|        default:
  ------------------
  |  Branch (629:9): [True: 0, False: 738k]
  ------------------
  630|  7.15k|        case kind::object:
  ------------------
  |  Branch (630:9): [True: 7.15k, False: 731k]
  ------------------
  631|  7.15k|            po_ = &jv.get_object();
  632|  7.15k|            return write_object<true>(ss);
  633|       |
  634|  5.68k|        case kind::array:
  ------------------
  |  Branch (634:9): [True: 5.68k, False: 733k]
  ------------------
  635|  5.68k|            pa_ = &jv.get_array();
  636|  5.68k|            return write_array<true>(ss);
  637|       |
  638|  4.71k|        case kind::string:
  ------------------
  |  Branch (638:9): [True: 4.71k, False: 734k]
  ------------------
  639|  4.71k|        {
  640|  4.71k|            auto const& js = jv.get_string();
  641|  4.71k|            cs0_ = { js.data(), js.size() };
  642|  4.71k|            return write_string<true>(ss);
  643|      0|        }
  644|       |
  645|   106k|        case kind::int64:
  ------------------
  |  Branch (645:9): [True: 106k, False: 632k]
  ------------------
  646|   115k|        case kind::uint64:
  ------------------
  |  Branch (646:9): [True: 9.68k, False: 729k]
  ------------------
  647|   703k|        case kind::double_:
  ------------------
  |  Branch (647:9): [True: 587k, False: 151k]
  ------------------
  648|   703k|            return write_number<true>(ss);
  649|       |
  650|  13.5k|        case kind::bool_:
  ------------------
  |  Branch (650:9): [True: 13.5k, False: 725k]
  ------------------
  651|  13.5k|            if(jv.get_bool())
  ------------------
  |  Branch (651:16): [True: 5.31k, False: 8.18k]
  ------------------
  652|  5.31k|            {
  653|  5.31k|                if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  5.31k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 5.28k, False: 26]
  |  |  ------------------
  ------------------
  654|  5.31k|                    ss.remain() >= 4))
  655|  5.28k|                {
  656|  5.28k|                    ss.append("true", 4);
  657|  5.28k|                    return true;
  658|  5.28k|                }
  659|     26|                return write_true<true>(ss);
  660|  5.31k|            }
  661|  8.18k|            else
  662|  8.18k|            {
  663|  8.18k|                if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  8.18k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 8.13k, False: 54]
  |  |  ------------------
  ------------------
  664|  8.18k|                    ss.remain() >= 5))
  665|  8.13k|                {
  666|  8.13k|                    ss.append("false", 5);
  667|  8.13k|                    return true;
  668|  8.13k|                }
  669|     54|                return write_false<true>(ss);
  670|  8.18k|            }
  671|       |
  672|  4.57k|        case kind::null:
  ------------------
  |  Branch (672:9): [True: 4.57k, False: 734k]
  ------------------
  673|  4.57k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  4.57k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.54k, False: 37]
  |  |  ------------------
  ------------------
  674|  4.57k|                ss.remain() >= 4))
  675|  4.54k|            {
  676|  4.54k|                ss.append("null", 4);
  677|  4.54k|                return true;
  678|  4.54k|            }
  679|     37|            return write_null<true>(ss);
  680|   738k|        }
  681|   738k|    }
  682|      0|    else
  683|      0|    {
  684|      0|        state st;
  685|      0|        st_.peek(st);
  686|      0|        switch(st)
  687|      0|        {
  688|      0|        default:
  ------------------
  |  Branch (688:9): [True: 0, False: 0]
  ------------------
  689|      0|        case state::nul1: case state::nul2:
  ------------------
  |  Branch (689:9): [True: 0, False: 0]
  |  Branch (689:27): [True: 0, False: 0]
  ------------------
  690|      0|        case state::nul3: case state::nul4:
  ------------------
  |  Branch (690:9): [True: 0, False: 0]
  |  Branch (690:27): [True: 0, False: 0]
  ------------------
  691|      0|            return write_null<StackEmpty>(ss);
  692|       |
  693|      0|        case state::tru1: case state::tru2:
  ------------------
  |  Branch (693:9): [True: 0, False: 0]
  |  Branch (693:27): [True: 0, False: 0]
  ------------------
  694|      0|        case state::tru3: case state::tru4:
  ------------------
  |  Branch (694:9): [True: 0, False: 0]
  |  Branch (694:27): [True: 0, False: 0]
  ------------------
  695|      0|            return write_true<StackEmpty>(ss);
  696|       |
  697|      0|        case state::fal1: case state::fal2:
  ------------------
  |  Branch (697:9): [True: 0, False: 0]
  |  Branch (697:27): [True: 0, False: 0]
  ------------------
  698|      0|        case state::fal3: case state::fal4:
  ------------------
  |  Branch (698:9): [True: 0, False: 0]
  |  Branch (698:27): [True: 0, False: 0]
  ------------------
  699|      0|        case state::fal5:
  ------------------
  |  Branch (699:9): [True: 0, False: 0]
  ------------------
  700|      0|            return write_false<StackEmpty>(ss);
  701|       |
  702|      0|        case state::str1: case state::str2:
  ------------------
  |  Branch (702:9): [True: 0, False: 0]
  |  Branch (702:27): [True: 0, False: 0]
  ------------------
  703|      0|        case state::str3: case state::str4:
  ------------------
  |  Branch (703:9): [True: 0, False: 0]
  |  Branch (703:27): [True: 0, False: 0]
  ------------------
  704|      0|        case state::esc1:
  ------------------
  |  Branch (704:9): [True: 0, False: 0]
  ------------------
  705|      0|        case state::utf1: case state::utf2:
  ------------------
  |  Branch (705:9): [True: 0, False: 0]
  |  Branch (705:27): [True: 0, False: 0]
  ------------------
  706|      0|        case state::utf3: case state::utf4:
  ------------------
  |  Branch (706:9): [True: 0, False: 0]
  |  Branch (706:27): [True: 0, False: 0]
  ------------------
  707|      0|        case state::utf5:
  ------------------
  |  Branch (707:9): [True: 0, False: 0]
  ------------------
  708|      0|            return write_string<StackEmpty>(ss);
  709|       |
  710|      0|        case state::num:
  ------------------
  |  Branch (710:9): [True: 0, False: 0]
  ------------------
  711|      0|            return write_number<StackEmpty>(ss);
  712|       |
  713|      0|        case state::arr1: case state::arr2:
  ------------------
  |  Branch (713:9): [True: 0, False: 0]
  |  Branch (713:27): [True: 0, False: 0]
  ------------------
  714|      0|        case state::arr3: case state::arr4:
  ------------------
  |  Branch (714:9): [True: 0, False: 0]
  |  Branch (714:27): [True: 0, False: 0]
  ------------------
  715|      0|            return write_array<StackEmpty>(ss);
  716|       |
  717|      0|        case state::obj1: case state::obj2:
  ------------------
  |  Branch (717:9): [True: 0, False: 0]
  |  Branch (717:27): [True: 0, False: 0]
  ------------------
  718|      0|        case state::obj3: case state::obj4:
  ------------------
  |  Branch (718:9): [True: 0, False: 0]
  |  Branch (718:27): [True: 0, False: 0]
  ------------------
  719|      0|        case state::obj5: case state::obj6:
  ------------------
  |  Branch (719:9): [True: 0, False: 0]
  |  Branch (719:27): [True: 0, False: 0]
  ------------------
  720|      0|            return write_object<StackEmpty>(ss);
  721|      0|        }
  722|      0|    }
  723|   738k|}
_ZN5boost4json10serializer12write_numberILb1EEEbRNS0_6detail6streamE:
  402|  6.55M|{
  403|  6.55M|    local_stream ss(ss0);
  404|  6.55M|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (404:8): [Folded - Ignored]
  |  Branch (404:22): [True: 0, False: 0]
  ------------------
  405|  6.55M|    {
  406|  6.55M|        switch(jv_->kind())
  407|  6.55M|        {
  408|      0|        default:
  ------------------
  |  Branch (408:9): [True: 0, False: 6.55M]
  ------------------
  409|  1.62M|        case kind::int64:
  ------------------
  |  Branch (409:9): [True: 1.62M, False: 4.93M]
  ------------------
  410|  1.62M|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  1.62M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.61M, False: 1.95k]
  |  |  ------------------
  ------------------
  411|  1.62M|                ss.remain() >=
  412|  1.62M|                    detail::max_number_chars))
  413|  1.61M|            {
  414|  1.61M|                ss.advance(detail::format_int64(
  415|  1.61M|                    ss.data(), jv_->get_int64()));
  416|  1.61M|                return true;
  417|  1.61M|            }
  418|  1.95k|            cs0_ = { buf_, detail::format_int64(
  419|  1.95k|                buf_, jv_->get_int64()) };
  420|  1.95k|            break;
  421|       |
  422|  16.4k|        case kind::uint64:
  ------------------
  |  Branch (422:9): [True: 16.4k, False: 6.54M]
  ------------------
  423|  16.4k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  16.4k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 16.2k, False: 150]
  |  |  ------------------
  ------------------
  424|  16.4k|                ss.remain() >=
  425|  16.4k|                    detail::max_number_chars))
  426|  16.2k|            {
  427|  16.2k|                ss.advance(detail::format_uint64(
  428|  16.2k|                    ss.data(), jv_->get_uint64()));
  429|  16.2k|                return true;
  430|  16.2k|            }
  431|    150|            cs0_ = { buf_, detail::format_uint64(
  432|    150|                buf_, jv_->get_uint64()) };
  433|    150|            break;
  434|       |
  435|  4.91M|        case kind::double_:
  ------------------
  |  Branch (435:9): [True: 4.91M, False: 1.63M]
  ------------------
  436|  4.91M|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  4.91M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.91M, False: 1.60k]
  |  |  ------------------
  ------------------
  437|  4.91M|                ss.remain() >=
  438|  4.91M|                    detail::max_number_chars))
  439|  4.91M|            {
  440|  4.91M|                ss.advance(detail::format_double(
  441|  4.91M|                    ss.data(), jv_->get_double()));
  442|  4.91M|                return true;
  443|  4.91M|            }
  444|  1.60k|            cs0_ = { buf_, detail::format_double(
  445|  1.60k|                buf_, jv_->get_double()) };
  446|  1.60k|            break;
  447|  6.55M|        }
  448|  6.55M|    }
  449|      0|    else
  450|      0|    {
  451|      0|        state st;
  452|      0|        st_.pop(st);
  453|      0|        BOOST_ASSERT(
  ------------------
  |  |   60|      0|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  454|      0|            st == state::num);
  455|      0|    }
  456|  3.71k|    auto const n = ss.remain();
  457|  3.71k|    if(n < cs0_.remain())
  ------------------
  |  Branch (457:8): [True: 1.00k, False: 2.70k]
  ------------------
  458|  1.00k|    {
  459|  1.00k|        ss.append(cs0_.data(), n);
  460|  1.00k|        cs0_.skip(n);
  461|  1.00k|        return suspend(state::num);
  462|  1.00k|    }
  463|  2.70k|    ss.append(
  464|  2.70k|        cs0_.data(), cs0_.remain());
  465|  2.70k|    return true;
  466|  3.71k|}
_ZN5boost4json10serializer10write_trueILb1EEEbRNS0_6detail6streamE:
  135|     54|{
  136|     54|    local_stream ss(ss0);
  137|     54|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (137:8): [Folded - Ignored]
  |  Branch (137:24): [True: 0, False: 0]
  ------------------
  138|      0|    {
  139|      0|        state st;
  140|      0|        st_.pop(st);
  141|      0|        switch(st)
  142|      0|        {
  143|      0|        default:
  ------------------
  |  Branch (143:9): [True: 0, False: 0]
  ------------------
  144|      0|        case state::tru1: goto do_tru1;
  ------------------
  |  Branch (144:9): [True: 0, False: 0]
  ------------------
  145|      0|        case state::tru2: goto do_tru2;
  ------------------
  |  Branch (145:9): [True: 0, False: 0]
  ------------------
  146|      0|        case state::tru3: goto do_tru3;
  ------------------
  |  Branch (146:9): [True: 0, False: 0]
  ------------------
  147|      0|        case state::tru4: goto do_tru4;
  ------------------
  |  Branch (147:9): [True: 0, False: 0]
  ------------------
  148|      0|        }
  149|      0|    }
  150|     54|do_tru1:
  151|     54|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     54|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 44, False: 10]
  |  |  ------------------
  ------------------
  152|     44|        ss.append('t');
  153|     10|    else
  154|     10|        return suspend(state::tru1);
  155|     44|do_tru2:
  156|     44|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     44|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 27, False: 17]
  |  |  ------------------
  ------------------
  157|     27|        ss.append('r');
  158|     17|    else
  159|     17|        return suspend(state::tru2);
  160|     27|do_tru3:
  161|     27|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     27|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 12, False: 15]
  |  |  ------------------
  ------------------
  162|     12|        ss.append('u');
  163|     15|    else
  164|     15|        return suspend(state::tru3);
  165|     12|do_tru4:
  166|     12|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     12|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  167|      0|        ss.append('e');
  168|     12|    else
  169|     12|        return suspend(state::tru4);
  170|      0|    return true;
  171|     12|}
_ZN5boost4json10serializer11write_falseILb1EEEbRNS0_6detail6streamE:
  177|     67|{
  178|     67|    local_stream ss(ss0);
  179|     67|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (179:8): [Folded - Ignored]
  |  Branch (179:24): [True: 0, False: 0]
  ------------------
  180|      0|    {
  181|      0|        state st;
  182|      0|        st_.pop(st);
  183|      0|        switch(st)
  184|      0|        {
  185|      0|        default:
  ------------------
  |  Branch (185:9): [True: 0, False: 0]
  ------------------
  186|      0|        case state::fal1: goto do_fal1;
  ------------------
  |  Branch (186:9): [True: 0, False: 0]
  ------------------
  187|      0|        case state::fal2: goto do_fal2;
  ------------------
  |  Branch (187:9): [True: 0, False: 0]
  ------------------
  188|      0|        case state::fal3: goto do_fal3;
  ------------------
  |  Branch (188:9): [True: 0, False: 0]
  ------------------
  189|      0|        case state::fal4: goto do_fal4;
  ------------------
  |  Branch (189:9): [True: 0, False: 0]
  ------------------
  190|      0|        case state::fal5: goto do_fal5;
  ------------------
  |  Branch (190:9): [True: 0, False: 0]
  ------------------
  191|      0|        }
  192|      0|    }
  193|     67|do_fal1:
  194|     67|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     67|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 54, False: 13]
  |  |  ------------------
  ------------------
  195|     54|        ss.append('f');
  196|     13|    else
  197|     13|        return suspend(state::fal1);
  198|     54|do_fal2:
  199|     54|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     54|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 42, False: 12]
  |  |  ------------------
  ------------------
  200|     42|        ss.append('a');
  201|     12|    else
  202|     12|        return suspend(state::fal2);
  203|     42|do_fal3:
  204|     42|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     42|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 29, False: 13]
  |  |  ------------------
  ------------------
  205|     29|        ss.append('l');
  206|     13|    else
  207|     13|        return suspend(state::fal3);
  208|     29|do_fal4:
  209|     29|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     29|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 16, False: 13]
  |  |  ------------------
  ------------------
  210|     16|        ss.append('s');
  211|     13|    else
  212|     13|        return suspend(state::fal4);
  213|     16|do_fal5:
  214|     16|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     16|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 16]
  |  |  ------------------
  ------------------
  215|      0|        ss.append('e');
  216|     16|    else
  217|     16|        return suspend(state::fal5);
  218|      0|    return true;
  219|     16|}
_ZN5boost4json10serializer11write_valueILb0EEEbRNS0_6detail6streamE:
  623|  5.90M|{
  624|  5.90M|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (624:8): [Folded - Ignored]
  |  Branch (624:22): [True: 5.89M, False: 10.4k]
  ------------------
  625|  5.89M|    {
  626|  5.89M|        auto const& jv(*jv_);
  627|  5.89M|        switch(jv.kind())
  628|  5.89M|        {
  629|      0|        default:
  ------------------
  |  Branch (629:9): [True: 0, False: 5.89M]
  ------------------
  630|  1.32k|        case kind::object:
  ------------------
  |  Branch (630:9): [True: 1.32k, False: 5.89M]
  ------------------
  631|  1.32k|            po_ = &jv.get_object();
  632|  1.32k|            return write_object<true>(ss);
  633|       |
  634|  4.64k|        case kind::array:
  ------------------
  |  Branch (634:9): [True: 4.64k, False: 5.88M]
  ------------------
  635|  4.64k|            pa_ = &jv.get_array();
  636|  4.64k|            return write_array<true>(ss);
  637|       |
  638|  22.6k|        case kind::string:
  ------------------
  |  Branch (638:9): [True: 22.6k, False: 5.87M]
  ------------------
  639|  22.6k|        {
  640|  22.6k|            auto const& js = jv.get_string();
  641|  22.6k|            cs0_ = { js.data(), js.size() };
  642|  22.6k|            return write_string<true>(ss);
  643|      0|        }
  644|       |
  645|  1.51M|        case kind::int64:
  ------------------
  |  Branch (645:9): [True: 1.51M, False: 4.37M]
  ------------------
  646|  1.52M|        case kind::uint64:
  ------------------
  |  Branch (646:9): [True: 6.73k, False: 5.88M]
  ------------------
  647|  5.85M|        case kind::double_:
  ------------------
  |  Branch (647:9): [True: 4.33M, False: 1.56M]
  ------------------
  648|  5.85M|            return write_number<true>(ss);
  649|       |
  650|  3.93k|        case kind::bool_:
  ------------------
  |  Branch (650:9): [True: 3.93k, False: 5.88M]
  ------------------
  651|  3.93k|            if(jv.get_bool())
  ------------------
  |  Branch (651:16): [True: 2.41k, False: 1.51k]
  ------------------
  652|  2.41k|            {
  653|  2.41k|                if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  2.41k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.38k, False: 28]
  |  |  ------------------
  ------------------
  654|  2.41k|                    ss.remain() >= 4))
  655|  2.38k|                {
  656|  2.38k|                    ss.append("true", 4);
  657|  2.38k|                    return true;
  658|  2.38k|                }
  659|     28|                return write_true<true>(ss);
  660|  2.41k|            }
  661|  1.51k|            else
  662|  1.51k|            {
  663|  1.51k|                if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  1.51k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.50k, False: 13]
  |  |  ------------------
  ------------------
  664|  1.51k|                    ss.remain() >= 5))
  665|  1.50k|                {
  666|  1.50k|                    ss.append("false", 5);
  667|  1.50k|                    return true;
  668|  1.50k|                }
  669|     13|                return write_false<true>(ss);
  670|  1.51k|            }
  671|       |
  672|  6.26k|        case kind::null:
  ------------------
  |  Branch (672:9): [True: 6.26k, False: 5.88M]
  ------------------
  673|  6.26k|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  6.26k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 6.23k, False: 28]
  |  |  ------------------
  ------------------
  674|  6.26k|                ss.remain() >= 4))
  675|  6.23k|            {
  676|  6.23k|                ss.append("null", 4);
  677|  6.23k|                return true;
  678|  6.23k|            }
  679|     28|            return write_null<true>(ss);
  680|  5.89M|        }
  681|  5.89M|    }
  682|  10.4k|    else
  683|  10.4k|    {
  684|  10.4k|        state st;
  685|  10.4k|        st_.peek(st);
  686|  10.4k|        switch(st)
  687|  10.4k|        {
  688|      0|        default:
  ------------------
  |  Branch (688:9): [True: 0, False: 10.4k]
  ------------------
  689|     37|        case state::nul1: case state::nul2:
  ------------------
  |  Branch (689:9): [True: 23, False: 10.4k]
  |  Branch (689:27): [True: 14, False: 10.4k]
  ------------------
  690|     65|        case state::nul3: case state::nul4:
  ------------------
  |  Branch (690:9): [True: 15, False: 10.4k]
  |  Branch (690:27): [True: 13, False: 10.4k]
  ------------------
  691|     65|            return write_null<StackEmpty>(ss);
  692|       |
  693|     27|        case state::tru1: case state::tru2:
  ------------------
  |  Branch (693:9): [True: 10, False: 10.4k]
  |  Branch (693:27): [True: 17, False: 10.4k]
  ------------------
  694|     54|        case state::tru3: case state::tru4:
  ------------------
  |  Branch (694:9): [True: 15, False: 10.4k]
  |  Branch (694:27): [True: 12, False: 10.4k]
  ------------------
  695|     54|            return write_true<StackEmpty>(ss);
  696|       |
  697|     25|        case state::fal1: case state::fal2:
  ------------------
  |  Branch (697:9): [True: 13, False: 10.4k]
  |  Branch (697:27): [True: 12, False: 10.4k]
  ------------------
  698|     51|        case state::fal3: case state::fal4:
  ------------------
  |  Branch (698:9): [True: 13, False: 10.4k]
  |  Branch (698:27): [True: 13, False: 10.4k]
  ------------------
  699|     67|        case state::fal5:
  ------------------
  |  Branch (699:9): [True: 16, False: 10.4k]
  ------------------
  700|     67|            return write_false<StackEmpty>(ss);
  701|       |
  702|     54|        case state::str1: case state::str2:
  ------------------
  |  Branch (702:9): [True: 17, False: 10.4k]
  |  Branch (702:27): [True: 37, False: 10.4k]
  ------------------
  703|    434|        case state::str3: case state::str4:
  ------------------
  |  Branch (703:9): [True: 380, False: 10.1k]
  |  Branch (703:27): [True: 0, False: 10.4k]
  ------------------
  704|    445|        case state::esc1:
  ------------------
  |  Branch (704:9): [True: 11, False: 10.4k]
  ------------------
  705|    491|        case state::utf1: case state::utf2:
  ------------------
  |  Branch (705:9): [True: 23, False: 10.4k]
  |  Branch (705:27): [True: 23, False: 10.4k]
  ------------------
  706|    532|        case state::utf3: case state::utf4:
  ------------------
  |  Branch (706:9): [True: 20, False: 10.4k]
  |  Branch (706:27): [True: 21, False: 10.4k]
  ------------------
  707|    553|        case state::utf5:
  ------------------
  |  Branch (707:9): [True: 21, False: 10.4k]
  ------------------
  708|    553|            return write_string<StackEmpty>(ss);
  709|       |
  710|  1.00k|        case state::num:
  ------------------
  |  Branch (710:9): [True: 1.00k, False: 9.48k]
  ------------------
  711|  1.00k|            return write_number<StackEmpty>(ss);
  712|       |
  713|  4.51k|        case state::arr1: case state::arr2:
  ------------------
  |  Branch (713:9): [True: 22, False: 10.4k]
  |  Branch (713:27): [True: 4.49k, False: 5.99k]
  ------------------
  714|  4.76k|        case state::arr3: case state::arr4:
  ------------------
  |  Branch (714:9): [True: 196, False: 10.2k]
  |  Branch (714:27): [True: 54, False: 10.4k]
  ------------------
  715|  4.76k|            return write_array<StackEmpty>(ss);
  716|       |
  717|    385|        case state::obj1: case state::obj2:
  ------------------
  |  Branch (717:9): [True: 23, False: 10.4k]
  |  Branch (717:27): [True: 362, False: 10.1k]
  ------------------
  718|  3.91k|        case state::obj3: case state::obj4:
  ------------------
  |  Branch (718:9): [True: 24, False: 10.4k]
  |  Branch (718:27): [True: 3.50k, False: 6.98k]
  ------------------
  719|  3.97k|        case state::obj5: case state::obj6:
  ------------------
  |  Branch (719:9): [True: 27, False: 10.4k]
  |  Branch (719:27): [True: 38, False: 10.4k]
  ------------------
  720|  3.97k|            return write_object<StackEmpty>(ss);
  721|  10.4k|        }
  722|  10.4k|    }
  723|  5.90M|}
_ZN5boost4json10serializer10write_trueILb0EEEbRNS0_6detail6streamE:
  135|     54|{
  136|     54|    local_stream ss(ss0);
  137|     54|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (137:8): [Folded - Ignored]
  |  Branch (137:24): [True: 54, False: 0]
  ------------------
  138|     54|    {
  139|     54|        state st;
  140|     54|        st_.pop(st);
  141|     54|        switch(st)
  142|     54|        {
  143|      0|        default:
  ------------------
  |  Branch (143:9): [True: 0, False: 54]
  ------------------
  144|     10|        case state::tru1: goto do_tru1;
  ------------------
  |  Branch (144:9): [True: 10, False: 44]
  ------------------
  145|     17|        case state::tru2: goto do_tru2;
  ------------------
  |  Branch (145:9): [True: 17, False: 37]
  ------------------
  146|     15|        case state::tru3: goto do_tru3;
  ------------------
  |  Branch (146:9): [True: 15, False: 39]
  ------------------
  147|     12|        case state::tru4: goto do_tru4;
  ------------------
  |  Branch (147:9): [True: 12, False: 42]
  ------------------
  148|     54|        }
  149|     54|    }
  150|     10|do_tru1:
  151|     10|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     10|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 10, False: 0]
  |  |  ------------------
  ------------------
  152|     10|        ss.append('t');
  153|      0|    else
  154|      0|        return suspend(state::tru1);
  155|     27|do_tru2:
  156|     27|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     27|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 27, False: 0]
  |  |  ------------------
  ------------------
  157|     27|        ss.append('r');
  158|      0|    else
  159|      0|        return suspend(state::tru2);
  160|     42|do_tru3:
  161|     42|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     42|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 42, False: 0]
  |  |  ------------------
  ------------------
  162|     42|        ss.append('u');
  163|      0|    else
  164|      0|        return suspend(state::tru3);
  165|     54|do_tru4:
  166|     54|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     54|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 54, False: 0]
  |  |  ------------------
  ------------------
  167|     54|        ss.append('e');
  168|      0|    else
  169|      0|        return suspend(state::tru4);
  170|     54|    return true;
  171|     54|}
_ZN5boost4json10serializer11write_falseILb0EEEbRNS0_6detail6streamE:
  177|     67|{
  178|     67|    local_stream ss(ss0);
  179|     67|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (179:8): [Folded - Ignored]
  |  Branch (179:24): [True: 67, False: 0]
  ------------------
  180|     67|    {
  181|     67|        state st;
  182|     67|        st_.pop(st);
  183|     67|        switch(st)
  184|     67|        {
  185|      0|        default:
  ------------------
  |  Branch (185:9): [True: 0, False: 67]
  ------------------
  186|     13|        case state::fal1: goto do_fal1;
  ------------------
  |  Branch (186:9): [True: 13, False: 54]
  ------------------
  187|     12|        case state::fal2: goto do_fal2;
  ------------------
  |  Branch (187:9): [True: 12, False: 55]
  ------------------
  188|     13|        case state::fal3: goto do_fal3;
  ------------------
  |  Branch (188:9): [True: 13, False: 54]
  ------------------
  189|     13|        case state::fal4: goto do_fal4;
  ------------------
  |  Branch (189:9): [True: 13, False: 54]
  ------------------
  190|     16|        case state::fal5: goto do_fal5;
  ------------------
  |  Branch (190:9): [True: 16, False: 51]
  ------------------
  191|     67|        }
  192|     67|    }
  193|     13|do_fal1:
  194|     13|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     13|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 13, False: 0]
  |  |  ------------------
  ------------------
  195|     13|        ss.append('f');
  196|      0|    else
  197|      0|        return suspend(state::fal1);
  198|     25|do_fal2:
  199|     25|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     25|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 25, False: 0]
  |  |  ------------------
  ------------------
  200|     25|        ss.append('a');
  201|      0|    else
  202|      0|        return suspend(state::fal2);
  203|     38|do_fal3:
  204|     38|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     38|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 38, False: 0]
  |  |  ------------------
  ------------------
  205|     38|        ss.append('l');
  206|      0|    else
  207|      0|        return suspend(state::fal3);
  208|     51|do_fal4:
  209|     51|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     51|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 51, False: 0]
  |  |  ------------------
  ------------------
  210|     51|        ss.append('s');
  211|      0|    else
  212|      0|        return suspend(state::fal4);
  213|     67|do_fal5:
  214|     67|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     67|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 67, False: 0]
  |  |  ------------------
  ------------------
  215|     67|        ss.append('e');
  216|      0|    else
  217|      0|        return suspend(state::fal5);
  218|     67|    return true;
  219|     67|}
_ZN5boost4json10serializer12write_numberILb0EEEbRNS0_6detail6streamE:
  402|  1.00k|{
  403|  1.00k|    local_stream ss(ss0);
  404|  1.00k|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (404:8): [Folded - Ignored]
  |  Branch (404:22): [True: 0, False: 1.00k]
  ------------------
  405|      0|    {
  406|      0|        switch(jv_->kind())
  407|      0|        {
  408|      0|        default:
  ------------------
  |  Branch (408:9): [True: 0, False: 0]
  ------------------
  409|      0|        case kind::int64:
  ------------------
  |  Branch (409:9): [True: 0, False: 0]
  ------------------
  410|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  411|      0|                ss.remain() >=
  412|      0|                    detail::max_number_chars))
  413|      0|            {
  414|      0|                ss.advance(detail::format_int64(
  415|      0|                    ss.data(), jv_->get_int64()));
  416|      0|                return true;
  417|      0|            }
  418|      0|            cs0_ = { buf_, detail::format_int64(
  419|      0|                buf_, jv_->get_int64()) };
  420|      0|            break;
  421|       |
  422|      0|        case kind::uint64:
  ------------------
  |  Branch (422:9): [True: 0, False: 0]
  ------------------
  423|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  424|      0|                ss.remain() >=
  425|      0|                    detail::max_number_chars))
  426|      0|            {
  427|      0|                ss.advance(detail::format_uint64(
  428|      0|                    ss.data(), jv_->get_uint64()));
  429|      0|                return true;
  430|      0|            }
  431|      0|            cs0_ = { buf_, detail::format_uint64(
  432|      0|                buf_, jv_->get_uint64()) };
  433|      0|            break;
  434|       |
  435|      0|        case kind::double_:
  ------------------
  |  Branch (435:9): [True: 0, False: 0]
  ------------------
  436|      0|            if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  437|      0|                ss.remain() >=
  438|      0|                    detail::max_number_chars))
  439|      0|            {
  440|      0|                ss.advance(detail::format_double(
  441|      0|                    ss.data(), jv_->get_double()));
  442|      0|                return true;
  443|      0|            }
  444|      0|            cs0_ = { buf_, detail::format_double(
  445|      0|                buf_, jv_->get_double()) };
  446|      0|            break;
  447|      0|        }
  448|      0|    }
  449|  1.00k|    else
  450|  1.00k|    {
  451|  1.00k|        state st;
  452|  1.00k|        st_.pop(st);
  453|  1.00k|        BOOST_ASSERT(
  ------------------
  |  |   60|  1.00k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  454|  1.00k|            st == state::num);
  455|  1.00k|    }
  456|  1.00k|    auto const n = ss.remain();
  457|  1.00k|    if(n < cs0_.remain())
  ------------------
  |  Branch (457:8): [True: 0, False: 1.00k]
  ------------------
  458|      0|    {
  459|      0|        ss.append(cs0_.data(), n);
  460|      0|        cs0_.skip(n);
  461|      0|        return suspend(state::num);
  462|      0|    }
  463|  1.00k|    ss.append(
  464|  1.00k|        cs0_.data(), cs0_.remain());
  465|  1.00k|    return true;
  466|  1.00k|}
_ZN5boost4json10serializer11write_arrayILb1EEEbRNS0_6detail6streamE:
  472|  10.3k|{
  473|  10.3k|    array const* pa;
  474|  10.3k|    local_stream ss(ss0);
  475|  10.3k|    array::const_iterator it;
  476|  10.3k|    array::const_iterator end;
  477|  10.3k|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (477:8): [Folded - Ignored]
  |  Branch (477:22): [True: 0, False: 0]
  ------------------
  478|  10.3k|    {
  479|  10.3k|        pa = pa_;
  480|  10.3k|        it = pa->begin();
  481|  10.3k|        end = pa->end();
  482|  10.3k|    }
  483|      0|    else
  484|      0|    {
  485|      0|        state st;
  486|      0|        st_.pop(st);
  487|      0|        st_.pop(it);
  488|      0|        st_.pop(pa);
  489|      0|        end = pa->end();
  490|      0|        switch(st)
  491|      0|        {
  492|      0|        default:
  ------------------
  |  Branch (492:9): [True: 0, False: 0]
  ------------------
  493|      0|        case state::arr1: goto do_arr1;
  ------------------
  |  Branch (493:9): [True: 0, False: 0]
  ------------------
  494|      0|        case state::arr2: goto do_arr2;
  ------------------
  |  Branch (494:9): [True: 0, False: 0]
  ------------------
  495|      0|        case state::arr3: goto do_arr3;
  ------------------
  |  Branch (495:9): [True: 0, False: 0]
  ------------------
  496|      0|        case state::arr4: goto do_arr4;
  ------------------
  |  Branch (496:9): [True: 0, False: 0]
  ------------------
  497|      0|            break;
  498|      0|        }
  499|      0|    }
  500|  10.3k|do_arr1:
  501|  10.3k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  10.3k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 10.3k, False: 22]
  |  |  ------------------
  ------------------
  502|  10.3k|        ss.append('[');
  503|     22|    else
  504|     22|        return suspend(
  505|     22|            state::arr1, it, pa);
  506|  10.3k|    if(it == end)
  ------------------
  |  Branch (506:8): [True: 3.47k, False: 6.83k]
  ------------------
  507|  3.47k|        goto do_arr4;
  508|  6.83k|    for(;;)
  509|   722k|    {
  510|   722k|do_arr2:
  511|   722k|        jv_ = &*it;
  512|   722k|        if(! write_value<StackEmpty>(ss))
  ------------------
  |  Branch (512:12): [True: 1.77k, False: 721k]
  ------------------
  513|  1.77k|            return suspend(
  514|  1.77k|                state::arr2, it, pa);
  515|   721k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|   721k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 4.97k, False: 716k]
  |  |  ------------------
  ------------------
  516|   721k|            ++it == end))
  517|  4.97k|            break;
  518|   716k|do_arr3:
  519|   716k|        if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|   716k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 716k, False: 92]
  |  |  ------------------
  ------------------
  520|   716k|            ss.append(',');
  521|     92|        else
  522|     92|            return suspend(
  523|     92|                state::arr3, it, pa);
  524|   716k|    }
  525|  8.44k|do_arr4:
  526|  8.44k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  8.44k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 8.40k, False: 42]
  |  |  ------------------
  ------------------
  527|  8.40k|        ss.append(']');
  528|     42|    else
  529|     42|        return suspend(
  530|     42|            state::arr4, it, pa);
  531|  8.40k|    return true;
  532|  8.44k|}
_ZN5boost4json10serializer7suspendENS1_5stateEPKNS0_5valueEPKNS0_5arrayE:
   69|  4.76k|{
   70|  4.76k|    st_.push(pa);
   71|  4.76k|    st_.push(it);
   72|  4.76k|    st_.push(st);
   73|  4.76k|    return false;
   74|  4.76k|}
_ZN5boost4json10serializer11write_arrayILb0EEEbRNS0_6detail6streamE:
  472|  4.76k|{
  473|  4.76k|    array const* pa;
  474|  4.76k|    local_stream ss(ss0);
  475|  4.76k|    array::const_iterator it;
  476|  4.76k|    array::const_iterator end;
  477|  4.76k|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (477:8): [Folded - Ignored]
  |  Branch (477:22): [True: 0, False: 4.76k]
  ------------------
  478|      0|    {
  479|      0|        pa = pa_;
  480|      0|        it = pa->begin();
  481|      0|        end = pa->end();
  482|      0|    }
  483|  4.76k|    else
  484|  4.76k|    {
  485|  4.76k|        state st;
  486|  4.76k|        st_.pop(st);
  487|  4.76k|        st_.pop(it);
  488|  4.76k|        st_.pop(pa);
  489|  4.76k|        end = pa->end();
  490|  4.76k|        switch(st)
  491|  4.76k|        {
  492|      0|        default:
  ------------------
  |  Branch (492:9): [True: 0, False: 4.76k]
  ------------------
  493|     22|        case state::arr1: goto do_arr1;
  ------------------
  |  Branch (493:9): [True: 22, False: 4.74k]
  ------------------
  494|  4.49k|        case state::arr2: goto do_arr2;
  ------------------
  |  Branch (494:9): [True: 4.49k, False: 272]
  ------------------
  495|    196|        case state::arr3: goto do_arr3;
  ------------------
  |  Branch (495:9): [True: 196, False: 4.56k]
  ------------------
  496|     54|        case state::arr4: goto do_arr4;
  ------------------
  |  Branch (496:9): [True: 54, False: 4.70k]
  ------------------
  497|      0|            break;
  498|  4.76k|        }
  499|  4.76k|    }
  500|     22|do_arr1:
  501|     22|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     22|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 22, False: 0]
  |  |  ------------------
  ------------------
  502|     22|        ss.append('[');
  503|      0|    else
  504|      0|        return suspend(
  505|      0|            state::arr1, it, pa);
  506|     22|    if(it == end)
  ------------------
  |  Branch (506:8): [True: 10, False: 12]
  ------------------
  507|     10|        goto do_arr4;
  508|     12|    for(;;)
  509|  5.89M|    {
  510|  5.89M|do_arr2:
  511|  5.89M|        jv_ = &*it;
  512|  5.89M|        if(! write_value<StackEmpty>(ss))
  ------------------
  |  Branch (512:12): [True: 2.71k, False: 5.89M]
  ------------------
  513|  2.71k|            return suspend(
  514|  2.71k|                state::arr2, it, pa);
  515|  5.89M|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  5.89M|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1.87k, False: 5.89M]
  |  |  ------------------
  ------------------
  516|  5.89M|            ++it == end))
  517|  1.87k|            break;
  518|  5.89M|do_arr3:
  519|  5.89M|        if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  5.89M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 5.89M, False: 104]
  |  |  ------------------
  ------------------
  520|  5.89M|            ss.append(',');
  521|    104|        else
  522|    104|            return suspend(
  523|    104|                state::arr3, it, pa);
  524|  5.89M|    }
  525|  1.94k|do_arr4:
  526|  1.94k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  1.94k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.92k, False: 12]
  |  |  ------------------
  ------------------
  527|  1.92k|        ss.append(']');
  528|     12|    else
  529|     12|        return suspend(
  530|     12|            state::arr4, it, pa);
  531|  1.92k|    return true;
  532|  1.94k|}
_ZN5boost4json10serializer12write_objectILb1EEEbRNS0_6detail6streamE:
  538|  8.47k|{
  539|  8.47k|    object const* po;
  540|  8.47k|    local_stream ss(ss0);
  541|  8.47k|    object::const_iterator it;
  542|  8.47k|    object::const_iterator end;
  543|  8.47k|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (543:8): [Folded - Ignored]
  |  Branch (543:22): [True: 0, False: 0]
  ------------------
  544|  8.47k|    {
  545|  8.47k|        po = po_;
  546|  8.47k|        it = po->begin();
  547|  8.47k|        end = po->end();
  548|  8.47k|    }
  549|      0|    else
  550|      0|    {
  551|      0|        state st;
  552|      0|        st_.pop(st);
  553|      0|        st_.pop(it);
  554|      0|        st_.pop(po);
  555|      0|        end = po->end();
  556|      0|        switch(st)
  557|      0|        {
  558|      0|        default:
  ------------------
  |  Branch (558:9): [True: 0, False: 0]
  ------------------
  559|      0|        case state::obj1: goto do_obj1;
  ------------------
  |  Branch (559:9): [True: 0, False: 0]
  ------------------
  560|      0|        case state::obj2: goto do_obj2;
  ------------------
  |  Branch (560:9): [True: 0, False: 0]
  ------------------
  561|      0|        case state::obj3: goto do_obj3;
  ------------------
  |  Branch (561:9): [True: 0, False: 0]
  ------------------
  562|      0|        case state::obj4: goto do_obj4;
  ------------------
  |  Branch (562:9): [True: 0, False: 0]
  ------------------
  563|      0|        case state::obj5: goto do_obj5;
  ------------------
  |  Branch (563:9): [True: 0, False: 0]
  ------------------
  564|      0|        case state::obj6: goto do_obj6;
  ------------------
  |  Branch (564:9): [True: 0, False: 0]
  ------------------
  565|      0|            break;
  566|      0|        }
  567|      0|    }
  568|  8.47k|do_obj1:
  569|  8.47k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  8.47k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 8.45k, False: 23]
  |  |  ------------------
  ------------------
  570|  8.45k|        ss.append('{');
  571|     23|    else
  572|     23|        return suspend(
  573|     23|            state::obj1, it, po);
  574|  8.45k|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  8.45k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1.22k, False: 7.23k]
  |  |  ------------------
  ------------------
  575|  8.45k|        it == end))
  576|  1.22k|        goto do_obj6;
  577|  7.23k|    for(;;)
  578|  11.5k|    {
  579|  11.5k|        cs0_ = {
  580|  11.5k|            it->key().data(),
  581|  11.5k|            it->key().size() };
  582|  11.5k|do_obj2:
  583|  11.5k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  11.5k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 118, False: 11.4k]
  |  |  ------------------
  ------------------
  584|  11.5k|            ! write_string<StackEmpty>(ss)))
  585|    118|            return suspend(
  586|    118|                state::obj2, it, po);
  587|  11.4k|do_obj3:
  588|  11.4k|        if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  11.4k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 11.4k, False: 13]
  |  |  ------------------
  ------------------
  589|  11.4k|            ss.append(':');
  590|     13|        else
  591|     13|            return suspend(
  592|     13|                state::obj3, it, po);
  593|  11.4k|do_obj4:
  594|  11.4k|        jv_ = &it->value();
  595|  11.4k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  11.4k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1.31k, False: 10.1k]
  |  |  ------------------
  ------------------
  596|  11.4k|            ! write_value<StackEmpty>(ss)))
  597|  1.31k|            return suspend(
  598|  1.31k|                state::obj4, it, po);
  599|  10.1k|        ++it;
  600|  10.1k|        if(BOOST_JSON_UNLIKELY(it == end))
  ------------------
  |  |  179|  10.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 5.77k, False: 4.37k]
  |  |  ------------------
  ------------------
  601|  5.77k|            break;
  602|  4.37k|do_obj5:
  603|  4.37k|        if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  4.37k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 4.35k, False: 16]
  |  |  ------------------
  ------------------
  604|  4.35k|            ss.append(',');
  605|     16|        else
  606|     16|            return suspend(
  607|     16|                state::obj5, it, po);
  608|  4.37k|    }
  609|  6.99k|do_obj6:
  610|  6.99k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  6.99k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 6.96k, False: 26]
  |  |  ------------------
  ------------------
  611|  6.96k|    {
  612|  6.96k|        ss.append('}');
  613|  6.96k|        return true;
  614|  6.96k|    }
  615|     26|    return suspend(
  616|     26|        state::obj6, it, po);
  617|  6.99k|}
_ZN5boost4json10serializer7suspendENS1_5stateEPKNS0_14key_value_pairEPKNS0_6objectE:
   82|  3.97k|{
   83|  3.97k|    st_.push(po);
   84|  3.97k|    st_.push(it);
   85|  3.97k|    st_.push(st);
   86|  3.97k|    return false;
   87|  3.97k|}
_ZN5boost4json10serializer12write_objectILb0EEEbRNS0_6detail6streamE:
  538|  3.97k|{
  539|  3.97k|    object const* po;
  540|  3.97k|    local_stream ss(ss0);
  541|  3.97k|    object::const_iterator it;
  542|  3.97k|    object::const_iterator end;
  543|  3.97k|    if(StackEmpty || st_.empty())
  ------------------
  |  Branch (543:8): [Folded - Ignored]
  |  Branch (543:22): [True: 0, False: 3.97k]
  ------------------
  544|      0|    {
  545|      0|        po = po_;
  546|      0|        it = po->begin();
  547|      0|        end = po->end();
  548|      0|    }
  549|  3.97k|    else
  550|  3.97k|    {
  551|  3.97k|        state st;
  552|  3.97k|        st_.pop(st);
  553|  3.97k|        st_.pop(it);
  554|  3.97k|        st_.pop(po);
  555|  3.97k|        end = po->end();
  556|  3.97k|        switch(st)
  557|  3.97k|        {
  558|      0|        default:
  ------------------
  |  Branch (558:9): [True: 0, False: 3.97k]
  ------------------
  559|     23|        case state::obj1: goto do_obj1;
  ------------------
  |  Branch (559:9): [True: 23, False: 3.95k]
  ------------------
  560|    362|        case state::obj2: goto do_obj2;
  ------------------
  |  Branch (560:9): [True: 362, False: 3.61k]
  ------------------
  561|     24|        case state::obj3: goto do_obj3;
  ------------------
  |  Branch (561:9): [True: 24, False: 3.95k]
  ------------------
  562|  3.50k|        case state::obj4: goto do_obj4;
  ------------------
  |  Branch (562:9): [True: 3.50k, False: 474]
  ------------------
  563|     27|        case state::obj5: goto do_obj5;
  ------------------
  |  Branch (563:9): [True: 27, False: 3.95k]
  ------------------
  564|     38|        case state::obj6: goto do_obj6;
  ------------------
  |  Branch (564:9): [True: 38, False: 3.94k]
  ------------------
  565|      0|            break;
  566|  3.97k|        }
  567|  3.97k|    }
  568|     23|do_obj1:
  569|     23|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     23|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 23, False: 0]
  |  |  ------------------
  ------------------
  570|     23|        ss.append('{');
  571|      0|    else
  572|      0|        return suspend(
  573|      0|            state::obj1, it, po);
  574|     23|    if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|     23|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 11, False: 12]
  |  |  ------------------
  ------------------
  575|     23|        it == end))
  576|     11|        goto do_obj6;
  577|     12|    for(;;)
  578|  2.22k|    {
  579|  2.22k|        cs0_ = {
  580|  2.22k|            it->key().data(),
  581|  2.22k|            it->key().size() };
  582|  2.58k|do_obj2:
  583|  2.58k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  2.58k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 244, False: 2.34k]
  |  |  ------------------
  ------------------
  584|  2.58k|            ! write_string<StackEmpty>(ss)))
  585|    244|            return suspend(
  586|    244|                state::obj2, it, po);
  587|  2.36k|do_obj3:
  588|  2.36k|        if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  2.36k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.35k, False: 11]
  |  |  ------------------
  ------------------
  589|  2.35k|            ss.append(':');
  590|     11|        else
  591|     11|            return suspend(
  592|     11|                state::obj3, it, po);
  593|  5.86k|do_obj4:
  594|  5.86k|        jv_ = &it->value();
  595|  5.86k|        if(BOOST_JSON_UNLIKELY(
  ------------------
  |  |  179|  5.86k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2.18k, False: 3.67k]
  |  |  ------------------
  ------------------
  596|  5.86k|            ! write_value<StackEmpty>(ss)))
  597|  2.18k|            return suspend(
  598|  2.18k|                state::obj4, it, po);
  599|  3.67k|        ++it;
  600|  3.67k|        if(BOOST_JSON_UNLIKELY(it == end))
  ------------------
  |  |  179|  3.67k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 1.47k, False: 2.19k]
  |  |  ------------------
  ------------------
  601|  1.47k|            break;
  602|  2.22k|do_obj5:
  603|  2.22k|        if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  2.22k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.21k, False: 11]
  |  |  ------------------
  ------------------
  604|  2.21k|            ss.append(',');
  605|     11|        else
  606|     11|            return suspend(
  607|     11|                state::obj5, it, po);
  608|  2.22k|    }
  609|  1.52k|do_obj6:
  610|  1.52k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  1.52k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 1.51k, False: 12]
  |  |  ------------------
  ------------------
  611|  1.51k|    {
  612|  1.51k|        ss.append('}');
  613|  1.51k|        return true;
  614|  1.51k|    }
  615|     12|    return suspend(
  616|     12|        state::obj6, it, po);
  617|  1.52k|}
_ZN5boost4json10serializer12write_stringILb1EEEbRNS0_6detail6streamE:
  225|  38.9k|{
  226|  38.9k|    local_stream ss(ss0);
  227|  38.9k|    local_const_stream cs(cs0_);
  228|  38.9k|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (228:8): [Folded - Ignored]
  |  Branch (228:24): [True: 0, False: 0]
  ------------------
  229|      0|    {
  230|      0|        state st;
  231|      0|        st_.pop(st);
  232|      0|        switch(st)
  233|      0|        {
  234|      0|        default:
  ------------------
  |  Branch (234:9): [True: 0, False: 0]
  ------------------
  235|      0|        case state::str1: goto do_str1;
  ------------------
  |  Branch (235:9): [True: 0, False: 0]
  ------------------
  236|      0|        case state::str2: goto do_str2;
  ------------------
  |  Branch (236:9): [True: 0, False: 0]
  ------------------
  237|      0|        case state::str3: goto do_str3;
  ------------------
  |  Branch (237:9): [True: 0, False: 0]
  ------------------
  238|      0|        case state::str4: goto do_str4;
  ------------------
  |  Branch (238:9): [True: 0, False: 0]
  ------------------
  239|      0|        case state::esc1: goto do_esc1;
  ------------------
  |  Branch (239:9): [True: 0, False: 0]
  ------------------
  240|      0|        case state::utf1: goto do_utf1;
  ------------------
  |  Branch (240:9): [True: 0, False: 0]
  ------------------
  241|      0|        case state::utf2: goto do_utf2;
  ------------------
  |  Branch (241:9): [True: 0, False: 0]
  ------------------
  242|      0|        case state::utf3: goto do_utf3;
  ------------------
  |  Branch (242:9): [True: 0, False: 0]
  ------------------
  243|      0|        case state::utf4: goto do_utf4;
  ------------------
  |  Branch (243:9): [True: 0, False: 0]
  ------------------
  244|      0|        case state::utf5: goto do_utf5;
  ------------------
  |  Branch (244:9): [True: 0, False: 0]
  ------------------
  245|      0|        }
  246|      0|    }
  247|  38.9k|    static constexpr char hex[] = "0123456789abcdef";
  248|  38.9k|    static constexpr char esc[] =
  249|  38.9k|        "uuuuuuuubtnufruuuuuuuuuuuuuuuuuu"
  250|  38.9k|        "\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  251|  38.9k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0"
  252|  38.9k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  253|  38.9k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  254|  38.9k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  255|  38.9k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  256|  38.9k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
  257|       |
  258|       |    // opening quote
  259|  38.9k|do_str1:
  260|  38.9k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  38.9k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 38.9k, False: 28]
  |  |  ------------------
  ------------------
  261|  38.9k|        ss.append('\x22'); // '"'
  262|     28|    else
  263|     28|        return suspend(state::str1);
  264|       |
  265|       |    // fast loop,
  266|       |    // copy unescaped
  267|  38.9k|do_str2:
  268|  38.9k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  38.9k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 38.8k, False: 41]
  |  |  ------------------
  ------------------
  269|  38.8k|    {
  270|  38.8k|        std::size_t n = cs.remain();
  271|  38.8k|        if(BOOST_JSON_LIKELY(n > 0))
  ------------------
  |  |  171|  38.8k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 20.5k, False: 18.3k]
  |  |  ------------------
  ------------------
  272|  20.5k|        {
  273|  20.5k|            if(ss.remain() > n)
  ------------------
  |  Branch (273:16): [True: 20.2k, False: 273]
  ------------------
  274|  20.2k|                n = detail::count_unescaped(
  275|  20.2k|                    cs.data(), n);
  276|    273|            else
  277|    273|                n = detail::count_unescaped(
  278|    273|                    cs.data(), ss.remain());
  279|  20.5k|            if(n > 0)
  ------------------
  |  Branch (279:16): [True: 13.1k, False: 7.36k]
  ------------------
  280|  13.1k|            {
  281|  13.1k|                ss.append(cs.data(), n);
  282|  13.1k|                cs.skip(n);
  283|  13.1k|                if(! ss)
  ------------------
  |  Branch (283:20): [True: 30, False: 13.1k]
  ------------------
  284|     30|                    return suspend(state::str2);
  285|  13.1k|            }
  286|  20.5k|        }
  287|  18.3k|        else
  288|  18.3k|        {
  289|  18.3k|            ss.append('\x22'); // '"'
  290|  18.3k|            return true;
  291|  18.3k|        }
  292|  38.8k|    }
  293|     41|    else
  294|     41|    {
  295|     41|        return suspend(state::str2);
  296|     41|    }
  297|       |
  298|       |    // slow loop,
  299|       |    // handle escapes
  300|  20.4k|do_str3:
  301|   995k|    while(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|   995k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 995k, False: 182]
  |  |  ------------------
  ------------------
  302|   995k|    {
  303|   995k|        if(BOOST_JSON_LIKELY(cs))
  ------------------
  |  |  171|   995k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 975k, False: 20.1k]
  |  |  ------------------
  ------------------
  304|   975k|        {
  305|   975k|            auto const ch = *cs;
  306|   975k|            auto const c = esc[static_cast<
  307|   975k|                unsigned char>(ch)];
  308|   975k|            ++cs;
  309|   975k|            if(! c)
  ------------------
  |  Branch (309:16): [True: 871k, False: 104k]
  ------------------
  310|   871k|            {
  311|   871k|                ss.append(ch);
  312|   871k|            }
  313|   104k|            else if(c != 'u')
  ------------------
  |  Branch (313:21): [True: 15.0k, False: 89.3k]
  ------------------
  314|  15.0k|            {
  315|  15.0k|                ss.append('\\');
  316|  15.0k|                if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  15.0k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 15.0k, False: 18]
  |  |  ------------------
  ------------------
  317|  15.0k|                {
  318|  15.0k|                    ss.append(c);
  319|  15.0k|                }
  320|     18|                else
  321|     18|                {
  322|     18|                    buf_[0] = c;
  323|     18|                    return suspend(
  324|     18|                        state::esc1);
  325|     18|                }
  326|  15.0k|            }
  327|  89.3k|            else
  328|  89.3k|            {
  329|  89.3k|                if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  89.3k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 89.2k, False: 103]
  |  |  ------------------
  ------------------
  330|  89.3k|                    ss.remain() >= 6))
  331|  89.2k|                {
  332|  89.2k|                    ss.append("\\u00", 4);
  333|  89.2k|                    ss.append(hex[static_cast<
  334|  89.2k|                        unsigned char>(ch) >> 4]);
  335|  89.2k|                    ss.append(hex[static_cast<
  336|  89.2k|                        unsigned char>(ch) & 15]);
  337|  89.2k|                }
  338|    103|                else
  339|    103|                {
  340|    103|                    ss.append('\\');
  341|    103|                    buf_[0] = hex[static_cast<
  342|    103|                        unsigned char>(ch) >> 4];
  343|    103|                    buf_[1] = hex[static_cast<
  344|    103|                        unsigned char>(ch) & 15];
  345|    103|                    goto do_utf1;
  346|    103|                }
  347|  89.3k|            }
  348|   975k|        }
  349|  20.1k|        else
  350|  20.1k|        {
  351|  20.1k|            ss.append('\x22'); // '"'
  352|  20.1k|            return true;
  353|  20.1k|        }
  354|   995k|    }
  355|    182|    return suspend(state::str3);
  356|       |
  357|      0|do_str4:
  358|      0|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  359|      0|        ss.append('\x22'); // '"'
  360|      0|    else
  361|      0|        return suspend(state::str4);
  362|       |
  363|      0|do_esc1:
  364|      0|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  365|      0|        ss.append(buf_[0]);
  366|      0|    else
  367|      0|        return suspend(state::esc1);
  368|      0|    goto do_str3;
  369|       |
  370|    103|do_utf1:
  371|    103|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|    103|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 81, False: 22]
  |  |  ------------------
  ------------------
  372|     81|        ss.append('u');
  373|     22|    else
  374|     22|        return suspend(state::utf1);
  375|     81|do_utf2:
  376|     81|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     81|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 59, False: 22]
  |  |  ------------------
  ------------------
  377|     59|        ss.append('0');
  378|     22|    else
  379|     22|        return suspend(state::utf2);
  380|     59|do_utf3:
  381|     59|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     59|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 40, False: 19]
  |  |  ------------------
  ------------------
  382|     40|        ss.append('0');
  383|     19|    else
  384|     19|        return suspend(state::utf3);
  385|     40|do_utf4:
  386|     40|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     40|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 20, False: 20]
  |  |  ------------------
  ------------------
  387|     20|        ss.append(buf_[0]);
  388|     20|    else
  389|     20|        return suspend(state::utf4);
  390|     20|do_utf5:
  391|     20|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     20|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 20]
  |  |  ------------------
  ------------------
  392|      0|        ss.append(buf_[1]);
  393|     20|    else
  394|     20|        return suspend(state::utf5);
  395|      0|    goto do_str3;
  396|     20|}
_ZN5boost4json10serializer12write_stringILb0EEEbRNS0_6detail6streamE:
  225|  3.14k|{
  226|  3.14k|    local_stream ss(ss0);
  227|  3.14k|    local_const_stream cs(cs0_);
  228|  3.14k|    if(! StackEmpty && ! st_.empty())
  ------------------
  |  Branch (228:8): [Folded - Ignored]
  |  Branch (228:24): [True: 915, False: 2.22k]
  ------------------
  229|    915|    {
  230|    915|        state st;
  231|    915|        st_.pop(st);
  232|    915|        switch(st)
  233|    915|        {
  234|      0|        default:
  ------------------
  |  Branch (234:9): [True: 0, False: 915]
  ------------------
  235|     38|        case state::str1: goto do_str1;
  ------------------
  |  Branch (235:9): [True: 38, False: 877]
  ------------------
  236|    100|        case state::str2: goto do_str2;
  ------------------
  |  Branch (236:9): [True: 100, False: 815]
  ------------------
  237|    567|        case state::str3: goto do_str3;
  ------------------
  |  Branch (237:9): [True: 567, False: 348]
  ------------------
  238|      0|        case state::str4: goto do_str4;
  ------------------
  |  Branch (238:9): [True: 0, False: 915]
  ------------------
  239|     37|        case state::esc1: goto do_esc1;
  ------------------
  |  Branch (239:9): [True: 37, False: 878]
  ------------------
  240|     34|        case state::utf1: goto do_utf1;
  ------------------
  |  Branch (240:9): [True: 34, False: 881]
  ------------------
  241|     35|        case state::utf2: goto do_utf2;
  ------------------
  |  Branch (241:9): [True: 35, False: 880]
  ------------------
  242|     32|        case state::utf3: goto do_utf3;
  ------------------
  |  Branch (242:9): [True: 32, False: 883]
  ------------------
  243|     34|        case state::utf4: goto do_utf4;
  ------------------
  |  Branch (243:9): [True: 34, False: 881]
  ------------------
  244|     38|        case state::utf5: goto do_utf5;
  ------------------
  |  Branch (244:9): [True: 38, False: 877]
  ------------------
  245|    915|        }
  246|    915|    }
  247|  2.22k|    static constexpr char hex[] = "0123456789abcdef";
  248|  2.22k|    static constexpr char esc[] =
  249|  2.22k|        "uuuuuuuubtnufruuuuuuuuuuuuuuuuuu"
  250|  2.22k|        "\0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  251|  2.22k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0"
  252|  2.22k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  253|  2.22k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  254|  2.22k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  255|  2.22k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  256|  2.22k|        "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
  257|       |
  258|       |    // opening quote
  259|  2.26k|do_str1:
  260|  2.26k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  2.26k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.25k, False: 10]
  |  |  ------------------
  ------------------
  261|  2.25k|        ss.append('\x22'); // '"'
  262|     10|    else
  263|     10|        return suspend(state::str1);
  264|       |
  265|       |    // fast loop,
  266|       |    // copy unescaped
  267|  2.35k|do_str2:
  268|  2.35k|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  2.35k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.34k, False: 12]
  |  |  ------------------
  ------------------
  269|  2.34k|    {
  270|  2.34k|        std::size_t n = cs.remain();
  271|  2.34k|        if(BOOST_JSON_LIKELY(n > 0))
  ------------------
  |  |  171|  2.34k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 2.14k, False: 196]
  |  |  ------------------
  ------------------
  272|  2.14k|        {
  273|  2.14k|            if(ss.remain() > n)
  ------------------
  |  Branch (273:16): [True: 2.03k, False: 116]
  ------------------
  274|  2.03k|                n = detail::count_unescaped(
  275|  2.03k|                    cs.data(), n);
  276|    116|            else
  277|    116|                n = detail::count_unescaped(
  278|    116|                    cs.data(), ss.remain());
  279|  2.14k|            if(n > 0)
  ------------------
  |  Branch (279:16): [True: 1.23k, False: 917]
  ------------------
  280|  1.23k|            {
  281|  1.23k|                ss.append(cs.data(), n);
  282|  1.23k|                cs.skip(n);
  283|  1.23k|                if(! ss)
  ------------------
  |  Branch (283:20): [True: 17, False: 1.21k]
  ------------------
  284|     17|                    return suspend(state::str2);
  285|  1.23k|            }
  286|  2.14k|        }
  287|    196|        else
  288|    196|        {
  289|    196|            ss.append('\x22'); // '"'
  290|    196|            return true;
  291|    196|        }
  292|  2.34k|    }
  293|     12|    else
  294|     12|    {
  295|     12|        return suspend(state::str2);
  296|     12|    }
  297|       |
  298|       |    // slow loop,
  299|       |    // handle escapes
  300|  2.90k|do_str3:
  301|  24.4M|    while(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|  24.4M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 24.4M, False: 385]
  |  |  ------------------
  ------------------
  302|  24.4M|    {
  303|  24.4M|        if(BOOST_JSON_LIKELY(cs))
  ------------------
  |  |  171|  24.4M|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 24.4M, False: 2.43k]
  |  |  ------------------
  ------------------
  304|  24.4M|        {
  305|  24.4M|            auto const ch = *cs;
  306|  24.4M|            auto const c = esc[static_cast<
  307|  24.4M|                unsigned char>(ch)];
  308|  24.4M|            ++cs;
  309|  24.4M|            if(! c)
  ------------------
  |  Branch (309:16): [True: 24.1M, False: 305k]
  ------------------
  310|  24.1M|            {
  311|  24.1M|                ss.append(ch);
  312|  24.1M|            }
  313|   305k|            else if(c != 'u')
  ------------------
  |  Branch (313:21): [True: 275k, False: 29.5k]
  ------------------
  314|   275k|            {
  315|   275k|                ss.append('\\');
  316|   275k|                if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|   275k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 275k, False: 19]
  |  |  ------------------
  ------------------
  317|   275k|                {
  318|   275k|                    ss.append(c);
  319|   275k|                }
  320|     19|                else
  321|     19|                {
  322|     19|                    buf_[0] = c;
  323|     19|                    return suspend(
  324|     19|                        state::esc1);
  325|     19|                }
  326|   275k|            }
  327|  29.5k|            else
  328|  29.5k|            {
  329|  29.5k|                if(BOOST_JSON_LIKELY(
  ------------------
  |  |  171|  29.5k|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 29.4k, False: 70]
  |  |  ------------------
  ------------------
  330|  29.5k|                    ss.remain() >= 6))
  331|  29.4k|                {
  332|  29.4k|                    ss.append("\\u00", 4);
  333|  29.4k|                    ss.append(hex[static_cast<
  334|  29.4k|                        unsigned char>(ch) >> 4]);
  335|  29.4k|                    ss.append(hex[static_cast<
  336|  29.4k|                        unsigned char>(ch) & 15]);
  337|  29.4k|                }
  338|     70|                else
  339|     70|                {
  340|     70|                    ss.append('\\');
  341|     70|                    buf_[0] = hex[static_cast<
  342|     70|                        unsigned char>(ch) >> 4];
  343|     70|                    buf_[1] = hex[static_cast<
  344|     70|                        unsigned char>(ch) & 15];
  345|     70|                    goto do_utf1;
  346|     70|                }
  347|  29.5k|            }
  348|  24.4M|        }
  349|  2.43k|        else
  350|  2.43k|        {
  351|  2.43k|            ss.append('\x22'); // '"'
  352|  2.43k|            return true;
  353|  2.43k|        }
  354|  24.4M|    }
  355|    385|    return suspend(state::str3);
  356|       |
  357|      0|do_str4:
  358|      0|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|      0|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  359|      0|        ss.append('\x22'); // '"'
  360|      0|    else
  361|      0|        return suspend(state::str4);
  362|       |
  363|     37|do_esc1:
  364|     37|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|     37|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 37, False: 0]
  |  |  ------------------
  ------------------
  365|     37|        ss.append(buf_[0]);
  366|      0|    else
  367|      0|        return suspend(state::esc1);
  368|     37|    goto do_str3;
  369|       |
  370|    104|do_utf1:
  371|    104|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|    104|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 92, False: 12]
  |  |  ------------------
  ------------------
  372|     92|        ss.append('u');
  373|     12|    else
  374|     12|        return suspend(state::utf1);
  375|    127|do_utf2:
  376|    127|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|    127|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 114, False: 13]
  |  |  ------------------
  ------------------
  377|    114|        ss.append('0');
  378|     13|    else
  379|     13|        return suspend(state::utf2);
  380|    146|do_utf3:
  381|    146|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|    146|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 133, False: 13]
  |  |  ------------------
  ------------------
  382|    133|        ss.append('0');
  383|     13|    else
  384|     13|        return suspend(state::utf3);
  385|    167|do_utf4:
  386|    167|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|    167|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 153, False: 14]
  |  |  ------------------
  ------------------
  387|    153|        ss.append(buf_[0]);
  388|     14|    else
  389|     14|        return suspend(state::utf4);
  390|    191|do_utf5:
  391|    191|    if(BOOST_JSON_LIKELY(ss))
  ------------------
  |  |  171|    191|#  define BOOST_JSON_LIKELY(x) __builtin_expect(!!(x), 1)
  |  |  ------------------
  |  |  |  Branch (171:32): [True: 173, False: 18]
  |  |  ------------------
  ------------------
  392|    173|        ss.append(buf_[1]);
  393|     18|    else
  394|     18|        return suspend(state::utf5);
  395|    173|    goto do_str3;
  396|    191|}

_ZN5boost4json15static_resourceD2Ev:
   22|  2.66k|~static_resource() noexcept = default;
_ZN5boost4json15static_resourceC2EPhm:
   31|  2.66k|{
   32|  2.66k|}
_ZN5boost4json15static_resource11do_allocateEmm:
   48|  10.4k|{
   49|  10.4k|    auto p = alignment::align(
   50|  10.4k|        align, n, p_, n_);
   51|  10.4k|    if(! p)
  ------------------
  |  Branch (51:8): [True: 20, False: 10.4k]
  ------------------
   52|     20|        detail::throw_bad_alloc();
   53|  10.4k|    p_ = reinterpret_cast<char*>(p) + n;
   54|  10.4k|    n_ -= n;
   55|  10.4k|    return p;
   56|  10.4k|}
_ZN5boost4json15static_resource13do_deallocateEPvmm:
   64|    279|{
   65|       |    // do nothing
   66|    279|}

_ZN5boost4json13stream_parserC2ENS0_11storage_ptrERKNS0_13parse_optionsEPhm:
   34|  4.78k|{
   35|  4.78k|    reset();
   36|  4.78k|}
_ZN5boost4json13stream_parserC2ENS0_11storage_ptrERKNS0_13parse_optionsE:
   47|  6.05k|{
   48|  6.05k|    reset();
   49|  6.05k|}
_ZN5boost4json13stream_parser5resetENS0_11storage_ptrE:
   54|  13.4k|{
   55|  13.4k|    p_.reset();
   56|  13.4k|    p_.handler().st.reset(sp);
   57|  13.4k|}
_ZN5boost4json13stream_parser10write_someEPKcmRNS_6system10error_codeE:
   65|  10.8k|{
   66|  10.8k|    return p_.write_some(
   67|  10.8k|        true, data, size, ec);
   68|  10.8k|}
_ZN5boost4json13stream_parser5writeEPKcmRNS_6system10error_codeE:
  103|  10.8k|{
  104|  10.8k|    auto const n = write_some(
  105|  10.8k|        data, size, ec);
  106|  10.8k|    if(! ec && n < size)
  ------------------
  |  Branch (106:8): [True: 8.16k, False: 2.67k]
  |  Branch (106:16): [True: 948, False: 7.21k]
  ------------------
  107|    948|    {
  108|    948|        BOOST_JSON_FAIL(ec, error::extra_data);
  ------------------
  |  |   20|    948|    BOOST_STATIC_CONSTEXPR source_location loc = BOOST_CURRENT_LOCATION; \
  |  |  ------------------
  |  |  |  |  170|    948|# define BOOST_CURRENT_LOCATION ::boost::source_location(__builtin_FILE(), __builtin_LINE(), __builtin_FUNCTION(), __builtin_COLUMN())
  |  |  ------------------
  |  |   21|    948|    (ec).assign(e, &loc);
  ------------------
  109|    948|        p_.fail(ec);
  110|    948|    }
  111|  10.8k|    return n;
  112|  10.8k|}
_ZN5boost4json13stream_parser6finishERNS_6system10error_codeE:
  144|  7.21k|{
  145|  7.21k|    p_.write_some(false, nullptr, 0, ec);
  146|  7.21k|}
_ZN5boost4json13stream_parser7releaseEv:
  170|  4.52k|{
  171|  4.52k|    if(! p_.done())
  ------------------
  |  Branch (171:8): [True: 0, False: 4.52k]
  ------------------
  172|      0|    {
  173|       |        // prevent undefined behavior
  174|      0|        finish();
  175|      0|    }
  176|  4.52k|    return p_.handler().st.release();
  177|  4.52k|}

_ZN5boost4json6stringC2ERKNS0_6detail5key_tENS_4core17basic_string_viewIcEENS0_11storage_ptrE:
   26|   223k|{
   27|   223k|}
_ZN5boost4json6stringC2ERKNS0_6detail5key_tENS_4core17basic_string_viewIcEES8_NS0_11storage_ptrE:
   38|  3.41k|{
   39|  3.41k|}

_ZN5boost4json6stringC2ENS_4core17basic_string_viewIcEENS0_11storage_ptrE:
   89|  19.3k|{
   90|  19.3k|    assign(s);
   91|  19.3k|}
_ZN5boost4json6string6assignEPKcm:
  178|  19.3k|{
  179|  19.3k|    std::char_traits<char>::copy(
  180|  19.3k|        impl_.assign(count, sp_),
  181|  19.3k|        s, count);
  182|  19.3k|    return *this;
  183|  19.3k|}
_ZN5boost4json6string12reserve_implEm:
  398|  12.7k|{
  399|  12.7k|    BOOST_ASSERT(
  ------------------
  |  |   60|  12.7k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  400|  12.7k|        new_cap >= impl_.capacity());
  401|  12.7k|    if(new_cap > impl_.capacity())
  ------------------
  |  Branch (401:8): [True: 12.7k, False: 0]
  ------------------
  402|  12.7k|    {
  403|       |        // grow
  404|  12.7k|        new_cap = detail::string_impl::growth(
  405|  12.7k|            new_cap, impl_.capacity());
  406|  12.7k|        detail::string_impl tmp(new_cap, sp_);
  407|  12.7k|        std::char_traits<char>::copy(tmp.data(),
  408|  12.7k|            impl_.data(), impl_.size() + 1);
  409|  12.7k|        tmp.size(impl_.size());
  410|  12.7k|        impl_.destroy(sp_);
  411|  12.7k|        impl_ = tmp;
  412|  12.7k|        return;
  413|  12.7k|    }
  414|  12.7k|}

_ZN5boost4json5valueD2Ev:
   43|  7.55M|{
   44|  7.55M|    switch(kind())
  ------------------
  |  Branch (44:12): [True: 0, False: 7.55M]
  ------------------
   45|  7.55M|    {
   46|  11.4k|    case json::kind::null:
  ------------------
  |  Branch (46:5): [True: 11.4k, False: 7.54M]
  ------------------
   47|  30.1k|    case json::kind::bool_:
  ------------------
  |  Branch (47:5): [True: 18.6k, False: 7.53M]
  ------------------
   48|  2.50M|    case json::kind::int64:
  ------------------
  |  Branch (48:5): [True: 2.47M, False: 5.08M]
  ------------------
   49|  2.52M|    case json::kind::uint64:
  ------------------
  |  Branch (49:5): [True: 17.5k, False: 7.54M]
  ------------------
   50|  7.46M|    case json::kind::double_:
  ------------------
  |  Branch (50:5): [True: 4.93M, False: 2.62M]
  ------------------
   51|  7.46M|        sca_.~scalar();
   52|  7.46M|        break;
   53|       |
   54|  73.2k|    case json::kind::string:
  ------------------
  |  Branch (54:5): [True: 73.2k, False: 7.48M]
  ------------------
   55|  73.2k|        str_.~string();
   56|  73.2k|        break;
   57|       |
   58|  12.6k|    case json::kind::array:
  ------------------
  |  Branch (58:5): [True: 12.6k, False: 7.54M]
  ------------------
   59|  12.6k|        arr_.~array();
   60|  12.6k|        break;
   61|       |
   62|  9.74k|    case json::kind::object:
  ------------------
  |  Branch (62:5): [True: 9.74k, False: 7.54M]
  ------------------
   63|  9.74k|        obj_.~object();
   64|  9.74k|        break;
   65|  7.55M|    }
   66|  7.55M|}
_ZN5boost4json14key_value_pairC2ENS0_8pilferedINS0_5valueEEES4_:
  583|   184k|{
  584|   184k|    std::size_t len;
  585|   184k|    key_ = access::release_key(key.get(), len);
  586|   184k|    len_ = static_cast<std::uint32_t>(len);
  587|   184k|}

_ZN5boost4json11value_stackD2Ev:
  305|  10.8k|{
  306|       |    // default dtor is here so the
  307|       |    // definition goes in the library
  308|       |    // instead of the caller's TU.
  309|  10.8k|}
_ZN5boost4json11value_stackC2ENS0_11storage_ptrEPhm:
  320|  10.8k|{
  321|  10.8k|}
_ZN5boost4json11value_stack5resetENS0_11storage_ptrE:
  326|  13.4k|{
  327|  13.4k|    st_.clear();
  328|       |
  329|  13.4k|    sp_.~storage_ptr();
  330|  13.4k|    ::new(&sp_) storage_ptr(
  331|  13.4k|        pilfer(sp));
  332|       |
  333|       |    // `stack` needs this
  334|       |    // to clean up correctly
  335|  13.4k|    st_.run_dtors(
  336|  13.4k|        ! sp_.is_not_shared_and_deallocate_is_trivial());
  337|  13.4k|}
_ZN5boost4json11value_stack7releaseEv:
  342|  4.52k|{
  343|       |    // This means the caller did not
  344|       |    // cause a single top level element
  345|       |    // to be produced.
  346|  4.52k|    BOOST_ASSERT(st_.size() == 1);
  ------------------
  |  |   60|  4.52k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  347|       |
  348|       |    // give up shared ownership
  349|  4.52k|    sp_ = {};
  350|       |
  351|  4.52k|    return pilfer(*st_.release(1));
  352|  4.52k|}
_ZN5boost4json11value_stack10push_arrayEm:
  359|  14.1k|{
  360|       |    // we already have room if n > 0
  361|  14.1k|    if(BOOST_JSON_UNLIKELY(n == 0))
  ------------------
  |  |  179|  14.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 6.35k, False: 7.81k]
  |  |  ------------------
  ------------------
  362|  6.35k|        st_.maybe_grow();
  363|  14.1k|    detail::unchecked_array ua(
  364|  14.1k|        st_.release(n), n, sp_);
  365|  14.1k|    st_.exchange(std::move(ua));
  366|  14.1k|}
_ZN5boost4json11value_stack11push_objectEm:
  371|  11.1k|{
  372|       |    // we already have room if n > 0
  373|  11.1k|    if(BOOST_JSON_UNLIKELY(n == 0))
  ------------------
  |  |  179|  11.1k|#  define BOOST_JSON_UNLIKELY(x) __builtin_expect(!!(x), 0)
  |  |  ------------------
  |  |  |  Branch (179:34): [True: 2.81k, False: 8.30k]
  |  |  ------------------
  ------------------
  374|  2.81k|        st_.maybe_grow();
  375|  11.1k|    detail::unchecked_object uo(
  376|  11.1k|        st_.release(n * 2), n, sp_);
  377|  11.1k|    st_.exchange(std::move(uo));
  378|  11.1k|}
_ZN5boost4json11value_stack10push_charsENS_4core17basic_string_viewIcEE:
  384|  24.4k|{
  385|  24.4k|    st_.append(s);
  386|  24.4k|}
_ZN5boost4json11value_stack8push_keyENS_4core17basic_string_viewIcEE:
  392|   227k|{
  393|   227k|    if(! st_.has_chars())
  ------------------
  |  Branch (393:8): [True: 223k, False: 3.41k]
  ------------------
  394|   223k|    {
  395|   223k|        st_.push(detail::key_t{}, s, sp_);
  396|   223k|        return;
  397|   223k|    }
  398|  3.41k|    auto part = st_.release_string();
  399|  3.41k|    st_.push(detail::key_t{}, part, s, sp_);
  400|  3.41k|}
_ZN5boost4json11value_stack11push_stringENS_4core17basic_string_viewIcEE:
  406|  32.7k|{
  407|  32.7k|    if(! st_.has_chars())
  ------------------
  |  Branch (407:8): [True: 19.3k, False: 13.4k]
  ------------------
  408|  19.3k|    {
  409|       |        // fast path
  410|  19.3k|        st_.push(s, sp_);
  411|  19.3k|        return;
  412|  19.3k|    }
  413|       |
  414|       |    // VFALCO We could add a special
  415|       |    // private ctor to string that just
  416|       |    // creates uninitialized space,
  417|       |    // to reduce member function calls.
  418|  13.4k|    auto part = st_.release_string();
  419|  13.4k|    auto& str = st_.push(
  420|  13.4k|        string_kind, sp_).get_string();
  421|  13.4k|    str.reserve(
  422|  13.4k|        part.size() + s.size());
  423|  13.4k|    std::memcpy(
  424|  13.4k|        str.data(),
  425|  13.4k|        part.data(), part.size());
  426|  13.4k|    std::memcpy(
  427|  13.4k|        str.data() + part.size(),
  428|  13.4k|        s.data(), s.size());
  429|  13.4k|    str.grow(part.size() + s.size());
  430|  13.4k|}
_ZN5boost4json11value_stack10push_int64El:
  436|  2.48M|{
  437|  2.48M|    st_.push(i, sp_);
  438|  2.48M|}
_ZN5boost4json11value_stack11push_uint64Em:
  444|  17.5k|{
  445|  17.5k|    st_.push(u, sp_);
  446|  17.5k|}
_ZN5boost4json11value_stack11push_doubleEd:
  452|  4.96M|{
  453|  4.96M|    st_.push(d, sp_);
  454|  4.96M|}
_ZN5boost4json11value_stack9push_boolEb:
  460|  19.4k|{
  461|  19.4k|    st_.push(b, sp_);
  462|  19.4k|}
_ZN5boost4json11value_stack9push_nullEv:
  467|  11.7k|{
  468|  11.7k|    st_.push(nullptr, sp_);
  469|  11.7k|}
_ZN5boost4json11value_stack5stackD2Ev:
   26|  10.8k|{
   27|  10.8k|    clear();
   28|  10.8k|    if( begin_ != temp_ &&
  ------------------
  |  Branch (28:9): [True: 5.49k, False: 5.34k]
  ------------------
   29|  10.8k|        begin_ != nullptr)
  ------------------
  |  Branch (29:9): [True: 5.34k, False: 143]
  ------------------
   30|  5.34k|        sp_->deallocate(
   31|  5.34k|            begin_,
   32|  5.34k|            (end_ - begin_) *
   33|  5.34k|                sizeof(value));
   34|  10.8k|}
_ZN5boost4json11value_stack5stackC2ENS0_11storage_ptrEPvm:
   44|  10.8k|{
   45|  10.8k|    if(size >= min_size_ *
  ------------------
  |  Branch (45:8): [True: 4.55k, False: 6.28k]
  ------------------
   46|  10.8k|        sizeof(value))
   47|  4.55k|    {
   48|  4.55k|        begin_ = reinterpret_cast<
   49|  4.55k|            value*>(temp);
   50|  4.55k|        top_ = begin_;
   51|  4.55k|        end_ = begin_ +
   52|  4.55k|            size / sizeof(value);
   53|  4.55k|    }
   54|  6.28k|    else
   55|  6.28k|    {
   56|  6.28k|        begin_ = nullptr;
   57|  6.28k|        top_ = nullptr;
   58|  6.28k|        end_ = nullptr;
   59|  6.28k|    }
   60|  10.8k|}
_ZN5boost4json11value_stack5stack5clearEv:
   94|  24.3k|{
   95|  24.3k|    if(top_ != begin_)
  ------------------
  |  Branch (95:8): [True: 3.60k, False: 20.7k]
  ------------------
   96|  3.60k|    {
   97|  3.60k|        if(run_dtors_)
  ------------------
  |  Branch (97:12): [True: 2.70k, False: 902]
  ------------------
   98|  2.70k|            for(auto it = top_;
   99|   153k|                it-- != begin_;)
  ------------------
  |  Branch (99:17): [True: 150k, False: 2.70k]
  ------------------
  100|   150k|                it->~value();
  101|  3.60k|        top_ = begin_;
  102|  3.60k|    }
  103|  24.3k|    chars_ = 0;
  104|  24.3k|}
_ZN5boost4json11value_stack5stack9run_dtorsEb:
   66|  13.4k|{
   67|  13.4k|    run_dtors_ = b;
   68|  13.4k|}
_ZN5boost4json11value_stack5stack7releaseEm:
  252|  29.8k|{
  253|  29.8k|    BOOST_ASSERT(n <= size());
  ------------------
  |  |   60|  29.8k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  254|  29.8k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  29.8k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  255|  29.8k|    top_ -= n;
  256|  29.8k|    return top_;
  257|  29.8k|}
_ZN5boost4json11value_stack5stack10maybe_growEv:
  110|  9.17k|{
  111|  9.17k|    if(top_ >= end_)
  ------------------
  |  Branch (111:8): [True: 131, False: 9.04k]
  ------------------
  112|    131|        grow_one();
  113|  9.17k|}
_ZN5boost4json11value_stack5stack8grow_oneEv:
  120|  10.0k|{
  121|  10.0k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  10.0k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  122|  10.0k|    std::size_t const capacity =
  123|  10.0k|        end_ - begin_;
  124|  10.0k|    std::size_t new_cap = min_size_;
  125|       |    // VFALCO check overflow here
  126|  29.5k|    while(new_cap < capacity + 1)
  ------------------
  |  Branch (126:11): [True: 19.5k, False: 10.0k]
  ------------------
  127|  19.5k|        new_cap <<= 1;
  128|  10.0k|    auto const begin =
  129|  10.0k|        reinterpret_cast<value*>(
  130|  10.0k|            sp_->allocate(
  131|  10.0k|                new_cap * sizeof(value)));
  132|  10.0k|    if(begin_)
  ------------------
  |  Branch (132:8): [True: 5.28k, False: 4.72k]
  ------------------
  133|  5.28k|    {
  134|  5.28k|        std::memcpy(
  135|  5.28k|            reinterpret_cast<char*>(begin),
  136|  5.28k|            reinterpret_cast<char*>(begin_),
  137|  5.28k|            size() * sizeof(value));
  138|  5.28k|        if(begin_ != temp_)
  ------------------
  |  Branch (138:12): [True: 5.26k, False: 22]
  ------------------
  139|  5.26k|            sp_->deallocate(begin_,
  140|  5.26k|                capacity * sizeof(value));
  141|  5.28k|    }
  142|       |    // book-keeping
  143|  10.0k|    top_ = begin + (top_ - begin_);
  144|  10.0k|    end_ = begin + new_cap;
  145|  10.0k|    begin_ = begin;
  146|  10.0k|}
_ZNK5boost4json11value_stack5stack4sizeEv:
   74|  7.65k|{
   75|  7.65k|    return top_ - begin_;
   76|  7.65k|}
_ZN5boost4json11value_stack5stack6appendENS_4core17basic_string_viewIcEE:
  199|  24.4k|{
  200|  24.4k|    std::size_t const bytes_avail =
  201|  24.4k|        reinterpret_cast<
  202|  24.4k|            char const*>(end_) -
  203|  24.4k|        reinterpret_cast<
  204|  24.4k|            char const*>(top_);
  205|       |    // make sure there is room for
  206|       |    // pushing one more value without
  207|       |    // clobbering the string.
  208|  24.4k|    if(sizeof(value) + chars_ +
  ------------------
  |  Branch (208:8): [True: 1.48k, False: 22.9k]
  ------------------
  209|  24.4k|            s.size() > bytes_avail)
  210|  1.48k|        grow(s.size());
  211|       |
  212|       |    // copy the new piece
  213|  24.4k|    std::memcpy(
  214|  24.4k|        reinterpret_cast<char*>(
  215|  24.4k|            top_ + 1) + chars_,
  216|  24.4k|        s.data(), s.size());
  217|  24.4k|    chars_ += s.size();
  218|       |
  219|       |    // ensure a pushed value cannot
  220|       |    // clobber the released string.
  221|  24.4k|    BOOST_ASSERT(
  ------------------
  |  |   60|  24.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  222|  24.4k|        reinterpret_cast<char*>(
  223|  24.4k|            top_ + 1) + chars_ <=
  224|  24.4k|        reinterpret_cast<char*>(
  225|  24.4k|            end_));
  226|  24.4k|}
_ZN5boost4json11value_stack5stack4growEm:
  153|  1.48k|{
  154|       |    // needed capacity in values
  155|  1.48k|    std::size_t const needed =
  156|  1.48k|        size() +
  157|  1.48k|        1 +
  158|  1.48k|        ((chars_ + nchars +
  159|  1.48k|            sizeof(value) - 1) /
  160|  1.48k|                sizeof(value));
  161|  1.48k|    std::size_t const capacity =
  162|  1.48k|        end_ - begin_;
  163|  1.48k|    BOOST_ASSERT(
  ------------------
  |  |   60|  1.48k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  164|  1.48k|        needed > capacity);
  165|  1.48k|    std::size_t new_cap = min_size_;
  166|       |    // VFALCO check overflow here
  167|  7.41k|    while(new_cap < needed)
  ------------------
  |  Branch (167:11): [True: 5.92k, False: 1.48k]
  ------------------
  168|  5.92k|        new_cap <<= 1;
  169|  1.48k|    auto const begin =
  170|  1.48k|        reinterpret_cast<value*>(
  171|  1.48k|            sp_->allocate(
  172|  1.48k|                new_cap * sizeof(value)));
  173|  1.48k|    if(begin_)
  ------------------
  |  Branch (173:8): [True: 887, False: 597]
  ------------------
  174|    887|    {
  175|    887|        std::size_t amount =
  176|    887|            size() * sizeof(value);
  177|    887|        if(chars_ > 0)
  ------------------
  |  Branch (177:12): [True: 680, False: 207]
  ------------------
  178|    680|            amount += sizeof(value) + chars_;
  179|    887|        std::memcpy(
  180|    887|            reinterpret_cast<char*>(begin),
  181|    887|            reinterpret_cast<char*>(begin_),
  182|    887|            amount);
  183|    887|        if(begin_ != temp_)
  ------------------
  |  Branch (183:12): [True: 807, False: 80]
  ------------------
  184|    807|            sp_->deallocate(begin_,
  185|    807|                capacity * sizeof(value));
  186|    887|    }
  187|       |    // book-keeping
  188|  1.48k|    top_ = begin + (top_ - begin_);
  189|  1.48k|    end_ = begin + new_cap;
  190|  1.48k|    begin_ = begin;
  191|  1.48k|}
_ZN5boost4json11value_stack5stack9has_charsEv:
   82|   259k|{
   83|   259k|    return chars_ != 0;
   84|   259k|}
_ZN5boost4json11value_stack5stack14release_stringEv:
  232|  16.8k|{
  233|       |    // ensure a pushed value cannot
  234|       |    // clobber the released string.
  235|  16.8k|    BOOST_ASSERT(
  ------------------
  |  |   60|  16.8k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  236|  16.8k|        reinterpret_cast<char*>(
  237|  16.8k|            top_ + 1) + chars_ <=
  238|  16.8k|        reinterpret_cast<char*>(
  239|  16.8k|            end_));
  240|  16.8k|    auto const n = chars_;
  241|  16.8k|    chars_ = 0;
  242|  16.8k|    return { reinterpret_cast<
  243|  16.8k|        char const*>(top_ + 1), n };
  244|  16.8k|}
_ZN5boost4json11value_stack5stack8exchangeINS0_6detail15unchecked_arrayEEEvOT_:
  280|  14.1k|{
  281|  14.1k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  14.1k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  282|  14.1k|    union U
  283|  14.1k|    {
  284|  14.1k|        value v;
  285|  14.1k|        U() {}
  286|  14.1k|        ~U() {}
  287|  14.1k|    } jv;
  288|       |    // construct value on the stack
  289|       |    // to avoid clobbering top_[0],
  290|       |    // which belongs to `u`.
  291|  14.1k|    detail::access::
  292|  14.1k|        construct_value(
  293|  14.1k|            &jv.v, std::move(u));
  294|  14.1k|    std::memcpy(
  295|  14.1k|        reinterpret_cast<
  296|  14.1k|            char*>(top_),
  297|  14.1k|        &jv.v, sizeof(value));
  298|  14.1k|    ++top_;
  299|  14.1k|}
_ZZN5boost4json11value_stack5stack8exchangeINS0_6detail15unchecked_arrayEEEvOT_EN1UC2Ev:
  285|  14.1k|        U() {}
_ZZN5boost4json11value_stack5stack8exchangeINS0_6detail15unchecked_arrayEEEvOT_EN1UD2Ev:
  286|  14.1k|        ~U() {}
_ZN5boost4json11value_stack5stack8exchangeINS0_6detail16unchecked_objectEEEvOT_:
  280|  11.1k|{
  281|  11.1k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  11.1k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  282|  11.1k|    union U
  283|  11.1k|    {
  284|  11.1k|        value v;
  285|  11.1k|        U() {}
  286|  11.1k|        ~U() {}
  287|  11.1k|    } jv;
  288|       |    // construct value on the stack
  289|       |    // to avoid clobbering top_[0],
  290|       |    // which belongs to `u`.
  291|  11.1k|    detail::access::
  292|  11.1k|        construct_value(
  293|  11.1k|            &jv.v, std::move(u));
  294|  11.1k|    std::memcpy(
  295|  11.1k|        reinterpret_cast<
  296|  11.1k|            char*>(top_),
  297|  11.1k|        &jv.v, sizeof(value));
  298|  11.1k|    ++top_;
  299|  11.1k|}
_ZZN5boost4json11value_stack5stack8exchangeINS0_6detail16unchecked_objectEEEvOT_EN1UC2Ev:
  285|  11.1k|        U() {}
_ZZN5boost4json11value_stack5stack8exchangeINS0_6detail16unchecked_objectEEEvOT_EN1UD2Ev:
  286|  11.1k|        ~U() {}
_ZN5boost4json11value_stack5stack4pushIJNS0_6detail5key_tERNS_4core17basic_string_viewIcEERNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|   223k|{
  265|   223k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|   223k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|   223k|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 1.31k, False: 222k]
  ------------------
  267|  1.31k|        grow_one();
  268|   223k|    value& jv = detail::access::
  269|   223k|        construct_value(top_,
  270|   223k|            std::forward<Args>(args)...);
  271|   223k|    ++top_;
  272|   223k|    return jv;
  273|   223k|}
_ZN5boost4json11value_stack5stack4pushIJNS0_6detail5key_tERNS_4core17basic_string_viewIcEES9_RNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  3.41k|{
  265|  3.41k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  3.41k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  3.41k|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 0, False: 3.41k]
  ------------------
  267|      0|        grow_one();
  268|  3.41k|    value& jv = detail::access::
  269|  3.41k|        construct_value(top_,
  270|  3.41k|            std::forward<Args>(args)...);
  271|  3.41k|    ++top_;
  272|  3.41k|    return jv;
  273|  3.41k|}
_ZN5boost4json11value_stack5stack4pushIJRNS_4core17basic_string_viewIcEERNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  19.3k|{
  265|  19.3k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  19.3k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  19.3k|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 228, False: 19.0k]
  ------------------
  267|    228|        grow_one();
  268|  19.3k|    value& jv = detail::access::
  269|  19.3k|        construct_value(top_,
  270|  19.3k|            std::forward<Args>(args)...);
  271|  19.3k|    ++top_;
  272|  19.3k|    return jv;
  273|  19.3k|}
_ZN5boost4json11value_stack5stack4pushIJRKNS0_13string_kind_tERNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  13.4k|{
  265|  13.4k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  13.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  13.4k|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 0, False: 13.4k]
  ------------------
  267|      0|        grow_one();
  268|  13.4k|    value& jv = detail::access::
  269|  13.4k|        construct_value(top_,
  270|  13.4k|            std::forward<Args>(args)...);
  271|  13.4k|    ++top_;
  272|  13.4k|    return jv;
  273|  13.4k|}
_ZN5boost4json11value_stack5stack4pushIJRlRNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  2.48M|{
  265|  2.48M|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  2.48M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  2.48M|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 1.82k, False: 2.48M]
  ------------------
  267|  1.82k|        grow_one();
  268|  2.48M|    value& jv = detail::access::
  269|  2.48M|        construct_value(top_,
  270|  2.48M|            std::forward<Args>(args)...);
  271|  2.48M|    ++top_;
  272|  2.48M|    return jv;
  273|  2.48M|}
_ZN5boost4json11value_stack5stack4pushIJRmRNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  17.5k|{
  265|  17.5k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  17.5k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  17.5k|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 212, False: 17.3k]
  ------------------
  267|    212|        grow_one();
  268|  17.5k|    value& jv = detail::access::
  269|  17.5k|        construct_value(top_,
  270|  17.5k|            std::forward<Args>(args)...);
  271|  17.5k|    ++top_;
  272|  17.5k|    return jv;
  273|  17.5k|}
_ZN5boost4json11value_stack5stack4pushIJRdRNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  4.96M|{
  265|  4.96M|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  4.96M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  4.96M|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 6.12k, False: 4.96M]
  ------------------
  267|  6.12k|        grow_one();
  268|  4.96M|    value& jv = detail::access::
  269|  4.96M|        construct_value(top_,
  270|  4.96M|            std::forward<Args>(args)...);
  271|  4.96M|    ++top_;
  272|  4.96M|    return jv;
  273|  4.96M|}
_ZN5boost4json11value_stack5stack4pushIJRbRNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  19.4k|{
  265|  19.4k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  19.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  19.4k|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 110, False: 19.3k]
  ------------------
  267|    110|        grow_one();
  268|  19.4k|    value& jv = detail::access::
  269|  19.4k|        construct_value(top_,
  270|  19.4k|            std::forward<Args>(args)...);
  271|  19.4k|    ++top_;
  272|  19.4k|    return jv;
  273|  19.4k|}
_ZN5boost4json11value_stack5stack4pushIJDnRNS0_11storage_ptrEEEERNS0_5valueEDpOT_:
  264|  11.7k|{
  265|  11.7k|    BOOST_ASSERT(chars_ == 0);
  ------------------
  |  |   60|  11.7k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  266|  11.7k|    if(top_ >= end_)
  ------------------
  |  Branch (266:8): [True: 66, False: 11.7k]
  ------------------
  267|     66|        grow_one();
  268|  11.7k|    value& jv = detail::access::
  269|  11.7k|        construct_value(top_,
  270|  11.7k|            std::forward<Args>(args)...);
  271|  11.7k|    ++top_;
  272|  11.7k|    return jv;
  273|  11.7k|}

_ZNK5boost4json8pilferedINS0_5valueEE3getEv:
   78|   561k|    {
   79|   561k|        return t_;
   80|   561k|    }
_ZN5boost4json6pilferIRNS0_5valueEEENSt3__111conditionalIXaasr3std24is_nothrow_constructibleINS4_16remove_referenceIT_E4typeENS0_8pilferedIS9_EEEE5valuentsr3std24is_nothrow_constructibleIS9_NS0_13detail_pilfer12not_pilferedIS9_EEEE5valueESB_OS9_E4typeEOS7_:
  187|   372k|{
  188|   372k|    using U =
  189|   372k|        typename std::remove_reference<T>::type;
  190|   372k|    static_assert(
  191|   372k|        is_pilfer_constructible<U>::value, "");
  192|   372k|    return typename std::conditional<
  193|   372k|        std::is_nothrow_constructible<
  194|   372k|            U, pilfered<U> >::value &&
  195|   372k|        ! std::is_nothrow_constructible<
  196|   372k|            U, detail_pilfer::not_pilfered<U> >::value,
  197|   372k|        pilfered<U>, U&&
  198|   372k|            >::type(std::move(t));
  199|   372k|}
_ZN5boost4json8pilferedINS0_5valueEEC2EOS2_:
   69|   372k|    {
   70|   372k|    }
_ZN5boost4json6pilferIRNS0_11storage_ptrEEENSt3__111conditionalIXaasr3std24is_nothrow_constructibleINS4_16remove_referenceIT_E4typeENS0_8pilferedIS9_EEEE5valuentsr3std24is_nothrow_constructibleIS9_NS0_13detail_pilfer12not_pilferedIS9_EEEE5valueESB_OS9_E4typeEOS7_:
  187|  13.4k|{
  188|  13.4k|    using U =
  189|  13.4k|        typename std::remove_reference<T>::type;
  190|  13.4k|    static_assert(
  191|  13.4k|        is_pilfer_constructible<U>::value, "");
  192|  13.4k|    return typename std::conditional<
  193|  13.4k|        std::is_nothrow_constructible<
  194|  13.4k|            U, pilfered<U> >::value &&
  195|  13.4k|        ! std::is_nothrow_constructible<
  196|  13.4k|            U, detail_pilfer::not_pilfered<U> >::value,
  197|  13.4k|        pilfered<U>, U&&
  198|  13.4k|            >::type(std::move(t));
  199|  13.4k|}

_ZNK5boost4json10serializer4doneEv:
  179|  7.01k|    {
  180|  7.01k|        return done_;
  181|  7.01k|    }
_ZN5boost4json10serializer4readILm4096EEENS_4core17basic_string_viewIcEERAT__c:
  302|  4.52k|    {
  303|  4.52k|        return read(dest, N);
  304|  4.52k|    }

_ZNK5boost4json11storage_ptr6addrefEv:
  108|  7.80M|    {
  109|  7.80M|        if(is_shared())
  ------------------
  |  Branch (109:12): [True: 0, False: 7.80M]
  ------------------
  110|      0|            get_shared()->refs.fetch_add(
  111|      0|                1, std::memory_order_relaxed);
  112|  7.80M|    }
_ZN5boost4json11storage_ptrC2EOS1_:
  264|  15.7M|    {
  265|  15.7M|    }
_ZN5boost4json11storage_ptrC2ERKS1_:
  290|  7.80M|    {
  291|  7.80M|        addref();
  292|  7.80M|    }
_ZN5boost4json11storage_ptraSEOS1_:
  322|  4.52k|    {
  323|  4.52k|        release();
  324|  4.52k|        i_ = detail::exchange(other.i_, 0);
  325|  4.52k|        return *this;
  326|  4.52k|    }
_ZNK5boost4json11storage_ptr39is_not_shared_and_deallocate_is_trivialEv:
  396|   226k|    {
  397|   226k|        return (i_ & 3) == 2;
  398|   226k|    }
_ZNK5boost4json11storage_ptr3getEv:
  413|   547k|    {
  414|   547k|        if(i_ != 0)
  ------------------
  |  Branch (414:12): [True: 10.7k, False: 536k]
  ------------------
  415|  10.7k|            return reinterpret_cast<
  416|  10.7k|                memory_resource*>(i_ & ~3);
  417|   536k|        return default_resource::get();
  418|   547k|    }
_ZNK5boost4json11storage_ptrptEv:
  433|   547k|    {
  434|   547k|        return get();
  435|   547k|    }

_ZN5boost4json6stringD2Ev:
  158|  73.2k|    {
  159|  73.2k|        impl_.destroy(sp_);
  160|  73.2k|    }
_ZN5boost4json6stringC2ENS0_11storage_ptrE:
  225|  13.4k|    {
  226|  13.4k|    }
_ZN5boost4json6string6assignENS_4core17basic_string_viewIcEE:
  836|  19.3k|    {
  837|  19.3k|        return assign(s.data(), s.size());
  838|  19.3k|    }
_ZN5boost4json6string4dataEv:
 1079|  26.8k|    {
 1080|  26.8k|        return impl_.data();
 1081|  26.8k|    }
_ZNK5boost4json6string4dataEv:
 1100|  27.3k|    {
 1101|  27.3k|        return impl_.data();
 1102|  27.3k|    }
_ZNK5boost4json6string4sizeEv:
 1418|  27.3k|    {
 1419|  27.3k|        return impl_.size();
 1420|  27.3k|    }
_ZNK5boost4json6string8capacityEv:
 1454|  13.4k|    {
 1455|  13.4k|        return impl_.capacity();
 1456|  13.4k|    }
_ZN5boost4json6string7reserveEm:
 1489|  13.4k|    {
 1490|  13.4k|        if(new_capacity <= capacity())
  ------------------
  |  Branch (1490:12): [True: 653, False: 12.7k]
  ------------------
 1491|    653|            return;
 1492|  12.7k|        reserve_impl(new_capacity);
 1493|  12.7k|    }
_ZN5boost4json6string4growEm:
 2361|  13.4k|    {
 2362|  13.4k|        BOOST_ASSERT(
  ------------------
  |  |   60|  13.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2363|  13.4k|            n <= impl_.capacity() - impl_.size());
 2364|  13.4k|        impl_.term(impl_.size() + n);
 2365|  13.4k|    }

_ZN5boost4json5valueC2EONS0_6detail15unchecked_arrayE:
   81|  14.1k|    {
   82|  14.1k|    }
_ZN5boost4json5valueC2EONS0_6detail16unchecked_objectE:
   88|  11.1k|    {
   89|  11.1k|    }
_ZN5boost4json5valueC2ERKNS0_6detail5key_tENS_4core17basic_string_viewIcEENS0_11storage_ptrE:
   96|   223k|    {
   97|   223k|    }
_ZN5boost4json5valueC2ERKNS0_6detail5key_tENS_4core17basic_string_viewIcEES8_NS0_11storage_ptrE:
  105|  3.41k|    {
  106|  3.41k|    }
_ZN5boost4json5valueC2ENS0_8pilferedIS1_EE:
  200|   188k|    {
  201|   188k|        relocate(this, other.get());
  202|   188k|        ::new(&other.get().sca_) scalar();
  203|   188k|    }
_ZN5boost4json5valueC2EDnNS0_11storage_ptrE:
  331|  11.7k|    {
  332|  11.7k|    }
_ZN5boost4json5valueC2ElNS0_11storage_ptrE:
  453|  2.48M|    {
  454|  2.48M|    }
_ZN5boost4json5valueC2EmNS0_11storage_ptrE:
  563|  17.5k|    {
  564|  17.5k|    }
_ZN5boost4json5valueC2EdNS0_11storage_ptrE:
  606|  4.96M|    {
  607|  4.96M|    }
_ZN5boost4json5valueC2ENS_4core17basic_string_viewIcEENS0_11storage_ptrE:
  631|  19.3k|    {
  632|  19.3k|    }
_ZN5boost4json5valueC2ENS0_13string_kind_tENS0_11storage_ptrE:
  776|  13.4k|    {
  777|  13.4k|    }
_ZNK5boost4json5value4kindEv:
 1684|  20.7M|    {
 1685|  20.7M|        return static_cast<json::kind>(
 1686|  20.7M|            static_cast<unsigned char>(
 1687|  20.7M|                sca_.k) & 0x3f);
 1688|  20.7M|    }
_ZNK5boost4json5value7storageEv:
 2467|   181k|    {
 2468|   181k|        return sp_;
 2469|   181k|    }
_ZNKR5boost4json5value10get_objectEv:
 2817|  8.47k|    {
 2818|  8.47k|        BOOST_ASSERT(is_object());
  ------------------
  |  |   60|  8.47k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2819|  8.47k|        return obj_;
 2820|  8.47k|    }
_ZNKR5boost4json5value9get_arrayEv:
 2857|  10.3k|    {
 2858|  10.3k|        BOOST_ASSERT(is_array());
  ------------------
  |  |   60|  10.3k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2859|  10.3k|        return arr_;
 2860|  10.3k|    }
_ZNR5boost4json5value10get_stringEv:
 2883|  13.4k|    {
 2884|  13.4k|        BOOST_ASSERT(is_string());
  ------------------
  |  |   60|  13.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2885|  13.4k|        return str_;
 2886|  13.4k|    }
_ZNKR5boost4json5value10get_stringEv:
 2897|  27.3k|    {
 2898|  27.3k|        BOOST_ASSERT(is_string());
  ------------------
  |  |   60|  27.3k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2899|  27.3k|        return str_;
 2900|  27.3k|    }
_ZNK5boost4json5value9get_int64Ev:
 2946|  1.62M|    {
 2947|  1.62M|        BOOST_ASSERT(is_int64());
  ------------------
  |  |   60|  1.62M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2948|  1.62M|        return sca_.i;
 2949|  1.62M|    }
_ZNK5boost4json5value10get_uint64Ev:
 2994|  16.4k|    {
 2995|  16.4k|        BOOST_ASSERT(is_uint64());
  ------------------
  |  |   60|  16.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 2996|  16.4k|        return sca_.u;
 2997|  16.4k|    }
_ZNK5boost4json5value10get_doubleEv:
 3042|  4.91M|    {
 3043|  4.91M|        BOOST_ASSERT(is_double());
  ------------------
  |  |   60|  4.91M|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 3044|  4.91M|        return sca_.d;
 3045|  4.91M|    }
_ZNK5boost4json5value8get_boolEv:
 3090|  17.4k|    {
 3091|  17.4k|        BOOST_ASSERT(is_bool());
  ------------------
  |  |   60|  17.4k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
 3092|  17.4k|        return sca_.b;
 3093|  17.4k|    }
_ZN5boost4json5value8relocateEPS1_RKS1_:
 3539|   188k|    {
 3540|   188k|        std::memcpy(
 3541|   188k|            static_cast<void*>(dest),
 3542|   188k|            &src,
 3543|   188k|            sizeof(src));
 3544|   188k|    }
_ZN5boost4json14key_value_pairD2Ev:
 3722|   181k|    {
 3723|   181k|        auto const& sp = value_.storage();
 3724|   181k|        if(sp.is_not_shared_and_deallocate_is_trivial())
  ------------------
  |  Branch (3724:12): [True: 2.68k, False: 178k]
  ------------------
 3725|  2.68k|            return;
 3726|   178k|        if(key_ == empty_)
  ------------------
  |  Branch (3726:12): [True: 0, False: 178k]
  ------------------
 3727|      0|            return;
 3728|   178k|        sp->deallocate(const_cast<char*>(key_),
 3729|   178k|            len_ + 1, alignof(char));
 3730|   178k|    }
_ZNK5boost4json14key_value_pair3keyEv:
 3956|   561k|    {
 3957|   561k|        return { key_, len_ };
 3958|   561k|    }
_ZNKR5boost4json14key_value_pair5valueEv:
 3985|  17.3k|    {
 3986|  17.3k|        return value_;
 3987|  17.3k|    }
_ZN5boost4json5valueC2IbvEET_NS0_11storage_ptrE:
  364|  19.4k|    {
  365|  19.4k|    }

_ZN5boost6system6detail11failed_implEiRKNS0_14error_categoryE:
  210|  6.21k|{
  211|  6.21k|    if( cat.id_ == system_category_id || cat.id_ == generic_category_id )
  ------------------
  |  Branch (211:9): [True: 0, False: 6.21k]
  |  Branch (211:42): [True: 0, False: 6.21k]
  ------------------
  212|      0|    {
  213|      0|        return ev != 0;
  214|      0|    }
  215|  6.21k|    else
  216|  6.21k|    {
  217|  6.21k|        return cat.failed( ev );
  218|  6.21k|    }
  219|  6.21k|}

_ZN5boost6system10error_codeC2EiRKNS0_14error_categoryE:
  130|  6.21k|    {
  131|  6.21k|        d1_.val_ = val;
  132|  6.21k|        d1_.cat_ = &cat;
  133|  6.21k|    }
_ZN5boost6system10error_codeC2ERKS1_PKNS_15source_locationE:
  155|  6.21k|    {
  156|  6.21k|        *this = ec;
  157|       |
  158|  6.21k|        if( ec.lc_flags_ != 0 && ec.lc_flags_ != 1 )
  ------------------
  |  Branch (158:13): [True: 6.21k, False: 0]
  |  Branch (158:34): [True: 6.21k, False: 0]
  ------------------
  159|  6.21k|        {
  160|  6.21k|            lc_flags_ = ( loc? reinterpret_cast<boost::uintptr_t>( loc ): 2 ) | ( ec.lc_flags_ & 1 );
  ------------------
  |  Branch (160:27): [True: 6.21k, False: 0]
  ------------------
  161|  6.21k|        }
  162|  6.21k|    }
_ZN5boost6system10error_code6assignERKS1_PKNS_15source_locationE:
  199|  6.21k|    {
  200|  6.21k|        *this = error_code( ec, loc );
  201|  6.21k|    }
_ZN5boost6system10error_codeC2INS_4json5errorEEET_PNS0_6detail9enable_ifIXoosr18is_error_code_enumIS5_EE5valuesr3std18is_error_code_enumIS5_EE5valueEvE4typeE:
  149|  6.21k|    {
  150|  6.21k|        *this = make_error_code( e );
  151|  6.21k|    }

_ZN5boost36throw_exception_assert_compatibilityERKSt9exception:
  140|    100|inline void throw_exception_assert_compatibility( std::exception const & ) {}
_ZN5boost15throw_exceptionISt9bad_allocEEvRKT_RKNS_15source_locationE:
  169|    100|{
  170|    100|    throw_exception_assert_compatibility( e );
  171|    100|    throw wrapexcept<E>( e, loc );
  172|    100|}
_ZN5boost10wrapexceptISt9bad_allocEC2ERKS1_RKNS_15source_locationE:
  103|    100|    {
  104|    100|        copy_from( &e );
  105|       |
  106|    100|        set_info( *this, throw_file( loc.file_name() ) );
  107|    100|        set_info( *this, throw_line( loc.line() ) );
  108|    100|        set_info( *this, throw_function( loc.function_name() ) );
  109|    100|        set_info( *this, throw_column( loc.column() ) );
  110|    100|    }
_ZN5boost10wrapexceptISt9bad_allocE9copy_fromEPKv:
   87|    100|    {
   88|    100|    }

LLVMFuzzerTestOneInput:
   91|  10.8k|{
   92|  10.8k|    if(size<=5)
  ------------------
  |  Branch (92:8): [True: 4, False: 10.8k]
  ------------------
   93|      4|        return 0;
   94|       |
   95|  10.8k|    FuzzHelper fh;
   96|       |
   97|       |    // set parse options
   98|  10.8k|    fh.opt.allow_comments=!!(data[0]&0x1);
   99|  10.8k|    fh.opt.allow_trailing_commas=!!(data[0]&0x2);
  100|  10.8k|    fh.opt.allow_invalid_utf8=!!(data[0]&0x4);
  101|  10.8k|    fh.opt.max_depth= (data[0]>>3);
  102|       |
  103|       |    // select memory strategy to use
  104|  10.8k|    const int strategy=data[1] & 0x3;
  105|       |
  106|       |    // memory limits
  107|  10.8k|    fh.memlimit1=data[2]*256+data[3];
  108|  10.8k|    fh.memlimit2=data[4]*256+data[5];
  109|       |
  110|  10.8k|    data+=6;
  111|  10.8k|    size-=6;
  112|       |
  113|       |    //set the json string to parse
  114|  10.8k|    fh.jsontext=string_view{
  115|  10.8k|            reinterpret_cast<const char*>(
  116|  10.8k|                data), size};
  117|  10.8k|    try
  118|  10.8k|    {
  119|  10.8k|        switch(strategy) {
  ------------------
  |  Branch (119:16): [True: 0, False: 10.8k]
  ------------------
  120|  3.18k|        case 0:
  ------------------
  |  Branch (120:9): [True: 3.18k, False: 7.64k]
  ------------------
  121|  3.18k|            fh.useDefault();
  122|  3.18k|            break;
  123|  2.86k|        case 1:
  ------------------
  |  Branch (123:9): [True: 2.86k, False: 7.97k]
  ------------------
  124|  2.86k|            fh.useDefault();
  125|  2.86k|            break;
  126|  2.12k|        case 2:
  ------------------
  |  Branch (126:9): [True: 2.12k, False: 8.71k]
  ------------------
  127|  2.12k|            fh.useLocalBuffer();
  128|  2.12k|            break;
  129|  2.66k|        case 3:
  ------------------
  |  Branch (129:9): [True: 2.66k, False: 8.17k]
  ------------------
  130|  2.66k|            fh.useDynLess();
  131|  2.66k|            break;
  132|  10.8k|        }
  133|  10.8k|    }
  134|  10.8k|    catch(...)
  135|  10.8k|    {
  136|    100|    }
  137|  10.8k|    return 0;
  138|  10.8k|}
_ZN10FuzzHelper10useDefaultEv:
   45|  6.05k|    void useDefault() {
   46|  6.05k|        stream_parser p(storage_ptr{}, opt);
   47|  6.05k|        run(p);
   48|  6.05k|    }
_ZN10FuzzHelper3runERN5boost4json13stream_parserE:
   26|  10.8k|    void run(stream_parser& p) {
   27|  10.8k|        error_code ec;
   28|       |
   29|       |        // Write the first part of the buffer
   30|  10.8k|        p.write( jsontext, ec);
   31|       |
   32|  10.8k|        if(! ec)
  ------------------
  |  Branch (32:12): [True: 7.21k, False: 3.62k]
  ------------------
   33|  7.21k|            p.finish( ec );
   34|       |
   35|       |        // Take ownership of the resulting value.
   36|  10.8k|        if(! ec)
  ------------------
  |  Branch (36:12): [True: 4.52k, False: 6.31k]
  ------------------
   37|  4.52k|        {
   38|  4.52k|            value jv = p.release();
   39|  4.52k|            res=serialize(jv).size()==42;
   40|  4.52k|        } else
   41|  6.31k|            res=false;
   42|  10.8k|    }
_ZN10FuzzHelper14useLocalBufferEv:
   58|  2.12k|    void useLocalBuffer() {
   59|  2.12k|        std::unique_ptr<unsigned char[]> temp(new unsigned char[memlimit1]);
   60|  2.12k|        stream_parser p(
   61|  2.12k|                    storage_ptr(),
   62|  2.12k|                    opt,
   63|  2.12k|                    temp.get(),
   64|  2.12k|                    memlimit1);
   65|  2.12k|        run(p);
   66|  2.12k|    }
_ZN10FuzzHelper10useDynLessEv:
   68|  2.66k|    void useDynLess() {
   69|       |        // this is on the heap because the size is chosen dynamically
   70|  2.66k|        std::unique_ptr<unsigned char[]> temp(new unsigned char[memlimit1]);
   71|  2.66k|        stream_parser p(get_null_resource(),
   72|  2.66k|                 opt,
   73|  2.66k|                 temp.get(),
   74|  2.66k|                 memlimit1);
   75|       |
   76|       |        // this is on the heap because the size is chosen dynamically
   77|  2.66k|        std::unique_ptr<unsigned char[]> buf(new unsigned char[memlimit2]);
   78|  2.66k|        static_resource mr2( buf.get(), memlimit2 );
   79|  2.66k|        p.reset( &mr2 );
   80|       |
   81|  2.66k|        run(p);
   82|  2.66k|    }

_ZN5boost4core17basic_string_viewIcEC2Ev:
  372|  15.3k|    {
  373|  15.3k|    }
_ZN5boost4core17basic_string_viewIcEC2EPKcm:
  380|  8.35M|    {
  381|  8.35M|    }
_ZNK5boost4core17basic_string_viewIcE4dataEv:
  542|   671k|    {
  543|   671k|        return p_;
  544|   671k|    }
_ZNK5boost4core17basic_string_viewIcE4sizeEv:
  492|  1.66M|    {
  493|  1.66M|        return n_;
  494|  1.66M|    }

_ZN5boost4json12basic_parserINS0_6detail7handlerEED2Ev:
  513|  10.8k|    ~basic_parser() = default;

_ZN5boost4json11storage_ptrC2Ev:
  170|   238k|    {
  171|   238k|    }
_ZN5boost4json11storage_ptrD2Ev:
  151|  23.5M|    {
  152|  23.5M|        release();
  153|  23.5M|    }
_ZNK5boost4json11storage_ptr7releaseEv:
  116|  23.5M|    {
  117|  23.5M|        if(is_shared())
  ------------------
  |  Branch (117:12): [True: 0, False: 23.5M]
  ------------------
  118|      0|        {
  119|      0|            auto const p = get_shared();
  120|      0|            if(p->refs.fetch_sub(1,
  ------------------
  |  Branch (120:16): [True: 0, False: 0]
  ------------------
  121|      0|                    std::memory_order_acq_rel) == 1)
  122|      0|                delete p;
  123|      0|        }
  124|  23.5M|    }
_ZNK5boost4json11storage_ptr9is_sharedEv:
  368|  31.3M|    {
  369|  31.3M|        return (i_ & 1) != 0;
  370|  31.3M|    }
_ZN5boost4json11storage_ptrC2INS_9container3pmr15memory_resourceEvEEPT_:
  207|  2.66k|    {
  208|  2.66k|        BOOST_ASSERT(r);
  ------------------
  |  |   60|  2.66k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  209|  2.66k|    }
_ZN5boost4json11storage_ptrC2INS0_15static_resourceEvEEPT_:
  207|  2.66k|    {
  208|  2.66k|        BOOST_ASSERT(r);
  ------------------
  |  |   60|  2.66k|# define BOOST_ASSERT(expr) assert(expr)
  ------------------
  209|  2.66k|    }

_ZN5boost4json13stream_parser5writeENS_4core17basic_string_viewIcEERNS_6system10error_codeE:
  858|  10.8k|    {
  859|  10.8k|        return write(
  860|  10.8k|            s.data(), s.size(), ec);
  861|  10.8k|    }
_ZN5boost4json13stream_parserD2Ev:
  158|  10.8k|    ~stream_parser() = default;

_ZNK5boost6system14error_category6failedEi:
  147|  6.21k|    {
  148|  6.21k|        return ev != 0;
  149|  6.21k|    }

_ZN5boost6system10error_codeC2Ev:
  125|  35.1k|    {
  126|  35.1k|    }
_ZNK5boost6system10error_codecvbEv:
  341|  79.3k|    {
  342|  79.3k|        return failed();
  343|  79.3k|    }
_ZNK5boost6system10error_code6failedEv:
  320|  79.3k|    {
  321|  79.3k|        if( lc_flags_ & 1 )
  ------------------
  |  Branch (321:13): [True: 20.2k, False: 59.1k]
  ------------------
  322|  20.2k|        {
  323|  20.2k|#if defined(BOOST_SYSTEM_HAS_SYSTEM_ERROR)
  324|  20.2k|            if( lc_flags_ == 1 )
  ------------------
  |  Branch (324:17): [True: 0, False: 20.2k]
  ------------------
  325|      0|            {
  326|      0|                std::error_code const& ec = *reinterpret_cast<std::error_code const*>( d2_ );
  327|      0|                return ec.value() != 0;
  328|      0|            }
  329|  20.2k|#endif
  330|  20.2k|            return true;
  331|  20.2k|        }
  332|  59.1k|        else
  333|  59.1k|        {
  334|  59.1k|            return false;
  335|  59.1k|        }
  336|  79.3k|    }

