)]}'
{
  "commit": "c65313e435da56d431ab4637292eef80bff09fe3",
  "tree": "77420667f20f97fedc1412b9c11c15940b9b18a1",
  "parents": [
    "1ebf192f6358e4dea3ae150a99e78c3b3970e873"
  ],
  "author": {
    "name": "Niels Lohmann",
    "email": "mail@nlohmann.me",
    "time": "Wed Sep 02 22:11:10 2026 +0200"
  },
  "committer": {
    "name": "Niels Lohmann",
    "email": "mail@nlohmann.me",
    "time": "Thu Sep 03 07:42:00 2026 +0200"
  },
  "message": "Skip the float fast path when it cannot succeed\n\nparse_float_fast() (Clinger) needs a significand below 2^53, so it always\ndeclines once the mantissa has 17 or more significant digits. convert_number()\ncalled it unconditionally, so those numbers were walked an extra time before\nstrtod had to run anyway. On streaming input, where scanning is byte-at-a-time\nand there is no compensating win, that made canada.json about 6% slower than\ndevelop.\n\nDerive the significant-digit count from token_buffer indices - the digits are\nnot scanned again - and skip the call when it is guaranteed to decline. Both\nscanners pass the offset where the mantissa ends; the count only has to be\ncorrected for a leading \"0\", which the JSON grammar admits nowhere else. The\ninteger path returns before the check, so integer-heavy input is unaffected.\n\nValues are unchanged: this only avoids an attempt that would have failed.\nVerified bit-exact against develop over every number in canada.json,\nfloats.json, signed_ints.json, unsigned_ints.json, small_signed_ints.json,\ncitm_catalog.json and twitter.json, for both the contiguous and the streaming\nscanner.\n\n  parse, streaming     develop    before     after\n  canada.json           19.4ms    20.5ms    19.3ms\n  floats.json          135.9ms   131.8ms   128.0ms\n\n  parse, contiguous    develop    before     after\n  canada.json           15.5ms    12.9ms    11.7ms\n  floats.json           98.6ms    69.8ms    66.7ms\n\nSigned-off-by: Niels Lohmann \u003cmail@nlohmann.me\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "4c3665593e3dde5250124a62a8a45d497d02c490",
      "old_mode": 33188,
      "old_path": "include/nlohmann/detail/input/lexer.hpp",
      "new_id": "0edd6428820aeae1bc852831cb4dda96ed3c3130",
      "new_mode": 33188,
      "new_path": "include/nlohmann/detail/input/lexer.hpp"
    },
    {
      "type": "modify",
      "old_id": "a06338a64707243ac2fee72c6765d3e15d48713f",
      "old_mode": 33188,
      "old_path": "single_include/nlohmann/json.hpp",
      "new_id": "9dedfe204b67f0044651402af08c408f1bbd03ee",
      "new_mode": 33188,
      "new_path": "single_include/nlohmann/json.hpp"
    },
    {
      "type": "modify",
      "old_id": "f138d33fac85dfd3c1deab677b58177431300daa",
      "old_mode": 33188,
      "old_path": "tests/src/unit-class_lexer.cpp",
      "new_id": "e894977387392be22cfb969796b91205d13a4290",
      "new_mode": 33188,
      "new_path": "tests/src/unit-class_lexer.cpp"
    }
  ]
}
